Ensure that ALTER TABLE modifies table and column names embedded in WITH
clauses that are part of views and triggers. FossilOrigin-Name: f44bc7a8b3fac82aa5598e9bdaf65ea4dd3c331cf90c1d5ba26ff1698e92c230
This commit is contained in:
parent
707821ff72
commit
ea41251eb0
16
manifest
16
manifest
@ -1,5 +1,5 @@
|
||||
C Enhance\sthe\ssqlite3_normalize_sql()\sinterface\sso\sthat\sit\sworks\seven\sif\sthe\nprepared\sstatement\swas\snot\sinitially\scompiled\susing\nSQLITE_PREPARE_NORMALIZED.\s\sEnhance\sthe\s".trace"\scommand\sin\sthe\sCLI\sso\sthat\nit\sis\sable\sto\saccess\sthe\sfull\sscope\sof\sfunctionality\sprovided\sby\s\nsqlite3_trace_v2()\sand\sin\sparticular\sso\sthat\sit\sis\sable\sto\sshow\snormalized\nSQL\soutput\susing\sthe\snewly\senhanced\ssqlite3_normalize_sql()\sinterface.
|
||||
D 2018-12-05T13:39:06.092
|
||||
C Ensure\sthat\sALTER\sTABLE\smodifies\stable\sand\scolumn\snames\sembedded\sin\sWITH\nclauses\sthat\sare\spart\sof\sviews\sand\striggers.
|
||||
D 2018-12-05T13:49:04.148
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
F Makefile.in 68d0ba0f0b533d5bc84c78c13a6ce84ee81183a67014caa47a969e67f028fa1c
|
||||
@ -441,7 +441,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca
|
||||
F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
|
||||
F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
|
||||
F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
|
||||
F src/alter.c f886160da189e4e99093cd5a2aca625652cc9b027d5100b87f81c175d1056387
|
||||
F src/alter.c 80747854ca90dadc7c51cc1da302e29081ca5f78a2a87b3d44f65d39db834ff5
|
||||
F src/analyze.c 3dc6b98cf007b005af89df165c966baaa48e8124f38c87b4d2b276fe7f0b9eb9
|
||||
F src/attach.c 92b51739a885da8bd84bc9a05485f1e48148bce5c15432f059b45af98fff75cd
|
||||
F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df
|
||||
@ -615,7 +615,7 @@ F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3
|
||||
F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9
|
||||
F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b
|
||||
F test/altertab.test 17e46baa6b2234048c91891a303141afceca4da95a36ee1a0a9fec6ccef1f4da
|
||||
F test/altertab2.test 0d64de5632ca5de13b023839cfe5b8952d029e4622befcea1433adaa93883220
|
||||
F test/altertab2.test 814369c72a7ed777ab2acf3f17fcff5ecb724816eb7c6659f40ef87b09521c99
|
||||
F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f
|
||||
F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c
|
||||
F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8
|
||||
@ -1782,7 +1782,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||
P df95455213c9d1db7229e94217e78edc05cbf9e40f39528105494ea6ac52be94
|
||||
R e65d818662ab9003f3be5e2ff4aec20c
|
||||
U drh
|
||||
Z 66f377ac461c094ae8c28a5487556c27
|
||||
P 7da617e97eb905cb009c47403786682b911e32a630f266e1c53ea72836fc88b5
|
||||
R 5be4b63edcb6a436be7d6ac2ccab0473
|
||||
U dan
|
||||
Z 758395cc3e6658700c83b35c2e31d2cc
|
||||
|
@ -1 +1 @@
|
||||
7da617e97eb905cb009c47403786682b911e32a630f266e1c53ea72836fc88b5
|
||||
f44bc7a8b3fac82aa5598e9bdaf65ea4dd3c331cf90c1d5ba26ff1698e92c230
|
22
src/alter.c
22
src/alter.c
@ -780,14 +780,31 @@ static void renameTokenFind(Parse *pParse, struct RenameCtx *pCtx, void *pPtr){
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** Iterate through the Select objects that are part of WITH clauses attached
|
||||
** to select statement pSelect.
|
||||
*/
|
||||
static void renameWalkWith(Walker *pWalker, Select *pSelect){
|
||||
if( pSelect->pWith ){
|
||||
int i;
|
||||
for(i=0; i<pSelect->pWith->nCte; i++){
|
||||
Select *p = pSelect->pWith->a[i].pSelect;
|
||||
NameContext sNC;
|
||||
memset(&sNC, 0, sizeof(sNC));
|
||||
sNC.pParse = pWalker->pParse;
|
||||
sqlite3SelectPrep(sNC.pParse, p, &sNC);
|
||||
sqlite3WalkSelect(pWalker, p);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** This is a Walker select callback. It does nothing. It is only required
|
||||
** because without a dummy callback, sqlite3WalkExpr() and similar do not
|
||||
** descend into sub-select statements.
|
||||
*/
|
||||
static int renameColumnSelectCb(Walker *pWalker, Select *p){
|
||||
UNUSED_PARAMETER(pWalker);
|
||||
UNUSED_PARAMETER(p);
|
||||
renameWalkWith(pWalker, p);
|
||||
return WRC_Continue;
|
||||
}
|
||||
|
||||
@ -1364,6 +1381,7 @@ static int renameTableSelectCb(Walker *pWalker, Select *pSelect){
|
||||
renameTokenFind(pWalker->pParse, p, pItem->zName);
|
||||
}
|
||||
}
|
||||
renameWalkWith(pWalker, pSelect);
|
||||
|
||||
return WRC_Continue;
|
||||
}
|
||||
|
@ -12,7 +12,7 @@
|
||||
|
||||
set testdir [file dirname $argv0]
|
||||
source $testdir/tester.tcl
|
||||
set testprefix altertab
|
||||
set testprefix altertab2
|
||||
|
||||
# If SQLITE_OMIT_ALTERTABLE is defined, omit this file.
|
||||
ifcapable !altertable {
|
||||
@ -85,5 +85,61 @@ do_execsql_test 2.3 {
|
||||
{CREATE TABLE c3(x, FOREIGN KEY (x) REFERENCES "p3"(a))}
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# Table name in WITH clauses that are part of views or triggers.
|
||||
#
|
||||
foreach {tn schema} {
|
||||
1 {
|
||||
CREATE TABLE log_entry(col1, y);
|
||||
CREATE INDEX i1 ON log_entry(col1);
|
||||
}
|
||||
|
||||
2 {
|
||||
CREATE TABLE t1(a, b, c);
|
||||
CREATE TABLE t2(x);
|
||||
CREATE TABLE log_entry(col1);
|
||||
CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN
|
||||
INSERT INTO t2 SELECT col1 FROM log_entry;
|
||||
END;
|
||||
}
|
||||
|
||||
3 {
|
||||
CREATE TABLE t1(a, b, c);
|
||||
CREATE TABLE t2(x);
|
||||
CREATE TABLE log_entry(col1);
|
||||
CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN
|
||||
INSERT INTO t2
|
||||
WITH xyz(x) AS (SELECT col1 FROM log_entry)
|
||||
SELECT x FROM xyz;
|
||||
END;
|
||||
}
|
||||
|
||||
4 {
|
||||
CREATE TABLE log_entry(col1);
|
||||
CREATE VIEW ttt AS
|
||||
WITH xyz(x) AS (SELECT col1 FROM log_entry)
|
||||
SELECT x FROM xyz;
|
||||
}
|
||||
} {
|
||||
reset_db
|
||||
do_execsql_test 3.$tn.1 $schema
|
||||
set expect [db eval "SELECT sql FROM sqlite_master"]
|
||||
set expect [string map {log_entry {"newname"}} $expect]
|
||||
|
||||
do_execsql_test 3.$tn.2 {
|
||||
ALTER TABLE log_entry RENAME TO newname;
|
||||
SELECT sql FROM sqlite_master;
|
||||
} $expect
|
||||
|
||||
reset_db
|
||||
do_execsql_test 3.$tn.3 $schema
|
||||
set expect [db eval "SELECT sql FROM sqlite_master"]
|
||||
set expect [string map {col1 newname} $expect]
|
||||
|
||||
do_execsql_test 3.$tn.4 {
|
||||
ALTER TABLE log_entry RENAME col1 TO newname;
|
||||
SELECT sql FROM sqlite_master;
|
||||
} $expect
|
||||
}
|
||||
|
||||
finish_test
|
||||
|
Loading…
x
Reference in New Issue
Block a user