/ Hex Artifact Content
Login

Artifact ec92d56d8fbed9eb3e11aaf1ab98cf7dd59e69dae31f128013f1d97e54e7dfed:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72  /*.** This progr
0010: 61 6d 20 67 65 6e 65 72 61 74 65 73 20 61 20 73  am generates a s
0020: 63 72 69 70 74 20 74 68 61 74 20 73 74 72 65 73  cript that stres
0030: 73 65 73 20 74 68 65 20 41 4c 54 45 52 20 54 41  ses the ALTER TA
0040: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
0050: 2a 20 43 6f 6d 70 69 6c 65 20 6c 69 6b 65 20 74  * Compile like t
0060: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
0070: 67 63 63 20 2d 67 20 2d 63 20 73 71 6c 69 74 65  gcc -g -c sqlite
0080: 33 2e 63 0a 2a 2a 20 20 20 20 20 20 67 63 63 20  3.c.**      gcc 
0090: 2d 67 20 2d 6f 20 61 74 72 63 20 61 74 72 63 2e  -g -o atrc atrc.
00a0: 63 20 73 71 6c 69 74 65 33 2e 6f 20 2d 6c 64 6c  c sqlite3.o -ldl
00b0: 20 2d 6c 70 74 68 72 65 61 64 0a 2a 2a 0a 2a 2a   -lpthread.**.**
00c0: 20 52 75 6e 20 74 68 65 20 70 72 6f 67 72 61 6d   Run the program
00d0: 20 74 68 69 73 20 77 61 79 3a 0a 2a 2a 0a 2a 2a   this way:.**.**
00e0: 20 20 20 20 20 20 2e 2f 61 74 72 63 20 44 41 54        ./atrc DAT
00f0: 41 42 41 53 45 20 7c 20 2e 2f 73 71 6c 69 74 65  ABASE | ./sqlite
0100: 33 20 44 41 54 41 42 41 53 45 0a 2a 2a 0a 2a 2a  3 DATABASE.**.**
0110: 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 22 61   This program "a
0120: 74 72 63 22 20 67 65 6e 65 72 61 74 65 73 20 61  trc" generates a
0130: 20 73 63 72 69 70 74 20 74 68 61 74 20 63 61 6e   script that can
0140: 20 62 65 20 66 65 64 20 69 6e 74 6f 20 61 6e 20   be fed into an 
0150: 6f 72 64 69 6e 61 72 79 0a 2a 2a 20 63 6f 6d 6d  ordinary.** comm
0160: 61 6e 64 2d 6c 69 6e 65 20 73 68 65 6c 6c 2e 20  and-line shell. 
0170: 20 54 68 65 20 73 63 72 69 70 74 20 70 65 72 66   The script perf
0180: 6f 72 6d 73 20 6d 61 6e 79 20 41 4c 54 45 52 20  orms many ALTER 
0190: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 73  TABLE statements
01a0: 2c 0a 2a 2a 20 72 75 6e 73 20 22 2e 73 63 68 65  ,.** runs ".sche
01b0: 6d 61 20 2d 2d 69 6e 64 65 6e 74 22 20 61 6e 64  ma --indent" and
01c0: 20 22 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69   "PRAGMA integri
01d0: 74 79 5f 63 68 65 63 6b 3b 22 2c 20 64 6f 65 73  ty_check;", does
01e0: 20 6d 6f 72 65 0a 2a 2a 20 41 4c 54 45 52 20 54   more.** ALTER T
01f0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 73 20  ABLE statements 
0200: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 6f  to restore the o
0210: 72 69 67 69 6e 61 6c 20 73 63 68 65 6d 61 2c 20  riginal schema, 
0220: 61 6e 64 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 73  and then.** runs
0230: 20 22 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69   "PRAGMA integri
0240: 74 79 5f 63 68 65 63 6b 22 20 61 67 61 69 6e 2e  ty_check" again.
0250: 20 20 45 76 65 72 79 20 74 61 62 6c 65 20 61 6e    Every table an
0260: 64 20 63 6f 6c 75 6d 6e 20 68 61 73 20 69 74 73  d column has its
0270: 0a 2a 2a 20 6e 61 6d 65 20 63 68 61 6e 67 65 64  .** name changed
0280: 2e 20 20 54 68 65 20 65 6e 74 69 72 65 20 73 63  .  The entire sc
0290: 72 69 70 74 20 69 73 20 63 6f 6e 74 61 69 6e 65  ript is containe
02a0: 64 20 77 69 74 68 69 6e 20 42 45 47 49 4e 2e 2e  d within BEGIN..
02b0: 2e 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 73 6f 20  .ROLLBACK.** so 
02c0: 74 68 61 74 20 6e 6f 20 63 68 61 6e 67 65 73 20  that no changes 
02d0: 61 72 65 20 65 76 65 72 20 61 63 74 75 61 6c 6c  are ever actuall
02e0: 79 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  y made to the da
02f0: 74 61 62 61 73 65 2e 0a 2a 2f 0a 23 69 6e 63 6c  tabase..*/.#incl
0300: 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a  ude "sqlite3.h".
0310: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e  #include <stdio.
0320: 68 3e 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  h>../*.** Genera
0330: 74 65 20 74 68 65 20 74 65 78 74 20 6f 66 20 41  te the text of A
0340: 4c 54 45 52 20 54 41 42 4c 45 20 73 74 61 74 65  LTER TABLE state
0350: 6d 65 6e 74 73 20 74 68 61 74 20 77 69 6c 6c 20  ments that will 
0360: 72 65 6e 61 6d 65 0a 2a 2a 20 65 76 65 72 79 20  rename.** every 
0370: 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
0380: 7a 54 61 62 6c 65 20 74 6f 20 61 20 67 65 6e 65  zTable to a gene
0390: 72 69 63 20 6e 61 6d 65 20 63 6f 6d 70 6f 73 65  ric name compose
03a0: 64 20 66 72 6f 6d 0a 2a 2a 20 7a 43 6f 6c 50 72  d from.** zColPr
03b0: 65 66 69 78 20 61 6e 64 20 61 20 73 65 71 75 65  efix and a seque
03c0: 6e 74 69 61 6c 20 6e 75 6d 62 65 72 2e 20 20 54  ntial number.  T
03d0: 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 65 78  he generated tex
03e0: 74 20 69 73 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t is.** appended
03f0: 20 70 43 6f 6e 76 65 72 74 2e 20 20 49 66 20 70   pConvert.  If p
0400: 55 6e 64 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Undo is not NULL
0410: 2c 20 74 68 65 6e 20 53 51 4c 20 74 65 78 74 20  , then SQL text 
0420: 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 75 6e 64  that.** will und
0430: 6f 20 74 68 65 20 63 68 61 6e 67 65 20 69 73 20  o the change is 
0440: 61 70 70 65 6e 64 65 64 20 74 6f 20 70 55 6e 64  appended to pUnd
0450: 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  o..**.** The tab
0460: 6c 65 20 74 6f 20 62 65 20 63 6f 6e 76 65 72 74  le to be convert
0470: 65 64 20 6d 75 73 74 20 62 65 20 69 6e 20 74 68  ed must be in th
0480: 65 20 22 6d 61 69 6e 22 20 73 63 68 65 6d 61 2e  e "main" schema.
0490: 0a 2a 2f 0a 69 6e 74 20 72 65 6e 61 6d 65 5f 61  .*/.int rename_a
04a0: 6c 6c 5f 63 6f 6c 75 6d 6e 73 5f 6f 66 5f 74 61  ll_columns_of_ta
04b0: 62 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ble(.  sqlite3 *
04c0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
04d0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
04e0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
04f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
0500: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
0510: 20 2f 2a 20 54 61 62 6c 65 20 77 68 6f 73 65 20   /* Table whose 
0520: 63 6f 6c 75 6d 6e 73 20 73 68 6f 75 6c 64 20 61  columns should a
0530: 6c 6c 20 62 65 20 72 65 6e 61 6d 65 64 20 2a 2f  ll be renamed */
0540: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
0550: 43 6f 6c 50 72 65 66 69 78 2c 20 20 20 20 20 20  ColPrefix,      
0560: 20 20 2f 2a 20 50 72 65 66 69 78 20 66 6f 72 20    /* Prefix for 
0570: 6e 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  new column names
0580: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
0590: 72 20 2a 70 43 6f 6e 76 65 72 74 2c 20 20 20 20  r *pConvert,    
05a0: 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 41       /* Append A
05b0: 4c 54 45 52 20 54 41 42 4c 45 20 73 74 61 74 65  LTER TABLE state
05c0: 6d 65 6e 74 73 20 68 65 72 65 20 2a 2f 0a 20 20  ments here */.  
05d0: 73 71 6c 69 74 65 33 5f 73 74 72 20 2a 70 55 6e  sqlite3_str *pUn
05e0: 64 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  do             /
05f0: 2a 20 53 51 4c 20 74 6f 20 75 6e 64 6f 20 74 68  * SQL to undo th
0600: 65 20 63 68 61 6e 67 65 2c 20 69 66 20 6e 6f 74  e change, if not
0610: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71   NULL */.){.  sq
0620: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
0630: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  t;.  int rc;.  i
0640: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 72  nt cnt = 0;..  r
0650: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
0660: 61 72 65 5f 76 32 28 64 62 2c 0a 20 20 20 20 20  are_v2(db,.     
0670: 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
0680: 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 74 61 62   FROM pragma_tab
0690: 6c 65 5f 69 6e 66 6f 28 3f 31 29 3b 22 2c 0a 20  le_info(?1);",. 
06a0: 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74          -1, &pSt
06b0: 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
06c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
06d0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
06e0: 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a 54 61 62  t(pStmt, 1, zTab
06f0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
0700: 54 49 43 29 3b 0a 20 20 77 68 69 6c 65 28 20 73  TIC);.  while( s
0710: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
0720: 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
0730: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
0740: 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20   *zCol = (const 
0750: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
0760: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
0770: 20 30 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 0a   0);.    cnt++;.
0780: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f      sqlite3_str_
0790: 61 70 70 65 6e 64 66 28 70 43 6f 6e 76 65 72 74  appendf(pConvert
07a0: 2c 0a 20 20 20 20 20 20 22 41 4c 54 45 52 20 54  ,.      "ALTER T
07b0: 41 42 4c 45 20 5c 22 25 77 5c 22 20 52 45 4e 41  ABLE \"%w\" RENA
07c0: 4d 45 20 43 4f 4c 55 4d 4e 20 5c 22 25 77 5c 22  ME COLUMN \"%w\"
07d0: 20 54 4f 20 5c 22 25 77 25 64 5c 22 3b 5c 6e 22   TO \"%w%d\";\n"
07e0: 2c 0a 20 20 20 20 20 20 7a 54 61 62 2c 20 7a 43  ,.      zTab, zC
07f0: 6f 6c 2c 20 7a 43 6f 6c 50 72 65 66 69 78 2c 20  ol, zColPrefix, 
0800: 63 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  cnt.    );.    i
0810: 66 28 20 70 55 6e 64 6f 20 29 7b 0a 20 20 20 20  f( pUndo ){.    
0820: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70    sqlite3_str_ap
0830: 70 65 6e 64 66 28 70 55 6e 64 6f 2c 0a 20 20 20  pendf(pUndo,.   
0840: 20 20 20 20 20 22 41 4c 54 45 52 20 54 41 42 4c       "ALTER TABL
0850: 45 20 5c 22 25 77 5c 22 20 52 45 4e 41 4d 45 20  E \"%w\" RENAME 
0860: 43 4f 4c 55 4d 4e 20 5c 22 25 77 25 64 5c 22 20  COLUMN \"%w%d\" 
0870: 54 4f 20 5c 22 25 77 5c 22 3b 5c 6e 22 2c 0a 20  TO \"%w\";\n",. 
0880: 20 20 20 20 20 20 20 7a 54 61 62 2c 20 7a 43 6f         zTab, zCo
0890: 6c 50 72 65 66 69 78 2c 20 63 6e 74 2c 20 7a 43  lPrefix, cnt, zC
08a0: 6f 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ol.      );.    
08b0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
08c0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
08d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
08e0: 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 20 52 65 6e 61  _OK; .}../* Rena
08f0: 6d 65 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e  me all tables an
0900: 64 20 74 68 65 69 72 20 63 6f 6c 75 6d 6e 73 20  d their columns 
0910: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
0920: 62 61 73 65 0a 2a 2f 0a 69 6e 74 20 72 65 6e 61  base.*/.int rena
0930: 6d 65 5f 61 6c 6c 5f 74 61 62 6c 65 73 28 0a 20  me_all_tables(. 
0940: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
0950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
0960: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
0970: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  n */.  sqlite3_s
0980: 74 72 20 2a 70 43 6f 6e 76 65 72 74 2c 20 20 20  tr *pConvert,   
0990: 20 2f 2a 20 41 70 70 65 6e 64 20 53 51 4c 20 74   /* Append SQL t
09a0: 6f 20 64 6f 20 74 68 65 20 72 65 6e 61 6d 65 20  o do the rename 
09b0: 68 65 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  here */.  sqlite
09c0: 33 5f 73 74 72 20 2a 70 55 6e 64 6f 20 20 20 20  3_str *pUndo    
09d0: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 53 51      /* Append SQ
09e0: 4c 20 74 6f 20 75 6e 64 6f 20 74 68 65 20 72 65  L to undo the re
09f0: 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  name here */.){.
0a00: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
0a10: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
0a20: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
0a30: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
0a40: 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 0a 20  prepare_v2(db,. 
0a50: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
0a60: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
0a70: 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79  _master WHERE ty
0a80: 70 65 3d 27 74 61 62 6c 65 27 22 0a 20 20 20 20  pe='table'".    
0a90: 20 20 20 20 20 22 20 41 4e 44 20 6e 61 6d 65 20       " AND name 
0aa0: 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65  NOT LIKE 'sqlite
0ab0: 5f 25 27 3b 22 2c 0a 20 20 20 20 20 20 20 20 20  _%';",.         
0ac0: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
0ad0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
0ae0: 6e 20 72 63 3b 0a 20 20 77 68 69 6c 65 28 20 73  n rc;.  while( s
0af0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
0b00: 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
0b10: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
0b20: 20 2a 7a 54 61 62 20 3d 20 28 63 6f 6e 73 74 20   *zTab = (const 
0b30: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
0b40: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
0b50: 20 30 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   0);.    char *z
0b60: 4e 65 77 54 61 62 3b 0a 20 20 20 20 63 68 61 72  NewTab;.    char
0b70: 20 7a 50 72 65 66 69 78 5b 32 5d 3b 0a 0a 20 20   zPrefix[2];..  
0b80: 20 20 7a 50 72 65 66 69 78 5b 30 5d 20 3d 20 28    zPrefix[0] = (
0b90: 63 6e 74 25 32 36 29 20 2b 20 27 61 27 3b 0a 20  cnt%26) + 'a';. 
0ba0: 20 20 20 7a 50 72 65 66 69 78 5b 31 5d 20 3d 20     zPrefix[1] = 
0bb0: 30 3b 0a 20 20 20 20 7a 4e 65 77 54 61 62 20 3d  0;.    zNewTab =
0bc0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
0bd0: 28 22 74 78 25 64 22 2c 20 2b 2b 63 6e 74 29 3b  ("tx%d", ++cnt);
0be0: 0a 20 20 20 20 69 66 28 20 70 55 6e 64 6f 20 29  .    if( pUndo )
0bf0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
0c00: 73 74 72 5f 61 70 70 65 6e 64 66 28 70 55 6e 64  str_appendf(pUnd
0c10: 6f 2c 0a 20 20 20 20 20 20 20 20 22 41 4c 54 45  o,.        "ALTE
0c20: 52 20 54 41 42 4c 45 20 5c 22 25 73 5c 22 20 52  R TABLE \"%s\" R
0c30: 45 4e 41 4d 45 20 54 4f 20 5c 22 25 77 5c 22 3b  ENAME TO \"%w\";
0c40: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 7a 4e 65  \n",.        zNe
0c50: 77 54 61 62 2c 20 7a 54 61 62 0a 20 20 20 20 20  wTab, zTab.     
0c60: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   );.    }.    re
0c70: 6e 61 6d 65 5f 61 6c 6c 5f 63 6f 6c 75 6d 6e 73  name_all_columns
0c80: 5f 6f 66 5f 74 61 62 6c 65 28 64 62 2c 20 7a 54  _of_table(db, zT
0c90: 61 62 2c 20 7a 50 72 65 66 69 78 2c 20 70 43 6f  ab, zPrefix, pCo
0ca0: 6e 76 65 72 74 2c 20 70 55 6e 64 6f 29 3b 0a 20  nvert, pUndo);. 
0cb0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61     sqlite3_str_a
0cc0: 70 70 65 6e 64 66 28 70 43 6f 6e 76 65 72 74 2c  ppendf(pConvert,
0cd0: 0a 20 20 20 20 20 20 22 41 4c 54 45 52 20 54 41  .      "ALTER TA
0ce0: 42 4c 45 20 5c 22 25 77 5c 22 20 52 45 4e 41 4d  BLE \"%w\" RENAM
0cf0: 45 20 54 4f 20 5c 22 25 73 5c 22 3b 5c 6e 22 2c  E TO \"%s\";\n",
0d00: 0a 20 20 20 20 20 20 7a 54 61 62 2c 20 7a 4e 65  .      zTab, zNe
0d10: 77 54 61 62 0a 20 20 20 20 29 3b 0a 20 20 20 20  wTab.    );.    
0d20: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65  sqlite3_free(zNe
0d30: 77 54 61 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  wTab);.  }.  sql
0d40: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
0d50: 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tmt);.  return S
0d60: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
0d70: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 63  ** Generate a sc
0d80: 72 69 70 74 20 74 68 61 74 20 64 6f 65 73 20 74  ript that does t
0d90: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  his:.**.**   (1)
0da0: 20 53 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   Start a transac
0db0: 74 69 6f 6e 0a 2a 2a 20 20 20 28 32 29 20 52 65  tion.**   (2) Re
0dc0: 6e 61 6d 65 20 61 6c 6c 20 74 61 62 6c 65 73 20  name all tables 
0dd0: 61 6e 64 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 75  and columns to u
0de0: 73 65 20 67 65 6e 65 72 69 63 20 6e 61 6d 65 73  se generic names
0df0: 2e 0a 2a 2a 20 20 20 28 33 29 20 50 72 69 6e 74  ..**   (3) Print
0e00: 20 74 68 65 20 73 63 68 65 6d 61 20 61 66 74 65   the schema afte
0e10: 72 20 74 68 69 73 20 72 65 6e 61 6d 65 0a 2a 2a  r this rename.**
0e20: 20 20 20 28 34 29 20 52 75 6e 20 70 72 61 67 6d     (4) Run pragm
0e30: 61 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  a integrity_chec
0e40: 6b 0a 2a 2a 20 20 20 28 35 29 20 44 6f 20 6d 6f  k.**   (5) Do mo
0e50: 72 65 20 41 4c 54 45 52 20 54 41 42 4c 45 20 73  re ALTER TABLE s
0e60: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 63 68 61  tatements to cha
0e70: 6e 67 65 20 74 68 65 20 6e 61 6d 65 73 20 62 61  nge the names ba
0e80: 63 6b 0a 2a 2a 20 20 20 28 36 29 20 52 75 6e 20  ck.**   (6) Run 
0e90: 70 72 61 67 6d 61 20 69 6e 74 65 67 72 69 74 79  pragma integrity
0ea0: 5f 63 68 65 63 6b 20 61 67 61 69 6e 0a 2a 2a 20  _check again.** 
0eb0: 20 20 28 37 29 20 52 6f 6c 6c 62 61 63 6b 20 74    (7) Rollback t
0ec0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
0ed0: 2f 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61  /.int main(int a
0ee0: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
0ef0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
0f00: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  ;.  int rc;.  sq
0f10: 6c 69 74 65 33 5f 73 74 72 20 2a 70 43 6f 6e 76  lite3_str *pConv
0f20: 65 72 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ert;.  sqlite3_s
0f30: 74 72 20 2a 70 55 6e 64 6f 3b 0a 20 20 63 68 61  tr *pUndo;.  cha
0f40: 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 63 68  r *zDbName;.  ch
0f50: 61 72 20 2a 7a 53 71 6c 31 2c 20 2a 7a 53 71 6c  ar *zSql1, *zSql
0f60: 32 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  2;.  if( argc!=2
0f70: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
0f80: 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
0f90: 25 73 20 44 41 54 41 42 41 53 45 5c 6e 22 2c 20  %s DATABASE\n", 
0fa0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  argv[0]);.  }.  
0fb0: 7a 44 62 4e 61 6d 65 20 3d 20 61 72 67 76 5b 31  zDbName = argv[1
0fc0: 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ];.  rc = sqlite
0fd0: 33 5f 6f 70 65 6e 28 7a 44 62 4e 61 6d 65 2c 20  3_open(zDbName, 
0fe0: 26 64 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29  &db);.  if( rc )
0ff0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
1000: 64 65 72 72 2c 20 22 73 71 6c 69 74 65 33 5f 6f  derr, "sqlite3_o
1010: 70 65 6e 28 29 20 72 65 74 75 72 6e 73 20 25 64  pen() returns %d
1020: 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65  \n", rc);.    re
1030: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 43  turn 1;.  }.  pC
1040: 6f 6e 76 65 72 74 20 3d 20 73 71 6c 69 74 65 33  onvert = sqlite3
1050: 5f 73 74 72 5f 6e 65 77 28 64 62 29 3b 0a 20 20  _str_new(db);.  
1060: 70 55 6e 64 6f 20 3d 20 73 71 6c 69 74 65 33 5f  pUndo = sqlite3_
1070: 73 74 72 5f 6e 65 77 28 64 62 29 3b 0a 20 20 72  str_new(db);.  r
1080: 65 6e 61 6d 65 5f 61 6c 6c 5f 74 61 62 6c 65 73  ename_all_tables
1090: 28 64 62 2c 20 70 43 6f 6e 76 65 72 74 2c 20 70  (db, pConvert, p
10a0: 55 6e 64 6f 29 3b 0a 20 20 7a 53 71 6c 31 20 3d  Undo);.  zSql1 =
10b0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 66 69 6e   sqlite3_str_fin
10c0: 69 73 68 28 70 43 6f 6e 76 65 72 74 29 3b 0a 20  ish(pConvert);. 
10d0: 20 7a 53 71 6c 32 20 3d 20 73 71 6c 69 74 65 33   zSql2 = sqlite3
10e0: 5f 73 74 72 5f 66 69 6e 69 73 68 28 70 55 6e 64  _str_finish(pUnd
10f0: 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c  o);.  sqlite3_cl
1100: 6f 73 65 28 64 62 29 3b 0a 20 20 70 72 69 6e 74  ose(db);.  print
1110: 66 28 22 42 45 47 49 4e 3b 5c 6e 22 29 3b 0a 20  f("BEGIN;\n");. 
1120: 20 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 53   printf("%s", zS
1130: 71 6c 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ql1);.  sqlite3_
1140: 66 72 65 65 28 7a 53 71 6c 31 29 3b 0a 20 20 70  free(zSql1);.  p
1150: 72 69 6e 74 66 28 22 2e 73 63 68 65 6d 61 20 2d  rintf(".schema -
1160: 2d 69 6e 64 65 6e 74 5c 6e 22 29 3b 0a 20 20 70  -indent\n");.  p
1170: 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 69 6e  rintf("PRAGMA in
1180: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 5c 6e  tegrity_check;\n
1190: 22 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 25 73  ");.  printf("%s
11a0: 22 2c 20 7a 53 71 6c 32 29 3b 0a 20 20 73 71 6c  ", zSql2);.  sql
11b0: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 32 29  ite3_free(zSql2)
11c0: 3b 0a 20 20 70 72 69 6e 74 66 28 22 50 52 41 47  ;.  printf("PRAG
11d0: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
11e0: 63 6b 3b 5c 6e 22 29 3b 0a 20 20 70 72 69 6e 74  ck;\n");.  print
11f0: 66 28 22 52 4f 4c 4c 42 41 43 4b 3b 5c 6e 22 29  f("ROLLBACK;\n")
1200: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 20 0a 7d  ;.  return 0; .}
1210: 0a                                               .