/ Hex Artifact Content
Login

Artifact 12f8c9a79ab51f7574998e3ed28dbafe59bbf0e8a435443c80bc788f661586f7:


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 2d 3e  chemaOp(pParse->
0a50: 70 56 64 62 65 2c 20 69 44 62 2c 20 30 29 3b 0a  pVdbe, iDb, 0);.
0a60: 20 20 20 20 69 66 28 20 69 44 62 21 3d 31 20 29      if( iDb!=1 )
0a70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
0a80: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 70 50 61  arseSchemaOp(pPa
0a90: 72 73 65 2d 3e 70 56 64 62 65 2c 20 31 2c 20 30  rse->pVdbe, 1, 0
0aa0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
0ab0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
0ac0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 22   implement the "
0ad0: 41 4c 54 45 52 20 54 41 42 4c 45 20 78 78 78 20  ALTER TABLE xxx 
0ae0: 52 45 4e 41 4d 45 20 54 4f 20 79 79 79 22 20 0a  RENAME TO yyy" .
0af0: 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a  ** command. .*/.
0b00: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 6c 74 65  void sqlite3Alte
0b10: 72 52 65 6e 61 6d 65 54 61 62 6c 65 28 0a 20 20  rRenameTable(.  
0b20: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0b30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
0b40: 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a  ser context. */.
0b50: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0b70: 68 65 20 74 61 62 6c 65 20 74 6f 20 72 65 6e 61  he table to rena
0b80: 6d 65 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  me. */.  Token *
0b90: 70 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  pName           
0ba0: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61     /* The new ta
0bb0: 62 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a 29 7b 0a  ble name. */.){.
0bc0: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0be0: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
0bf0: 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20  tains the table 
0c00: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20  */.  char *zDb; 
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0c20: 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61  * Name of databa
0c30: 73 65 20 69 44 62 20 2a 2f 0a 20 20 54 61 62 6c  se iDb */.  Tabl
0c40: 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
0c50: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62        /* Table b
0c60: 65 69 6e 67 20 72 65 6e 61 6d 65 64 20 2a 2f 0a  eing renamed */.
0c70: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
0c80: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  0;          /* N
0c90: 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 65 64 20 76  ULL-terminated v
0ca0: 65 72 73 69 6f 6e 20 6f 66 20 70 4e 61 6d 65 20  ersion of pName 
0cb0: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  */ .  sqlite3 *d
0cc0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
0cd0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
0ce0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
0cf0: 6e 54 61 62 4e 61 6d 65 3b 20 20 20 20 20 20 20  nTabName;       
0d00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
0d10: 6f 66 20 55 54 46 2d 38 20 63 68 61 72 61 63 74  of UTF-8 charact
0d20: 65 72 73 20 69 6e 20 7a 54 61 62 4e 61 6d 65 20  ers in zTabName 
0d30: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0d40: 2a 7a 54 61 62 4e 61 6d 65 3b 20 20 20 20 20 2f  *zTabName;     /
0d50: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 61 6d 65 20  * Original name 
0d60: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  of the table */.
0d70: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 56 54 61    Vdbe *v;.  VTa
0d80: 62 6c 65 20 2a 70 56 54 61 62 20 3d 20 30 3b 20  ble *pVTab = 0; 
0d90: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65         /* Non-ze
0da0: 72 6f 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ro if this is a 
0db0: 76 2d 74 61 62 20 77 69 74 68 20 61 6e 20 78 52  v-tab with an xR
0dc0: 65 6e 61 6d 65 28 29 20 2a 2f 0a 20 20 75 33 32  ename() */.  u32
0dd0: 20 73 61 76 65 64 44 62 46 6c 61 67 73 3b 20 20   savedDbFlags;  
0de0: 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
0df0: 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 6d 44 62  value of db->mDb
0e00: 46 6c 61 67 73 20 2a 2f 0a 0a 20 20 73 61 76 65  Flags */..  save
0e10: 64 44 62 46 6c 61 67 73 20 3d 20 64 62 2d 3e 6d  dDbFlags = db->m
0e20: 44 62 46 6c 61 67 73 3b 20 20 0a 20 20 69 66 28  DbFlags;  .  if(
0e30: 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f   NEVER(db->mallo
0e40: 63 46 61 69 6c 65 64 29 20 29 20 67 6f 74 6f 20  cFailed) ) goto 
0e50: 65 78 69 74 5f 72 65 6e 61 6d 65 5f 74 61 62 6c  exit_rename_tabl
0e60: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  e;.  assert( pSr
0e70: 63 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  c->nSrc==1 );.  
0e80: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
0e90: 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
0ea0: 78 65 73 28 70 50 61 72 73 65 2d 3e 64 62 29 20  xes(pParse->db) 
0eb0: 29 3b 0a 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  );..  pTab = sql
0ec0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
0ed0: 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 26  tem(pParse, 0, &
0ee0: 70 53 72 63 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69  pSrc->a[0]);.  i
0ef0: 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20  f( !pTab ) goto 
0f00: 65 78 69 74 5f 72 65 6e 61 6d 65 5f 74 61 62 6c  exit_rename_tabl
0f10: 65 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  e;.  iDb = sqlit
0f20: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
0f30: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
0f40: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7a 44  ->pSchema);.  zD
0f50: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
0f60: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 64 62 2d  .zDbSName;.  db-
0f70: 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 46  >mDbFlags |= DBF
0f80: 4c 41 47 5f 50 72 65 66 65 72 42 75 69 6c 74 69  LAG_PreferBuilti
0f90: 6e 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 4e  n;..  /* Get a N
0fa0: 55 4c 4c 20 74 65 72 6d 69 6e 61 74 65 64 20 76  ULL terminated v
0fb0: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65  ersion of the ne
0fc0: 77 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 2a 2f  w table name. */
0fd0: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
0fe0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
0ff0: 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
1000: 28 20 21 7a 4e 61 6d 65 20 29 20 67 6f 74 6f 20  ( !zName ) goto 
1010: 65 78 69 74 5f 72 65 6e 61 6d 65 5f 74 61 62 6c  exit_rename_tabl
1020: 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  e;..  /* Check t
1030: 68 61 74 20 61 20 74 61 62 6c 65 20 6f 72 20 69  hat a table or i
1040: 6e 64 65 78 20 6e 61 6d 65 64 20 27 7a 4e 61 6d  ndex named 'zNam
1050: 65 27 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  e' does not alre
1060: 61 64 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 69  ady exist.  ** i
1070: 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20  n database iDb. 
1080: 49 66 20 73 6f 2c 20 74 68 69 73 20 69 73 20 61  If so, this is a
1090: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20  n error..  */.  
10a0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
10b0: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
10c0: 7a 44 62 29 20 7c 7c 20 73 71 6c 69 74 65 33 46  zDb) || sqlite3F
10d0: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
10e0: 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
10f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1100: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
1110: 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
1120: 64 79 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  dy another table
1130: 20 6f 72 20 69 6e 64 65 78 20 77 69 74 68 20 74   or index with t
1140: 68 69 73 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  his name: %s", z
1150: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
1160: 65 78 69 74 5f 72 65 6e 61 6d 65 5f 74 61 62 6c  exit_rename_tabl
1170: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  e;.  }..  /* Mak
1180: 65 20 73 75 72 65 20 69 74 20 69 73 20 6e 6f 74  e sure it is not
1190: 20 61 20 73 79 73 74 65 6d 20 74 61 62 6c 65 20   a system table 
11a0: 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2c 20 6f  being altered, o
11b0: 72 20 61 20 72 65 73 65 72 76 65 64 20 6e 61 6d  r a reserved nam
11c0: 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  e.  ** that the 
11d0: 74 61 62 6c 65 20 69 73 20 62 65 69 6e 67 20 72  table is being r
11e0: 65 6e 61 6d 65 64 20 74 6f 2e 0a 20 20 2a 2f 0a  enamed to..  */.
11f0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1200: 3d 69 73 41 6c 74 65 72 61 62 6c 65 54 61 62 6c  =isAlterableTabl
1210: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  e(pParse, pTab) 
1220: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
1230: 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65 3b 0a 20  _rename_table;. 
1240: 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f   }.  if( SQLITE_
1250: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
1260: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
1270: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 20 67 6f 74  e, zName) ){ got
1280: 6f 0a 20 20 20 20 65 78 69 74 5f 72 65 6e 61 6d  o.    exit_renam
1290: 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  e_table;.  }..#i
12a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12b0: 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61  T_VIEW.  if( pTa
12c0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
12d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
12e0: 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20  g(pParse, "view 
12f0: 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c  %s may not be al
1300: 74 65 72 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  tered", pTab->zN
1310: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
1320: 78 69 74 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65  xit_rename_table
1330: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
1340: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1350: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
1360: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
1370: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61  authorization ca
1380: 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 69 66 28  llback. */.  if(
1390: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
13a0: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
13b0: 5f 41 4c 54 45 52 5f 54 41 42 4c 45 2c 20 7a 44  _ALTER_TABLE, zD
13c0: 62 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  b, pTab->zName, 
13d0: 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  0) ){.    goto e
13e0: 78 69 74 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65  xit_rename_table
13f0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
1400: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1410: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1420: 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77   if( sqlite3View
1430: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
1440: 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
1450: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 72 65      goto exit_re
1460: 6e 61 6d 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  name_table;.  }.
1470: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
1480: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70 56 54  pTab) ){.    pVT
1490: 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  ab = sqlite3GetV
14a0: 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
14b0: 0a 20 20 20 20 69 66 28 20 70 56 54 61 62 2d 3e  .    if( pVTab->
14c0: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e  pVtab->pModule->
14d0: 78 52 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  xRename==0 ){.  
14e0: 20 20 20 20 70 56 54 61 62 20 3d 20 30 3b 0a 20      pVTab = 0;. 
14f0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1500: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 74 72  .  /* Begin a tr
1510: 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 64 61  ansaction for da
1520: 74 61 62 61 73 65 20 69 44 62 2e 20 54 68 65 6e  tabase iDb. Then
1530: 20 6d 6f 64 69 66 79 20 74 68 65 20 73 63 68 65   modify the sche
1540: 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 2a 2a 20 28  ma cookie.  ** (
1550: 73 69 6e 63 65 20 74 68 65 20 41 4c 54 45 52 20  since the ALTER 
1560: 54 41 42 4c 45 20 6d 6f 64 69 66 69 65 73 20 74  TABLE modifies t
1570: 68 65 20 73 63 68 65 6d 61 29 2e 20 43 61 6c 6c  he schema). Call
1580: 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
1590: 28 29 2c 0a 20 20 2a 2a 20 61 73 20 74 68 65 20  (),.  ** as the 
15a0: 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73  scalar functions
15b0: 20 28 65 2e 67 2e 20 73 71 6c 69 74 65 5f 72 65   (e.g. sqlite_re
15c0: 6e 61 6d 65 5f 74 61 62 6c 65 28 29 29 20 69 6e  name_table()) in
15d0: 76 6f 6b 65 64 20 62 79 20 74 68 65 20 0a 20 20  voked by the .  
15e0: 2a 2a 20 6e 65 73 74 65 64 20 53 51 4c 20 6d 61  ** nested SQL ma
15f0: 79 20 72 61 69 73 65 20 61 6e 20 65 78 63 65 70  y raise an excep
1600: 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 76 20 3d 20  tion.  */.  v = 
1610: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1620: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
1630: 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  =0 ){.    goto e
1640: 78 69 74 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65  xit_rename_table
1650: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4d  ;.  }.  sqlite3M
1660: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
1670: 0a 0a 20 20 2f 2a 20 66 69 67 75 72 65 20 6f 75  ..  /* figure ou
1680: 74 20 68 6f 77 20 6d 61 6e 79 20 55 54 46 2d 38  t how many UTF-8
1690: 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20   characters are 
16a0: 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 7a 54  in zName */.  zT
16b0: 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
16c0: 4e 61 6d 65 3b 0a 20 20 6e 54 61 62 4e 61 6d 65  Name;.  nTabName
16d0: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38 43 68   = sqlite3Utf8Ch
16e0: 61 72 4c 65 6e 28 7a 54 61 62 4e 61 6d 65 2c 20  arLen(zTabName, 
16f0: 2d 31 29 3b 0a 0a 20 20 2f 2a 20 52 65 77 72 69  -1);..  /* Rewri
1700: 74 65 20 61 6c 6c 20 43 52 45 41 54 45 20 54 41  te all CREATE TA
1710: 42 4c 45 2c 20 49 4e 44 45 58 2c 20 54 52 49 47  BLE, INDEX, TRIG
1720: 47 45 52 20 6f 72 20 56 49 45 57 20 73 74 61 74  GER or VIEW stat
1730: 65 6d 65 6e 74 73 20 69 6e 0a 20 20 2a 2a 20 74  ements in.  ** t
1740: 68 65 20 73 63 68 65 6d 61 20 74 6f 20 75 73 65  he schema to use
1750: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e   the new table n
1760: 61 6d 65 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ame.  */.  sqlit
1770: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
1780: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 55 50  arse, .      "UP
1790: 44 41 54 45 20 5c 22 25 77 5c 22 2e 25 73 20 53  DATE \"%w\".%s S
17a0: 45 54 20 22 0a 20 20 20 20 20 20 22 73 71 6c 20  ET ".      "sql 
17b0: 3d 20 73 71 6c 69 74 65 5f 72 65 6e 61 6d 65 5f  = sqlite_rename_
17c0: 74 61 62 6c 65 28 25 51 2c 20 74 79 70 65 2c 20  table(%Q, type, 
17d0: 6e 61 6d 65 2c 20 73 71 6c 2c 20 25 51 2c 20 25  name, sql, %Q, %
17e0: 51 2c 20 25 64 29 20 22 0a 20 20 20 20 20 20 22  Q, %d) ".      "
17f0: 57 48 45 52 45 20 28 74 79 70 65 21 3d 27 69 6e  WHERE (type!='in
1800: 64 65 78 27 20 4f 52 20 74 62 6c 5f 6e 61 6d 65  dex' OR tbl_name
1810: 3d 25 51 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  =%Q COLLATE noca
1820: 73 65 29 22 0a 20 20 20 20 20 20 22 41 4e 44 20  se)".      "AND 
1830: 20 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20    name NOT LIKE 
1840: 27 73 71 6c 69 74 65 58 5f 25 25 27 20 45 53 43  'sqliteX_%%' ESC
1850: 41 50 45 20 27 58 27 22 0a 20 20 20 20 20 20 2c  APE 'X'".      ,
1860: 20 7a 44 62 2c 20 4d 41 53 54 45 52 5f 4e 41 4d   zDb, MASTER_NAM
1870: 45 2c 20 7a 44 62 2c 20 7a 54 61 62 4e 61 6d 65  E, zDb, zTabName
1880: 2c 20 7a 4e 61 6d 65 2c 20 28 69 44 62 3d 3d 31  , zName, (iDb==1
1890: 29 2c 20 7a 54 61 62 4e 61 6d 65 0a 20 20 29 3b  ), zTabName.  );
18a0: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
18b0: 65 20 74 62 6c 5f 6e 61 6d 65 20 61 6e 64 20 6e  e tbl_name and n
18c0: 61 6d 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ame columns of t
18d0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
18e0: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 73 20 72   table.  ** as r
18f0: 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 73  equired.  */.  s
1900: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
1910: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
1920: 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45  "UPDATE %Q.%s SE
1930: 54 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74  T ".          "t
1940: 62 6c 5f 6e 61 6d 65 20 3d 20 25 51 2c 20 22 0a  bl_name = %Q, ".
1950: 20 20 20 20 20 20 20 20 20 20 22 6e 61 6d 65 20            "name 
1960: 3d 20 43 41 53 45 20 22 0a 20 20 20 20 20 20 20  = CASE ".       
1970: 20 20 20 20 20 22 57 48 45 4e 20 74 79 70 65 3d       "WHEN type=
1980: 27 74 61 62 6c 65 27 20 54 48 45 4e 20 25 51 20  'table' THEN %Q 
1990: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 57  ".            "W
19a0: 48 45 4e 20 6e 61 6d 65 20 4c 49 4b 45 20 27 73  HEN name LIKE 's
19b0: 71 6c 69 74 65 58 5f 61 75 74 6f 69 6e 64 65 78  qliteX_autoindex
19c0: 25 25 27 20 45 53 43 41 50 45 20 27 58 27 20 22  %%' ESCAPE 'X' "
19d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20  .            "  
19e0: 20 20 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64     AND type='ind
19f0: 65 78 27 20 54 48 45 4e 20 22 0a 20 20 20 20 20  ex' THEN ".     
1a00: 20 20 20 20 20 20 20 20 22 27 73 71 6c 69 74 65          "'sqlite
1a10: 5f 61 75 74 6f 69 6e 64 65 78 5f 27 20 7c 7c 20  _autoindex_' || 
1a20: 25 51 20 7c 7c 20 73 75 62 73 74 72 28 6e 61 6d  %Q || substr(nam
1a30: 65 2c 25 64 2b 31 38 29 20 22 0a 20 20 20 20 20  e,%d+18) ".     
1a40: 20 20 20 20 20 20 20 22 45 4c 53 45 20 6e 61 6d         "ELSE nam
1a50: 65 20 45 4e 44 20 22 0a 20 20 20 20 20 20 22 57  e END ".      "W
1a60: 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  HERE tbl_name=%Q
1a70: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
1a80: 41 4e 44 20 22 0a 20 20 20 20 20 20 20 20 20 20  AND ".          
1a90: 22 28 74 79 70 65 3d 27 74 61 62 6c 65 27 20 4f  "(type='table' O
1aa0: 52 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 4f  R type='index' O
1ab0: 52 20 74 79 70 65 3d 27 74 72 69 67 67 65 72 27  R type='trigger'
1ac0: 29 3b 22 2c 20 0a 20 20 20 20 20 20 7a 44 62 2c  );", .      zDb,
1ad0: 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 0a 20   MASTER_NAME, . 
1ae0: 20 20 20 20 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d       zName, zNam
1af0: 65 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  e, zName, .     
1b00: 20 6e 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 4e   nTabName, zTabN
1b10: 61 6d 65 0a 20 20 29 3b 0a 0a 23 69 66 6e 64 65  ame.  );..#ifnde
1b20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1b30: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a  TOINCREMENT.  /*
1b40: 20 49 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   If the sqlite_s
1b50: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 65 78  equence table ex
1b60: 69 73 74 73 20 69 6e 20 74 68 69 73 20 64 61 74  ists in this dat
1b70: 61 62 61 73 65 2c 20 74 68 65 6e 20 75 70 64 61  abase, then upda
1b80: 74 65 20 0a 20 20 2a 2a 20 69 74 20 77 69 74 68  te .  ** it with
1b90: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e   the new table n
1ba0: 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
1bb0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1bc0: 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 65 71  (db, "sqlite_seq
1bd0: 75 65 6e 63 65 22 2c 20 7a 44 62 29 20 29 7b 0a  uence", zDb) ){.
1be0: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
1bf0: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
1c00: 20 20 20 20 20 20 20 22 55 50 44 41 54 45 20 5c         "UPDATE \
1c10: 22 25 77 5c 22 2e 73 71 6c 69 74 65 5f 73 65 71  "%w\".sqlite_seq
1c20: 75 65 6e 63 65 20 73 65 74 20 6e 61 6d 65 20 3d  uence set name =
1c30: 20 25 51 20 57 48 45 52 45 20 6e 61 6d 65 20 3d   %Q WHERE name =
1c40: 20 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44   %Q",.        zD
1c50: 62 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  b, zName, pTab->
1c60: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  zName);.  }.#end
1c70: 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  if..  /* If the 
1c80: 74 61 62 6c 65 20 62 65 69 6e 67 20 72 65 6e 61  table being rena
1c90: 6d 65 64 20 69 73 20 6e 6f 74 20 69 74 73 65 6c  med is not itsel
1ca0: 66 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 65  f part of the te
1cb0: 6d 70 20 64 61 74 61 62 61 73 65 2c 0a 20 20 2a  mp database,.  *
1cc0: 2a 20 65 64 69 74 20 76 69 65 77 20 61 6e 64 20  * edit view and 
1cd0: 74 72 69 67 67 65 72 20 64 65 66 69 6e 69 74 69  trigger definiti
1ce0: 6f 6e 73 20 77 69 74 68 69 6e 20 74 68 65 20 74  ons within the t
1cf0: 65 6d 70 20 64 61 74 61 62 61 73 65 20 0a 20 20  emp database .  
1d00: 2a 2a 20 61 73 20 72 65 71 75 69 72 65 64 2e 20  ** as required. 
1d10: 20 2a 2f 0a 20 20 69 66 28 20 69 44 62 21 3d 31   */.  if( iDb!=1
1d20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   ){.    sqlite3N
1d30: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
1d40: 65 2c 20 0a 20 20 20 20 20 20 20 20 22 55 50 44  e, .        "UPD
1d50: 41 54 45 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f  ATE sqlite_temp_
1d60: 6d 61 73 74 65 72 20 53 45 54 20 22 0a 20 20 20  master SET ".   
1d70: 20 20 20 20 20 20 20 20 20 22 73 71 6c 20 3d 20           "sql = 
1d80: 73 71 6c 69 74 65 5f 72 65 6e 61 6d 65 5f 74 61  sqlite_rename_ta
1d90: 62 6c 65 28 25 51 2c 20 74 79 70 65 2c 20 6e 61  ble(%Q, type, na
1da0: 6d 65 2c 20 73 71 6c 2c 20 25 51 2c 20 25 51 2c  me, sql, %Q, %Q,
1db0: 20 31 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20   1), ".         
1dc0: 20 20 20 22 74 62 6c 5f 6e 61 6d 65 20 3d 20 22     "tbl_name = "
1dd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1de0: 43 41 53 45 20 57 48 45 4e 20 74 62 6c 5f 6e 61  CASE WHEN tbl_na
1df0: 6d 65 3d 25 51 20 43 4f 4c 4c 41 54 45 20 6e 6f  me=%Q COLLATE no
1e00: 63 61 73 65 20 41 4e 44 20 22 0a 20 20 20 20 20  case AND ".     
1e10: 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20           "      
1e20: 20 20 20 20 73 71 6c 69 74 65 5f 72 65 6e 61 6d      sqlite_renam
1e30: 65 5f 74 65 73 74 28 25 51 2c 20 73 71 6c 2c 20  e_test(%Q, sql, 
1e40: 74 79 70 65 2c 20 6e 61 6d 65 2c 20 31 29 20 22  type, name, 1) "
1e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1e60: 54 48 45 4e 20 25 51 20 45 4c 53 45 20 74 62 6c  THEN %Q ELSE tbl
1e70: 5f 6e 61 6d 65 20 45 4e 44 20 22 0a 20 20 20 20  _name END ".    
1e80: 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74          "WHERE t
1e90: 79 70 65 20 49 4e 20 28 27 76 69 65 77 27 2c 20  ype IN ('view', 
1ea0: 27 74 72 69 67 67 65 72 27 29 22 0a 20 20 20 20  'trigger')".    
1eb0: 20 20 20 20 2c 20 7a 44 62 2c 20 7a 54 61 62 4e      , zDb, zTabN
1ec0: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 7a 54 61 62  ame, zName, zTab
1ed0: 4e 61 6d 65 2c 20 7a 44 62 2c 20 7a 4e 61 6d 65  Name, zDb, zName
1ee0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
1ef0: 74 68 69 73 20 69 73 20 61 20 76 69 72 74 75 61  this is a virtua
1f00: 6c 20 74 61 62 6c 65 2c 20 69 6e 76 6f 6b 65 20  l table, invoke 
1f10: 74 68 65 20 78 52 65 6e 61 6d 65 28 29 20 66 75  the xRename() fu
1f20: 6e 63 74 69 6f 6e 20 69 66 0a 20 20 2a 2a 20 6f  nction if.  ** o
1f30: 6e 65 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54  ne is defined. T
1f40: 68 65 20 78 52 65 6e 61 6d 65 28 29 20 63 61 6c  he xRename() cal
1f50: 6c 62 61 63 6b 20 77 69 6c 6c 20 6d 6f 64 69 66  lback will modif
1f60: 79 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  y the names.  **
1f70: 20 6f 66 20 61 6e 79 20 72 65 73 6f 75 72 63 65   of any resource
1f80: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 76 2d  s used by the v-
1f90: 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61  table implementa
1fa0: 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20  tion (including 
1fb0: 6f 74 68 65 72 0a 20 20 2a 2a 20 53 51 4c 69 74  other.  ** SQLit
1fc0: 65 20 74 61 62 6c 65 73 29 20 74 68 61 74 20 61  e tables) that a
1fd0: 72 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  re identified by
1fe0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1ff0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
2000: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
2010: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2020: 54 41 42 4c 45 0a 20 20 69 66 28 20 70 56 54 61  TABLE.  if( pVTa
2030: 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  b ){.    int i =
2040: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2050: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2060: 4c 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 69 2c  LoadString(v, i,
2070: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c   zName);.    sql
2080: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2090: 2c 20 4f 50 5f 56 52 65 6e 61 6d 65 2c 20 69 2c  , OP_VRename, i,
20a0: 20 30 2c 20 30 2c 28 63 6f 6e 73 74 20 63 68 61   0, 0,(const cha
20b0: 72 2a 29 70 56 54 61 62 2c 20 50 34 5f 56 54 41  r*)pVTab, P4_VTA
20c0: 42 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  B);.  }.#endif..
20d0: 20 20 72 65 6e 61 6d 65 52 65 6c 6f 61 64 53 63    renameReloadSc
20e0: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
20f0: 29 3b 0a 20 20 72 65 6e 61 6d 65 54 65 73 74 53  );.  renameTestS
2100: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 7a 44  chema(pParse, zD
2110: 62 2c 20 69 44 62 3d 3d 31 29 3b 0a 0a 65 78 69  b, iDb==1);..exi
2120: 74 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65 3a 0a  t_rename_table:.
2130: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
2140: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 29  Delete(db, pSrc)
2150: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2160: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
2170: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 3d 20 73  db->mDbFlags = s
2180: 61 76 65 64 44 62 46 6c 61 67 73 3b 0a 7d 0a 0a  avedDbFlags;.}..
2190: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
21a0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ion is called af
21b0: 74 65 72 20 61 6e 20 22 41 4c 54 45 52 20 54 41  ter an "ALTER TA
21c0: 42 4c 45 20 2e 2e 2e 20 41 44 44 22 20 73 74 61  BLE ... ADD" sta
21d0: 74 65 6d 65 6e 74 0a 2a 2a 20 68 61 73 20 62 65  tement.** has be
21e0: 65 6e 20 70 61 72 73 65 64 2e 20 41 72 67 75 6d  en parsed. Argum
21f0: 65 6e 74 20 70 43 6f 6c 44 65 66 20 63 6f 6e 74  ent pColDef cont
2200: 61 69 6e 73 20 74 68 65 20 74 65 78 74 20 6f 66  ains the text of
2210: 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63 6f 6c 75   the new.** colu
2220: 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a  mn definition..*
2230: 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
2240: 74 72 75 63 74 75 72 65 20 70 50 61 72 73 65 2d  tructure pParse-
2250: 3e 70 4e 65 77 54 61 62 6c 65 20 77 61 73 20 65  >pNewTable was e
2260: 78 74 65 6e 64 65 64 20 74 6f 20 69 6e 63 6c 75  xtended to inclu
2270: 64 65 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 6f  de.** the new co
2280: 6c 75 6d 6e 20 64 75 72 69 6e 67 20 70 61 72 73  lumn during pars
2290: 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ing..*/.void sql
22a0: 69 74 65 33 41 6c 74 65 72 46 69 6e 69 73 68 41  ite3AlterFinishA
22b0: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
22c0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
22d0: 43 6f 6c 44 65 66 29 7b 0a 20 20 54 61 62 6c 65  ColDef){.  Table
22e0: 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
22f0: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
2300: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
2310: 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
2320: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
2330: 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
2340: 61 6c 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  altered */.  int
2350: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
2360: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
2370: 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  se number */.  c
2380: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20  onst char *zDb; 
2390: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
23a0: 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63  base name */.  c
23b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 3b  onst char *zTab;
23c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
23d0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72  e name */.  char
23e0: 20 2a 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20   *zCol;         
23f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6c 6c 2d 74 65        /* Null-te
2400: 72 6d 69 6e 61 74 65 64 20 63 6f 6c 75 6d 6e 20  rminated column 
2410: 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a 20 20  definition */.  
2420: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 20 20 20  Column *pCol;   
2430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2440: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20   new column */. 
2450: 20 45 78 70 72 20 2a 70 44 66 6c 74 3b 20 20 20   Expr *pDflt;   
2460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
2470: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
2480: 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 2a  the new column *
2490: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24b0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
24c0: 6e 6e 65 63 74 69 6f 6e 3b 20 2a 2f 0a 20 20 56  nnection; */.  V
24d0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
24e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24f0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
2500: 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
2510: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
2520: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
2530: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
2540: 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 0a  y registers */..
2550: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
2560: 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  b;.  if( pParse-
2570: 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
2580: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
2590: 72 6e 3b 0a 20 20 70 4e 65 77 20 3d 20 70 50 61  rn;.  pNew = pPa
25a0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
25b0: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 20 29    assert( pNew )
25c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
25d0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
25e0: 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a  lMutexes(db) );.
25f0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
2600: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
2610: 20 70 4e 65 77 2d 3e 70 53 63 68 65 6d 61 29 3b   pNew->pSchema);
2620: 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  zDb = db->aDb
2630: 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a  [iDb].zDbSName;.
2640: 20 20 7a 54 61 62 20 3d 20 26 70 4e 65 77 2d 3e    zTab = &pNew->
2650: 7a 4e 61 6d 65 5b 31 36 5d 3b 20 20 2f 2a 20 53  zName[16];  /* S
2660: 6b 69 70 20 74 68 65 20 22 73 71 6c 69 74 65 5f  kip the "sqlite_
2670: 61 6c 74 65 72 74 61 62 5f 22 20 70 72 65 66 69  altertab_" prefi
2680: 78 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20 2a 2f  x on the name */
2690: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 4e 65 77 2d  .  pCol = &pNew-
26a0: 3e 61 43 6f 6c 5b 70 4e 65 77 2d 3e 6e 43 6f 6c  >aCol[pNew->nCol
26b0: 2d 31 5d 3b 0a 20 20 70 44 66 6c 74 20 3d 20 70  -1];.  pDflt = p
26c0: 43 6f 6c 2d 3e 70 44 66 6c 74 3b 0a 20 20 70 54  Col->pDflt;.  pT
26d0: 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
26e0: 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 2c 20  Table(db, zTab, 
26f0: 7a 44 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20  zDb);.  assert( 
2700: 70 54 61 62 20 29 3b 0a 0a 23 69 66 6e 64 65 66  pTab );..#ifndef
2710: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2720: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20  HORIZATION.  /* 
2730: 49 6e 76 6f 6b 65 20 74 68 65 20 61 75 74 68 6f  Invoke the autho
2740: 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63  rization callbac
2750: 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  k. */.  if( sqli
2760: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
2770: 72 73 65 2c 20 53 51 4c 49 54 45 5f 41 4c 54 45  rse, SQLITE_ALTE
2780: 52 5f 54 41 42 4c 45 2c 20 7a 44 62 2c 20 70 54  R_TABLE, zDb, pT
2790: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20 29 7b  ab->zName, 0) ){
27a0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
27b0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
27c0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
27d0: 75 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 63  ue for the new c
27e0: 6f 6c 75 6d 6e 20 77 61 73 20 73 70 65 63 69 66  olumn was specif
27f0: 69 65 64 20 77 69 74 68 20 61 20 0a 20 20 2a 2a  ied with a .  **
2800: 20 6c 69 74 65 72 61 6c 20 4e 55 4c 4c 2c 20 74   literal NULL, t
2810: 68 65 6e 20 73 65 74 20 70 44 66 6c 74 20 74 6f  hen set pDflt to
2820: 20 30 2e 20 54 68 69 73 20 73 69 6d 70 6c 69 66   0. This simplif
2830: 69 65 73 20 63 68 65 63 6b 69 6e 67 0a 20 20 2a  ies checking.  *
2840: 2a 20 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c  * for an SQL NUL
2850: 4c 20 64 65 66 61 75 6c 74 20 62 65 6c 6f 77 2e  L default below.
2860: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2870: 70 44 66 6c 74 3d 3d 30 20 7c 7c 20 70 44 66 6c  pDflt==0 || pDfl
2880: 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20 29  t->op==TK_SPAN )
2890: 3b 0a 20 20 69 66 28 20 70 44 66 6c 74 20 26 26  ;.  if( pDflt &&
28a0: 20 70 44 66 6c 74 2d 3e 70 4c 65 66 74 2d 3e 6f   pDflt->pLeft->o
28b0: 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 7b 0a 20 20  p==TK_NULL ){.  
28c0: 20 20 70 44 66 6c 74 20 3d 20 30 3b 0a 20 20 7d    pDflt = 0;.  }
28d0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
28e0: 74 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e  t the new column
28f0: 20 69 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65   is not specifie
2900: 64 20 61 73 20 50 52 49 4d 41 52 59 20 4b 45 59  d as PRIMARY KEY
2910: 20 6f 72 20 55 4e 49 51 55 45 2e 0a 20 20 2a 2a   or UNIQUE..  **
2920: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 4e   If there is a N
2930: 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  OT NULL constrai
2940: 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 64 65 66  nt, then the def
2950: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
2960: 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6d  he.  ** column m
2970: 75 73 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e  ust not be NULL.
2980: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c  .  */.  if( pCol
2990: 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ->colFlags & COL
29a0: 46 4c 41 47 5f 50 52 49 4d 4b 45 59 20 29 7b 0a  FLAG_PRIMKEY ){.
29b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
29c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 43 61 6e  Msg(pParse, "Can
29d0: 6e 6f 74 20 61 64 64 20 61 20 50 52 49 4d 41 52  not add a PRIMAR
29e0: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 22 29 3b 0a  Y KEY column");.
29f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2a00: 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 64    if( pNew->pInd
2a10: 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ex ){.    sqlite
2a20: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2a30: 2c 20 22 43 61 6e 6e 6f 74 20 61 64 64 20 61 20  , "Cannot add a 
2a40: 55 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 22 29 3b  UNIQUE column");
2a50: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2a60: 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67  .  if( (db->flag
2a70: 73 26 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e  s&SQLITE_Foreign
2a80: 4b 65 79 73 29 20 26 26 20 70 4e 65 77 2d 3e 70  Keys) && pNew->p
2a90: 46 4b 65 79 20 26 26 20 70 44 66 6c 74 20 29 7b  FKey && pDflt ){
2aa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
2ab0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
2ac0: 20 20 20 20 20 20 22 43 61 6e 6e 6f 74 20 61 64        "Cannot ad
2ad0: 64 20 61 20 52 45 46 45 52 45 4e 43 45 53 20 63  d a REFERENCES c
2ae0: 6f 6c 75 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e  olumn with non-N
2af0: 55 4c 4c 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ULL default valu
2b00: 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  e");.    return;
2b10: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 6f 6c 2d  .  }.  if( pCol-
2b20: 3e 6e 6f 74 4e 75 6c 6c 20 26 26 20 21 70 44 66  >notNull && !pDf
2b30: 6c 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  lt ){.    sqlite
2b40: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2b50: 2c 20 0a 20 20 20 20 20 20 20 20 22 43 61 6e 6e  , .        "Cann
2b60: 6f 74 20 61 64 64 20 61 20 4e 4f 54 20 4e 55 4c  ot add a NOT NUL
2b70: 4c 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 64 65  L column with de
2b80: 66 61 75 6c 74 20 76 61 6c 75 65 20 4e 55 4c 4c  fault value NULL
2b90: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
2ba0: 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65    }..  /* Ensure
2bb0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 65 78 70   the default exp
2bc0: 72 65 73 73 69 6f 6e 20 69 73 20 73 6f 6d 65 74  ression is somet
2bd0: 68 69 6e 67 20 74 68 61 74 20 73 71 6c 69 74 65  hing that sqlite
2be0: 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 29  3ValueFromExpr()
2bf0: 0a 20 20 2a 2a 20 63 61 6e 20 68 61 6e 64 6c 65  .  ** can handle
2c00: 20 28 69 2e 65 2e 20 6e 6f 74 20 43 55 52 52 45   (i.e. not CURRE
2c10: 4e 54 5f 54 49 4d 45 20 65 74 63 2e 29 0a 20 20  NT_TIME etc.).  
2c20: 2a 2f 0a 20 20 69 66 28 20 70 44 66 6c 74 20 29  */.  if( pDflt )
2c30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  {.    sqlite3_va
2c40: 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20  lue *pVal = 0;. 
2c50: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72     int rc;.    r
2c60: 63 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  c = sqlite3Value
2c70: 46 72 6f 6d 45 78 70 72 28 64 62 2c 20 70 44 66  FromExpr(db, pDf
2c80: 6c 74 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  lt, SQLITE_UTF8,
2c90: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
2ca0: 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 61 73  , &pVal);.    as
2cb0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2cc0: 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
2cd0: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69  E_NOMEM );.    i
2ce0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2cf0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2d00: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2d10: 65 64 20 3d 3d 20 31 20 29 3b 0a 20 20 20 20 20  ed == 1 );.     
2d20: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
2d30: 20 20 20 69 66 28 20 21 70 56 61 6c 20 29 7b 0a     if( !pVal ){.
2d40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2d50: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 43  orMsg(pParse, "C
2d60: 61 6e 6e 6f 74 20 61 64 64 20 61 20 63 6f 6c 75  annot add a colu
2d70: 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d 63 6f 6e 73  mn with non-cons
2d80: 74 61 6e 74 20 64 65 66 61 75 6c 74 22 29 3b 0a  tant default");.
2d90: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2da0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
2db0: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
2dc0: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 64 69 66 79    }..  /* Modify
2dd0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
2de0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a  E statement. */.
2df0: 20 20 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    zCol = sqlite3
2e00: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
2e10: 68 61 72 2a 29 70 43 6f 6c 44 65 66 2d 3e 7a 2c  har*)pColDef->z,
2e20: 20 70 43 6f 6c 44 65 66 2d 3e 6e 29 3b 0a 20 20   pColDef->n);.  
2e30: 69 66 28 20 7a 43 6f 6c 20 29 7b 0a 20 20 20 20  if( zCol ){.    
2e40: 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26 7a 43  char *zEnd = &zC
2e50: 6f 6c 5b 70 43 6f 6c 44 65 66 2d 3e 6e 2d 31 5d  ol[pColDef->n-1]
2e60: 3b 0a 20 20 20 20 75 33 32 20 73 61 76 65 64 44  ;.    u32 savedD
2e70: 62 46 6c 61 67 73 20 3d 20 64 62 2d 3e 6d 44 62  bFlags = db->mDb
2e80: 46 6c 61 67 73 3b 0a 20 20 20 20 77 68 69 6c 65  Flags;.    while
2e90: 28 20 7a 45 6e 64 3e 7a 43 6f 6c 20 26 26 20 28  ( zEnd>zCol && (
2ea0: 2a 7a 45 6e 64 3d 3d 27 3b 27 20 7c 7c 20 73 71  *zEnd==';' || sq
2eb0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 45  lite3Isspace(*zE
2ec0: 6e 64 29 29 20 29 7b 0a 20 20 20 20 20 20 2a 7a  nd)) ){.      *z
2ed0: 45 6e 64 2d 2d 20 3d 20 27 5c 30 27 3b 0a 20 20  End-- = '\0';.  
2ee0: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46    }.    db->mDbF
2ef0: 6c 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 50  lags |= DBFLAG_P
2f00: 72 65 66 65 72 42 75 69 6c 74 69 6e 3b 0a 20 20  referBuiltin;.  
2f10: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
2f20: 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
2f30: 20 20 20 20 20 20 22 55 50 44 41 54 45 20 5c 22        "UPDATE \"
2f40: 25 77 5c 22 2e 25 73 20 53 45 54 20 22 0a 20 20  %w\".%s SET ".  
2f50: 20 20 20 20 20 20 20 20 22 73 71 6c 20 3d 20 73          "sql = s
2f60: 75 62 73 74 72 28 73 71 6c 2c 31 2c 25 64 29 20  ubstr(sql,1,%d) 
2f70: 7c 7c 20 27 2c 20 27 20 7c 7c 20 25 51 20 7c 7c  || ', ' || %Q ||
2f80: 20 73 75 62 73 74 72 28 73 71 6c 2c 25 64 29 20   substr(sql,%d) 
2f90: 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
2fa0: 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27 20   type = 'table' 
2fb0: 41 4e 44 20 6e 61 6d 65 20 3d 20 25 51 22 2c 20  AND name = %Q", 
2fc0: 0a 20 20 20 20 20 20 7a 44 62 2c 20 4d 41 53 54  .      zDb, MAST
2fd0: 45 52 5f 4e 41 4d 45 2c 20 70 4e 65 77 2d 3e 61  ER_NAME, pNew->a
2fe0: 64 64 43 6f 6c 4f 66 66 73 65 74 2c 20 7a 43 6f  ddColOffset, zCo
2ff0: 6c 2c 20 70 4e 65 77 2d 3e 61 64 64 43 6f 6c 4f  l, pNew->addColO
3000: 66 66 73 65 74 2b 31 2c 0a 20 20 20 20 20 20 7a  ffset+1,.      z
3010: 54 61 62 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  Tab.    );.    s
3020: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3030: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 64 62 2d 3e   zCol);.    db->
3040: 6d 44 62 46 6c 61 67 73 20 3d 20 73 61 76 65 64  mDbFlags = saved
3050: 44 62 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  DbFlags;.  }..  
3060: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
3070: 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20   schema version 
3080: 69 73 20 61 74 20 6c 65 61 73 74 20 33 2e 20 20  is at least 3.  
3090: 42 75 74 20 64 6f 20 6e 6f 74 20 75 70 67 72 61  But do not upgra
30a0: 64 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 6c 65 73  de.  ** from les
30b0: 73 20 74 68 61 6e 20 33 20 74 6f 20 34 2c 20 61  s than 3 to 4, a
30c0: 73 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 72 72  s that will corr
30d0: 75 70 74 20 61 6e 79 20 70 72 65 65 78 69 73 74  upt any preexist
30e0: 69 6e 67 20 44 45 53 43 0a 20 20 2a 2a 20 69 6e  ing DESC.  ** in
30f0: 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  dex..  */.  v = 
3100: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
3110: 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
3120: 29 7b 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69  ){.    r1 = sqli
3130: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
3140: 61 72 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  arse);.    sqlit
3150: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
3160: 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69  OP_ReadCookie, i
3170: 44 62 2c 20 72 31 2c 20 42 54 52 45 45 5f 46 49  Db, r1, BTREE_FI
3180: 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20  LE_FORMAT);.    
3190: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
31a0: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
31b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
31c0: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
31d0: 2c 20 72 31 2c 20 2d 32 29 3b 0a 20 20 20 20 73  , r1, -2);.    s
31e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
31f0: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 31  (v, OP_IfPos, r1
3200: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
3210: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
3220: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
3230: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
3240: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
3250: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
3260: 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d   BTREE_FILE_FORM
3270: 41 54 2c 20 33 29 3b 0a 20 20 20 20 73 71 6c 69  AT, 3);.    sqli
3280: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
3290: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
32a0: 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 6f 61 64 20   }..  /* Reload 
32b0: 74 68 65 20 74 61 62 6c 65 20 64 65 66 69 6e 69  the table defini
32c0: 74 69 6f 6e 20 2a 2f 0a 20 20 72 65 6e 61 6d 65  tion */.  rename
32d0: 52 65 6c 6f 61 64 53 63 68 65 6d 61 28 70 50 61  ReloadSchema(pPa
32e0: 72 73 65 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a  rse, iDb);.}../*
32f0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3300: 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
3310: 68 65 20 70 61 72 73 65 72 20 61 66 74 65 72 20  he parser after 
3320: 74 68 65 20 74 61 62 6c 65 2d 6e 61 6d 65 20 69  the table-name i
3330: 6e 0a 2a 2a 20 61 6e 20 22 41 4c 54 45 52 20 54  n.** an "ALTER T
3340: 41 42 4c 45 20 3c 74 61 62 6c 65 2d 6e 61 6d 65  ABLE <table-name
3350: 3e 20 41 44 44 22 20 73 74 61 74 65 6d 65 6e 74  > ADD" statement
3360: 20 69 73 20 70 61 72 73 65 64 2e 20 41 72 67 75   is parsed. Argu
3370: 6d 65 6e 74 20 0a 2a 2a 20 70 53 72 63 20 69 73  ment .** pSrc is
3380: 20 74 68 65 20 66 75 6c 6c 2d 6e 61 6d 65 20 6f   the full-name o
3390: 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  f the table bein
33a0: 67 20 61 6c 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  g altered..**.**
33b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
33c0: 6b 65 73 20 61 20 28 70 61 72 74 69 61 6c 29 20  kes a (partial) 
33d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 54 61 62 6c  copy of the Tabl
33e0: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 66  e structure.** f
33f0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  or the table bei
3400: 6e 67 20 61 6c 74 65 72 65 64 20 61 6e 64 20 73  ng altered and s
3410: 65 74 73 20 50 61 72 73 65 2e 70 4e 65 77 54 61  ets Parse.pNewTa
3420: 62 6c 65 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20  ble to point.** 
3430: 74 6f 20 69 74 2e 20 52 6f 75 74 69 6e 65 73 20  to it. Routines 
3440: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
3450: 72 73 65 72 20 61 73 20 74 68 65 20 63 6f 6c 75  rser as the colu
3460: 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 0a 2a 2a  mn definition.**
3470: 20 69 73 20 70 61 72 73 65 64 20 28 69 2e 65 2e   is parsed (i.e.
3480: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
3490: 6e 28 29 29 20 61 64 64 20 74 68 65 20 6e 65 77  n()) add the new
34a0: 20 43 6f 6c 75 6d 6e 20 64 61 74 61 20 74 6f 20   Column data to 
34b0: 0a 2a 2a 20 74 68 65 20 63 6f 70 79 2e 20 54 68  .** the copy. Th
34c0: 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 54 61  e copy of the Ta
34d0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ble structure is
34e0: 20 64 65 6c 65 74 65 64 20 62 79 20 74 6f 6b 65   deleted by toke
34f0: 6e 69 7a 65 2e 63 20 0a 2a 2a 20 61 66 74 65 72  nize.c .** after
3500: 20 70 61 72 73 69 6e 67 20 69 73 20 66 69 6e 69   parsing is fini
3510: 73 68 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 6f 75 74  shed..**.** Rout
3520: 69 6e 65 20 73 71 6c 69 74 65 33 41 6c 74 65 72  ine sqlite3Alter
3530: 46 69 6e 69 73 68 41 64 64 43 6f 6c 75 6d 6e 28  FinishAddColumn(
3540: 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  ) will be called
3550: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 0a 2a 2a 20   to complete.** 
3560: 63 6f 64 69 6e 67 20 74 68 65 20 22 41 4c 54 45  coding the "ALTE
3570: 52 20 54 41 42 4c 45 20 2e 2e 2e 20 41 44 44 22  R TABLE ... ADD"
3580: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
3590: 6f 69 64 20 73 71 6c 69 74 65 33 41 6c 74 65 72  oid sqlite3Alter
35a0: 42 65 67 69 6e 41 64 64 43 6f 6c 75 6d 6e 28 50  BeginAddColumn(P
35b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
35c0: 63 4c 69 73 74 20 2a 70 53 72 63 29 7b 0a 20 20  cList *pSrc){.  
35d0: 54 61 62 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 54  Table *pNew;.  T
35e0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e  able *pTab;.  in
35f0: 74 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  t iDb;.  int i;.
3600: 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 20 20    int nAlloc;.  
3610: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
3620: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
3630: 4c 6f 6f 6b 20 75 70 20 74 68 65 20 74 61 62 6c  Look up the tabl
3640: 65 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e  e being altered.
3650: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
3660: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
3670: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
3680: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
3690: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
36a0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
36b0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
36c0: 20 65 78 69 74 5f 62 65 67 69 6e 5f 61 64 64 5f   exit_begin_add_
36d0: 63 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d  column;.  pTab =
36e0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
36f0: 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
3700: 30 2c 20 26 70 53 72 63 2d 3e 61 5b 30 5d 29 3b  0, &pSrc->a[0]);
3710: 0a 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67  .  if( !pTab ) g
3720: 6f 74 6f 20 65 78 69 74 5f 62 65 67 69 6e 5f 61  oto exit_begin_a
3730: 64 64 5f 63 6f 6c 75 6d 6e 3b 0a 0a 23 69 66 6e  dd_column;..#ifn
3740: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3750: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
3760: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
3770: 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
3780: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3790: 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65  , "virtual table
37a0: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 74  s may not be alt
37b0: 65 72 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  ered");.    goto
37c0: 20 65 78 69 74 5f 62 65 67 69 6e 5f 61 64 64 5f   exit_begin_add_
37d0: 63 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a 23 65 6e 64  column;.  }.#end
37e0: 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
37f0: 72 65 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  re this is not a
3800: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 41 4c 54  n attempt to ALT
3810: 45 52 20 61 20 76 69 65 77 2e 20 2a 2f 0a 20 20  ER a view. */.  
3820: 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
3830: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
3840: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3850: 20 22 43 61 6e 6e 6f 74 20 61 64 64 20 61 20 63   "Cannot add a c
3860: 6f 6c 75 6d 6e 20 74 6f 20 61 20 76 69 65 77 22  olumn to a view"
3870: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
3880: 5f 62 65 67 69 6e 5f 61 64 64 5f 63 6f 6c 75 6d  _begin_add_colum
3890: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c  n;.  }.  if( SQL
38a0: 49 54 45 5f 4f 4b 21 3d 69 73 41 6c 74 65 72 61  ITE_OK!=isAltera
38b0: 62 6c 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  bleTable(pParse,
38c0: 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f   pTab) ){.    go
38d0: 74 6f 20 65 78 69 74 5f 62 65 67 69 6e 5f 61 64  to exit_begin_ad
38e0: 64 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a 0a 20  d_column;.  }.. 
38f0: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 61   assert( pTab->a
3900: 64 64 43 6f 6c 4f 66 66 73 65 74 3e 30 20 29 3b  ddColOffset>0 );
3910: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
3920: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
3930: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
3940: 3b 0a 0a 20 20 2f 2a 20 50 75 74 20 61 20 63 6f  ;..  /* Put a co
3950: 70 79 20 6f 66 20 74 68 65 20 54 61 62 6c 65 20  py of the Table 
3960: 73 74 72 75 63 74 20 69 6e 20 50 61 72 73 65 2e  struct in Parse.
3970: 70 4e 65 77 54 61 62 6c 65 20 66 6f 72 20 74 68  pNewTable for th
3980: 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 64  e.  ** sqlite3Ad
3990: 64 43 6f 6c 75 6d 6e 28 29 20 66 75 6e 63 74 69  dColumn() functi
39a0: 6f 6e 20 61 6e 64 20 66 72 69 65 6e 64 73 20 74  on and friends t
39b0: 6f 20 6d 6f 64 69 66 79 2e 20 20 42 75 74 20 6d  o modify.  But m
39c0: 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 6e  odify.  ** the n
39d0: 61 6d 65 20 62 79 20 61 64 64 69 6e 67 20 61 6e  ame by adding an
39e0: 20 22 73 71 6c 69 74 65 5f 61 6c 74 65 72 74 61   "sqlite_alterta
39f0: 62 5f 22 20 70 72 65 66 69 78 2e 20 20 42 79 20  b_" prefix.  By 
3a00: 61 64 64 69 6e 67 20 74 68 69 73 0a 20 20 2a 2a  adding this.  **
3a10: 20 70 72 65 66 69 78 2c 20 77 65 20 69 6e 73 75   prefix, we insu
3a20: 72 65 20 74 68 61 74 20 74 68 65 20 6e 61 6d 65  re that the name
3a30: 20 77 69 6c 6c 20 6e 6f 74 20 63 6f 6c 6c 69 64   will not collid
3a40: 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69  e with an existi
3a50: 6e 67 0a 20 20 2a 2a 20 74 61 62 6c 65 20 62 65  ng.  ** table be
3a60: 63 61 75 73 65 20 75 73 65 72 20 74 61 62 6c 65  cause user table
3a70: 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
3a80: 20 74 6f 20 68 61 76 65 20 74 68 65 20 22 73 71   to have the "sq
3a90: 6c 69 74 65 5f 22 0a 20 20 2a 2a 20 70 72 65 66  lite_".  ** pref
3aa0: 69 78 20 6f 6e 20 74 68 65 69 72 20 6e 61 6d 65  ix on their name
3ab0: 2e 0a 20 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20  ..  */.  pNew = 
3ac0: 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 33 44  (Table*)sqlite3D
3ad0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
3ae0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
3af0: 20 20 69 66 28 20 21 70 4e 65 77 20 29 20 67 6f    if( !pNew ) go
3b00: 74 6f 20 65 78 69 74 5f 62 65 67 69 6e 5f 61 64  to exit_begin_ad
3b10: 64 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 70 50 61 72  d_column;.  pPar
3b20: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
3b30: 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 6e 54  pNew;.  pNew->nT
3b40: 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65  abRef = 1;.  pNe
3b50: 77 2d 3e 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  w->nCol = pTab->
3b60: 6e 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  nCol;.  assert( 
3b70: 70 4e 65 77 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a  pNew->nCol>0 );.
3b80: 20 20 6e 41 6c 6c 6f 63 20 3d 20 28 28 28 70 4e    nAlloc = (((pN
3b90: 65 77 2d 3e 6e 43 6f 6c 2d 31 29 2f 38 29 2a 38  ew->nCol-1)/8)*8
3ba0: 29 2b 38 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  )+8;.  assert( n
3bb0: 41 6c 6c 6f 63 3e 3d 70 4e 65 77 2d 3e 6e 43 6f  Alloc>=pNew->nCo
3bc0: 6c 20 26 26 20 6e 41 6c 6c 6f 63 25 38 3d 3d 30  l && nAlloc%8==0
3bd0: 20 26 26 20 6e 41 6c 6c 6f 63 2d 70 4e 65 77 2d   && nAlloc-pNew-
3be0: 3e 6e 43 6f 6c 3c 38 20 29 3b 0a 20 20 70 4e 65  >nCol<8 );.  pNe
3bf0: 77 2d 3e 61 43 6f 6c 20 3d 20 28 43 6f 6c 75 6d  w->aCol = (Colum
3c00: 6e 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  n*)sqlite3DbMall
3c10: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
3c20: 66 28 43 6f 6c 75 6d 6e 29 2a 6e 41 6c 6c 6f 63  f(Column)*nAlloc
3c30: 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  );.  pNew->zName
3c40: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
3c50: 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 6c  f(db, "sqlite_al
3c60: 74 65 72 74 61 62 5f 25 73 22 2c 20 70 54 61 62  tertab_%s", pTab
3c70: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
3c80: 21 70 4e 65 77 2d 3e 61 43 6f 6c 20 7c 7c 20 21  !pNew->aCol || !
3c90: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  pNew->zName ){. 
3ca0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
3cb0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
3cc0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 62 65 67     goto exit_beg
3cd0: 69 6e 5f 61 64 64 5f 63 6f 6c 75 6d 6e 3b 0a 20  in_add_column;. 
3ce0: 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77   }.  memcpy(pNew
3cf0: 2d 3e 61 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43  ->aCol, pTab->aC
3d00: 6f 6c 2c 20 73 69 7a 65 6f 66 28 43 6f 6c 75 6d  ol, sizeof(Colum
3d10: 6e 29 2a 70 4e 65 77 2d 3e 6e 43 6f 6c 29 3b 0a  n)*pNew->nCol);.
3d20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65    for(i=0; i<pNe
3d30: 77 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  w->nCol; i++){. 
3d40: 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20     Column *pCol 
3d50: 3d 20 26 70 4e 65 77 2d 3e 61 43 6f 6c 5b 69 5d  = &pNew->aCol[i]
3d60: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  ;.    pCol->zNam
3d70: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
3d80: 44 75 70 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  Dup(db, pCol->zN
3d90: 61 6d 65 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e  ame);.    pCol->
3da0: 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 70  zColl = 0;.    p
3db0: 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 30 3b 0a  Col->pDflt = 0;.
3dc0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 53 63 68    }.  pNew->pSch
3dd0: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
3de0: 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 4e  b].pSchema;.  pN
3df0: 65 77 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74  ew->addColOffset
3e00: 20 3d 20 70 54 61 62 2d 3e 61 64 64 43 6f 6c 4f   = pTab->addColO
3e10: 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e  ffset;.  pNew->n
3e20: 54 61 62 52 65 66 20 3d 20 31 3b 0a 0a 65 78 69  TabRef = 1;..exi
3e30: 74 5f 62 65 67 69 6e 5f 61 64 64 5f 63 6f 6c 75  t_begin_add_colu
3e40: 6d 6e 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  mn:.  sqlite3Src
3e50: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
3e60: 53 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  Src);.  return;.
3e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
3e80: 65 72 20 70 54 61 62 20 69 73 20 74 68 65 20 73  er pTab is the s
3e90: 75 62 6a 65 63 74 20 6f 66 20 61 6e 20 41 4c 54  ubject of an ALT
3ea0: 45 52 20 54 41 42 4c 45 20 2e 2e 2e 20 52 45 4e  ER TABLE ... REN
3eb0: 41 4d 45 20 43 4f 4c 55 4d 4e 0a 2a 2a 20 63 6f  AME COLUMN.** co
3ec0: 6d 6d 61 6e 64 2e 20 54 68 69 73 20 66 75 6e 63  mmand. This func
3ed0: 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74  tion checks if t
3ee0: 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69  he table is a vi
3ef0: 65 77 20 6f 72 20 76 69 72 74 75 61 6c 0a 2a 2a  ew or virtual.**
3f00: 20 74 61 62 6c 65 20 28 63 6f 6c 75 6d 6e 73 20   table (columns 
3f10: 6f 66 20 76 69 65 77 73 20 6f 72 20 76 69 72 74  of views or virt
3f20: 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e  ual tables may n
3f30: 6f 74 20 62 65 20 72 65 6e 61 6d 65 64 29 2e 20  ot be renamed). 
3f40: 49 66 20 73 6f 2c 0a 2a 2a 20 69 74 20 6c 6f 61  If so,.** it loa
3f50: 64 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ds an error mess
3f60: 61 67 65 20 69 6e 74 6f 20 70 50 61 72 73 65 20  age into pParse 
3f70: 61 6e 64 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  and returns non-
3f80: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  zero..**.** Or, 
3f90: 69 66 20 70 54 61 62 20 69 73 20 6e 6f 74 20 61  if pTab is not a
3fa0: 20 76 69 65 77 20 6f 72 20 76 69 72 74 75 61 6c   view or virtual
3fb0: 20 74 61 62 6c 65 2c 20 7a 65 72 6f 20 69 73 20   table, zero is 
3fc0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 23 69 66  returned..*/.#if
3fd0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3fe0: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
3ff0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4000: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
4010: 29 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 52  ).static int isR
4020: 65 61 6c 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ealTable(Parse *
4030: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
4040: 54 61 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  Tab){.  const ch
4050: 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 23  ar *zType = 0;.#
4060: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4070: 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54  IT_VIEW.  if( pT
4080: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
4090: 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77     zType = "view
40a0: 22 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  ";.  }.#endif.#i
40b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
40c0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
40d0: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
40e0: 54 61 62 29 20 29 7b 0a 20 20 20 20 7a 54 79 70  Tab) ){.    zTyp
40f0: 65 20 3d 20 22 76 69 72 74 75 61 6c 20 74 61 62  e = "virtual tab
4100: 6c 65 22 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  le";.  }.#endif.
4110: 20 20 69 66 28 20 7a 54 79 70 65 20 29 7b 0a 20    if( zType ){. 
4120: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4130: 73 67 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  sg(.        pPar
4140: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 72 65 6e 61  se, "cannot rena
4150: 6d 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 25 73  me columns of %s
4160: 20 5c 22 25 73 5c 22 22 2c 20 7a 54 79 70 65 2c   \"%s\"", zType,
4170: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20   pTab->zName.   
4180: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   );.    return 1
4190: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
41a0: 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 21 64 65  ;.}.#else /* !de
41b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
41c0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
41d0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
41e0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f  VIRTUALTABLE) */
41f0: 0a 23 20 64 65 66 69 6e 65 20 69 73 52 65 61 6c  .# define isReal
4200: 54 61 62 6c 65 28 78 2c 79 29 20 28 30 29 0a 23  Table(x,y) (0).#
4210: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e  endif../*.** Han
4220: 64 6c 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  dles the followi
4230: 6e 67 20 70 61 72 73 65 72 20 72 65 64 75 63 74  ng parser reduct
4240: 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 63 6d 64 20  ion:.**.**  cmd 
4250: 3a 3a 3d 20 41 4c 54 45 52 20 54 41 42 4c 45 20  ::= ALTER TABLE 
4260: 70 53 72 63 20 52 45 4e 41 4d 45 20 43 4f 4c 55  pSrc RENAME COLU
4270: 4d 4e 20 70 4f 6c 64 20 54 4f 20 70 4e 65 77 0a  MN pOld TO pNew.
4280: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
4290: 6c 74 65 72 52 65 6e 61 6d 65 43 6f 6c 75 6d 6e  lterRenameColumn
42a0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
42b0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
42c0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
42d0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
42e0: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4300: 61 62 6c 65 20 62 65 69 6e 67 20 61 6c 74 65 72  able being alter
4310: 65 64 2e 20 20 70 53 72 63 2d 3e 6e 53 72 63 3d  ed.  pSrc->nSrc=
4320: 3d 31 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  =1 */.  Token *p
4330: 4f 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  Old,            
4340: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
4350: 6f 66 20 63 6f 6c 75 6d 6e 20 62 65 69 6e 67 20  of column being 
4360: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 54 6f 6b  changed */.  Tok
4370: 65 6e 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  en *pNew        
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4390: 4e 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  New column name 
43a0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
43b0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
43c0: 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
43d0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
43e0: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69      /* Table bei
4410: 6e 67 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20  ng updated */.  
4420: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
4450: 6d 6e 20 62 65 69 6e 67 20 72 65 6e 61 6d 65 64  mn being renamed
4460: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 6c 64   */.  char *zOld
4470: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
4480: 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20 63 6f 6c        /* Old col
4490: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68  umn name */.  ch
44a0: 61 72 20 2a 7a 4e 65 77 20 3d 20 30 3b 20 20 20  ar *zNew = 0;   
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
44c0: 20 4e 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   New column name
44d0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
44e0: 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
44f0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
4500: 20 73 63 68 65 6d 61 20 63 6f 6e 74 61 69 6e 69   schema containi
4510: 6e 67 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  ng the table */.
4520: 20 20 69 6e 74 20 69 53 63 68 65 6d 61 3b 20 20    int iSchema;  
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
4550: 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 69 6e  e schema */.  in
4560: 74 20 62 51 75 6f 74 65 3b 20 20 20 20 20 20 20  t bQuote;       
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4580: 20 54 72 75 65 20 74 6f 20 71 75 6f 74 65 20 74   True to quote t
4590: 68 65 20 6e 65 77 20 6e 61 6d 65 20 2a 2f 0a 0a  he new name */..
45a0: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
45b0: 74 61 62 6c 65 20 74 6f 20 62 65 20 61 6c 74 65  table to be alte
45c0: 72 65 64 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  red */.  pTab = 
45d0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
45e0: 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
45f0: 2c 20 26 70 53 72 63 2d 3e 61 5b 30 5d 29 3b 0a  , &pSrc->a[0]);.
4600: 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f    if( !pTab ) go
4610: 74 6f 20 65 78 69 74 5f 72 65 6e 61 6d 65 5f 63  to exit_rename_c
4620: 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a 20 43 61 6e  olumn;..  /* Can
4630: 6e 6f 74 20 61 6c 74 65 72 20 61 20 73 79 73 74  not alter a syst
4640: 65 6d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66  em table */.  if
4650: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 69 73 41  ( SQLITE_OK!=isA
4660: 6c 74 65 72 61 62 6c 65 54 61 62 6c 65 28 70 50  lterableTable(pP
4670: 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 67 6f  arse, pTab) ) go
4680: 74 6f 20 65 78 69 74 5f 72 65 6e 61 6d 65 5f 63  to exit_rename_c
4690: 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 53 51 4c  olumn;.  if( SQL
46a0: 49 54 45 5f 4f 4b 21 3d 69 73 52 65 61 6c 54 61  ITE_OK!=isRealTa
46b0: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
46c0: 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 72 65  ) ) goto exit_re
46d0: 6e 61 6d 65 5f 63 6f 6c 75 6d 6e 3b 0a 0a 20 20  name_column;..  
46e0: 2f 2a 20 57 68 69 63 68 20 73 63 68 65 6d 61 20  /* Which schema 
46f0: 68 6f 6c 64 73 20 74 68 65 20 74 61 62 6c 65 20  holds the table 
4700: 74 6f 20 62 65 20 61 6c 74 65 72 65 64 20 2a 2f  to be altered */
4710: 20 20 0a 20 20 69 53 63 68 65 6d 61 20 3d 20 73    .  iSchema = s
4720: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
4730: 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
4740: 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74  chema);.  assert
4750: 28 20 69 53 63 68 65 6d 61 3e 3d 30 20 29 3b 0a  ( iSchema>=0 );.
4760: 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b    zDb = db->aDb[
4770: 69 53 63 68 65 6d 61 5d 2e 7a 44 62 53 4e 61 6d  iSchema].zDbSNam
4780: 65 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e;..#ifndef SQLI
4790: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
47a0: 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 6e 76 6f 6b  ATION.  /* Invok
47b0: 65 20 74 68 65 20 61 75 74 68 6f 72 69 7a 61 74  e the authorizat
47c0: 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e 20 2a 2f  ion callback. */
47d0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
47e0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
47f0: 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42  SQLITE_ALTER_TAB
4800: 4c 45 2c 20 7a 44 62 2c 20 70 54 61 62 2d 3e 7a  LE, zDb, pTab->z
4810: 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  Name, 0) ){.    
4820: 67 6f 74 6f 20 65 78 69 74 5f 72 65 6e 61 6d 65  goto exit_rename
4830: 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a 23 65 6e  _column;.  }.#en
4840: 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  dif..  /* Make s
4850: 75 72 65 20 74 68 65 20 6f 6c 64 20 6e 61 6d 65  ure the old name
4860: 20 72 65 61 6c 6c 79 20 69 73 20 61 20 63 6f 6c   really is a col
4870: 75 6d 6e 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  umn name in the 
4880: 74 61 62 6c 65 20 74 6f 20 62 65 0a 20 20 2a 2a  table to be.  **
4890: 20 61 6c 74 65 72 65 64 2e 20 20 53 65 74 20 69   altered.  Set i
48a0: 43 6f 6c 20 74 6f 20 62 65 20 74 68 65 20 69 6e  Col to be the in
48b0: 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
48c0: 6e 20 62 65 69 6e 67 20 72 65 6e 61 6d 65 64 20  n being renamed 
48d0: 2a 2f 0a 20 20 7a 4f 6c 64 20 3d 20 73 71 6c 69  */.  zOld = sqli
48e0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
48f0: 28 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 69 66  (db, pOld);.  if
4900: 28 20 21 7a 4f 6c 64 20 29 20 67 6f 74 6f 20 65  ( !zOld ) goto e
4910: 78 69 74 5f 72 65 6e 61 6d 65 5f 63 6f 6c 75 6d  xit_rename_colum
4920: 6e 3b 0a 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b  n;.  for(iCol=0;
4930: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
4940: 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 69  ; iCol++){.    i
4950: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
4960: 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  ICmp(pTab->aCol[
4970: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 7a 4f 6c  iCol].zName, zOl
4980: 64 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  d) ) break;.  }.
4990: 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62    if( iCol==pTab
49a0: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 73 71  ->nCol ){.    sq
49b0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
49c0: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63  arse, "no such c
49d0: 6f 6c 75 6d 6e 3a 20 5c 22 25 73 5c 22 22 2c 20  olumn: \"%s\"", 
49e0: 7a 4f 6c 64 29 3b 0a 20 20 20 20 67 6f 74 6f 20  zOld);.    goto 
49f0: 65 78 69 74 5f 72 65 6e 61 6d 65 5f 63 6f 6c 75  exit_rename_colu
4a00: 6d 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  mn;.  }..  /* Do
4a10: 20 74 68 65 20 72 65 6e 61 6d 65 20 6f 70 65 72   the rename oper
4a20: 61 74 69 6f 6e 20 75 73 69 6e 67 20 61 20 72 65  ation using a re
4a30: 63 75 72 73 69 76 65 20 55 50 44 41 54 45 20 73  cursive UPDATE s
4a40: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 20 20  tatement that.  
4a50: 2a 2a 20 75 73 65 73 20 74 68 65 20 73 71 6c 69  ** uses the sqli
4a60: 74 65 5f 72 65 6e 61 6d 65 5f 63 6f 6c 75 6d 6e  te_rename_column
4a70: 28 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  () SQL function 
4a80: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e  to compute the n
4a90: 65 77 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 73  ew.  ** CREATE s
4aa0: 74 61 74 65 6d 65 6e 74 20 74 65 78 74 20 66 6f  tatement text fo
4ab0: 72 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  r the sqlite_mas
4ac0: 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ter table..  */.
4ad0: 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
4ae0: 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7a 4e 65  t(pParse);.  zNe
4af0: 77 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  w = sqlite3NameF
4b00: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 65  romToken(db, pNe
4b10: 77 29 3b 0a 20 20 69 66 28 20 21 7a 4e 65 77 20  w);.  if( !zNew 
4b20: 29 20 67 6f 74 6f 20 65 78 69 74 5f 72 65 6e 61  ) goto exit_rena
4b30: 6d 65 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 61 73 73  me_column;.  ass
4b40: 65 72 74 28 20 70 4e 65 77 2d 3e 6e 3e 30 20 29  ert( pNew->n>0 )
4b50: 3b 0a 20 20 62 51 75 6f 74 65 20 3d 20 73 71 6c  ;.  bQuote = sql
4b60: 69 74 65 33 49 73 71 75 6f 74 65 28 70 4e 65 77  ite3Isquote(pNew
4b70: 2d 3e 7a 5b 30 5d 29 3b 0a 20 20 73 71 6c 69 74  ->z[0]);.  sqlit
4b80: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
4b90: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 55 50  arse, .      "UP
4ba0: 44 41 54 45 20 5c 22 25 77 5c 22 2e 25 73 20 53  DATE \"%w\".%s S
4bb0: 45 54 20 22 0a 20 20 20 20 20 20 22 73 71 6c 20  ET ".      "sql 
4bc0: 3d 20 73 71 6c 69 74 65 5f 72 65 6e 61 6d 65 5f  = sqlite_rename_
4bd0: 63 6f 6c 75 6d 6e 28 73 71 6c 2c 20 74 79 70 65  column(sql, type
4be0: 2c 20 6e 61 6d 65 2c 20 25 51 2c 20 25 51 2c 20  , name, %Q, %Q, 
4bf0: 25 64 2c 20 25 51 2c 20 25 64 2c 20 25 64 29 20  %d, %Q, %d, %d) 
4c00: 22 0a 20 20 20 20 20 20 22 57 48 45 52 45 20 6e  ".      "WHERE n
4c10: 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71  ame NOT LIKE 'sq
4c20: 6c 69 74 65 58 5f 25 25 27 20 45 53 43 41 50 45  liteX_%%' ESCAPE
4c30: 20 27 58 27 20 22 0a 20 20 20 20 20 20 22 20 41   'X' ".      " A
4c40: 4e 44 20 28 74 79 70 65 20 21 3d 20 27 69 6e 64  ND (type != 'ind
4c50: 65 78 27 20 4f 52 20 74 62 6c 5f 6e 61 6d 65 20  ex' OR tbl_name 
4c60: 3d 20 25 51 29 22 0a 20 20 20 20 20 20 22 20 41  = %Q)".      " A
4c70: 4e 44 20 73 71 6c 20 4e 4f 54 20 4c 49 4b 45 20  ND sql NOT LIKE 
4c80: 27 63 72 65 61 74 65 20 76 69 72 74 75 61 6c 25  'create virtual%
4c90: 25 27 22 2c 0a 20 20 20 20 20 20 7a 44 62 2c 20  %'",.      zDb, 
4ca0: 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 0a 20 20  MASTER_NAME, .  
4cb0: 20 20 20 20 7a 44 62 2c 20 70 54 61 62 2d 3e 7a      zDb, pTab->z
4cc0: 4e 61 6d 65 2c 20 69 43 6f 6c 2c 20 7a 4e 65 77  Name, iCol, zNew
4cd0: 2c 20 62 51 75 6f 74 65 2c 20 69 53 63 68 65 6d  , bQuote, iSchem
4ce0: 61 3d 3d 31 2c 0a 20 20 20 20 20 20 70 54 61 62  a==1,.      pTab
4cf0: 2d 3e 7a 4e 61 6d 65 0a 20 20 29 3b 0a 0a 20 20  ->zName.  );..  
4d00: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
4d10: 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
4d20: 20 20 22 55 50 44 41 54 45 20 74 65 6d 70 2e 25    "UPDATE temp.%
4d30: 73 20 53 45 54 20 22 0a 20 20 20 20 20 20 22 73  s SET ".      "s
4d40: 71 6c 20 3d 20 73 71 6c 69 74 65 5f 72 65 6e 61  ql = sqlite_rena
4d50: 6d 65 5f 63 6f 6c 75 6d 6e 28 73 71 6c 2c 20 74  me_column(sql, t
4d60: 79 70 65 2c 20 6e 61 6d 65 2c 20 25 51 2c 20 25  ype, name, %Q, %
4d70: 51 2c 20 25 64 2c 20 25 51 2c 20 25 64 2c 20 31  Q, %d, %Q, %d, 1
4d80: 29 20 22 0a 20 20 20 20 20 20 22 57 48 45 52 45  ) ".      "WHERE
4d90: 20 74 79 70 65 20 49 4e 20 28 27 74 72 69 67 67   type IN ('trigg
4da0: 65 72 27 2c 20 27 76 69 65 77 27 29 22 2c 0a 20  er', 'view')",. 
4db0: 20 20 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d 45       MASTER_NAME
4dc0: 2c 20 0a 20 20 20 20 20 20 7a 44 62 2c 20 70 54  , .      zDb, pT
4dd0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 69 43 6f 6c 2c  ab->zName, iCol,
4de0: 20 7a 4e 65 77 2c 20 62 51 75 6f 74 65 0a 20 20   zNew, bQuote.  
4df0: 29 3b 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6e  );..  /* Drop an
4e00: 64 20 72 65 6c 6f 61 64 20 74 68 65 20 64 61 74  d reload the dat
4e10: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 2a 2f  abase schema. */
4e20: 0a 20 20 72 65 6e 61 6d 65 52 65 6c 6f 61 64 53  .  renameReloadS
4e30: 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 53  chema(pParse, iS
4e40: 63 68 65 6d 61 29 3b 0a 20 20 72 65 6e 61 6d 65  chema);.  rename
4e50: 54 65 73 74 53 63 68 65 6d 61 28 70 50 61 72 73  TestSchema(pPars
4e60: 65 2c 20 7a 44 62 2c 20 69 53 63 68 65 6d 61 3d  e, zDb, iSchema=
4e70: 3d 31 29 3b 0a 0a 20 65 78 69 74 5f 72 65 6e 61  =1);.. exit_rena
4e80: 6d 65 5f 63 6f 6c 75 6d 6e 3a 0a 20 20 73 71 6c  me_column:.  sql
4e90: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
4ea0: 65 28 64 62 2c 20 70 53 72 63 29 3b 0a 20 20 73  e(db, pSrc);.  s
4eb0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4ec0: 20 7a 4f 6c 64 29 3b 0a 20 20 73 71 6c 69 74 65   zOld);.  sqlite
4ed0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 65 77  3DbFree(db, zNew
4ee0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
4ef0: 2f 2a 0a 2a 2a 20 45 61 63 68 20 52 65 6e 61 6d  /*.** Each Renam
4f00: 65 54 6f 6b 65 6e 20 6f 62 6a 65 63 74 20 6d 61  eToken object ma
4f10: 70 73 20 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66  ps an element of
4f20: 20 74 68 65 20 70 61 72 73 65 20 74 72 65 65 20   the parse tree 
4f30: 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 74 6f 6b 65  into.** the toke
4f40: 6e 20 74 68 61 74 20 67 65 6e 65 72 61 74 65 64  n that generated
4f50: 20 74 68 61 74 20 65 6c 65 6d 65 6e 74 2e 20 20   that element.  
4f60: 54 68 65 20 70 61 72 73 65 20 74 72 65 65 20 65  The parse tree e
4f70: 6c 65 6d 65 6e 74 0a 2a 2a 20 6d 69 67 68 74 20  lement.** might 
4f80: 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a  be one of:.**.**
4f90: 20 20 20 20 20 2a 20 20 41 20 70 6f 69 6e 74 65       *  A pointe
4fa0: 72 20 74 6f 20 61 6e 20 45 78 70 72 20 74 68 61  r to an Expr tha
4fb0: 74 20 72 65 70 72 65 73 65 6e 74 73 20 61 6e 20  t represents an 
4fc0: 49 44 0a 2a 2a 20 20 20 20 20 2a 20 20 54 68 65  ID.**     *  The
4fd0: 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   name of a table
4fe0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 43 6f 6c 75 6d   column in Colum
4ff0: 6e 2e 7a 4e 61 6d 65 0a 2a 2a 0a 2a 2a 20 41 20  n.zName.**.** A 
5000: 6c 69 73 74 20 6f 66 20 52 65 6e 61 6d 65 54 6f  list of RenameTo
5010: 6b 65 6e 20 6f 62 6a 65 63 74 73 20 63 61 6e 20  ken objects can 
5020: 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 64  be constructed d
5030: 75 72 69 6e 67 20 70 61 72 73 69 6e 67 2e 0a 2a  uring parsing..*
5040: 2a 20 45 61 63 68 20 6e 65 77 20 6f 62 6a 65 63  * Each new objec
5050: 74 20 69 73 20 63 72 65 61 74 65 64 20 62 79 20  t is created by 
5060: 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
5070: 65 6e 4d 61 70 28 29 2e 0a 2a 2a 20 41 73 20 74  enMap()..** As t
5080: 68 65 20 70 61 72 73 65 20 74 72 65 65 20 69 73  he parse tree is
5090: 20 74 72 61 6e 73 66 6f 72 6d 65 64 2c 20 74 68   transformed, th
50a0: 65 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54  e sqlite3RenameT
50b0: 6f 6b 65 6e 52 65 6d 61 70 28 29 0a 2a 2a 20 72  okenRemap().** r
50c0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
50d0: 6f 20 6b 65 65 70 20 74 68 65 20 6d 61 70 70 69  o keep the mappi
50e0: 6e 67 20 63 75 72 72 65 6e 74 2e 0a 2a 2a 0a 2a  ng current..**.*
50f0: 2a 20 41 66 74 65 72 20 74 68 65 20 70 61 72 73  * After the pars
5100: 65 20 66 69 6e 69 73 68 65 73 2c 20 72 65 6e 61  e finishes, rena
5110: 6d 65 54 6f 6b 65 6e 46 69 6e 64 28 29 20 72 6f  meTokenFind() ro
5120: 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
5130: 64 0a 2a 2a 20 74 6f 20 6c 6f 6f 6b 20 75 70 20  d.** to look up 
5140: 74 68 65 20 61 63 74 75 61 6c 20 74 6f 6b 65 6e  the actual token
5150: 20 76 61 6c 75 65 20 74 68 61 74 20 63 72 65 61   value that crea
5160: 74 65 64 20 73 6f 6d 65 20 65 6c 65 6d 65 6e 74  ted some element
5170: 20 69 6e 0a 2a 2a 20 74 68 65 20 70 61 72 73 65   in.** the parse
5180: 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 72 75 63 74   tree..*/.struct
5190: 20 52 65 6e 61 6d 65 54 6f 6b 65 6e 20 7b 0a 20   RenameToken {. 
51a0: 20 76 6f 69 64 20 2a 70 3b 20 20 20 20 20 20 20   void *p;       
51b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
51c0: 20 74 72 65 65 20 65 6c 65 6d 65 6e 74 20 63 72   tree element cr
51d0: 65 61 74 65 64 20 62 79 20 74 6f 6b 65 6e 20 74  eated by token t
51e0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 74 3b 20 20   */.  Token t;  
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5200: 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 63  The token that c
5210: 72 65 61 74 65 64 20 70 61 72 73 65 20 74 72 65  reated parse tre
5220: 65 20 65 6c 65 6d 65 6e 74 20 70 20 2a 2f 0a 20  e element p */. 
5230: 20 52 65 6e 61 6d 65 54 6f 6b 65 6e 20 2a 70 4e   RenameToken *pN
5240: 65 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20  ext;    /* Next 
5250: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c  is a list of all
5260: 20 52 65 6e 61 6d 65 54 6f 6b 65 6e 20 6f 62 6a   RenameToken obj
5270: 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ects */.};../*.*
5280: 2a 20 54 68 65 20 63 6f 6e 74 65 78 74 20 6f 66  * The context of
5290: 20 61 6e 20 41 4c 54 45 52 20 54 41 42 4c 45 20   an ALTER TABLE 
52a0: 52 45 4e 41 4d 45 20 43 4f 4c 55 4d 4e 20 6f 70  RENAME COLUMN op
52b0: 65 72 61 74 69 6f 6e 20 74 68 61 74 20 67 65 74  eration that get
52c0: 73 20 70 61 73 73 65 64 0a 2a 2a 20 64 6f 77 6e  s passed.** down
52d0: 20 69 6e 74 6f 20 74 68 65 20 57 61 6c 6b 65 72   into the Walker
52e0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
52f0: 75 63 74 20 52 65 6e 61 6d 65 43 74 78 20 52 65  uct RenameCtx Re
5300: 6e 61 6d 65 43 74 78 3b 0a 73 74 72 75 63 74 20  nameCtx;.struct 
5310: 52 65 6e 61 6d 65 43 74 78 20 7b 0a 20 20 52 65  RenameCtx {.  Re
5320: 6e 61 6d 65 54 6f 6b 65 6e 20 2a 70 4c 69 73 74  nameToken *pList
5330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
5340: 20 4c 69 73 74 20 6f 66 20 74 6f 6b 65 6e 73 20   List of tokens 
5350: 74 6f 20 6f 76 65 72 77 72 69 74 65 20 2a 2f 0a  to overwrite */.
5360: 20 20 69 6e 74 20 6e 4c 69 73 74 3b 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 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
5390: 6f 6b 65 6e 73 20 69 6e 20 70 4c 69 73 74 20 2a  okens in pList *
53a0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 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 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
53d0: 63 6f 6c 75 6d 6e 20 62 65 69 6e 67 20 72 65 6e  column being ren
53e0: 61 6d 65 64 20 2a 2f 0a 20 20 54 61 62 6c 65 20  amed */.  Table 
53f0: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  *pTab;          
5400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
5410: 6c 65 20 62 65 69 6e 67 20 41 4c 54 45 52 65 64  le being ALTERed
5420: 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 63 68 61   */ .  const cha
5430: 72 20 2a 7a 4f 6c 64 3b 20 20 20 20 20 20 20 20  r *zOld;        
5440: 20 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20 63 6f         /* Old co
5450: 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a  lumn name */.};.
5460: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
5470: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EBUG./*.** This 
5480: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
5490: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 20   for debugging. 
54a0: 49 74 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20  It performs two 
54b0: 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  tasks:.**.**   1
54c0: 2e 20 43 68 65 63 6b 73 20 74 68 61 74 20 70 6f  . Checks that po
54d0: 69 6e 74 65 72 20 70 50 74 72 20 64 6f 65 73 20  inter pPtr does 
54e0: 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 70 70 65  not already appe
54f0: 61 72 20 69 6e 20 74 68 65 20 0a 2a 2a 20 20 20  ar in the .**   
5500: 20 20 20 72 65 6e 61 6d 65 2d 74 6f 6b 65 6e 20     rename-token 
5510: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e  list..**.**   2.
5520: 20 44 65 72 65 66 65 72 65 6e 63 65 73 20 65 61   Dereferences ea
5530: 63 68 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ch pointer in th
5540: 65 20 72 65 6e 61 6d 65 2d 74 6f 6b 65 6e 20 6c  e rename-token l
5550: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ist..**.** The s
5560: 65 63 6f 6e 64 20 69 73 20 6d 6f 73 74 20 65 66  econd is most ef
5570: 66 65 63 74 69 76 65 20 77 68 65 6e 20 64 65 62  fective when deb
5580: 75 67 67 69 6e 67 20 75 6e 64 65 72 20 76 61 6c  ugging under val
5590: 67 72 69 6e 64 20 6f 72 0a 2a 2a 20 61 64 64 72  grind or.** addr
55a0: 65 73 73 2d 73 61 6e 69 74 69 7a 65 72 20 6f 72  ess-sanitizer or
55b0: 20 73 69 6d 69 6c 61 72 2e 20 49 66 20 61 6e 79   similar. If any
55c0: 20 6f 66 20 74 68 65 73 65 20 70 6f 69 6e 74 65   of these pointe
55d0: 72 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 2a 2a  rs no longer .**
55e0: 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64 20   point to valid 
55f0: 6f 62 6a 65 63 74 73 2c 20 61 6e 20 65 78 63 65  objects, an exce
5600: 70 74 69 6f 6e 20 69 73 20 72 61 69 73 65 64 20  ption is raised 
5610: 62 79 20 74 68 65 20 6d 65 6d 6f 72 79 2d 63 68  by the memory-ch
5620: 65 63 6b 69 6e 67 20 0a 2a 2a 20 74 6f 6f 6c 2e  ecking .** tool.
5630: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
5640: 20 6f 66 20 74 68 69 73 20 69 73 20 74 6f 20 70   of this is to p
5650: 72 65 76 65 6e 74 20 63 6f 6d 70 61 72 69 73 6f  revent compariso
5660: 6e 73 20 6f 66 20 69 6e 76 61 6c 69 64 20 70 6f  ns of invalid po
5670: 69 6e 74 65 72 20 76 61 6c 75 65 73 2e 0a 2a 2a  inter values..**
5680: 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69   Even though thi
5690: 73 20 61 6c 77 61 79 73 20 73 65 65 6d 73 20 74  s always seems t
56a0: 6f 20 77 6f 72 6b 2c 20 69 74 20 69 73 20 75 6e  o work, it is un
56b0: 64 65 66 69 6e 65 64 20 61 63 63 6f 72 64 69 6e  defined accordin
56c0: 67 20 74 6f 20 74 68 65 0a 2a 2a 20 43 20 73 74  g to the.** C st
56d0: 61 6e 64 61 72 64 2e 20 45 78 61 6d 70 6c 65 20  andard. Example 
56e0: 6f 66 20 75 6e 64 65 66 69 6e 65 64 20 63 6f 6d  of undefined com
56f0: 70 61 72 69 73 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20  parison:.**.**  
5700: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5710: 78 29 3b 0a 2a 2a 20 20 20 20 20 69 66 28 20 78  x);.**     if( x
5720: 3d 3d 79 20 29 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  ==y ) ....**.** 
5730: 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 61 73 20  Technically, as 
5740: 78 20 6e 6f 20 6c 6f 6e 67 65 72 20 70 6f 69 6e  x no longer poin
5750: 74 73 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20  ts into a valid 
5760: 6f 62 6a 65 63 74 20 6f 72 20 74 6f 20 74 68 65  object or to the
5770: 20 62 79 74 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69   byte.** followi
5780: 6e 67 20 61 20 76 61 6c 69 64 20 6f 62 6a 65 63  ng a valid objec
5790: 74 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65  t, it may not be
57a0: 20 75 73 65 64 20 69 6e 20 63 6f 6d 70 61 72 69   used in compari
57b0: 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  son operations..
57c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
57d0: 65 6e 61 6d 65 54 6f 6b 65 6e 43 68 65 63 6b 41  enameTokenCheckA
57e0: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
57f0: 2c 20 76 6f 69 64 20 2a 70 50 74 72 29 7b 0a 20  , void *pPtr){. 
5800: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
5810: 72 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  r==0 && pParse->
5820: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5830: 3d 3d 30 20 29 7b 0a 20 20 20 20 52 65 6e 61 6d  ==0 ){.    Renam
5840: 65 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 20 20 75  eToken *p;.    u
5850: 38 20 69 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  8 i = 0;.    for
5860: 28 70 3d 70 50 61 72 73 65 2d 3e 70 52 65 6e 61  (p=pParse->pRena
5870: 6d 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  me; p; p=p->pNex
5880: 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  t){.      if( p-
5890: 3e 70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  >p ){.        as
58a0: 73 65 72 74 28 20 70 2d 3e 70 21 3d 70 50 74 72  sert( p->p!=pPtr
58b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d   );.        i +=
58c0: 20 2a 28 75 38 2a 29 28 70 2d 3e 70 29 3b 0a 20   *(u8*)(p->p);. 
58d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
58e0: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
58f0: 65 20 72 65 6e 61 6d 65 54 6f 6b 65 6e 43 68 65  e renameTokenChe
5900: 63 6b 41 6c 6c 28 78 2c 79 29 0a 23 65 6e 64 69  ckAll(x,y).#endi
5910: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  f../*.** Remembe
5920: 72 20 74 68 61 74 20 74 68 65 20 70 61 72 73 65  r that the parse
5930: 72 20 74 72 65 65 20 65 6c 65 6d 65 6e 74 20 70  r tree element p
5940: 50 74 72 20 77 61 73 20 63 72 65 61 74 65 64 20  Ptr was created 
5950: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 6b  using.** the tok
5960: 65 6e 20 70 54 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a  en pToken..**.**
5970: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
5980: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   construct a new
5990: 20 52 65 6e 61 6d 65 54 6f 6b 65 6e 20 6f 62 6a   RenameToken obj
59a0: 65 63 74 20 61 6e 64 20 61 64 64 20 69 74 0a 2a  ect and add it.*
59b0: 2a 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  * to the list of
59c0: 20 52 65 6e 61 6d 65 54 6f 6b 65 6e 20 6f 62 6a   RenameToken obj
59d0: 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 62  ects currently b
59e0: 65 69 6e 67 20 62 75 69 6c 74 20 75 70 0a 2a 2a  eing built up.**
59f0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 52 65 6e   in pParse->pRen
5a00: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ame..**.** The p
5a10: 50 74 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20  Ptr argument is 
5a20: 72 65 74 75 72 6e 65 64 20 73 6f 20 74 68 61 74  returned so that
5a30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
5a40: 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 77 69 74  n be used.** wit
5a50: 68 20 74 61 69 6c 20 72 65 63 75 72 73 69 6f 6e  h tail recursion
5a60: 20 69 6e 20 74 6f 6b 65 6e 45 78 70 72 28 29 20   in tokenExpr() 
5a70: 72 6f 75 74 69 6e 65 2c 20 66 6f 72 20 61 20 73  routine, for a s
5a80: 6d 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65  mall performance
5a90: 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  .** improvement.
5aa0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
5ab0: 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28  3RenameTokenMap(
5ac0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 76  Parse *pParse, v
5ad0: 6f 69 64 20 2a 70 50 74 72 2c 20 54 6f 6b 65 6e  oid *pPtr, Token
5ae0: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 52 65 6e   *pToken){.  Ren
5af0: 61 6d 65 54 6f 6b 65 6e 20 2a 70 4e 65 77 3b 0a  ameToken *pNew;.
5b00: 20 20 61 73 73 65 72 74 28 20 70 50 74 72 20 7c    assert( pPtr |
5b10: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
5b20: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
5b30: 72 65 6e 61 6d 65 54 6f 6b 65 6e 43 68 65 63 6b  renameTokenCheck
5b40: 41 6c 6c 28 70 50 61 72 73 65 2c 20 70 50 74 72  All(pParse, pPtr
5b50: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
5b60: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
5b70: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
5b80: 6f 66 28 52 65 6e 61 6d 65 54 6f 6b 65 6e 29 29  of(RenameToken))
5b90: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
5ba0: 20 20 20 20 70 4e 65 77 2d 3e 70 20 3d 20 70 50      pNew->p = pP
5bb0: 74 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 20  tr;.    pNew->t 
5bc0: 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 70  = *pToken;.    p
5bd0: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61  New->pNext = pPa
5be0: 72 73 65 2d 3e 70 52 65 6e 61 6d 65 3b 0a 20 20  rse->pRename;.  
5bf0: 20 20 70 50 61 72 73 65 2d 3e 70 52 65 6e 61 6d    pParse->pRenam
5c00: 65 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20  e = pNew;.  }.. 
5c10: 20 72 65 74 75 72 6e 20 70 50 74 72 3b 0a 7d 0a   return pPtr;.}.
5c20: 0a 2f 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  ./*.** It is ass
5c30: 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
5c40: 69 73 20 61 6c 72 65 61 64 79 20 61 20 52 65 6e  is already a Ren
5c50: 61 6d 65 54 6f 6b 65 6e 20 6f 62 6a 65 63 74 20  ameToken object 
5c60: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
5c70: 74 68 20 70 61 72 73 65 20 74 72 65 65 20 65 6c  th parse tree el
5c80: 65 6d 65 6e 74 20 70 46 72 6f 6d 2e 20 54 68 69  ement pFrom. Thi
5c90: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6d 61 70  s function remap
5ca0: 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
5cb0: 20 74 6f 6b 65 6e 0a 2a 2a 20 74 6f 20 70 61 72   token.** to par
5cc0: 73 65 20 74 72 65 65 20 65 6c 65 6d 65 6e 74 20  se tree element 
5cd0: 70 54 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  pTo..*/.void sql
5ce0: 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52  ite3RenameTokenR
5cf0: 65 6d 61 70 28 50 61 72 73 65 20 2a 70 50 61 72  emap(Parse *pPar
5d00: 73 65 2c 20 76 6f 69 64 20 2a 70 54 6f 2c 20 76  se, void *pTo, v
5d10: 6f 69 64 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 52  oid *pFrom){.  R
5d20: 65 6e 61 6d 65 54 6f 6b 65 6e 20 2a 70 3b 0a 20  enameToken *p;. 
5d30: 20 72 65 6e 61 6d 65 54 6f 6b 65 6e 43 68 65 63   renameTokenChec
5d40: 6b 41 6c 6c 28 70 50 61 72 73 65 2c 20 70 54 6f  kAll(pParse, pTo
5d50: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 72 73  );.  for(p=pPars
5d60: 65 2d 3e 70 52 65 6e 61 6d 65 3b 20 70 3b 20 70  e->pRename; p; p
5d70: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
5d80: 69 66 28 20 70 2d 3e 70 3d 3d 70 46 72 6f 6d 20  if( p->p==pFrom 
5d90: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 20 3d 20  ){.      p->p = 
5da0: 70 54 6f 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  pTo;.      break
5db0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
5dc0: 2a 0a 2a 2a 20 57 61 6c 6b 65 72 20 63 61 6c 6c  *.** Walker call
5dd0: 62 61 63 6b 20 75 73 65 64 20 62 79 20 73 71 6c  back used by sql
5de0: 69 74 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e  ite3RenameExprUn
5df0: 6d 61 70 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  map()..*/.static
5e00: 20 69 6e 74 20 72 65 6e 61 6d 65 55 6e 6d 61 70   int renameUnmap
5e10: 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a 70  ExprCb(Walker *p
5e20: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
5e30: 78 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  xpr){.  Parse *p
5e40: 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
5e50: 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74  >pParse;.  sqlit
5e60: 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d  e3RenameTokenRem
5e70: 61 70 28 70 50 61 72 73 65 2c 20 30 2c 20 28 76  ap(pParse, 0, (v
5e80: 6f 69 64 2a 29 70 45 78 70 72 29 3b 0a 20 20 72  oid*)pExpr);.  r
5e90: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
5ea0: 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c  ue;.}../*.** Wal
5eb0: 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 75 73 65  ker callback use
5ec0: 64 20 62 79 20 73 71 6c 69 74 65 33 52 65 6e 61  d by sqlite3Rena
5ed0: 6d 65 45 78 70 72 55 6e 6d 61 70 28 29 2e 0a 2a  meExprUnmap()..*
5ee0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6e  /.static int ren
5ef0: 61 6d 65 55 6e 6d 61 70 53 65 6c 65 63 74 43 62  ameUnmapSelectCb
5f00: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
5f10: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
5f20: 69 66 28 20 41 4c 57 41 59 53 28 70 2d 3e 70 53  if( ALWAYS(p->pS
5f30: 72 63 29 20 29 7b 20 20 2f 2a 20 45 76 65 72 79  rc) ){  /* Every
5f40: 20 53 65 6c 65 63 74 20 61 73 20 61 20 53 72 63   Select as a Src
5f50: 4c 69 73 74 2c 20 65 76 65 6e 20 69 66 20 69 74  List, even if it
5f60: 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20   is empty */.   
5f70: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
5f80: 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
5f90: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
5fa0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70   for(i=0; i<p->p
5fb0: 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
5fc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
5fd0: 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70  nameTokenRemap(p
5fe0: 50 61 72 73 65 2c 20 30 2c 20 28 76 6f 69 64 2a  Parse, 0, (void*
5ff0: 29 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 7a  )p->pSrc->a[0].z
6000: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
6010: 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
6020: 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
6030: 20 52 65 6d 6f 76 65 20 61 6c 6c 20 6e 6f 64 65   Remove all node
6040: 73 20 74 68 61 74 20 61 72 65 20 70 61 72 74 20  s that are part 
6050: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  of expression pE
6060: 78 70 72 20 66 72 6f 6d 20 74 68 65 20 72 65 6e  xpr from the ren
6070: 61 6d 65 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ame list..*/.voi
6080: 64 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 45  d sqlite3RenameE
6090: 78 70 72 55 6e 6d 61 70 28 50 61 72 73 65 20 2a  xprUnmap(Parse *
60a0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
60b0: 78 70 72 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73  xpr){.  Walker s
60c0: 57 61 6c 6b 65 72 3b 0a 20 20 6d 65 6d 73 65 74  Walker;.  memset
60d0: 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69  (&sWalker, 0, si
60e0: 7a 65 6f 66 28 57 61 6c 6b 65 72 29 29 3b 0a 20  zeof(Walker));. 
60f0: 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20   sWalker.pParse 
6100: 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c  = pParse;.  sWal
6110: 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
6120: 6b 20 3d 20 72 65 6e 61 6d 65 55 6e 6d 61 70 45  k = renameUnmapE
6130: 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72  xprCb;.  sWalker
6140: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
6150: 20 3d 20 72 65 6e 61 6d 65 55 6e 6d 61 70 53 65   = renameUnmapSe
6160: 6c 65 63 74 43 62 3b 0a 20 20 73 71 6c 69 74 65  lectCb;.  sqlite
6170: 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b  3WalkExpr(&sWalk
6180: 65 72 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  er, pExpr);.}../
6190: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20  *.** Remove all 
61a0: 6e 6f 64 65 73 20 74 68 61 74 20 61 72 65 20 70  nodes that are p
61b0: 61 72 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  art of expressio
61c0: 6e 2d 6c 69 73 74 20 70 45 4c 69 73 74 20 66 72  n-list pEList fr
61d0: 6f 6d 20 74 68 65 20 0a 2a 2a 20 72 65 6e 61 6d  om the .** renam
61e0: 65 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  e list..*/.void 
61f0: 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 45 78 70  sqlite3RenameExp
6200: 72 6c 69 73 74 55 6e 6d 61 70 28 50 61 72 73 65  rlistUnmap(Parse
6210: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
6220: 73 74 20 2a 70 45 4c 69 73 74 29 7b 0a 20 20 69  st *pEList){.  i
6230: 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20  f( pEList ){.   
6240: 20 69 6e 74 20 69 3b 0a 20 20 20 20 57 61 6c 6b   int i;.    Walk
6250: 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20 20 20  er sWalker;.    
6260: 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c  memset(&sWalker,
6270: 20 30 2c 20 73 69 7a 65 6f 66 28 57 61 6c 6b 65   0, sizeof(Walke
6280: 72 29 29 3b 0a 20 20 20 20 73 57 61 6c 6b 65 72  r));.    sWalker
6290: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
62a0: 3b 0a 20 20 20 20 73 57 61 6c 6b 65 72 2e 78 45  ;.    sWalker.xE
62b0: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65  xprCallback = re
62c0: 6e 61 6d 65 55 6e 6d 61 70 45 78 70 72 43 62 3b  nameUnmapExprCb;
62d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
62e0: 45 78 70 72 4c 69 73 74 28 26 73 57 61 6c 6b 65  ExprList(&sWalke
62f0: 72 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  r, pEList);.    
6300: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
6310: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
6320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e        sqlite3Ren
6330: 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50  ameTokenRemap(pP
6340: 61 72 73 65 2c 20 30 2c 20 28 76 6f 69 64 2a 29  arse, 0, (void*)
6350: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
6360: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  me);.    }.  }.}
6370: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
6380: 20 6c 69 73 74 20 6f 66 20 52 65 6e 61 6d 65 54   list of RenameT
6390: 6f 6b 65 6e 20 6f 62 6a 65 63 74 73 20 67 69 76  oken objects giv
63a0: 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64  en in the second
63b0: 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61   argument.*/.sta
63c0: 74 69 63 20 76 6f 69 64 20 72 65 6e 61 6d 65 54  tic void renameT
63d0: 6f 6b 65 6e 46 72 65 65 28 73 71 6c 69 74 65 33  okenFree(sqlite3
63e0: 20 2a 64 62 2c 20 52 65 6e 61 6d 65 54 6f 6b 65   *db, RenameToke
63f0: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 52 65  n *pToken){.  Re
6400: 6e 61 6d 65 54 6f 6b 65 6e 20 2a 70 4e 65 78 74  nameToken *pNext
6410: 3b 0a 20 20 52 65 6e 61 6d 65 54 6f 6b 65 6e 20  ;.  RenameToken 
6420: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 6f 6b  *p;.  for(p=pTok
6430: 65 6e 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b  en; p; p=pNext){
6440: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e  .    pNext = p->
6450: 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
6460: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
6470: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
6480: 61 72 63 68 20 74 68 65 20 50 61 72 73 65 20 6f  arch the Parse o
6490: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
64a0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
64b0: 6e 74 20 66 6f 72 20 61 20 52 65 6e 61 6d 65 54  nt for a RenameT
64c0: 6f 6b 65 6e 0a 2a 2a 20 6f 62 6a 65 63 74 20 61  oken.** object a
64d0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
64e0: 61 72 73 65 20 74 72 65 65 20 65 6c 65 6d 65 6e  arse tree elemen
64f0: 74 20 70 50 74 72 2e 20 49 66 20 66 6f 75 6e 64  t pPtr. If found
6500: 2c 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66  , remove it.** f
6510: 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62  rom the Parse ob
6520: 6a 65 63 74 20 61 6e 64 20 61 64 64 20 69 74 20  ject and add it 
6530: 74 6f 20 74 68 65 20 6c 69 73 74 20 6d 61 69 6e  to the list main
6540: 74 61 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  tained by the.**
6550: 20 52 65 6e 61 6d 65 43 74 78 20 6f 62 6a 65 63   RenameCtx objec
6560: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
6570: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
6580: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6590: 72 65 6e 61 6d 65 54 6f 6b 65 6e 46 69 6e 64 28  renameTokenFind(
65a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
65b0: 74 72 75 63 74 20 52 65 6e 61 6d 65 43 74 78 20  truct RenameCtx 
65c0: 2a 70 43 74 78 2c 20 76 6f 69 64 20 2a 70 50 74  *pCtx, void *pPt
65d0: 72 29 7b 0a 20 20 52 65 6e 61 6d 65 54 6f 6b 65  r){.  RenameToke
65e0: 6e 20 2a 2a 70 70 3b 0a 20 20 61 73 73 65 72 74  n **pp;.  assert
65f0: 28 20 70 50 74 72 21 3d 30 20 29 3b 0a 20 20 66  ( pPtr!=0 );.  f
6600: 6f 72 28 70 70 3d 26 70 50 61 72 73 65 2d 3e 70  or(pp=&pParse->p
6610: 52 65 6e 61 6d 65 3b 20 28 2a 70 70 29 3b 20 70  Rename; (*pp); p
6620: 70 3d 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  p=&(*pp)->pNext)
6630: 7b 0a 20 20 20 20 69 66 28 20 28 2a 70 70 29 2d  {.    if( (*pp)-
6640: 3e 70 3d 3d 70 50 74 72 20 29 7b 0a 20 20 20 20  >p==pPtr ){.    
6650: 20 20 52 65 6e 61 6d 65 54 6f 6b 65 6e 20 2a 70    RenameToken *p
6660: 54 6f 6b 65 6e 20 3d 20 2a 70 70 3b 0a 20 20 20  Token = *pp;.   
6670: 20 20 20 2a 70 70 20 3d 20 70 54 6f 6b 65 6e 2d     *pp = pToken-
6680: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 54  >pNext;.      pT
6690: 6f 6b 65 6e 2d 3e 70 4e 65 78 74 20 3d 20 70 43  oken->pNext = pC
66a0: 74 78 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  tx->pList;.     
66b0: 20 70 43 74 78 2d 3e 70 4c 69 73 74 20 3d 20 70   pCtx->pList = p
66c0: 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 70 43 74  Token;.      pCt
66d0: 78 2d 3e 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20  x->nList++;.    
66e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
66f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72   }.}../*.** Iter
6700: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
6710: 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 73 20 74  Select objects t
6720: 68 61 74 20 61 72 65 20 70 61 72 74 20 6f 66 20  hat are part of 
6730: 57 49 54 48 20 63 6c 61 75 73 65 73 20 61 74 74  WITH clauses att
6740: 61 63 68 65 64 0a 2a 2a 20 74 6f 20 73 65 6c 65  ached.** to sele
6750: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 53 65  ct statement pSe
6760: 6c 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lect..*/.static 
6770: 76 6f 69 64 20 72 65 6e 61 6d 65 57 61 6c 6b 57  void renameWalkW
6780: 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ith(Walker *pWal
6790: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  ker, Select *pSe
67a0: 6c 65 63 74 29 7b 0a 20 20 69 66 28 20 70 53 65  lect){.  if( pSe
67b0: 6c 65 63 74 2d 3e 70 57 69 74 68 20 29 7b 0a 20  lect->pWith ){. 
67c0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
67d0: 72 28 69 3d 30 3b 20 69 3c 70 53 65 6c 65 63 74  r(i=0; i<pSelect
67e0: 2d 3e 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69  ->pWith->nCte; i
67f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  ++){.      Selec
6800: 74 20 2a 70 20 3d 20 70 53 65 6c 65 63 74 2d 3e  t *p = pSelect->
6810: 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 70 53 65 6c  pWith->a[i].pSel
6820: 65 63 74 3b 0a 20 20 20 20 20 20 4e 61 6d 65 43  ect;.      NameC
6830: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20  ontext sNC;.    
6840: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
6850: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
6860: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
6870: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
6880: 73 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se;.      sqlite
6890: 33 53 65 6c 65 63 74 50 72 65 70 28 73 4e 43 2e  3SelectPrep(sNC.
68a0: 70 50 61 72 73 65 2c 20 70 2c 20 26 73 4e 43 29  pParse, p, &sNC)
68b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ;.      sqlite3W
68c0: 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
68d0: 72 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  r, p);.    }.  }
68e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
68f0: 73 20 61 20 57 61 6c 6b 65 72 20 73 65 6c 65 63  s a Walker selec
6900: 74 20 63 61 6c 6c 62 61 63 6b 2e 20 49 74 20 64  t callback. It d
6910: 6f 65 73 20 6e 6f 74 68 69 6e 67 2e 20 49 74 20  oes nothing. It 
6920: 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64  is only required
6930: 0a 2a 2a 20 62 65 63 61 75 73 65 20 77 69 74 68  .** because with
6940: 6f 75 74 20 61 20 64 75 6d 6d 79 20 63 61 6c 6c  out a dummy call
6950: 62 61 63 6b 2c 20 73 71 6c 69 74 65 33 57 61 6c  back, sqlite3Wal
6960: 6b 45 78 70 72 28 29 20 61 6e 64 20 73 69 6d 69  kExpr() and simi
6970: 6c 61 72 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65  lar do not.** de
6980: 73 63 65 6e 64 20 69 6e 74 6f 20 73 75 62 2d 73  scend into sub-s
6990: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73  elect statements
69a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
69b0: 72 65 6e 61 6d 65 43 6f 6c 75 6d 6e 53 65 6c 65  renameColumnSele
69c0: 63 74 43 62 28 57 61 6c 6b 65 72 20 2a 70 57 61  ctCb(Walker *pWa
69d0: 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
69e0: 7b 0a 20 20 72 65 6e 61 6d 65 57 61 6c 6b 57 69  {.  renameWalkWi
69f0: 74 68 28 70 57 61 6c 6b 65 72 2c 20 70 29 3b 0a  th(pWalker, p);.
6a00: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
6a10: 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
6a20: 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72  This is a Walker
6a30: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6c 6c   expression call
6a40: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  back..**.** For 
6a50: 65 76 65 72 79 20 54 4b 5f 43 4f 4c 55 4d 4e 20  every TK_COLUMN 
6a60: 6e 6f 64 65 20 69 6e 20 74 68 65 20 65 78 70 72  node in the expr
6a70: 65 73 73 69 6f 6e 20 74 72 65 65 2c 20 73 65 61  ession tree, sea
6a80: 72 63 68 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66  rch to see.** if
6a90: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 62 65 69 6e   the column bein
6aa0: 67 20 72 65 66 65 72 65 6e 63 65 73 20 69 73 20  g references is 
6ab0: 74 68 65 20 63 6f 6c 75 6d 6e 20 62 65 69 6e 67  the column being
6ac0: 20 72 65 6e 61 6d 65 64 20 62 79 20 61 6e 0a 2a   renamed by an.*
6ad0: 2a 20 41 4c 54 45 52 20 54 41 42 4c 45 20 73 74  * ALTER TABLE st
6ae0: 61 74 65 6d 65 6e 74 2e 20 20 49 66 20 69 74 20  atement.  If it 
6af0: 69 73 2c 20 74 68 65 6e 20 61 74 74 61 63 68 20  is, then attach 
6b00: 69 74 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  its associated.*
6b10: 2a 20 52 65 6e 61 6d 65 54 6f 6b 65 6e 20 6f 62  * RenameToken ob
6b20: 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 73 74  ject to the list
6b30: 20 6f 66 20 52 65 6e 61 6d 65 54 6f 6b 65 6e 20   of RenameToken 
6b40: 6f 62 6a 65 63 74 73 20 62 65 69 6e 67 0a 2a 2a  objects being.**
6b50: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
6b60: 52 65 6e 61 6d 65 43 74 78 20 6f 62 6a 65 63 74  RenameCtx object
6b70: 20 61 74 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70   at pWalker->u.p
6b80: 52 65 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  Rename..*/.stati
6b90: 63 20 69 6e 74 20 72 65 6e 61 6d 65 43 6f 6c 75  c int renameColu
6ba0: 6d 6e 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20  mnExprCb(Walker 
6bb0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
6bc0: 70 45 78 70 72 29 7b 0a 20 20 52 65 6e 61 6d 65  pExpr){.  Rename
6bd0: 43 74 78 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72  Ctx *p = pWalker
6be0: 2d 3e 75 2e 70 52 65 6e 61 6d 65 3b 0a 20 20 69  ->u.pRename;.  i
6bf0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
6c00: 5f 54 52 49 47 47 45 52 20 0a 20 20 20 26 26 20  _TRIGGER .   && 
6c10: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
6c20: 70 2d 3e 69 43 6f 6c 20 0a 20 20 20 26 26 20 70  p->iCol .   && p
6c30: 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e  Walker->pParse->
6c40: 70 54 72 69 67 67 65 72 54 61 62 3d 3d 70 2d 3e  pTriggerTab==p->
6c50: 70 54 61 62 0a 20 20 29 7b 0a 20 20 20 20 72 65  pTab.  ){.    re
6c60: 6e 61 6d 65 54 6f 6b 65 6e 46 69 6e 64 28 70 57  nameTokenFind(pW
6c70: 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70  alker->pParse, p
6c80: 2c 20 28 76 6f 69 64 2a 29 70 45 78 70 72 29 3b  , (void*)pExpr);
6c90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78  .  }else if( pEx
6ca0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
6cb0: 4e 20 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e  N .   && pExpr->
6cc0: 69 43 6f 6c 75 6d 6e 3d 3d 70 2d 3e 69 43 6f 6c  iColumn==p->iCol
6cd0: 20 0a 20 20 20 26 26 20 70 2d 3e 70 54 61 62 3d   .   && p->pTab=
6ce0: 3d 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 0a 20  =pExpr->y.pTab. 
6cf0: 20 29 7b 0a 20 20 20 20 72 65 6e 61 6d 65 54 6f   ){.    renameTo
6d00: 6b 65 6e 46 69 6e 64 28 70 57 61 6c 6b 65 72 2d  kenFind(pWalker-
6d10: 3e 70 50 61 72 73 65 2c 20 70 2c 20 28 76 6f 69  >pParse, p, (voi
6d20: 64 2a 29 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  d*)pExpr);.  }. 
6d30: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
6d40: 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  inue;.}../*.** T
6d50: 68 65 20 52 65 6e 61 6d 65 43 74 78 20 63 6f 6e  he RenameCtx con
6d60: 74 61 69 6e 73 20 61 20 6c 69 73 74 20 6f 66 20  tains a list of 
6d70: 74 6f 6b 65 6e 73 20 74 68 61 74 20 72 65 66 65  tokens that refe
6d80: 72 65 6e 63 65 20 61 20 63 6f 6c 75 6d 6e 20 74  rence a column t
6d90: 68 61 74 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20  hat.** is being 
6da0: 72 65 6e 61 6d 65 64 20 62 79 20 61 6e 20 41 4c  renamed by an AL
6db0: 54 45 52 20 54 41 42 4c 45 20 73 74 61 74 65 6d  TER TABLE statem
6dc0: 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ent.  Return the
6dd0: 20 22 6c 61 73 74 22 0a 2a 2a 20 52 65 6e 61 6d   "last".** Renam
6de0: 65 54 6f 6b 65 6e 20 69 6e 20 74 68 65 20 52 65  eToken in the Re
6df0: 6e 61 6d 65 43 74 78 20 61 6e 64 20 72 65 6d 6f  nameCtx and remo
6e00: 76 65 20 74 68 61 74 20 52 65 6e 61 6d 65 54 6f  ve that RenameTo
6e10: 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ken from the.** 
6e20: 52 65 6e 61 6d 65 43 6f 6e 74 65 78 74 2e 20 20  RenameContext.  
6e30: 22 4c 61 73 74 22 20 6d 65 61 6e 73 20 74 68 65  "Last" means the
6e40: 20 6c 61 73 74 20 52 65 6e 61 6d 65 54 6f 6b 65   last RenameToke
6e50: 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68  n encountered wh
6e60: 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 70 75 74 20  en.** the input 
6e70: 53 51 4c 20 69 73 20 70 61 72 73 65 64 20 66 72  SQL is parsed fr
6e80: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
6e90: 2e 20 20 52 65 70 65 61 74 65 64 20 63 61 6c 6c  .  Repeated call
6ea0: 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  s to this routin
6eb0: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6c 6c 20  e.** return all 
6ec0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f 6b 65  column name toke
6ed0: 6e 73 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ns in the order 
6ee0: 74 68 61 74 20 74 68 65 79 20 61 72 65 20 65 6e  that they are en
6ef0: 63 6f 75 6e 74 65 72 65 64 0a 2a 2a 20 69 6e 20  countered.** in 
6f00: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
6f10: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 52 65 6e  t..*/.static Ren
6f20: 61 6d 65 54 6f 6b 65 6e 20 2a 72 65 6e 61 6d 65  ameToken *rename
6f30: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 4e 65 78 74 28  ColumnTokenNext(
6f40: 52 65 6e 61 6d 65 43 74 78 20 2a 70 43 74 78 29  RenameCtx *pCtx)
6f50: 7b 0a 20 20 52 65 6e 61 6d 65 54 6f 6b 65 6e 20  {.  RenameToken 
6f60: 2a 70 42 65 73 74 20 3d 20 70 43 74 78 2d 3e 70  *pBest = pCtx->p
6f70: 4c 69 73 74 3b 0a 20 20 52 65 6e 61 6d 65 54 6f  List;.  RenameTo
6f80: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 52  ken *pToken;.  R
6f90: 65 6e 61 6d 65 54 6f 6b 65 6e 20 2a 2a 70 70 3b  enameToken **pp;
6fa0: 0a 0a 20 20 66 6f 72 28 70 54 6f 6b 65 6e 3d 70  ..  for(pToken=p
6fb0: 42 65 73 74 2d 3e 70 4e 65 78 74 3b 20 70 54 6f  Best->pNext; pTo
6fc0: 6b 65 6e 3b 20 70 54 6f 6b 65 6e 3d 70 54 6f 6b  ken; pToken=pTok
6fd0: 65 6e 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  en->pNext){.    
6fe0: 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 74 2e 7a 3e  if( pToken->t.z>
6ff0: 70 42 65 73 74 2d 3e 74 2e 7a 20 29 20 70 42 65  pBest->t.z ) pBe
7000: 73 74 20 3d 20 70 54 6f 6b 65 6e 3b 0a 20 20 7d  st = pToken;.  }
7010: 0a 20 20 66 6f 72 28 70 70 3d 26 70 43 74 78 2d  .  for(pp=&pCtx-
7020: 3e 70 4c 69 73 74 3b 20 2a 70 70 21 3d 70 42 65  >pList; *pp!=pBe
7030: 73 74 3b 20 70 70 3d 26 28 2a 70 70 29 2d 3e 70  st; pp=&(*pp)->p
7040: 4e 65 78 74 29 3b 0a 20 20 2a 70 70 20 3d 20 70  Next);.  *pp = p
7050: 42 65 73 74 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20  Best->pNext;..  
7060: 72 65 74 75 72 6e 20 70 42 65 73 74 3b 0a 7d 0a  return pBest;.}.
7070: 0a 2f 2a 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ./*.** An error 
7080: 6f 63 63 75 72 65 64 20 77 68 69 6c 65 20 70 61  occured while pa
7090: 72 73 69 6e 67 20 6f 72 20 6f 74 68 65 72 77 69  rsing or otherwi
70a0: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  se processing a 
70b0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 6f 62 6a 65  database.** obje
70c0: 63 74 20 28 65 69 74 68 65 72 20 70 50 61 72 73  ct (either pPars
70d0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2c 20 70 4e  e->pNewTable, pN
70e0: 65 77 49 6e 64 65 78 20 6f 72 20 70 4e 65 77 54  ewIndex or pNewT
70f0: 72 69 67 67 65 72 29 20 61 73 20 70 61 72 74 20  rigger) as part 
7100: 6f 66 20 61 6e 0a 2a 2a 20 41 4c 54 45 52 20 54  of an.** ALTER T
7110: 41 42 4c 45 20 52 45 4e 41 4d 45 20 43 4f 4c 55  ABLE RENAME COLU
7120: 4d 4e 20 70 72 6f 67 72 61 6d 2e 20 54 68 65 20  MN program. The 
7130: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 65 6d  error message em
7140: 69 74 74 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  itted by the.** 
7150: 73 75 62 2d 72 6f 75 74 69 6e 65 20 69 73 20 63  sub-routine is c
7160: 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
7170: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
7180: 73 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  sg. This functio
7190: 6e 0a 2a 2a 20 61 64 64 73 20 63 6f 6e 74 65 78  n.** adds contex
71a0: 74 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d  t to the error m
71b0: 65 73 73 61 67 65 20 61 6e 64 20 74 68 65 6e 20  essage and then 
71c0: 73 74 6f 72 65 73 20 69 74 20 69 6e 20 70 43 74  stores it in pCt
71d0: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
71e0: 64 20 72 65 6e 61 6d 65 43 6f 6c 75 6d 6e 50 61  d renameColumnPa
71f0: 72 73 65 45 72 72 6f 72 28 0a 20 20 73 71 6c 69  rseError(.  sqli
7200: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
7210: 78 2c 20 0a 20 20 69 6e 74 20 62 50 6f 73 74 2c  x, .  int bPost,
7220: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
7230: 20 2a 70 54 79 70 65 2c 0a 20 20 73 71 6c 69 74   *pType,.  sqlit
7240: 65 33 5f 76 61 6c 75 65 20 2a 70 4f 62 6a 65 63  e3_value *pObjec
7250: 74 2c 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t,.  Parse *pPar
7260: 73 65 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  se.){.  const ch
7270: 61 72 20 2a 7a 54 20 3d 20 28 63 6f 6e 73 74 20  ar *zT = (const 
7280: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
7290: 6c 75 65 5f 74 65 78 74 28 70 54 79 70 65 29 3b  lue_text(pType);
72a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
72b0: 4e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  N = (const char*
72c0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
72d0: 65 78 74 28 70 4f 62 6a 65 63 74 29 3b 0a 20 20  ext(pObject);.  
72e0: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 0a 20 20 7a  char *zErr;..  z
72f0: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
7300: 72 69 6e 74 66 28 22 65 72 72 6f 72 20 69 6e 20  rintf("error in 
7310: 25 73 20 25 73 25 73 3a 20 25 73 22 2c 20 0a 20  %s %s%s: %s", . 
7320: 20 20 20 20 20 7a 54 2c 20 7a 4e 2c 20 28 62 50       zT, zN, (bP
7330: 6f 73 74 20 3f 20 22 20 61 66 74 65 72 20 72 65  ost ? " after re
7340: 6e 61 6d 65 22 20 3a 20 22 22 29 2c 0a 20 20 20  name" : ""),.   
7350: 20 20 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d     pParse->zErrM
7360: 73 67 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  sg.  );.  sqlite
7370: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
7380: 43 74 78 2c 20 7a 45 72 72 2c 20 2d 31 29 3b 0a  Ctx, zErr, -1);.
7390: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
73a0: 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  Err);.}../*.** F
73b0: 6f 72 20 65 61 63 68 20 6e 61 6d 65 20 69 6e 20  or each name in 
73c0: 74 68 65 20 74 68 65 20 65 78 70 72 65 73 73 69  the the expressi
73d0: 6f 6e 2d 6c 69 73 74 20 70 45 4c 69 73 74 20 28  on-list pEList (
73e0: 69 2e 65 2e 20 65 61 63 68 0a 2a 2a 20 70 45 4c  i.e. each.** pEL
73f0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
7400: 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 74 68   that matches th
7410: 65 20 73 74 72 69 6e 67 20 69 6e 20 7a 4f 6c 64  e string in zOld
7420: 2c 20 65 78 74 72 61 63 74 20 74 68 65 20 0a 2a  , extract the .*
7430: 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
7440: 72 65 6e 61 6d 65 2d 74 6f 6b 65 6e 20 66 72 6f  rename-token fro
7450: 6d 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70  m Parse object p
7460: 50 61 72 73 65 20 61 6e 64 20 61 64 64 20 69 74  Parse and add it
7470: 0a 2a 2a 20 74 6f 20 74 68 65 20 52 65 6e 61 6d  .** to the Renam
7480: 65 43 74 78 20 70 43 74 78 2e 0a 2a 2f 0a 73 74  eCtx pCtx..*/.st
7490: 61 74 69 63 20 76 6f 69 64 20 72 65 6e 61 6d 65  atic void rename
74a0: 43 6f 6c 75 6d 6e 45 6c 69 73 74 4e 61 6d 65 73  ColumnElistNames
74b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
74c0: 65 2c 20 0a 20 20 52 65 6e 61 6d 65 43 74 78 20  e, .  RenameCtx 
74d0: 2a 70 43 74 78 2c 20 0a 20 20 45 78 70 72 4c 69  *pCtx, .  ExprLi
74e0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 0a 20 20 63  st *pEList, .  c
74f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 6c 64 0a  onst char *zOld.
7500: 29 7b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  ){.  if( pEList 
7510: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
7520: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
7530: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
7540: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
7550: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
7560: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
7570: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73  if( 0==sqlite3_s
7580: 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 7a 4f  tricmp(zName, zO
7590: 6c 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ld) ){.        r
75a0: 65 6e 61 6d 65 54 6f 6b 65 6e 46 69 6e 64 28 70  enameTokenFind(p
75b0: 50 61 72 73 65 2c 20 70 43 74 78 2c 20 28 76 6f  Parse, pCtx, (vo
75c0: 69 64 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  id*)zName);.    
75d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
75e0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20  ./*.** For each 
75f0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 74 68 65 20  name in the the 
7600: 69 64 2d 6c 69 73 74 20 70 49 64 4c 69 73 74 20  id-list pIdList 
7610: 28 69 2e 65 2e 20 65 61 63 68 20 70 49 64 4c 69  (i.e. each pIdLi
7620: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20  st->a[i].zName) 
7630: 0a 2a 2a 20 74 68 61 74 20 6d 61 74 63 68 65 73  .** that matches
7640: 20 74 68 65 20 73 74 72 69 6e 67 20 69 6e 20 7a   the string in z
7650: 4f 6c 64 2c 20 65 78 74 72 61 63 74 20 74 68 65  Old, extract the
7660: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 72   corresponding r
7670: 65 6e 61 6d 65 2d 74 6f 6b 65 6e 20 0a 2a 2a 20  ename-token .** 
7680: 66 72 6f 6d 20 50 61 72 73 65 20 6f 62 6a 65 63  from Parse objec
7690: 74 20 70 50 61 72 73 65 20 61 6e 64 20 61 64 64  t pParse and add
76a0: 20 69 74 20 74 6f 20 74 68 65 20 52 65 6e 61 6d   it to the Renam
76b0: 65 43 74 78 20 70 43 74 78 2e 0a 2a 2f 0a 73 74  eCtx pCtx..*/.st
76c0: 61 74 69 63 20 76 6f 69 64 20 72 65 6e 61 6d 65  atic void rename
76d0: 43 6f 6c 75 6d 6e 49 64 6c 69 73 74 4e 61 6d 65  ColumnIdlistName
76e0: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
76f0: 73 65 2c 20 0a 20 20 52 65 6e 61 6d 65 43 74 78  se, .  RenameCtx
7700: 20 2a 70 43 74 78 2c 20 0a 20 20 49 64 4c 69 73   *pCtx, .  IdLis
7710: 74 20 2a 70 49 64 4c 69 73 74 2c 20 0a 20 20 63  t *pIdList, .  c
7720: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 6c 64 0a  onst char *zOld.
7730: 29 7b 0a 20 20 69 66 28 20 70 49 64 4c 69 73 74  ){.  if( pIdList
7740: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
7750: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
7760: 64 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  dList->nId; i++)
7770: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
7780: 61 6d 65 20 3d 20 70 49 64 4c 69 73 74 2d 3e 61  ame = pIdList->a
7790: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
77a0: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f   if( 0==sqlite3_
77b0: 73 74 72 69 63 6d 70 28 7a 4e 61 6d 65 2c 20 7a  stricmp(zName, z
77c0: 4f 6c 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Old) ){.        
77d0: 72 65 6e 61 6d 65 54 6f 6b 65 6e 46 69 6e 64 28  renameTokenFind(
77e0: 70 50 61 72 73 65 2c 20 70 43 74 78 2c 20 28 76  pParse, pCtx, (v
77f0: 6f 69 64 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20  oid*)zName);.   
7800: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
7810: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 74 68  ../*.** Parse th
7820: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
7830: 7a 53 71 6c 20 75 73 69 6e 67 20 50 61 72 73 65  zSql using Parse
7840: 20 6f 62 6a 65 63 74 20 28 2a 70 29 2e 20 54 68   object (*p). Th
7850: 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 0a 2a  e Parse object.*
7860: 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  * is initialized
7870: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
7880: 6e 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 75  n before it is u
7890: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
78a0: 6e 74 20 72 65 6e 61 6d 65 50 61 72 73 65 53 71  nt renameParseSq
78b0: 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 2c 20 20  l(.  Parse *p,  
78c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78d0: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 74       /* Memory t
78e0: 6f 20 75 73 65 20 66 6f 72 20 50 61 72 73 65 20  o use for Parse 
78f0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
7900: 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
7910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7920: 61 6d 65 20 6f 66 20 73 63 68 65 6d 61 20 53 51  ame of schema SQ
7930: 4c 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  L belongs to */.
7940: 20 20 69 6e 74 20 62 54 61 62 6c 65 2c 20 20 20    int bTable,   
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 20 20 2f 2a 20 31 20 2d 3e 20 52 45 4e 41 4d 45    /* 1 -> RENAME
7970: 20 54 41 42 4c 45 2c 20 30 20 2d 3e 20 52 45 4e   TABLE, 0 -> REN
7980: 41 4d 45 20 43 4f 4c 55 4d 4e 20 2a 2f 0a 20 20  AME COLUMN */.  
7990: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79b0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
79c0: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
79d0: 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20  ar *zSql,       
79e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74          /* SQL t
79f0: 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20 69 6e 74  o parse */.  int
7a00: 20 62 54 65 6d 70 20 20 20 20 20 20 20 20 20 20   bTemp          
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7a20: 54 72 75 65 20 69 66 20 53 51 4c 20 69 73 20 66  True if SQL is f
7a30: 72 6f 6d 20 74 65 6d 70 20 73 63 68 65 6d 61 20  rom temp schema 
7a40: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
7a50: 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
7a60: 3b 0a 0a 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44  ;..  db->init.iD
7a70: 62 20 3d 20 62 54 65 6d 70 20 3f 20 31 20 3a 20  b = bTemp ? 1 : 
7a80: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
7a90: 65 28 64 62 2c 20 7a 44 62 29 3b 0a 0a 20 20 2f  e(db, zDb);..  /
7aa0: 2a 20 50 61 72 73 65 20 74 68 65 20 53 51 4c 20  * Parse the SQL 
7ab0: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
7ac0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
7ad0: 67 75 6d 65 6e 74 2e 20 49 66 20 6e 6f 20 65 72  gument. If no er
7ae0: 72 6f 72 0a 20 20 2a 2a 20 6f 63 63 75 72 73 20  ror.  ** occurs 
7af0: 61 6e 64 20 74 68 65 20 70 61 72 73 65 20 64 6f  and the parse do
7b00: 65 73 20 6e 6f 74 20 72 65 73 75 6c 74 20 69 6e  es not result in
7b10: 20 61 20 6e 65 77 20 74 61 62 6c 65 2c 20 69 6e   a new table, in
7b20: 64 65 78 20 6f 72 0a 20 20 2a 2a 20 74 72 69 67  dex or.  ** trig
7b30: 67 65 72 20 6f 62 6a 65 63 74 2c 20 74 68 65 20  ger object, the 
7b40: 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
7b50: 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 6d   corrupt. */.  m
7b60: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
7b70: 6f 66 28 50 61 72 73 65 29 29 3b 0a 20 20 70 2d  of(Parse));.  p-
7b80: 3e 65 50 61 72 73 65 4d 6f 64 65 20 3d 20 28 62  >eParseMode = (b
7b90: 54 61 62 6c 65 20 3f 20 50 41 52 53 45 5f 4d 4f  Table ? PARSE_MO
7ba0: 44 45 5f 52 45 4e 41 4d 45 5f 54 41 42 4c 45 20  DE_RENAME_TABLE 
7bb0: 3a 20 50 41 52 53 45 5f 4d 4f 44 45 5f 52 45 4e  : PARSE_MODE_REN
7bc0: 41 4d 45 5f 43 4f 4c 55 4d 4e 29 3b 0a 20 20 70  AME_COLUMN);.  p
7bd0: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70 2d 3e  ->db = db;.  p->
7be0: 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 31 3b 0a  nQueryLoop = 1;.
7bf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 75    rc = sqlite3Ru
7c00: 6e 50 61 72 73 65 72 28 70 2c 20 7a 53 71 6c 2c  nParser(p, zSql,
7c10: 20 26 7a 45 72 72 29 3b 0a 20 20 61 73 73 65 72   &zErr);.  asser
7c20: 74 28 20 70 2d 3e 7a 45 72 72 4d 73 67 3d 3d 30  t( p->zErrMsg==0
7c30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63   );.  assert( rc
7c40: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 7a  !=SQLITE_OK || z
7c50: 45 72 72 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a  Err==0 );.  p->z
7c60: 45 72 72 4d 73 67 20 3d 20 7a 45 72 72 3b 0a 20  ErrMsg = zErr;. 
7c70: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
7c80: 61 69 6c 65 64 20 29 20 72 63 20 3d 20 53 51 4c  ailed ) rc = SQL
7c90: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28  ITE_NOMEM;.  if(
7ca0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a   rc==SQLITE_OK .
7cb0: 20 20 20 26 26 20 70 2d 3e 70 4e 65 77 54 61 62     && p->pNewTab
7cc0: 6c 65 3d 3d 30 20 26 26 20 70 2d 3e 70 4e 65 77  le==0 && p->pNew
7cd0: 49 6e 64 65 78 3d 3d 30 20 26 26 20 70 2d 3e 70  Index==0 && p->p
7ce0: 4e 65 77 54 72 69 67 67 65 72 3d 3d 30 20 0a 20  NewTrigger==0 . 
7cf0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
7d00: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7d10: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;.  }..#ifdef SQ
7d20: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
7d30: 45 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20  Ensure that all 
7d40: 6d 61 70 70 69 6e 67 73 20 69 6e 20 74 68 65 20  mappings in the 
7d50: 50 61 72 73 65 2e 70 52 65 6e 61 6d 65 20 6c 69  Parse.pRename li
7d60: 73 74 20 72 65 61 6c 6c 79 20 64 6f 20 6d 61 70  st really do map
7d70: 20 74 6f 0a 20 20 2a 2a 20 61 20 70 61 72 74 20   to.  ** a part 
7d80: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  of the input str
7d90: 69 6e 67 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72  ing.  */.  if( r
7da0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7db0: 20 20 20 20 69 6e 74 20 6e 53 71 6c 20 3d 20 73      int nSql = s
7dc0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7dd0: 53 71 6c 29 3b 0a 20 20 20 20 52 65 6e 61 6d 65  Sql);.    Rename
7de0: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20  Token *pToken;. 
7df0: 20 20 20 66 6f 72 28 70 54 6f 6b 65 6e 3d 70 2d     for(pToken=p-
7e00: 3e 70 52 65 6e 61 6d 65 3b 20 70 54 6f 6b 65 6e  >pRename; pToken
7e10: 3b 20 70 54 6f 6b 65 6e 3d 70 54 6f 6b 65 6e 2d  ; pToken=pToken-
7e20: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
7e30: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 74  ssert( pToken->t
7e40: 2e 7a 3e 3d 7a 53 71 6c 20 26 26 20 26 70 54 6f  .z>=zSql && &pTo
7e50: 6b 65 6e 2d 3e 74 2e 7a 5b 70 54 6f 6b 65 6e 2d  ken->t.z[pToken-
7e60: 3e 74 2e 6e 5d 3c 3d 26 7a 53 71 6c 5b 6e 53 71  >t.n]<=&zSql[nSq
7e70: 6c 5d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  l] );.    }.  }.
7e80: 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 69 6e  #endif..  db->in
7e90: 69 74 2e 69 44 62 20 3d 20 30 3b 0a 20 20 72 65  it.iDb = 0;.  re
7ea0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7eb0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
7ec0: 65 64 69 74 73 20 53 51 4c 20 73 74 61 74 65 6d  edits SQL statem
7ed0: 65 6e 74 20 7a 53 71 6c 2c 20 72 65 70 6c 61 63  ent zSql, replac
7ee0: 69 6e 67 20 65 61 63 68 20 74 6f 6b 65 6e 20 69  ing each token i
7ef0: 64 65 6e 74 69 66 69 65 64 0a 2a 2a 20 62 79 20  dentified.** by 
7f00: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
7f10: 70 52 65 6e 61 6d 65 20 77 69 74 68 20 74 68 65  pRename with the
7f20: 20 74 65 78 74 20 6f 66 20 7a 4e 65 77 2e 20 49   text of zNew. I
7f30: 66 20 61 72 67 75 6d 65 6e 74 20 62 51 75 6f 74  f argument bQuot
7f40: 65 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68  e is.** true, th
7f50: 65 6e 20 7a 4e 65 77 20 69 73 20 61 6c 77 61 79  en zNew is alway
7f60: 73 20 71 75 6f 74 65 64 20 66 69 72 73 74 2e 20  s quoted first. 
7f70: 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
7f80: 72 73 2c 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  rs, the result.*
7f90: 2a 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  * is loaded into
7fa0: 20 63 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20   context object 
7fb0: 70 43 74 78 20 61 73 20 74 68 65 20 72 65 73 75  pCtx as the resu
7fc0: 6c 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  lt..**.** Or, if
7fd0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7fe0: 20 28 69 2e 65 2e 20 61 6e 20 4f 4f 4d 20 63 6f   (i.e. an OOM co
7ff0: 6e 64 69 74 69 6f 6e 29 2c 20 61 6e 20 65 72 72  ndition), an err
8000: 6f 72 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a  or is left in.**
8010: 20 70 43 74 78 20 61 6e 64 20 61 6e 20 53 51 4c   pCtx and an SQL
8020: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 72  ite error code r
8030: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
8040: 69 63 20 69 6e 74 20 72 65 6e 61 6d 65 45 64 69  ic int renameEdi
8050: 74 53 71 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  tSql(.  sqlite3_
8060: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20  context *pCtx,  
8070: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
8080: 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
8090: 0a 20 20 52 65 6e 61 6d 65 43 74 78 20 2a 70 52  .  RenameCtx *pR
80a0: 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  ename,          
80b0: 20 20 20 2f 2a 20 52 65 6e 61 6d 65 20 63 6f 6e     /* Rename con
80c0: 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  text */.  const 
80d0: 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20  char *zSql,     
80e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
80f0: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 64   statement to ed
8100: 69 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  it */.  const ch
8110: 61 72 20 2a 7a 4e 65 77 2c 20 20 20 20 20 20 20  ar *zNew,       
8120: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74          /* New t
8130: 6f 6b 65 6e 20 74 65 78 74 20 2a 2f 0a 20 20 69  oken text */.  i
8140: 6e 74 20 62 51 75 6f 74 65 20 20 20 20 20 20 20  nt bQuote       
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8160: 2a 20 54 72 75 65 20 74 6f 20 61 6c 77 61 79 73  * True to always
8170: 20 71 75 6f 74 65 20 74 6f 6b 65 6e 20 2a 2f 0a   quote token */.
8180: 29 7b 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  ){.  int nNew = 
8190: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
81a0: 7a 4e 65 77 29 3b 0a 20 20 69 6e 74 20 6e 53 71  zNew);.  int nSq
81b0: 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  l = sqlite3Strle
81c0: 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c  n30(zSql);.  sql
81d0: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
81e0: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
81f0: 6e 64 6c 65 28 70 43 74 78 29 3b 0a 20 20 69 6e  ndle(pCtx);.  in
8200: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
8210: 3b 0a 20 20 63 68 61 72 20 2a 7a 51 75 6f 74 3b  ;.  char *zQuot;
8220: 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20  .  char *zOut;. 
8230: 20 69 6e 74 20 6e 51 75 6f 74 3b 0a 0a 20 20 2f   int nQuot;..  /
8240: 2a 20 53 65 74 20 7a 51 75 6f 74 20 74 6f 20 70  * Set zQuot to p
8250: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
8260: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 71 75   containing a qu
8270: 6f 74 65 64 20 63 6f 70 79 20 6f 66 20 74 68 65  oted copy of the
8280: 20 0a 20 20 2a 2a 20 69 64 65 6e 74 69 66 69 65   .  ** identifie
8290: 72 20 7a 4e 65 77 2e 20 49 66 20 74 68 65 20 63  r zNew. If the c
82a0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 64 65  orresponding ide
82b0: 6e 74 69 66 69 65 72 20 69 6e 20 74 68 65 20 6f  ntifier in the o
82c0: 72 69 67 69 6e 61 6c 20 0a 20 20 2a 2a 20 41 4c  riginal .  ** AL
82d0: 54 45 52 20 54 41 42 4c 45 20 73 74 61 74 65 6d  TER TABLE statem
82e0: 65 6e 74 20 77 61 73 20 71 75 6f 74 65 64 20 28  ent was quoted (
82f0: 62 51 75 6f 74 65 3d 3d 31 29 2c 20 74 68 65 6e  bQuote==1), then
8300: 20 73 65 74 20 7a 4e 65 77 20 74 6f 0a 20 20 2a   set zNew to.  *
8310: 2a 20 70 6f 69 6e 74 20 74 6f 20 7a 51 75 6f 74  * point to zQuot
8320: 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 73 75 62   so that all sub
8330: 73 74 69 74 75 74 69 6f 6e 73 20 61 72 65 20 6d  stitutions are m
8340: 61 64 65 20 75 73 69 6e 67 20 74 68 65 0a 20 20  ade using the.  
8350: 2a 2a 20 71 75 6f 74 65 64 20 76 65 72 73 69 6f  ** quoted versio
8360: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 63 6f 6c  n of the new col
8370: 75 6d 6e 20 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20  umn name.  */.  
8380: 7a 51 75 6f 74 20 3d 20 73 71 6c 69 74 65 33 4d  zQuot = sqlite3M
8390: 50 72 69 6e 74 66 28 64 62 2c 20 22 5c 22 25 77  Printf(db, "\"%w
83a0: 5c 22 22 2c 20 7a 4e 65 77 29 3b 0a 20 20 69 66  \"", zNew);.  if
83b0: 28 20 7a 51 75 6f 74 3d 3d 30 20 29 7b 0a 20 20  ( zQuot==0 ){.  
83c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
83d0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
83e0: 20 20 20 20 6e 51 75 6f 74 20 3d 20 73 71 6c 69      nQuot = sqli
83f0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 51 75 6f  te3Strlen30(zQuo
8400: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 51  t);.  }.  if( bQ
8410: 75 6f 74 65 20 29 7b 0a 20 20 20 20 7a 4e 65 77  uote ){.    zNew
8420: 20 3d 20 7a 51 75 6f 74 3b 0a 20 20 20 20 6e 4e   = zQuot;.    nN
8430: 65 77 20 3d 20 6e 51 75 6f 74 3b 0a 20 20 7d 0a  ew = nQuot;.  }.
8440: 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
8450: 69 6e 74 20 70 52 65 6e 61 6d 65 2d 3e 70 4c 69  int pRename->pLi
8460: 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c 69  st contains a li
8470: 73 74 20 6f 66 20 52 65 6e 61 6d 65 54 6f 6b 65  st of RenameToke
8480: 6e 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20 63  n objects.  ** c
8490: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
84a0: 61 6c 6c 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68  all tokens in th
84b0: 65 20 69 6e 70 75 74 20 53 51 4c 20 74 68 61 74  e input SQL that
84c0: 20 6d 75 73 74 20 62 65 20 72 65 70 6c 61 63 65   must be replace
84d0: 64 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20  d.  ** with the 
84e0: 6e 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e  new column name.
84f0: 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69 6e   All that remain
8500: 73 20 69 73 20 74 6f 20 63 6f 6e 73 74 72 75 63  s is to construc
8510: 74 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72  t and.  ** retur
8520: 6e 20 74 68 65 20 65 64 69 74 65 64 20 53 51 4c  n the edited SQL
8530: 20 73 74 72 69 6e 67 2e 20 2a 2f 0a 20 20 61 73   string. */.  as
8540: 73 65 72 74 28 20 6e 51 75 6f 74 3e 3d 6e 4e 65  sert( nQuot>=nNe
8550: 77 20 29 3b 0a 20 20 7a 4f 75 74 20 3d 20 73 71  w );.  zOut = sq
8560: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
8570: 6f 28 64 62 2c 20 6e 53 71 6c 20 2b 20 70 52 65  o(db, nSql + pRe
8580: 6e 61 6d 65 2d 3e 6e 4c 69 73 74 2a 6e 51 75 6f  name->nList*nQuo
8590: 74 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 7a 4f  t + 1);.  if( zO
85a0: 75 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4f  ut ){.    int nO
85b0: 75 74 20 3d 20 6e 53 71 6c 3b 0a 20 20 20 20 6d  ut = nSql;.    m
85c0: 65 6d 63 70 79 28 7a 4f 75 74 2c 20 7a 53 71 6c  emcpy(zOut, zSql
85d0: 2c 20 6e 53 71 6c 29 3b 0a 20 20 20 20 77 68 69  , nSql);.    whi
85e0: 6c 65 28 20 70 52 65 6e 61 6d 65 2d 3e 70 4c 69  le( pRename->pLi
85f0: 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
8600: 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
8610: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
8620: 74 20 6f 66 20 74 6f 6b 65 6e 20 74 6f 20 72 65  t of token to re
8630: 70 6c 61 63 65 20 69 6e 20 7a 4f 75 74 20 2a 2f  place in zOut */
8640: 0a 20 20 20 20 20 20 52 65 6e 61 6d 65 54 6f 6b  .      RenameTok
8650: 65 6e 20 2a 70 42 65 73 74 20 3d 20 72 65 6e 61  en *pBest = rena
8660: 6d 65 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 4e 65 78  meColumnTokenNex
8670: 74 28 70 52 65 6e 61 6d 65 29 3b 0a 0a 20 20 20  t(pRename);..   
8680: 20 20 20 75 33 32 20 6e 52 65 70 6c 61 63 65 3b     u32 nReplace;
8690: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
86a0: 72 20 2a 7a 52 65 70 6c 61 63 65 3b 0a 20 20 20  r *zReplace;.   
86b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
86c0: 49 64 43 68 61 72 28 2a 70 42 65 73 74 2d 3e 74  IdChar(*pBest->t
86d0: 2e 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  .z) ){.        n
86e0: 52 65 70 6c 61 63 65 20 3d 20 6e 4e 65 77 3b 0a  Replace = nNew;.
86f0: 20 20 20 20 20 20 20 20 7a 52 65 70 6c 61 63 65          zReplace
8700: 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = zNew;.      }
8710: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 52  else{.        nR
8720: 65 70 6c 61 63 65 20 3d 20 6e 51 75 6f 74 3b 0a  eplace = nQuot;.
8730: 20 20 20 20 20 20 20 20 7a 52 65 70 6c 61 63 65          zReplace
8740: 20 3d 20 7a 51 75 6f 74 3b 0a 20 20 20 20 20 20   = zQuot;.      
8750: 7d 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  }..      iOff = 
8760: 70 42 65 73 74 2d 3e 74 2e 7a 20 2d 20 7a 53 71  pBest->t.z - zSq
8770: 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 65  l;.      if( pBe
8780: 73 74 2d 3e 74 2e 6e 21 3d 6e 52 65 70 6c 61 63  st->t.n!=nReplac
8790: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  e ){.        mem
87a0: 6d 6f 76 65 28 26 7a 4f 75 74 5b 69 4f 66 66 20  move(&zOut[iOff 
87b0: 2b 20 6e 52 65 70 6c 61 63 65 5d 2c 20 26 7a 4f  + nReplace], &zO
87c0: 75 74 5b 69 4f 66 66 20 2b 20 70 42 65 73 74 2d  ut[iOff + pBest-
87d0: 3e 74 2e 6e 5d 2c 20 0a 20 20 20 20 20 20 20 20  >t.n], .        
87e0: 20 20 20 20 6e 4f 75 74 20 2d 20 28 69 4f 66 66      nOut - (iOff
87f0: 20 2b 20 70 42 65 73 74 2d 3e 74 2e 6e 29 0a 20   + pBest->t.n). 
8800: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
8810: 20 20 6e 4f 75 74 20 2b 3d 20 6e 52 65 70 6c 61    nOut += nRepla
8820: 63 65 20 2d 20 70 42 65 73 74 2d 3e 74 2e 6e 3b  ce - pBest->t.n;
8830: 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6e 4f  .        zOut[nO
8840: 75 74 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ut] = '\0';.    
8850: 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 63 70 79    }.      memcpy
8860: 28 26 7a 4f 75 74 5b 69 4f 66 66 5d 2c 20 7a 52  (&zOut[iOff], zR
8870: 65 70 6c 61 63 65 2c 20 6e 52 65 70 6c 61 63 65  eplace, nReplace
8880: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8890: 44 62 46 72 65 65 28 64 62 2c 20 70 42 65 73 74  DbFree(db, pBest
88a0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  );.    }..    sq
88b0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
88c0: 74 28 70 43 74 78 2c 20 7a 4f 75 74 2c 20 2d 31  t(pCtx, zOut, -1
88d0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
88e0: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
88f0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4f 75 74 29  DbFree(db, zOut)
8900: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
8910: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
8920: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
8930: 5f 66 72 65 65 28 7a 51 75 6f 74 29 3b 0a 20 20  _free(zQuot);.  
8940: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
8950: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20  .** Resolve all 
8960: 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 74  symbols in the t
8970: 72 69 67 67 65 72 20 61 74 20 70 50 61 72 73 65  rigger at pParse
8980: 2d 3e 70 4e 65 77 54 72 69 67 67 65 72 2c 20 61  ->pNewTrigger, a
8990: 73 73 75 6d 69 6e 67 0a 2a 2a 20 69 74 20 77 61  ssuming.** it wa
89a0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
89b0: 73 63 68 65 6d 61 20 6f 66 20 64 61 74 61 62 61  schema of databa
89c0: 73 65 20 7a 44 62 2e 20 52 65 74 75 72 6e 20 53  se zDb. Return S
89d0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 0a 2a 2a 20  QLITE_OK if .** 
89e0: 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65  successful. Othe
89f0: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
8a00: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
8a10: 64 65 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20  de and leave an 
8a20: 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65  error.** message
8a30: 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 6f 62   in the Parse ob
8a40: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
8a50: 69 6e 74 20 72 65 6e 61 6d 65 52 65 73 6f 6c 76  int renameResolv
8a60: 65 54 72 69 67 67 65 72 28 50 61 72 73 65 20 2a  eTrigger(Parse *
8a70: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
8a80: 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69  ar *zDb){.  sqli
8a90: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8aa0: 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20  ->db;.  Trigger 
8ab0: 2a 70 4e 65 77 20 3d 20 70 50 61 72 73 65 2d 3e  *pNew = pParse->
8ac0: 70 4e 65 77 54 72 69 67 67 65 72 3b 0a 20 20 54  pNewTrigger;.  T
8ad0: 72 69 67 67 65 72 53 74 65 70 20 2a 70 53 74 65  riggerStep *pSte
8ae0: 70 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  p;.  NameContext
8af0: 20 73 4e 43 3b 0a 20 20 69 6e 74 20 72 63 20 3d   sNC;.  int rc =
8b00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 6d   SQLITE_OK;..  m
8b10: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
8b20: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73  izeof(sNC));.  s
8b30: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
8b40: 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  se;.  assert( pN
8b50: 65 77 2d 3e 70 54 61 62 53 63 68 65 6d 61 20 29  ew->pTabSchema )
8b60: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 54 72 69  ;.  pParse->pTri
8b70: 67 67 65 72 54 61 62 20 3d 20 73 71 6c 69 74 65  ggerTab = sqlite
8b80: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 70  3FindTable(db, p
8b90: 4e 65 77 2d 3e 74 61 62 6c 65 2c 20 0a 20 20 20  New->table, .   
8ba0: 20 20 20 64 62 2d 3e 61 44 62 5b 73 71 6c 69 74     db->aDb[sqlit
8bb0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
8bc0: 64 62 2c 20 70 4e 65 77 2d 3e 70 54 61 62 53 63  db, pNew->pTabSc
8bd0: 68 65 6d 61 29 5d 2e 7a 44 62 53 4e 61 6d 65 0a  hema)].zDbSName.
8be0: 20 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 65    );.  pParse->e
8bf0: 54 72 69 67 67 65 72 4f 70 20 3d 20 70 4e 65 77  TriggerOp = pNew
8c00: 2d 3e 6f 70 3b 0a 20 20 2f 2a 20 41 4c 57 41 59  ->op;.  /* ALWAY
8c10: 53 28 29 20 62 65 63 61 75 73 65 20 69 66 20 74  S() because if t
8c20: 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  he table of the 
8c30: 74 72 69 67 67 65 72 20 64 6f 65 73 20 6e 6f 74  trigger does not
8c40: 20 65 78 69 73 74 2c 20 74 68 65 0a 20 20 2a 2a   exist, the.  **
8c50: 20 65 72 72 6f 72 20 77 6f 75 6c 64 20 68 61 76   error would hav
8c60: 65 20 62 65 65 6e 20 68 69 74 20 62 65 66 6f 72  e been hit befor
8c70: 65 20 74 68 69 73 20 70 6f 69 6e 74 20 2a 2f 0a  e this point */.
8c80: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61    if( ALWAYS(pPa
8c90: 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
8ca0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
8cb0: 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
8cc0: 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
8cd0: 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
8ce0: 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tab);.  }..  /* 
8cf0: 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 73 20  Resolve symbols 
8d00: 69 6e 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a  in WHEN clause *
8d10: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
8d20: 54 45 5f 4f 4b 20 26 26 20 70 4e 65 77 2d 3e 70  TE_OK && pNew->p
8d30: 57 68 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  When ){.    rc =
8d40: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
8d50: 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  xprNames(&sNC, p
8d60: 4e 65 77 2d 3e 70 57 68 65 6e 29 3b 0a 20 20 7d  New->pWhen);.  }
8d70: 0a 0a 20 20 66 6f 72 28 70 53 74 65 70 3d 70 4e  ..  for(pStep=pN
8d80: 65 77 2d 3e 73 74 65 70 5f 6c 69 73 74 3b 20 72  ew->step_list; r
8d90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
8da0: 70 53 74 65 70 3b 20 70 53 74 65 70 3d 70 53 74  pStep; pStep=pSt
8db0: 65 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ep->pNext){.    
8dc0: 69 66 28 20 70 53 74 65 70 2d 3e 70 53 65 6c 65  if( pStep->pSele
8dd0: 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
8de0: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
8df0: 61 72 73 65 2c 20 70 53 74 65 70 2d 3e 70 53 65  arse, pStep->pSe
8e00: 6c 65 63 74 2c 20 26 73 4e 43 29 3b 0a 20 20 20  lect, &sNC);.   
8e10: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
8e20: 45 72 72 20 29 20 72 63 20 3d 20 70 50 61 72 73  Err ) rc = pPars
8e30: 65 2d 3e 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  e->rc;.    }.   
8e40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8e50: 4f 4b 20 26 26 20 70 53 74 65 70 2d 3e 7a 54 61  OK && pStep->zTa
8e60: 72 67 65 74 20 29 7b 0a 20 20 20 20 20 20 54 61  rget ){.      Ta
8e70: 62 6c 65 20 2a 70 54 61 72 67 65 74 20 3d 20 73  ble *pTarget = s
8e80: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
8e90: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53 74  e(pParse, 0, pSt
8ea0: 65 70 2d 3e 7a 54 61 72 67 65 74 2c 20 7a 44 62  ep->zTarget, zDb
8eb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
8ec0: 72 67 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rget==0 ){.     
8ed0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
8ee0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
8ef0: 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d  e if( SQLITE_OK=
8f00: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 56 69  =(rc = sqlite3Vi
8f10: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
8f20: 28 70 50 61 72 73 65 2c 20 70 54 61 72 67 65 74  (pParse, pTarget
8f30: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72  )) ){.        Sr
8f40: 63 4c 69 73 74 20 73 53 72 63 3b 0a 20 20 20 20  cList sSrc;.    
8f50: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 53 72 63      memset(&sSrc
8f60: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 72 63  , 0, sizeof(sSrc
8f70: 29 29 3b 0a 20 20 20 20 20 20 20 20 73 53 72 63  ));.        sSrc
8f80: 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 20  .nSrc = 1;.     
8f90: 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61     sSrc.a[0].zNa
8fa0: 6d 65 20 3d 20 70 53 74 65 70 2d 3e 7a 54 61 72  me = pStep->zTar
8fb0: 67 65 74 3b 0a 20 20 20 20 20 20 20 20 73 53 72  get;.        sSr
8fc0: 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 54  c.a[0].pTab = pT
8fd0: 61 72 67 65 74 3b 0a 20 20 20 20 20 20 20 20 73  arget;.        s
8fe0: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73  NC.pSrcList = &s
8ff0: 53 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Src;.        if(
9000: 20 70 53 74 65 70 2d 3e 70 57 68 65 72 65 20 29   pStep->pWhere )
9010: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
9020: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
9030: 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  xprNames(&sNC, p
9040: 53 74 65 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  Step->pWhere);. 
9050: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9060: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9070: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
9080: 72 63 20 3d 20 73 71 6c 69 74 65 33 52 65 73 6f  rc = sqlite3Reso
9090: 6c 76 65 45 78 70 72 4c 69 73 74 4e 61 6d 65 73  lveExprListNames
90a0: 28 26 73 4e 43 2c 20 70 53 74 65 70 2d 3e 70 45  (&sNC, pStep->pE
90b0: 78 70 72 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  xprList);.      
90c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
90d0: 72 74 28 20 21 70 53 74 65 70 2d 3e 70 55 70 73  rt( !pStep->pUps
90e0: 65 72 74 20 7c 7c 20 28 21 70 53 74 65 70 2d 3e  ert || (!pStep->
90f0: 70 57 68 65 72 65 20 26 26 20 21 70 53 74 65 70  pWhere && !pStep
9100: 2d 3e 70 45 78 70 72 4c 69 73 74 29 20 29 3b 0a  ->pExprList) );.
9110: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 74 65          if( pSte
9120: 70 2d 3e 70 55 70 73 65 72 74 20 29 7b 0a 20 20  p->pUpsert ){.  
9130: 20 20 20 20 20 20 20 20 55 70 73 65 72 74 20 2a          Upsert *
9140: 70 55 70 73 65 72 74 20 3d 20 70 53 74 65 70 2d  pUpsert = pStep-
9150: 3e 70 55 70 73 65 72 74 3b 0a 20 20 20 20 20 20  >pUpsert;.      
9160: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
9170: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
9180: 20 20 20 20 20 20 20 70 55 70 73 65 72 74 2d 3e         pUpsert->
9190: 70 55 70 73 65 72 74 53 72 63 20 3d 20 26 73 53  pUpsertSrc = &sS
91a0: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
91b0: 43 2e 75 4e 43 2e 70 55 70 73 65 72 74 20 3d 20  C.uNC.pUpsert = 
91c0: 70 55 70 73 65 72 74 3b 0a 20 20 20 20 20 20 20  pUpsert;.       
91d0: 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d     sNC.ncFlags =
91e0: 20 4e 43 5f 55 55 70 73 65 72 74 3b 0a 20 20 20   NC_UUpsert;.   
91f0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
9200: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69  te3ResolveExprLi
9210: 73 74 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 55  stNames(&sNC, pU
9220: 70 73 65 72 74 2d 3e 70 55 70 73 65 72 74 54 61  psert->pUpsertTa
9230: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  rget);.         
9240: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9250: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
9260: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 55 70 73    ExprList *pUps
9270: 65 72 74 53 65 74 20 3d 20 70 55 70 73 65 72 74  ertSet = pUpsert
9280: 2d 3e 70 55 70 73 65 72 74 53 65 74 3b 0a 20 20  ->pUpsertSet;.  
9290: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
92a0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
92b0: 72 4c 69 73 74 4e 61 6d 65 73 28 26 73 4e 43 2c  rListNames(&sNC,
92c0: 20 70 55 70 73 65 72 74 53 65 74 29 3b 0a 20 20   pUpsertSet);.  
92d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
92e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
92f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
9300: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9310: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
9320: 73 28 26 73 4e 43 2c 20 70 55 70 73 65 72 74 2d  s(&sNC, pUpsert-
9330: 3e 70 55 70 73 65 72 74 57 68 65 72 65 29 3b 0a  >pUpsertWhere);.
9340: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9350: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
9360: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9370: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
9380: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
9390: 6d 65 73 28 26 73 4e 43 2c 20 70 55 70 73 65 72  mes(&sNC, pUpser
93a0: 74 2d 3e 70 55 70 73 65 72 74 54 61 72 67 65 74  t->pUpsertTarget
93b0: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20  Where);.        
93c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 4e    }.          sN
93d0: 43 2e 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20  C.ncFlags = 0;. 
93e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
93f0: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
9400: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
9410: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
9420: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
9430: 65 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70  e sqlite3WalkExp
9440: 72 28 29 20 6f 72 20 73 71 6c 69 74 65 33 57 61  r() or sqlite3Wa
9450: 6c 6b 53 65 6c 65 63 74 28 29 20 6f 6e 20 61 6c  lkSelect() on al
9460: 6c 20 53 65 6c 65 63 74 20 6f 72 20 45 78 70 72  l Select or Expr
9470: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 74 68 61 74  .** objects that
9480: 20 61 72 65 20 70 61 72 74 20 6f 66 20 74 68 65   are part of the
9490: 20 74 72 69 67 67 65 72 20 70 61 73 73 65 64 20   trigger passed 
94a0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
94b0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
94c0: 63 20 76 6f 69 64 20 72 65 6e 61 6d 65 57 61 6c  c void renameWal
94d0: 6b 54 72 69 67 67 65 72 28 57 61 6c 6b 65 72 20  kTrigger(Walker 
94e0: 2a 70 57 61 6c 6b 65 72 2c 20 54 72 69 67 67 65  *pWalker, Trigge
94f0: 72 20 2a 70 54 72 69 67 67 65 72 29 7b 0a 20 20  r *pTrigger){.  
9500: 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 53 74  TriggerStep *pSt
9510: 65 70 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74  ep;..  /* Find t
9520: 6f 6b 65 6e 73 20 74 6f 20 65 64 69 74 20 69 6e  okens to edit in
9530: 20 57 48 45 4e 20 63 6c 61 75 73 65 20 2a 2f 0a   WHEN clause */.
9540: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
9550: 72 28 70 57 61 6c 6b 65 72 2c 20 70 54 72 69 67  r(pWalker, pTrig
9560: 67 65 72 2d 3e 70 57 68 65 6e 29 3b 0a 0a 20 20  ger->pWhen);..  
9570: 2f 2a 20 46 69 6e 64 20 74 6f 6b 65 6e 73 20 74  /* Find tokens t
9580: 6f 20 65 64 69 74 20 69 6e 20 74 72 69 67 67 65  o edit in trigge
9590: 72 20 73 74 65 70 73 20 2a 2f 0a 20 20 66 6f 72  r steps */.  for
95a0: 28 70 53 74 65 70 3d 70 54 72 69 67 67 65 72 2d  (pStep=pTrigger-
95b0: 3e 73 74 65 70 5f 6c 69 73 74 3b 20 70 53 74 65  >step_list; pSte
95c0: 70 3b 20 70 53 74 65 70 3d 70 53 74 65 70 2d 3e  p; pStep=pStep->
95d0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 73 71 6c 69  pNext){.    sqli
95e0: 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
95f0: 61 6c 6b 65 72 2c 20 70 53 74 65 70 2d 3e 70 53  alker, pStep->pS
9600: 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
9610: 74 65 33 57 61 6c 6b 45 78 70 72 28 70 57 61 6c  te3WalkExpr(pWal
9620: 6b 65 72 2c 20 70 53 74 65 70 2d 3e 70 57 68 65  ker, pStep->pWhe
9630: 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
9640: 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 57 61  WalkExprList(pWa
9650: 6c 6b 65 72 2c 20 70 53 74 65 70 2d 3e 70 45 78  lker, pStep->pEx
9660: 70 72 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  prList);.    if(
9670: 20 70 53 74 65 70 2d 3e 70 55 70 73 65 72 74 20   pStep->pUpsert 
9680: 29 7b 0a 20 20 20 20 20 20 55 70 73 65 72 74 20  ){.      Upsert 
9690: 2a 70 55 70 73 65 72 74 20 3d 20 70 53 74 65 70  *pUpsert = pStep
96a0: 2d 3e 70 55 70 73 65 72 74 3b 0a 20 20 20 20 20  ->pUpsert;.     
96b0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
96c0: 4c 69 73 74 28 70 57 61 6c 6b 65 72 2c 20 70 55  List(pWalker, pU
96d0: 70 73 65 72 74 2d 3e 70 55 70 73 65 72 74 54 61  psert->pUpsertTa
96e0: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  rget);.      sql
96f0: 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
9700: 28 70 57 61 6c 6b 65 72 2c 20 70 55 70 73 65 72  (pWalker, pUpser
9710: 74 2d 3e 70 55 70 73 65 72 74 53 65 74 29 3b 0a  t->pUpsertSet);.
9720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
9730: 6b 45 78 70 72 28 70 57 61 6c 6b 65 72 2c 20 70  kExpr(pWalker, p
9740: 55 70 73 65 72 74 2d 3e 70 55 70 73 65 72 74 57  Upsert->pUpsertW
9750: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  here);.      sql
9760: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 70 57 61  ite3WalkExpr(pWa
9770: 6c 6b 65 72 2c 20 70 55 70 73 65 72 74 2d 3e 70  lker, pUpsert->p
9780: 55 70 73 65 72 74 54 61 72 67 65 74 57 68 65 72  UpsertTargetWher
9790: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
97a0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
97b0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 50 61 72 73  contents of Pars
97c0: 65 20 6f 62 6a 65 63 74 20 28 2a 70 50 61 72 73  e object (*pPars
97d0: 65 29 2e 20 44 6f 20 6e 6f 74 20 66 72 65 65 20  e). Do not free 
97e0: 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 6f 63  the memory.** oc
97f0: 63 75 70 69 65 64 20 62 79 20 74 68 65 20 50 61  cupied by the Pa
9800: 72 73 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c  rse object itsel
9810: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  f..*/.static voi
9820: 64 20 72 65 6e 61 6d 65 50 61 72 73 65 43 6c 65  d renameParseCle
9830: 61 6e 75 70 28 50 61 72 73 65 20 2a 70 50 61 72  anup(Parse *pPar
9840: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
9850: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9860: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
9870: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56    if( pParse->pV
9880: 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dbe ){.    sqlit
9890: 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 70  e3VdbeFinalize(p
98a0: 50 61 72 73 65 2d 3e 70 56 64 62 65 29 3b 0a 20  Parse->pVdbe);. 
98b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65   }.  sqlite3Dele
98c0: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72  teTable(db, pPar
98d0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3b 0a  se->pNewTable);.
98e0: 20 20 77 68 69 6c 65 28 20 28 70 49 64 78 20 3d    while( (pIdx =
98f0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64   pParse->pNewInd
9900: 65 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 50  ex)!=0 ){.    pP
9910: 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78 20  arse->pNewIndex 
9920: 3d 20 70 49 64 78 2d 3e 70 4e 65 78 74 3b 0a 20  = pIdx->pNext;. 
9930: 20 20 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e     sqlite3FreeIn
9940: 64 65 78 28 64 62 2c 20 70 49 64 78 29 3b 0a 20  dex(db, pIdx);. 
9950: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65   }.  sqlite3Dele
9960: 74 65 54 72 69 67 67 65 72 28 64 62 2c 20 70 50  teTrigger(db, pP
9970: 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67 67 65  arse->pNewTrigge
9980: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  r);.  sqlite3DbF
9990: 72 65 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  ree(db, pParse->
99a0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 65 6e 61  zErrMsg);.  rena
99b0: 6d 65 54 6f 6b 65 6e 46 72 65 65 28 64 62 2c 20  meTokenFree(db, 
99c0: 70 50 61 72 73 65 2d 3e 70 52 65 6e 61 6d 65 29  pParse->pRename)
99d0: 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 72 73 65  ;.  sqlite3Parse
99e0: 72 52 65 73 65 74 28 70 50 61 72 73 65 29 3b 0a  rReset(pParse);.
99f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e  }../*.** SQL fun
9a00: 63 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ction:.**.**    
9a10: 20 73 71 6c 69 74 65 5f 72 65 6e 61 6d 65 5f 63   sqlite_rename_c
9a20: 6f 6c 75 6d 6e 28 7a 53 71 6c 2c 20 69 43 6f 6c  olumn(zSql, iCol
9a30: 2c 20 62 51 75 6f 74 65 2c 20 7a 4e 65 77 2c 20  , bQuote, zNew, 
9a40: 7a 54 61 62 6c 65 2c 20 7a 4f 6c 64 29 0a 2a 2a  zTable, zOld).**
9a50: 0a 2a 2a 20 20 20 30 2e 20 7a 53 71 6c 3a 20 20  .**   0. zSql:  
9a60: 20 20 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74     SQL statement
9a70: 20 74 6f 20 72 65 77 72 69 74 65 0a 2a 2a 20 20   to rewrite.**  
9a80: 20 31 2e 20 74 79 70 65 3a 20 20 20 20 20 54 79   1. type:     Ty
9a90: 70 65 20 6f 66 20 6f 62 6a 65 63 74 20 28 22 74  pe of object ("t
9aa0: 61 62 6c 65 22 2c 20 22 76 69 65 77 22 20 65 74  able", "view" et
9ab0: 63 2e 29 0a 2a 2a 20 20 20 32 2e 20 6f 62 6a 65  c.).**   2. obje
9ac0: 63 74 3a 20 20 20 4e 61 6d 65 20 6f 66 20 6f 62  ct:   Name of ob
9ad0: 6a 65 63 74 0a 2a 2a 20 20 20 33 2e 20 44 61 74  ject.**   3. Dat
9ae0: 61 62 61 73 65 3a 20 44 61 74 61 62 61 73 65 20  abase: Database 
9af0: 6e 61 6d 65 20 28 65 2e 67 2e 20 22 6d 61 69 6e  name (e.g. "main
9b00: 22 29 0a 2a 2a 20 20 20 34 2e 20 54 61 62 6c 65  ").**   4. Table
9b10: 3a 20 20 20 20 54 61 62 6c 65 20 6e 61 6d 65 0a  :    Table name.
9b20: 2a 2a 20 20 20 35 2e 20 69 43 6f 6c 3a 20 20 20  **   5. iCol:   
9b30: 20 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d    Index of colum
9b40: 6e 20 74 6f 20 72 65 6e 61 6d 65 0a 2a 2a 20 20  n to rename.**  
9b50: 20 36 2e 20 7a 4e 65 77 3a 20 20 20 20 20 4e 65   6. zNew:     Ne
9b60: 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 0a 2a 2a  w column name.**
9b70: 20 20 20 37 2e 20 62 51 75 6f 74 65 3a 20 20 20     7. bQuote:   
9b80: 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  Non-zero if the 
9b90: 6e 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  new column name 
9ba0: 73 68 6f 75 6c 64 20 62 65 20 71 75 6f 74 65 64  should be quoted
9bb0: 2e 0a 2a 2a 20 20 20 38 2e 20 62 54 65 6d 70 3a  ..**   8. bTemp:
9bc0: 20 20 20 20 54 72 75 65 20 69 66 20 7a 53 71 6c      True if zSql
9bd0: 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 65 6d 70   comes from temp
9be0: 20 73 63 68 65 6d 61 0a 2a 2a 0a 2a 2a 20 44 6f   schema.**.** Do
9bf0: 20 61 20 63 6f 6c 75 6d 6e 20 72 65 6e 61 6d 65   a column rename
9c00: 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68   operation on th
9c10: 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
9c20: 6e 74 20 67 69 76 65 6e 20 69 6e 20 7a 53 71 6c  nt given in zSql
9c30: 2e 0a 2a 2a 20 54 68 65 20 69 43 6f 6c 2d 74 68  ..** The iCol-th
9c40: 20 63 6f 6c 75 6d 6e 20 28 6c 65 66 74 2d 6d 6f   column (left-mo
9c50: 73 74 20 69 73 20 30 29 20 6f 66 20 74 61 62 6c  st is 0) of tabl
9c60: 65 20 7a 54 61 62 6c 65 20 69 73 20 72 65 6e 61  e zTable is rena
9c70: 6d 65 64 20 66 72 6f 6d 20 7a 43 6f 6c 0a 2a 2a  med from zCol.**
9c80: 20 69 6e 74 6f 20 7a 4e 65 77 2e 20 20 54 68 65   into zNew.  The
9c90: 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20   name should be 
9ca0: 71 75 6f 74 65 64 20 69 66 20 62 51 75 6f 74 65  quoted if bQuote
9cb0: 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
9cc0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
9cd0: 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
9ce0: 20 62 79 20 74 68 65 20 41 4c 54 45 52 20 54 41   by the ALTER TA
9cf0: 42 4c 45 20 52 45 4e 41 4d 45 20 43 4f 4c 55 4d  BLE RENAME COLUM
9d00: 4e 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 20 49 74  N command..** It
9d10: 20 69 73 20 6f 6e 6c 79 20 61 63 63 65 73 73 69   is only accessi
9d20: 62 6c 65 20 74 6f 20 53 51 4c 20 63 72 65 61 74  ble to SQL creat
9d30: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
9d40: 4e 65 73 74 65 64 50 61 72 73 65 28 29 2e 20 20  NestedParse().  
9d50: 49 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 72 65 61  It is.** not rea
9d60: 63 68 61 62 6c 65 20 66 72 6f 6d 20 6f 72 64 69  chable from ordi
9d70: 6e 61 72 79 20 53 51 4c 20 70 61 73 73 65 64 20  nary SQL passed 
9d80: 69 6e 74 6f 20 73 71 6c 69 74 65 33 5f 70 72 65  into sqlite3_pre
9d90: 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  pare()..*/.stati
9da0: 63 20 76 6f 69 64 20 72 65 6e 61 6d 65 43 6f 6c  c void renameCol
9db0: 75 6d 6e 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  umnFunc(.  sqlit
9dc0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
9dd0: 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73  ext,.  int NotUs
9de0: 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ed,.  sqlite3_va
9df0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
9e00: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
9e10: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
9e20: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
9e30: 3b 0a 20 20 52 65 6e 61 6d 65 43 74 78 20 73 43  ;.  RenameCtx sC
9e40: 74 78 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  tx;.  const char
9e50: 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20   *zSql = (const 
9e60: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
9e70: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
9e80: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
9e90: 2a 7a 44 62 20 3d 20 28 63 6f 6e 73 74 20 63 68  *zDb = (const ch
9ea0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
9eb0: 65 5f 74 65 78 74 28 61 72 67 76 5b 33 5d 29 3b  e_text(argv[3]);
9ec0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9ed0: 54 61 62 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63  Table = (const c
9ee0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
9ef0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 34 5d 29  ue_text(argv[4])
9f00: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 73  ;.  int iCol = s
9f10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
9f20: 28 61 72 67 76 5b 35 5d 29 3b 0a 20 20 63 6f 6e  (argv[5]);.  con
9f30: 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20  st char *zNew = 
9f40: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
9f50: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
9f60: 61 72 67 76 5b 36 5d 29 3b 0a 20 20 69 6e 74 20  argv[6]);.  int 
9f70: 62 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33  bQuote = sqlite3
9f80: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
9f90: 37 5d 29 3b 0a 20 20 69 6e 74 20 62 54 65 6d 70  7]);.  int bTemp
9fa0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
9fb0: 5f 69 6e 74 28 61 72 67 76 5b 38 5d 29 3b 0a 20  _int(argv[8]);. 
9fc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 6c   const char *zOl
9fd0: 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  d;.  int rc;.  P
9fe0: 61 72 73 65 20 73 50 61 72 73 65 3b 0a 20 20 57  arse sParse;.  W
9ff0: 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20  alker sWalker;. 
a000: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
a010: 69 6e 74 20 69 3b 0a 20 20 54 61 62 6c 65 20 2a  int i;.  Table *
a020: 70 54 61 62 3b 0a 23 69 66 6e 64 65 66 20 53 51  pTab;.#ifndef SQ
a030: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
a040: 49 5a 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65  IZATION.  sqlite
a050: 33 5f 78 61 75 74 68 20 78 41 75 74 68 20 3d 20  3_xauth xAuth = 
a060: 64 62 2d 3e 78 41 75 74 68 3b 0a 23 65 6e 64 69  db->xAuth;.#endi
a070: 66 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  f..  UNUSED_PARA
a080: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
a090: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
a0a0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 7a 54  return;.  if( zT
a0b0: 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  able==0 ) return
a0c0: 3b 0a 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20  ;.  if( zNew==0 
a0d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
a0e0: 69 43 6f 6c 3c 30 20 29 20 72 65 74 75 72 6e 3b  iCol<0 ) return;
a0f0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
a100: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 70  nterAll(db);.  p
a110: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
a120: 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c  dTable(db, zTabl
a130: 65 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70  e, zDb);.  if( p
a140: 54 61 62 3d 3d 30 20 7c 7c 20 69 43 6f 6c 3e 3d  Tab==0 || iCol>=
a150: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
a160: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
a170: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  aveAll(db);.    
a180: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 4f  return;.  }.  zO
a190: 6c 64 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ld = pTab->aCol[
a1a0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 6d  iCol].zName;.  m
a1b0: 65 6d 73 65 74 28 26 73 43 74 78 2c 20 30 2c 20  emset(&sCtx, 0, 
a1c0: 73 69 7a 65 6f 66 28 73 43 74 78 29 29 3b 0a 20  sizeof(sCtx));. 
a1d0: 20 73 43 74 78 2e 69 43 6f 6c 20 3d 20 28 28 69   sCtx.iCol = ((i
a1e0: 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  Col==pTab->iPKey
a1f0: 29 20 3f 20 2d 31 20 3a 20 69 43 6f 6c 29 3b 0a  ) ? -1 : iCol);.
a200: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a210: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
a220: 4f 4e 0a 20 20 64 62 2d 3e 78 41 75 74 68 20 3d  ON.  db->xAuth =
a230: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 63 20   0;.#endif.  rc 
a240: 3d 20 72 65 6e 61 6d 65 50 61 72 73 65 53 71 6c  = renameParseSql
a250: 28 26 73 50 61 72 73 65 2c 20 7a 44 62 2c 20 30  (&sParse, zDb, 0
a260: 2c 20 64 62 2c 20 7a 53 71 6c 2c 20 62 54 65 6d  , db, zSql, bTem
a270: 70 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74  p);..  /* Find t
a280: 6f 6b 65 6e 73 20 74 68 61 74 20 6e 65 65 64 20  okens that need 
a290: 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 2e 20  to be replaced. 
a2a0: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61  */.  memset(&sWa
a2b0: 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lker, 0, sizeof(
a2c0: 57 61 6c 6b 65 72 29 29 3b 0a 20 20 73 57 61 6c  Walker));.  sWal
a2d0: 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 26 73 50  ker.pParse = &sP
a2e0: 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  arse;.  sWalker.
a2f0: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
a300: 72 65 6e 61 6d 65 43 6f 6c 75 6d 6e 45 78 70 72  renameColumnExpr
a310: 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 53  Cb;.  sWalker.xS
a320: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
a330: 72 65 6e 61 6d 65 43 6f 6c 75 6d 6e 53 65 6c 65  renameColumnSele
a340: 63 74 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  ctCb;.  sWalker.
a350: 75 2e 70 52 65 6e 61 6d 65 20 3d 20 26 73 43 74  u.pRename = &sCt
a360: 78 3b 0a 0a 20 20 73 43 74 78 2e 70 54 61 62 20  x;..  sCtx.pTab 
a370: 3d 20 70 54 61 62 3b 0a 20 20 69 66 28 20 72 63  = pTab;.  if( rc
a380: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
a390: 74 6f 20 72 65 6e 61 6d 65 43 6f 6c 75 6d 6e 46  to renameColumnF
a3a0: 75 6e 63 5f 64 6f 6e 65 3b 0a 20 20 69 66 28 20  unc_done;.  if( 
a3b0: 73 50 61 72 73 65 2e 70 4e 65 77 54 61 62 6c 65  sParse.pNewTable
a3c0: 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   ){.    Select *
a3d0: 70 53 65 6c 65 63 74 20 3d 20 73 50 61 72 73 65  pSelect = sParse
a3e0: 2e 70 4e 65 77 54 61 62 6c 65 2d 3e 70 53 65 6c  .pNewTable->pSel
a3f0: 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65  ect;.    if( pSe
a400: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 50  lect ){.      sP
a410: 61 72 73 65 2e 72 63 20 3d 20 53 51 4c 49 54 45  arse.rc = SQLITE
a420: 5f 4f 4b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  _OK;.      sqlit
a430: 65 33 53 65 6c 65 63 74 50 72 65 70 28 26 73 50  e3SelectPrep(&sP
a440: 61 72 73 65 2c 20 73 50 61 72 73 65 2e 70 4e 65  arse, sParse.pNe
a450: 77 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c  wTable->pSelect,
a460: 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   0);.      rc = 
a470: 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  (db->mallocFaile
a480: 64 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d ? SQLITE_NOMEM
a490: 20 3a 20 73 50 61 72 73 65 2e 72 63 29 3b 0a 20   : sParse.rc);. 
a4a0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
a4b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a4c0: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
a4d0: 65 63 74 28 26 73 57 61 6c 6b 65 72 2c 20 70 53  ect(&sWalker, pS
a4e0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a  elect);.      }.
a4f0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
a500: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 72  LITE_OK ) goto r
a510: 65 6e 61 6d 65 43 6f 6c 75 6d 6e 46 75 6e 63 5f  enameColumnFunc_
a520: 64 6f 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  done;.    }else{
a530: 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75  .      /* A regu
a540: 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  lar table */.   
a550: 20 20 20 69 6e 74 20 62 46 4b 4f 6e 6c 79 20 3d     int bFKOnly =
a560: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
a570: 28 7a 54 61 62 6c 65 2c 20 73 50 61 72 73 65 2e  (zTable, sParse.
a580: 70 4e 65 77 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  pNewTable->zName
a590: 29 3b 0a 20 20 20 20 20 20 46 4b 65 79 20 2a 70  );.      FKey *p
a5a0: 46 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65  FKey;.      asse
a5b0: 72 74 28 20 73 50 61 72 73 65 2e 70 4e 65 77 54  rt( sParse.pNewT
a5c0: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  able->pSelect==0
a5d0: 20 29 3b 0a 20 20 20 20 20 20 73 43 74 78 2e 70   );.      sCtx.p
a5e0: 54 61 62 20 3d 20 73 50 61 72 73 65 2e 70 4e 65  Tab = sParse.pNe
a5f0: 77 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 69 66  wTable;.      if
a600: 28 20 62 46 4b 4f 6e 6c 79 3d 3d 30 20 29 7b 0a  ( bFKOnly==0 ){.
a610: 20 20 20 20 20 20 20 20 72 65 6e 61 6d 65 54 6f          renameTo
a620: 6b 65 6e 46 69 6e 64 28 0a 20 20 20 20 20 20 20  kenFind(.       
a630: 20 20 20 20 20 26 73 50 61 72 73 65 2c 20 26 73       &sParse, &s
a640: 43 74 78 2c 20 28 76 6f 69 64 2a 29 73 50 61 72  Ctx, (void*)sPar
a650: 73 65 2e 70 4e 65 77 54 61 62 6c 65 2d 3e 61 43  se.pNewTable->aC
a660: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 0a 20  ol[iCol].zName. 
a670: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
a680: 20 20 69 66 28 20 73 43 74 78 2e 69 43 6f 6c 3c    if( sCtx.iCol<
a690: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
a6a0: 65 6e 61 6d 65 54 6f 6b 65 6e 46 69 6e 64 28 26  enameTokenFind(&
a6b0: 73 50 61 72 73 65 2c 20 26 73 43 74 78 2c 20 28  sParse, &sCtx, (
a6c0: 76 6f 69 64 2a 29 26 73 50 61 72 73 65 2e 70 4e  void*)&sParse.pN
a6d0: 65 77 54 61 62 6c 65 2d 3e 69 50 4b 65 79 29 3b  ewTable->iPKey);
a6e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a6f0: 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78     sqlite3WalkEx
a700: 70 72 4c 69 73 74 28 26 73 57 61 6c 6b 65 72 2c  prList(&sWalker,
a710: 20 73 50 61 72 73 65 2e 70 4e 65 77 54 61 62 6c   sParse.pNewTabl
a720: 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20 20 20  e->pCheck);.    
a730: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 73 50 61      for(pIdx=sPa
a740: 72 73 65 2e 70 4e 65 77 54 61 62 6c 65 2d 3e 70  rse.pNewTable->p
a750: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
a760: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
a770: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a780: 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 73  3WalkExprList(&s
a790: 57 61 6c 6b 65 72 2c 20 70 49 64 78 2d 3e 61 43  Walker, pIdx->aC
a7a0: 6f 6c 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  olExpr);.       
a7b0: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70   }.        for(p
a7c0: 49 64 78 3d 73 50 61 72 73 65 2e 70 4e 65 77 49  Idx=sParse.pNewI
a7d0: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
a7e0: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
a7f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a800: 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 73 57  WalkExprList(&sW
a810: 61 6c 6b 65 72 2c 20 70 49 64 78 2d 3e 61 43 6f  alker, pIdx->aCo
a820: 6c 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  lExpr);.        
a830: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
a840: 20 66 6f 72 28 70 46 4b 65 79 3d 73 50 61 72 73   for(pFKey=sPars
a850: 65 2e 70 4e 65 77 54 61 62 6c 65 2d 3e 70 46 4b  e.pNewTable->pFK
a860: 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79  ey; pFKey; pFKey
a870: 3d 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f  =pFKey->pNextFro
a880: 6d 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  m){.        for(
a890: 69 3d 30 3b 20 69 3c 70 46 4b 65 79 2d 3e 6e 43  i=0; i<pFKey->nC
a8a0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
a8b0: 20 20 20 20 69 66 28 20 62 46 4b 4f 6e 6c 79 3d      if( bFKOnly=
a8c0: 3d 30 20 26 26 20 70 46 4b 65 79 2d 3e 61 43 6f  =0 && pFKey->aCo
a8d0: 6c 5b 69 5d 2e 69 46 72 6f 6d 3d 3d 69 43 6f 6c  l[i].iFrom==iCol
a8e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a8f0: 72 65 6e 61 6d 65 54 6f 6b 65 6e 46 69 6e 64 28  renameTokenFind(
a900: 26 73 50 61 72 73 65 2c 20 26 73 43 74 78 2c 20  &sParse, &sCtx, 
a910: 28 76 6f 69 64 2a 29 26 70 46 4b 65 79 2d 3e 61  (void*)&pFKey->a
a920: 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Col[i]);.       
a930: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
a940: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
a950: 72 69 63 6d 70 28 70 46 4b 65 79 2d 3e 7a 54 6f  ricmp(pFKey->zTo
a960: 2c 20 7a 54 61 62 6c 65 29 0a 20 20 20 20 20 20  , zTable).      
a970: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
a980: 65 33 5f 73 74 72 69 63 6d 70 28 70 46 4b 65 79  e3_stricmp(pFKey
a990: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 2c 20  ->aCol[i].zCol, 
a9a0: 7a 4f 6c 64 29 0a 20 20 20 20 20 20 20 20 20 20  zOld).          
a9b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
a9c0: 65 6e 61 6d 65 54 6f 6b 65 6e 46 69 6e 64 28 26  enameTokenFind(&
a9d0: 73 50 61 72 73 65 2c 20 26 73 43 74 78 2c 20 28  sParse, &sCtx, (
a9e0: 76 6f 69 64 2a 29 70 46 4b 65 79 2d 3e 61 43 6f  void*)pFKey->aCo
a9f0: 6c 5b 69 5d 2e 7a 43 6f 6c 29 3b 0a 20 20 20 20  l[i].zCol);.    
aa00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
aa10: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
aa20: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 50 61 72    }else if( sPar
aa30: 73 65 2e 70 4e 65 77 49 6e 64 65 78 20 29 7b 0a  se.pNewIndex ){.
aa40: 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45      sqlite3WalkE
aa50: 78 70 72 4c 69 73 74 28 26 73 57 61 6c 6b 65 72  xprList(&sWalker
aa60: 2c 20 73 50 61 72 73 65 2e 70 4e 65 77 49 6e 64  , sParse.pNewInd
aa70: 65 78 2d 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20  ex->aColExpr);. 
aa80: 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78     sqlite3WalkEx
aa90: 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 73 50 61  pr(&sWalker, sPa
aaa0: 72 73 65 2e 70 4e 65 77 49 6e 64 65 78 2d 3e 70  rse.pNewIndex->p
aab0: 50 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a 20  PartIdxWhere);. 
aac0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 41   }else{.    /* A
aad0: 20 74 72 69 67 67 65 72 20 2a 2f 0a 20 20 20 20   trigger */.    
aae0: 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 53 74  TriggerStep *pSt
aaf0: 65 70 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 6e  ep;.    rc = ren
ab00: 61 6d 65 52 65 73 6f 6c 76 65 54 72 69 67 67 65  ameResolveTrigge
ab10: 72 28 26 73 50 61 72 73 65 2c 20 28 62 54 65 6d  r(&sParse, (bTem
ab20: 70 20 3f 20 30 20 3a 20 7a 44 62 29 29 3b 0a 20  p ? 0 : zDb));. 
ab30: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ab40: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 72 65 6e 61  E_OK ) goto rena
ab50: 6d 65 43 6f 6c 75 6d 6e 46 75 6e 63 5f 64 6f 6e  meColumnFunc_don
ab60: 65 3b 0a 0a 20 20 20 20 66 6f 72 28 70 53 74 65  e;..    for(pSte
ab70: 70 3d 73 50 61 72 73 65 2e 70 4e 65 77 54 72 69  p=sParse.pNewTri
ab80: 67 67 65 72 2d 3e 73 74 65 70 5f 6c 69 73 74 3b  gger->step_list;
ab90: 20 70 53 74 65 70 3b 20 70 53 74 65 70 3d 70 53   pStep; pStep=pS
aba0: 74 65 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  tep->pNext){.   
abb0: 20 20 20 69 66 28 20 70 53 74 65 70 2d 3e 7a 54     if( pStep->zT
abc0: 61 72 67 65 74 20 29 7b 20 0a 20 20 20 20 20 20  arget ){ .      
abd0: 20 20 54 61 62 6c 65 20 2a 70 54 61 72 67 65 74    Table *pTarget
abe0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
abf0: 54 61 62 6c 65 28 26 73 50 61 72 73 65 2c 20 30  Table(&sParse, 0
ac00: 2c 20 70 53 74 65 70 2d 3e 7a 54 61 72 67 65 74  , pStep->zTarget
ac10: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , zDb);.        
ac20: 69 66 28 20 70 54 61 72 67 65 74 3d 3d 70 54 61  if( pTarget==pTa
ac30: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  b ){.          i
ac40: 66 28 20 70 53 74 65 70 2d 3e 70 55 70 73 65 72  f( pStep->pUpser
ac50: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
ac60: 20 45 78 70 72 4c 69 73 74 20 2a 70 55 70 73 65   ExprList *pUpse
ac70: 72 74 53 65 74 20 3d 20 70 53 74 65 70 2d 3e 70  rtSet = pStep->p
ac80: 55 70 73 65 72 74 2d 3e 70 55 70 73 65 72 74 53  Upsert->pUpsertS
ac90: 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  et;.            
aca0: 72 65 6e 61 6d 65 43 6f 6c 75 6d 6e 45 6c 69 73  renameColumnElis
acb0: 74 4e 61 6d 65 73 28 26 73 50 61 72 73 65 2c 20  tNames(&sParse, 
acc0: 26 73 43 74 78 2c 20 70 55 70 73 65 72 74 53 65  &sCtx, pUpsertSe
acd0: 74 2c 20 7a 4f 6c 64 29 3b 0a 20 20 20 20 20 20  t, zOld);.      
ace0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
acf0: 72 65 6e 61 6d 65 43 6f 6c 75 6d 6e 49 64 6c 69  renameColumnIdli
ad00: 73 74 4e 61 6d 65 73 28 26 73 50 61 72 73 65 2c  stNames(&sParse,
ad10: 20 26 73 43 74 78 2c 20 70 53 74 65 70 2d 3e 70   &sCtx, pStep->p
ad20: 49 64 4c 69 73 74 2c 20 7a 4f 6c 64 29 3b 0a 20  IdList, zOld);. 
ad30: 20 20 20 20 20 20 20 20 20 72 65 6e 61 6d 65 43           renameC
ad40: 6f 6c 75 6d 6e 45 6c 69 73 74 4e 61 6d 65 73 28  olumnElistNames(
ad50: 26 73 50 61 72 73 65 2c 20 26 73 43 74 78 2c 20  &sParse, &sCtx, 
ad60: 70 53 74 65 70 2d 3e 70 45 78 70 72 4c 69 73 74  pStep->pExprList
ad70: 2c 20 7a 4f 6c 64 29 3b 0a 20 20 20 20 20 20 20  , zOld);.       
ad80: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
ad90: 0a 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74  ...    /* Find t
ada0: 6f 6b 65 6e 73 20 74 6f 20 65 64 69 74 20 69 6e  okens to edit in
adb0: 20 55 50 44 41 54 45 20 4f 46 20 63 6c 61 75 73   UPDATE OF claus
adc0: 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 50 61  e */.    if( sPa
add0: 72 73 65 2e 70 54 72 69 67 67 65 72 54 61 62 3d  rse.pTriggerTab=
ade0: 3d 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 72  =pTab ){.      r
adf0: 65 6e 61 6d 65 43 6f 6c 75 6d 6e 49 64 6c 69 73  enameColumnIdlis
ae00: 74 4e 61 6d 65 73 28 26 73 50 61 72 73 65 2c 20  tNames(&sParse, 
ae10: 26 73 43 74 78 2c 73 50 61 72 73 65 2e 70 4e 65  &sCtx,sParse.pNe
ae20: 77 54 72 69 67 67 65 72 2d 3e 70 43 6f 6c 75 6d  wTrigger->pColum
ae30: 6e 73 2c 7a 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  ns,zOld);.    }.
ae40: 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 6f 6b  .    /* Find tok
ae50: 65 6e 73 20 74 6f 20 65 64 69 74 20 69 6e 20 76  ens to edit in v
ae60: 61 72 69 6f 75 73 20 65 78 70 72 65 73 73 69 6f  arious expressio
ae70: 6e 73 20 61 6e 64 20 73 65 6c 65 63 74 73 20 2a  ns and selects *
ae80: 2f 0a 20 20 20 20 72 65 6e 61 6d 65 57 61 6c 6b  /.    renameWalk
ae90: 54 72 69 67 67 65 72 28 26 73 57 61 6c 6b 65 72  Trigger(&sWalker
aea0: 2c 20 73 50 61 72 73 65 2e 70 4e 65 77 54 72 69  , sParse.pNewTri
aeb0: 67 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gger);.  }..  as
aec0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
aed0: 5f 4f 4b 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  _OK );.  rc = re
aee0: 6e 61 6d 65 45 64 69 74 53 71 6c 28 63 6f 6e 74  nameEditSql(cont
aef0: 65 78 74 2c 20 26 73 43 74 78 2c 20 7a 53 71 6c  ext, &sCtx, zSql
af00: 2c 20 7a 4e 65 77 2c 20 62 51 75 6f 74 65 29 3b  , zNew, bQuote);
af10: 0a 0a 72 65 6e 61 6d 65 43 6f 6c 75 6d 6e 46 75  ..renameColumnFu
af20: 6e 63 5f 64 6f 6e 65 3a 0a 20 20 69 66 28 20 72  nc_done:.  if( r
af30: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
af40: 20 20 20 20 69 66 28 20 73 50 61 72 73 65 2e 7a      if( sParse.z
af50: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
af60: 72 65 6e 61 6d 65 43 6f 6c 75 6d 6e 50 61 72 73  renameColumnPars
af70: 65 45 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  eError(context, 
af80: 30 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72 67 76  0, argv[1], argv
af90: 5b 32 5d 2c 20 26 73 50 61 72 73 65 29 3b 0a 20  [2], &sParse);. 
afa0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
afb0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
afc0: 72 72 6f 72 5f 63 6f 64 65 28 63 6f 6e 74 65 78  rror_code(contex
afd0: 74 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  t, rc);.    }.  
afe0: 7d 0a 0a 20 20 72 65 6e 61 6d 65 50 61 72 73 65  }..  renameParse
aff0: 43 6c 65 61 6e 75 70 28 26 73 50 61 72 73 65 29  Cleanup(&sParse)
b000: 3b 0a 20 20 72 65 6e 61 6d 65 54 6f 6b 65 6e 46  ;.  renameTokenF
b010: 72 65 65 28 64 62 2c 20 73 43 74 78 2e 70 4c 69  ree(db, sCtx.pLi
b020: 73 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  st);.#ifndef SQL
b030: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
b040: 5a 41 54 49 4f 4e 0a 20 20 64 62 2d 3e 78 41 75  ZATION.  db->xAu
b050: 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6e 64  th = xAuth;.#end
b060: 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  if.  sqlite3Btre
b070: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 7d  eLeaveAll(db);.}
b080: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 65 72 20 65  ../*.** Walker e
b090: 78 70 72 65 73 73 69 6f 6e 20 63 61 6c 6c 62 61  xpression callba
b0a0: 63 6b 20 75 73 65 64 20 62 79 20 22 52 45 4e 41  ck used by "RENA
b0b0: 4d 45 20 54 41 42 4c 45 22 2e 20 0a 2a 2f 0a 73  ME TABLE". .*/.s
b0c0: 74 61 74 69 63 20 69 6e 74 20 72 65 6e 61 6d 65  tatic int rename
b0d0: 54 61 62 6c 65 45 78 70 72 43 62 28 57 61 6c 6b  TableExprCb(Walk
b0e0: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
b0f0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 52 65 6e  r *pExpr){.  Ren
b100: 61 6d 65 43 74 78 20 2a 70 20 3d 20 70 57 61 6c  ameCtx *p = pWal
b110: 6b 65 72 2d 3e 75 2e 70 52 65 6e 61 6d 65 3b 0a  ker->u.pRename;.
b120: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
b130: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d  =TK_COLUMN && p-
b140: 3e 70 54 61 62 3d 3d 70 45 78 70 72 2d 3e 79 2e  >pTab==pExpr->y.
b150: 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 6e 61  pTab ){.    rena
b160: 6d 65 54 6f 6b 65 6e 46 69 6e 64 28 70 57 61 6c  meTokenFind(pWal
b170: 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 2c 20  ker->pParse, p, 
b180: 28 76 6f 69 64 2a 29 26 70 45 78 70 72 2d 3e 79  (void*)&pExpr->y
b190: 2e 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 72 65  .pTab);.  }.  re
b1a0: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
b1b0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  e;.}../*.** Walk
b1c0: 65 72 20 73 65 6c 65 63 74 20 63 61 6c 6c 62 61  er select callba
b1d0: 63 6b 20 75 73 65 64 20 62 79 20 22 52 45 4e 41  ck used by "RENA
b1e0: 4d 45 20 54 41 42 4c 45 22 2e 20 0a 2a 2f 0a 73  ME TABLE". .*/.s
b1f0: 74 61 74 69 63 20 69 6e 74 20 72 65 6e 61 6d 65  tatic int rename
b200: 54 61 62 6c 65 53 65 6c 65 63 74 43 62 28 57 61  TableSelectCb(Wa
b210: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
b220: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
b230: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 52 65 6e 61  .  int i;.  Rena
b240: 6d 65 43 74 78 20 2a 70 20 3d 20 70 57 61 6c 6b  meCtx *p = pWalk
b250: 65 72 2d 3e 75 2e 70 52 65 6e 61 6d 65 3b 0a 20  er->u.pRename;. 
b260: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
b270: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
b280: 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b    if( pSrc==0 ){
b290: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 61  .    assert( pWa
b2a0: 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62  lker->pParse->db
b2b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b2c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  ;.    return WRC
b2d0: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 66 6f  _Abort;.  }.  fo
b2e0: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
b2f0: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
b300: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
b310: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72  em *pItem = &pSr
b320: 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 69 66 28  c->a[i];.    if(
b330: 20 70 49 74 65 6d 2d 3e 70 54 61 62 3d 3d 70 2d   pItem->pTab==p-
b340: 3e 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 72  >pTab ){.      r
b350: 65 6e 61 6d 65 54 6f 6b 65 6e 46 69 6e 64 28 70  enameTokenFind(p
b360: 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20  Walker->pParse, 
b370: 70 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  p, pItem->zName)
b380: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
b390: 6e 61 6d 65 57 61 6c 6b 57 69 74 68 28 70 57 61  nameWalkWith(pWa
b3a0: 6c 6b 65 72 2c 20 70 53 65 6c 65 63 74 29 3b 0a  lker, pSelect);.
b3b0: 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
b3c0: 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ntinue;.}.../*.*
b3d0: 2a 20 54 68 69 73 20 43 20 66 75 6e 63 74 69 6f  * This C functio
b3e0: 6e 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20  n implements an 
b3f0: 53 51 4c 20 75 73 65 72 20 66 75 6e 63 74 69 6f  SQL user functio
b400: 6e 20 74 68 61 74 20 69 73 20 75 73 65 64 20 62  n that is used b
b410: 79 20 53 51 4c 20 63 6f 64 65 0a 2a 2a 20 67 65  y SQL code.** ge
b420: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 41  nerated by the A
b430: 4c 54 45 52 20 54 41 42 4c 45 20 2e 2e 2e 20 52  LTER TABLE ... R
b440: 45 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 74 6f  ENAME command to
b450: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 65 66 69   modify the defi
b460: 6e 69 74 69 6f 6e 0a 2a 2a 20 6f 66 20 61 6e 79  nition.** of any
b470: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
b480: 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 75 73  straints that us
b490: 65 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  e the table bein
b4a0: 67 20 72 65 6e 61 6d 65 64 20 61 73 20 74 68 65  g renamed as the
b4b0: 20 0a 2a 2a 20 70 61 72 65 6e 74 20 74 61 62 6c   .** parent tabl
b4c0: 65 2e 20 49 74 20 69 73 20 70 61 73 73 65 64 20  e. It is passed 
b4d0: 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 3a  three arguments:
b4e0: 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20  .**.**   0: The 
b4f0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
b500: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62 65  ing the table be
b510: 69 6e 67 20 72 65 6e 61 6d 65 64 2e 0a 2a 2a 20  ing renamed..** 
b520: 20 20 31 2e 20 74 79 70 65 3a 20 20 20 20 20 54    1. type:     T
b530: 79 70 65 20 6f 66 20 6f 62 6a 65 63 74 20 28 22  ype of object ("
b540: 74 61 62 6c 65 22 2c 20 22 76 69 65 77 22 20 65  table", "view" e
b550: 74 63 2e 29 0a 2a 2a 20 20 20 32 2e 20 6f 62 6a  tc.).**   2. obj
b560: 65 63 74 3a 20 20 20 4e 61 6d 65 20 6f 66 20 6f  ect:   Name of o
b570: 62 6a 65 63 74 0a 2a 2a 20 20 20 33 3a 20 54 68  bject.**   3: Th
b580: 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
b590: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 73 74  of the schema st
b5a0: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 6d 6f  atement being mo
b5b0: 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 34 3a 20  dified,.**   4: 
b5c0: 54 68 65 20 6f 6c 64 20 6e 61 6d 65 20 6f 66 20  The old name of 
b5d0: 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
b5e0: 72 65 6e 61 6d 65 64 2c 20 61 6e 64 0a 2a 2a 20  renamed, and.** 
b5f0: 20 20 35 3a 20 54 68 65 20 6e 65 77 20 6e 61 6d    5: The new nam
b600: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 62  e of the table b
b610: 65 69 6e 67 20 72 65 6e 61 6d 65 64 2e 0a 2a 2a  eing renamed..**
b620: 20 20 20 36 3a 20 54 72 75 65 20 69 66 20 74 68     6: True if th
b630: 65 20 73 63 68 65 6d 61 20 73 74 61 74 65 6d 65  e schema stateme
b640: 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68  nt comes from th
b650: 65 20 74 65 6d 70 20 64 62 2e 0a 2a 2a 0a 2a 2a  e temp db..**.**
b660: 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65 20   It returns the 
b670: 6e 65 77 20 73 63 68 65 6d 61 20 73 74 61 74 65  new schema state
b680: 6d 65 6e 74 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ment. For exampl
b690: 65 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 5f  e:.**.** sqlite_
b6a0: 72 65 6e 61 6d 65 5f 74 61 62 6c 65 28 27 6d 61  rename_table('ma
b6b0: 69 6e 27 2c 20 27 43 52 45 41 54 45 20 54 41 42  in', 'CREATE TAB
b6c0: 4c 45 20 74 31 28 61 20 52 45 46 45 52 45 4e 43  LE t1(a REFERENC
b6d0: 45 53 20 74 32 29 27 2c 27 74 32 27 2c 27 74 33  ES t2)','t2','t3
b6e0: 27 2c 30 29 0a 2a 2a 20 20 20 20 20 20 20 2d 3e  ',0).**       ->
b6f0: 20 27 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   'CREATE TABLE t
b700: 31 28 61 20 52 45 46 45 52 45 4e 43 45 53 20 74  1(a REFERENCES t
b710: 33 29 27 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  3)'.*/.static vo
b720: 69 64 20 72 65 6e 61 6d 65 54 61 62 6c 65 46 75  id renameTableFu
b730: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
b740: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
b750: 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20    int NotUsed,. 
b760: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
b770: 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
b780: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
b790: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
b7a0: 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 63  le(context);.  c
b7b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
b7c0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
b7d0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
b7e0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e  (argv[0]);.  con
b7f0: 73 74 20 63 68 61 72 20 2a 7a 49 6e 70 75 74 20  st char *zInput 
b800: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
b810: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
b820: 74 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 63 6f  t(argv[3]);.  co
b830: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 6c 64 20 3d  nst char *zOld =
b840: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
b850: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
b860: 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20 63 6f 6e  (argv[4]);.  con
b870: 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20  st char *zNew = 
b880: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
b890: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
b8a0: 61 72 67 76 5b 35 5d 29 3b 0a 20 20 69 6e 74 20  argv[5]);.  int 
b8b0: 62 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f  bTemp = sqlite3_
b8c0: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 36  value_int(argv[6
b8d0: 5d 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ]);.  UNUSED_PAR
b8e0: 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
b8f0: 0a 0a 20 20 69 66 28 20 7a 49 6e 70 75 74 20 26  ..  if( zInput &
b900: 26 20 7a 4f 6c 64 20 26 26 20 7a 4e 65 77 20 29  & zOld && zNew )
b910: 7b 0a 20 20 20 20 50 61 72 73 65 20 73 50 61 72  {.    Parse sPar
b920: 73 65 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  se;.    int rc;.
b930: 20 20 20 20 69 6e 74 20 62 51 75 6f 74 65 20 3d      int bQuote =
b940: 20 31 3b 0a 20 20 20 20 52 65 6e 61 6d 65 43 74   1;.    RenameCt
b950: 78 20 73 43 74 78 3b 0a 20 20 20 20 57 61 6c 6b  x sCtx;.    Walk
b960: 65 72 20 73 57 61 6c 6b 65 72 3b 0a 0a 23 69 66  er sWalker;..#if
b970: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b980: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
b990: 20 20 20 73 71 6c 69 74 65 33 5f 78 61 75 74 68     sqlite3_xauth
b9a0: 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75   xAuth = db->xAu
b9b0: 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74  th;.    db->xAut
b9c0: 68 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  h = 0;.#endif.. 
b9d0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
b9e0: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 0a 20 20  nterAll(db);..  
b9f0: 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c 20    memset(&sCtx, 
ba00: 30 2c 20 73 69 7a 65 6f 66 28 52 65 6e 61 6d 65  0, sizeof(Rename
ba10: 43 74 78 29 29 3b 0a 20 20 20 20 73 43 74 78 2e  Ctx));.    sCtx.
ba20: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
ba30: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4f 6c 64  ndTable(db, zOld
ba40: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 6d 65 6d 73  , zDb);.    mems
ba50: 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20  et(&sWalker, 0, 
ba60: 73 69 7a 65 6f 66 28 57 61 6c 6b 65 72 29 29 3b  sizeof(Walker));
ba70: 0a 20 20 20 20 73 57 61 6c 6b 65 72 2e 70 50 61  .    sWalker.pPa
ba80: 72 73 65 20 3d 20 26 73 50 61 72 73 65 3b 0a 20  rse = &sParse;. 
ba90: 20 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72     sWalker.xExpr
baa0: 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 6e 61 6d  Callback = renam
bab0: 65 54 61 62 6c 65 45 78 70 72 43 62 3b 0a 20 20  eTableExprCb;.  
bac0: 20 20 73 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63    sWalker.xSelec
bad0: 74 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 6e 61  tCallback = rena
bae0: 6d 65 54 61 62 6c 65 53 65 6c 65 63 74 43 62 3b  meTableSelectCb;
baf0: 0a 20 20 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70  .    sWalker.u.p
bb00: 52 65 6e 61 6d 65 20 3d 20 26 73 43 74 78 3b 0a  Rename = &sCtx;.
bb10: 0a 20 20 20 20 72 63 20 3d 20 72 65 6e 61 6d 65  .    rc = rename
bb20: 50 61 72 73 65 53 71 6c 28 26 73 50 61 72 73 65  ParseSql(&sParse
bb30: 2c 20 7a 44 62 2c 20 31 2c 20 64 62 2c 20 7a 49  , zDb, 1, db, zI
bb40: 6e 70 75 74 2c 20 62 54 65 6d 70 29 3b 0a 0a 20  nput, bTemp);.. 
bb50: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
bb60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
bb70: 74 20 69 73 4c 65 67 61 63 79 20 3d 20 28 64 62  t isLegacy = (db
bb80: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
bb90: 5f 4c 65 67 61 63 79 41 6c 74 65 72 29 3b 0a 20  _LegacyAlter);. 
bba0: 20 20 20 20 20 69 66 28 20 73 50 61 72 73 65 2e       if( sParse.
bbb0: 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
bbc0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
bbd0: 20 3d 20 73 50 61 72 73 65 2e 70 4e 65 77 54 61   = sParse.pNewTa
bbe0: 62 6c 65 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  ble;..        if
bbf0: 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
bc00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
bc10: 20 69 73 4c 65 67 61 63 79 3d 3d 30 20 29 7b 0a   isLegacy==0 ){.
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65              Name
bc30: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
bc40: 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
bc50: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
bc60: 73 4e 43 29 29 3b 0a 20 20 20 20 20 20 20 20 20  sNC));.         
bc70: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
bc80: 26 73 50 61 72 73 65 3b 0a 0a 20 20 20 20 20 20  &sParse;..      
bc90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
bca0: 65 63 74 50 72 65 70 28 26 73 50 61 72 73 65 2c  ectPrep(&sParse,
bcb0: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20   pTab->pSelect, 
bcc0: 26 73 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 20  &sNC);.         
bcd0: 20 20 20 69 66 28 20 73 50 61 72 73 65 2e 6e 45     if( sParse.nE
bce0: 72 72 20 29 20 72 63 20 3d 20 73 50 61 72 73 65  rr ) rc = sParse
bcf0: 2e 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20  .rc;.           
bd00: 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
bd10: 63 74 28 26 73 57 61 6c 6b 65 72 2c 20 70 54 61  ct(&sWalker, pTa
bd20: 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b->pSelect);.   
bd30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bd40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bd50: 20 20 2f 2a 20 4d 6f 64 69 66 79 20 61 6e 79 20    /* Modify any 
bd60: 46 4b 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 74  FK definitions t
bd70: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
bd80: 65 77 20 74 61 62 6c 65 2e 20 2a 2f 0a 23 69 66  ew table. */.#if
bd90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bda0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
bdb0: 20 20 20 20 20 20 20 69 66 28 20 69 73 4c 65 67         if( isLeg
bdc0: 61 63 79 3d 3d 30 20 7c 7c 20 28 64 62 2d 3e 66  acy==0 || (db->f
bdd0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 6f  lags & SQLITE_Fo
bde0: 72 65 69 67 6e 4b 65 79 73 29 20 29 7b 0a 20 20  reignKeys) ){.  
bdf0: 20 20 20 20 20 20 20 20 20 20 46 4b 65 79 20 2a            FKey *
be00: 70 46 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  pFKey;.         
be10: 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61     for(pFKey=pTa
be20: 62 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b  b->pFKey; pFKey;
be30: 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e   pFKey=pFKey->pN
be40: 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20  extFrom){.      
be50: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
be60: 74 65 33 5f 73 74 72 69 63 6d 70 28 70 46 4b 65  te3_stricmp(pFKe
be70: 79 2d 3e 7a 54 6f 2c 20 7a 4f 6c 64 29 3d 3d 30  y->zTo, zOld)==0
be80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
be90: 20 20 20 20 72 65 6e 61 6d 65 54 6f 6b 65 6e 46      renameTokenF
bea0: 69 6e 64 28 26 73 50 61 72 73 65 2c 20 26 73 43  ind(&sParse, &sC
beb0: 74 78 2c 20 28 76 6f 69 64 2a 29 70 46 4b 65 79  tx, (void*)pFKey
bec0: 2d 3e 7a 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  ->zTo);.        
bed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bee0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
bef0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
bf00: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
bf10: 73 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  s the table bein
bf20: 67 20 61 6c 74 65 72 65 64 2c 20 66 69 78 20 61  g altered, fix a
bf30: 6e 79 20 74 61 62 6c 65 20 72 65 66 73 20 69 6e  ny table refs in
bf40: 20 43 48 45 43 4b 0a 20 20 20 20 20 20 20 20 20   CHECK.         
bf50: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 2e   ** expressions.
bf60: 20 41 6c 73 6f 20 75 70 64 61 74 65 20 74 68 65   Also update the
bf70: 20 6e 61 6d 65 20 74 68 61 74 20 61 70 70 65 61   name that appea
bf80: 72 73 20 72 69 67 68 74 20 61 66 74 65 72 20 74  rs right after t
bf90: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
bfa0: 22 43 52 45 41 54 45 20 5b 56 49 52 54 55 41 4c  "CREATE [VIRTUAL
bfb0: 5d 20 54 41 42 4c 45 22 20 62 69 74 2e 20 2a 2f  ] TABLE" bit. */
bfc0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
bfd0: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
bfe0: 4f 6c 64 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Old, pTab->zName
bff0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
c000: 20 20 20 20 73 43 74 78 2e 70 54 61 62 20 3d 20      sCtx.pTab = 
c010: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
c020: 20 20 69 66 28 20 69 73 4c 65 67 61 63 79 3d 3d    if( isLegacy==
c030: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
c040: 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78     sqlite3WalkEx
c050: 70 72 4c 69 73 74 28 26 73 57 61 6c 6b 65 72 2c  prList(&sWalker,
c060: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 29 3b 0a   pTab->pCheck);.
c070: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
c080: 20 20 20 20 20 20 20 20 20 20 72 65 6e 61 6d 65            rename
c090: 54 6f 6b 65 6e 46 69 6e 64 28 26 73 50 61 72 73  TokenFind(&sPars
c0a0: 65 2c 20 26 73 43 74 78 2c 20 70 54 61 62 2d 3e  e, &sCtx, pTab->
c0b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
c0c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
c0d0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 65 6c 73      }..      els
c0e0: 65 20 69 66 28 20 73 50 61 72 73 65 2e 70 4e 65  e if( sParse.pNe
c0f0: 77 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  wIndex ){.      
c100: 20 20 72 65 6e 61 6d 65 54 6f 6b 65 6e 46 69 6e    renameTokenFin
c110: 64 28 26 73 50 61 72 73 65 2c 20 26 73 43 74 78  d(&sParse, &sCtx
c120: 2c 20 73 50 61 72 73 65 2e 70 4e 65 77 49 6e 64  , sParse.pNewInd
c130: 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ex->zName);.    
c140: 20 20 20 20 69 66 28 20 69 73 4c 65 67 61 63 79      if( isLegacy
c150: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
c160: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
c170: 28 26 73 57 61 6c 6b 65 72 2c 20 73 50 61 72 73  (&sWalker, sPars
c180: 65 2e 70 4e 65 77 49 6e 64 65 78 2d 3e 70 50 61  e.pNewIndex->pPa
c190: 72 74 49 64 78 57 68 65 72 65 29 3b 0a 20 20 20  rtIdxWhere);.   
c1a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
c1b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c1c0: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
c1d0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20    else{.        
c1e0: 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65  Trigger *pTrigge
c1f0: 72 20 3d 20 73 50 61 72 73 65 2e 70 4e 65 77 54  r = sParse.pNewT
c200: 72 69 67 67 65 72 3b 0a 20 20 20 20 20 20 20 20  rigger;.        
c210: 54 72 69 67 67 65 72 53 74 65 70 20 2a 70 53 74  TriggerStep *pSt
c220: 65 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ep;.        if( 
c230: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
c240: 6d 70 28 73 50 61 72 73 65 2e 70 4e 65 77 54 72  mp(sParse.pNewTr
c250: 69 67 67 65 72 2d 3e 74 61 62 6c 65 2c 20 7a 4f  igger->table, zO
c260: 6c 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  ld) .           
c270: 20 26 26 20 73 43 74 78 2e 70 54 61 62 2d 3e 70   && sCtx.pTab->p
c280: 53 63 68 65 6d 61 3d 3d 70 54 72 69 67 67 65 72  Schema==pTrigger
c290: 2d 3e 70 54 61 62 53 63 68 65 6d 61 0a 20 20 20  ->pTabSchema.   
c2a0: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
c2b0: 20 20 20 20 72 65 6e 61 6d 65 54 6f 6b 65 6e 46      renameTokenF
c2c0: 69 6e 64 28 26 73 50 61 72 73 65 2c 20 26 73 43  ind(&sParse, &sC
c2d0: 74 78 2c 20 73 50 61 72 73 65 2e 70 4e 65 77 54  tx, sParse.pNewT
c2e0: 72 69 67 67 65 72 2d 3e 74 61 62 6c 65 29 3b 0a  rigger->table);.
c2f0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
c300: 20 20 20 69 66 28 20 69 73 4c 65 67 61 63 79 3d     if( isLegacy=
c310: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
c320: 72 63 20 3d 20 72 65 6e 61 6d 65 52 65 73 6f 6c  rc = renameResol
c330: 76 65 54 72 69 67 67 65 72 28 26 73 50 61 72 73  veTrigger(&sPars
c340: 65 2c 20 62 54 65 6d 70 20 3f 20 30 20 3a 20 7a  e, bTemp ? 0 : z
c350: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Db);.          i
c360: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c370: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
c380: 72 65 6e 61 6d 65 57 61 6c 6b 54 72 69 67 67 65  renameWalkTrigge
c390: 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 54 72 69  r(&sWalker, pTri
c3a0: 67 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  gger);.         
c3b0: 20 20 20 66 6f 72 28 70 53 74 65 70 3d 70 54 72     for(pStep=pTr
c3c0: 69 67 67 65 72 2d 3e 73 74 65 70 5f 6c 69 73 74  igger->step_list
c3d0: 3b 20 70 53 74 65 70 3b 20 70 53 74 65 70 3d 70  ; pStep; pStep=p
c3e0: 53 74 65 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Step->pNext){.  
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
c400: 70 53 74 65 70 2d 3e 7a 54 61 72 67 65 74 20 26  pStep->zTarget &
c410: 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  & 0==sqlite3_str
c420: 69 63 6d 70 28 70 53 74 65 70 2d 3e 7a 54 61 72  icmp(pStep->zTar
c430: 67 65 74 2c 20 7a 4f 6c 64 29 20 29 7b 0a 20 20  get, zOld) ){.  
c440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
c450: 6e 61 6d 65 54 6f 6b 65 6e 46 69 6e 64 28 26 73  nameTokenFind(&s
c460: 50 61 72 73 65 2c 20 26 73 43 74 78 2c 20 70 53  Parse, &sCtx, pS
c470: 74 65 70 2d 3e 7a 54 61 72 67 65 74 29 3b 0a 20  tep->zTarget);. 
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
c490: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
c4a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c4b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
c4c0: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  f.    }..    if(
c4d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c4e0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6e  {.      rc = ren
c4f0: 61 6d 65 45 64 69 74 53 71 6c 28 63 6f 6e 74 65  ameEditSql(conte
c500: 78 74 2c 20 26 73 43 74 78 2c 20 7a 49 6e 70 75  xt, &sCtx, zInpu
c510: 74 2c 20 7a 4e 65 77 2c 20 62 51 75 6f 74 65 29  t, zNew, bQuote)
c520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
c530: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c540: 0a 20 20 20 20 20 20 69 66 28 20 73 50 61 72 73  .      if( sPars
c550: 65 2e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  e.zErrMsg ){.   
c560: 20 20 20 20 20 72 65 6e 61 6d 65 43 6f 6c 75 6d       renameColum
c570: 6e 50 61 72 73 65 45 72 72 6f 72 28 63 6f 6e 74  nParseError(cont
c580: 65 78 74 2c 20 30 2c 20 61 72 67 76 5b 31 5d 2c  ext, 0, argv[1],
c590: 20 61 72 67 76 5b 32 5d 2c 20 26 73 50 61 72 73   argv[2], &sPars
c5a0: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
c5b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c5c0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f  _result_error_co
c5d0: 64 65 28 63 6f 6e 74 65 78 74 2c 20 72 63 29 3b  de(context, rc);
c5e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
c5f0: 20 20 20 20 72 65 6e 61 6d 65 50 61 72 73 65 43      renameParseC
c600: 6c 65 61 6e 75 70 28 26 73 50 61 72 73 65 29 3b  leanup(&sParse);
c610: 0a 20 20 20 20 72 65 6e 61 6d 65 54 6f 6b 65 6e  .    renameToken
c620: 46 72 65 65 28 64 62 2c 20 73 43 74 78 2e 70 4c  Free(db, sCtx.pL
c630: 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
c640: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
c650: 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  b);.#ifndef SQLI
c660: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
c670: 41 54 49 4f 4e 0a 20 20 20 20 64 62 2d 3e 78 41  ATION.    db->xA
c680: 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6e  uth = xAuth;.#en
c690: 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  dif.  }..  retur
c6a0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 53  n;.}../*.** An S
c6b0: 51 4c 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  QL user function
c6c0: 20 74 68 61 74 20 63 68 65 63 6b 73 20 74 68 61   that checks tha
c6d0: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 70  t there are no p
c6e0: 61 72 73 65 20 6f 72 20 73 79 6d 62 6f 6c 0a 2a  arse or symbol.*
c6f0: 2a 20 72 65 73 6f 6c 75 74 69 6f 6e 20 70 72 6f  * resolution pro
c700: 62 6c 65 6d 73 20 69 6e 20 61 20 43 52 45 41 54  blems in a CREAT
c710: 45 20 54 52 49 47 47 45 52 7c 54 41 42 4c 45 7c  E TRIGGER|TABLE|
c720: 56 49 45 57 7c 49 4e 44 45 58 20 73 74 61 74 65  VIEW|INDEX state
c730: 6d 65 6e 74 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ment..** After a
c740: 6e 20 41 4c 54 45 52 20 54 41 42 4c 45 20 2e 2e  n ALTER TABLE ..
c750: 20 52 45 4e 41 4d 45 20 6f 70 65 72 61 74 69 6f   RENAME operatio
c760: 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 61  n is performed a
c770: 6e 64 20 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a  nd the schema.**
c780: 20 72 65 6c 6f 61 64 65 64 2c 20 74 68 69 73 20   reloaded, this 
c790: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
c7a0: 65 64 20 6f 6e 20 65 61 63 68 20 53 51 4c 20 73  ed on each SQL s
c7b0: 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  tatement in the 
c7c0: 73 63 68 65 6d 61 0a 2a 2a 20 74 6f 20 65 6e 73  schema.** to ens
c7d0: 75 72 65 20 74 68 61 74 20 69 74 20 69 73 20 73  ure that it is s
c7e0: 74 69 6c 6c 20 75 73 61 62 6c 65 2e 0a 2a 2a 0a  till usable..**.
c7f0: 2a 2a 20 20 20 30 3a 20 44 61 74 61 62 61 73 65  **   0: Database
c800: 20 6e 61 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22   name ("main", "
c810: 74 65 6d 70 22 20 65 74 63 2e 29 2e 0a 2a 2a 20  temp" etc.)..** 
c820: 20 20 31 3a 20 53 51 4c 20 73 74 61 74 65 6d 65    1: SQL stateme
c830: 6e 74 2e 0a 2a 2a 20 20 20 32 3a 20 4f 62 6a 65  nt..**   2: Obje
c840: 63 74 20 74 79 70 65 20 28 22 76 69 65 77 22 2c  ct type ("view",
c850: 20 22 74 61 62 6c 65 22 2c 20 22 74 72 69 67 67   "table", "trigg
c860: 65 72 22 20 6f 72 20 22 69 6e 64 65 78 22 29 2e  er" or "index").
c870: 0a 2a 2a 20 20 20 33 3a 20 4f 62 6a 65 63 74 20  .**   3: Object 
c880: 6e 61 6d 65 2e 0a 2a 2a 20 20 20 34 3a 20 54 72  name..**   4: Tr
c890: 75 65 20 69 66 20 6f 62 6a 65 63 74 20 69 73 20  ue if object is 
c8a0: 66 72 6f 6d 20 74 65 6d 70 20 73 63 68 65 6d 61  from temp schema
c8b0: 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 69  ..**.** Unless i
c8c0: 74 20 66 69 6e 64 73 20 61 6e 20 65 72 72 6f 72  t finds an error
c8d0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
c8e0: 6e 6f 72 6d 61 6c 6c 79 20 72 65 74 75 72 6e 73  normally returns
c8f0: 20 4e 55 4c 4c 2e 20 48 6f 77 65 76 65 72 2c 20   NULL. However, 
c900: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 69 6e  it.** returns in
c910: 74 65 67 65 72 20 76 61 6c 75 65 20 31 20 69 66  teger value 1 if
c920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  :.**.**   * the 
c930: 53 51 4c 20 61 72 67 75 6d 65 6e 74 20 63 72 65  SQL argument cre
c940: 61 74 65 73 20 61 20 74 72 69 67 67 65 72 2c 20  ates a trigger, 
c950: 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 74  and.**   * the t
c960: 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 74 72  able that the tr
c970: 69 67 67 65 72 20 69 73 20 61 74 74 61 63 68 65  igger is attache
c980: 64 20 74 6f 20 69 73 20 69 6e 20 64 61 74 61 62  d to is in datab
c990: 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 73 74 61 74  ase zDb..*/.stat
c9a0: 69 63 20 76 6f 69 64 20 72 65 6e 61 6d 65 54 61  ic void renameTa
c9b0: 62 6c 65 54 65 73 74 28 0a 20 20 73 71 6c 69 74  bleTest(.  sqlit
c9c0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
c9d0: 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73  ext,.  int NotUs
c9e0: 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ed,.  sqlite3_va
c9f0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
ca00: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
ca10: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
ca20: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
ca30: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
ca40: 7a 44 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zDb = (const cha
ca50: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
ca60: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
ca70: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 49    char const *zI
ca80: 6e 70 75 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  nput = (const ch
ca90: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
caa0: 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b  e_text(argv[1]);
cab0: 0a 20 20 69 6e 74 20 62 54 65 6d 70 20 3d 20 73  .  int bTemp = s
cac0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
cad0: 28 61 72 67 76 5b 34 5d 29 3b 0a 20 20 69 6e 74  (argv[4]);.  int
cae0: 20 69 73 4c 65 67 61 63 79 20 3d 20 28 64 62 2d   isLegacy = (db-
caf0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
cb00: 4c 65 67 61 63 79 41 6c 74 65 72 29 3b 0a 0a 23  LegacyAlter);..#
cb10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cb20: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
cb30: 0a 20 20 73 71 6c 69 74 65 33 5f 78 61 75 74 68  .  sqlite3_xauth
cb40: 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75   xAuth = db->xAu
cb50: 74 68 3b 0a 20 20 64 62 2d 3e 78 41 75 74 68 20  th;.  db->xAuth 
cb60: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 55  = 0;.#endif..  U
cb70: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
cb80: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
cb90: 7a 44 62 20 26 26 20 7a 49 6e 70 75 74 20 29 7b  zDb && zInput ){
cba0: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
cbb0: 20 50 61 72 73 65 20 73 50 61 72 73 65 3b 0a 20   Parse sParse;. 
cbc0: 20 20 20 72 63 20 3d 20 72 65 6e 61 6d 65 50 61     rc = renamePa
cbd0: 72 73 65 53 71 6c 28 26 73 50 61 72 73 65 2c 20  rseSql(&sParse, 
cbe0: 7a 44 62 2c 20 31 2c 20 64 62 2c 20 7a 49 6e 70  zDb, 1, db, zInp
cbf0: 75 74 2c 20 62 54 65 6d 70 29 3b 0a 20 20 20 20  ut, bTemp);.    
cc00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
cc10: 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
cc20: 73 4c 65 67 61 63 79 3d 3d 30 20 26 26 20 73 50  sLegacy==0 && sP
cc30: 61 72 73 65 2e 70 4e 65 77 54 61 62 6c 65 20 26  arse.pNewTable &
cc40: 26 20 73 50 61 72 73 65 2e 70 4e 65 77 54 61 62  & sParse.pNewTab
cc50: 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  le->pSelect ){. 
cc60: 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65         NameConte
cc70: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20  xt sNC;.        
cc80: 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
cc90: 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
cca0: 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65        sNC.pParse
ccb0: 20 3d 20 26 73 50 61 72 73 65 3b 0a 20 20 20 20   = &sParse;.    
ccc0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
ccd0: 74 50 72 65 70 28 26 73 50 61 72 73 65 2c 20 73  tPrep(&sParse, s
cce0: 50 61 72 73 65 2e 70 4e 65 77 54 61 62 6c 65 2d  Parse.pNewTable-
ccf0: 3e 70 53 65 6c 65 63 74 2c 20 26 73 4e 43 29 3b  >pSelect, &sNC);
cd00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 50 61  .        if( sPa
cd10: 72 73 65 2e 6e 45 72 72 20 29 20 72 63 20 3d 20  rse.nErr ) rc = 
cd20: 73 50 61 72 73 65 2e 72 63 3b 0a 20 20 20 20 20  sParse.rc;.     
cd30: 20 7d 0a 0a 20 20 20 20 20 20 65 6c 73 65 20 69   }..      else i
cd40: 66 28 20 73 50 61 72 73 65 2e 70 4e 65 77 54 72  f( sParse.pNewTr
cd50: 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20 20  igger ){.       
cd60: 20 69 66 28 20 69 73 4c 65 67 61 63 79 3d 3d 30   if( isLegacy==0
cd70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
cd80: 20 3d 20 72 65 6e 61 6d 65 52 65 73 6f 6c 76 65   = renameResolve
cd90: 54 72 69 67 67 65 72 28 26 73 50 61 72 73 65 2c  Trigger(&sParse,
cda0: 20 62 54 65 6d 70 20 3f 20 30 20 3a 20 7a 44 62   bTemp ? 0 : zDb
cdb0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
cdc0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
cdd0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
cde0: 20 20 20 20 69 6e 74 20 69 31 20 3d 20 73 71 6c      int i1 = sql
cdf0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
ce00: 78 28 64 62 2c 20 73 50 61 72 73 65 2e 70 4e 65  x(db, sParse.pNe
ce10: 77 54 72 69 67 67 65 72 2d 3e 70 54 61 62 53 63  wTrigger->pTabSc
ce20: 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20  hema);.         
ce30: 20 69 6e 74 20 69 32 20 3d 20 73 71 6c 69 74 65   int i2 = sqlite
ce40: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
ce50: 7a 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  zDb);.          
ce60: 69 66 28 20 69 31 3d 3d 69 32 20 29 20 73 71 6c  if( i1==i2 ) sql
ce70: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
ce80: 63 6f 6e 74 65 78 74 2c 20 31 29 3b 0a 20 20 20  context, 1);.   
ce90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
cea0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
ceb0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
cec0: 20 20 20 20 20 72 65 6e 61 6d 65 43 6f 6c 75 6d       renameColum
ced0: 6e 50 61 72 73 65 45 72 72 6f 72 28 63 6f 6e 74  nParseError(cont
cee0: 65 78 74 2c 20 31 2c 20 61 72 67 76 5b 32 5d 2c  ext, 1, argv[2],
cef0: 20 61 72 67 76 5b 33 5d 2c 20 26 73 50 61 72 73   argv[3], &sPars
cf00: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  e);.    }.    re
cf10: 6e 61 6d 65 50 61 72 73 65 43 6c 65 61 6e 75 70  nameParseCleanup
cf20: 28 26 73 50 61 72 73 65 29 3b 0a 20 20 7d 0a 0a  (&sParse);.  }..
cf30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cf40: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
cf50: 4e 0a 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20  N.  db->xAuth = 
cf60: 78 41 75 74 68 3b 0a 23 65 6e 64 69 66 0a 7d 0a  xAuth;.#endif.}.
cf70: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
cf80: 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f  built-in functio
cf90: 6e 73 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20  ns used to help 
cfa0: 69 6d 70 6c 65 6d 65 6e 74 20 41 4c 54 45 52 20  implement ALTER 
cfb0: 54 41 42 4c 45 0a 2a 2f 0a 76 6f 69 64 20 73 71  TABLE.*/.void sq
cfc0: 6c 69 74 65 33 41 6c 74 65 72 46 75 6e 63 74 69  lite3AlterFuncti
cfd0: 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  ons(void){.  sta
cfe0: 74 69 63 20 46 75 6e 63 44 65 66 20 61 41 6c 74  tic FuncDef aAlt
cff0: 65 72 54 61 62 6c 65 46 75 6e 63 73 5b 5d 20 3d  erTableFuncs[] =
d000: 20 7b 0a 20 20 20 20 49 4e 54 45 52 4e 41 4c 5f   {.    INTERNAL_
d010: 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74 65 5f  FUNCTION(sqlite_
d020: 72 65 6e 61 6d 65 5f 63 6f 6c 75 6d 6e 2c 20 39  rename_column, 9
d030: 2c 20 72 65 6e 61 6d 65 43 6f 6c 75 6d 6e 46 75  , renameColumnFu
d040: 6e 63 29 2c 0a 20 20 20 20 49 4e 54 45 52 4e 41  nc),.    INTERNA
d050: 4c 5f 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69 74  L_FUNCTION(sqlit
d060: 65 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65 2c 20  e_rename_table, 
d070: 20 37 2c 20 72 65 6e 61 6d 65 54 61 62 6c 65 46   7, renameTableF
d080: 75 6e 63 29 2c 0a 20 20 20 20 49 4e 54 45 52 4e  unc),.    INTERN
d090: 41 4c 5f 46 55 4e 43 54 49 4f 4e 28 73 71 6c 69  AL_FUNCTION(sqli
d0a0: 74 65 5f 72 65 6e 61 6d 65 5f 74 65 73 74 2c 20  te_rename_test, 
d0b0: 20 20 35 2c 20 72 65 6e 61 6d 65 54 61 62 6c 65    5, renameTable
d0c0: 54 65 73 74 29 2c 0a 20 20 7d 3b 0a 20 20 73 71  Test),.  };.  sq
d0d0: 6c 69 74 65 33 49 6e 73 65 72 74 42 75 69 6c 74  lite3InsertBuilt
d0e0: 69 6e 46 75 6e 63 73 28 61 41 6c 74 65 72 54 61  inFuncs(aAlterTa
d0f0: 62 6c 65 46 75 6e 63 73 2c 20 41 72 72 61 79 53  bleFuncs, ArrayS
d100: 69 7a 65 28 61 41 6c 74 65 72 54 61 62 6c 65 46  ize(aAlterTableF
d110: 75 6e 63 73 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  uncs));.}.#endif
d120: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 4c 54 45    /* SQLITE_ALTE
d130: 52 5f 54 41 42 4c 45 20 2a 2f 0a                 R_TABLE */.