Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | By default, make all "ALTER TABLE RENAME" statements executed within a virtual table xRename() method exhibit the legacy behaviour. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | legacy-alter-table |
Files: | files | file ages | folders |
SHA3-256: |
71947337e98b90debb13b390119bc2a6 |
User & Date: | dan 2018-09-20 17:21:21.872 |
Context
2018-09-20
| ||
20:15 | Add the "PRAGMA legacy_alter_table=ON" command to enable the pre-3.25.0 behavior of ALTER TABLE that does not modify the bodies of triggers or views or the WHERE clause of a partial index. Enable the legacy behavior by default when running the xRename method of virtual tables. (check-in: 7edd26ed27 user: drh tags: trunk) | |
17:21 | By default, make all "ALTER TABLE RENAME" statements executed within a virtual table xRename() method exhibit the legacy behaviour. (Closed-Leaf check-in: 71947337e9 user: dan tags: legacy-alter-table) | |
08:28 | Add a PRAGMA that restores the legacy ALTER TABLE RENAME TO behaviour. (check-in: 5acad2e92c user: dan tags: legacy-alter-table) | |
Changes
Changes to src/alter.c.
︙ | ︙ | |||
165 166 167 168 169 170 171 | ** table. */ v = sqlite3GetVdbe(pParse); if( v==0 ){ goto exit_rename_table; } | < < < < < < < < < < < < < < | 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | ** table. */ v = sqlite3GetVdbe(pParse); if( v==0 ){ goto exit_rename_table; } /* figure out how many UTF-8 characters are in zName */ zTabName = pTab->zName; nTabName = sqlite3Utf8CharLen(zTabName, -1); /* Rewrite all CREATE TABLE, INDEX, TRIGGER or VIEW statements in ** the schema to use the new table name. */ sqlite3NestedParse(pParse, |
︙ | ︙ | |||
235 236 237 238 239 240 241 242 243 244 245 246 247 248 | "tbl_name = " "CASE WHEN tbl_name=%Q COLLATE nocase AND " " sqlite_rename_test(%Q, sql, type, name, 1) " "THEN %Q ELSE tbl_name END " "WHERE type IN ('view', 'trigger')" , zDb, zTabName, zName, zTabName, zDb, zName); } renameReloadSchema(pParse, iDb); renameTestSchema(pParse, zDb, iDb==1); exit_rename_table: sqlite3SrcListDelete(db, pSrc); sqlite3DbFree(db, zName); | > > > > > > > > > > > > > > | 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 | "tbl_name = " "CASE WHEN tbl_name=%Q COLLATE nocase AND " " sqlite_rename_test(%Q, sql, type, name, 1) " "THEN %Q ELSE tbl_name END " "WHERE type IN ('view', 'trigger')" , zDb, zTabName, zName, zTabName, zDb, zName); } /* If this is a virtual table, invoke the xRename() function if ** one is defined. The xRename() callback will modify the names ** of any resources used by the v-table implementation (including other ** SQLite tables) that are identified by the name of the virtual table. */ #ifndef SQLITE_OMIT_VIRTUALTABLE if( pVTab ){ int i = ++pParse->nMem; sqlite3VdbeLoadString(v, i, zName); sqlite3VdbeAddOp4(v, OP_VRename, i, 0, 0,(const char*)pVTab, P4_VTAB); sqlite3MayAbort(pParse); } #endif renameReloadSchema(pParse, iDb); renameTestSchema(pParse, zDb, iDb==1); exit_rename_table: sqlite3SrcListDelete(db, pSrc); sqlite3DbFree(db, zName); |
︙ | ︙ |
Changes to src/vdbe.c.
︙ | ︙ | |||
7055 7056 7057 7058 7059 7060 7061 | ** P4 is a pointer to a virtual table object, an sqlite3_vtab structure. ** This opcode invokes the corresponding xRename method. The value ** in register P1 is passed as the zName argument to the xRename method. */ case OP_VRename: { sqlite3_vtab *pVtab; Mem *pName; | > | > > > | 7055 7056 7057 7058 7059 7060 7061 7062 7063 7064 7065 7066 7067 7068 7069 7070 7071 7072 7073 7074 7075 7076 7077 7078 7079 7080 7081 7082 7083 7084 7085 7086 | ** P4 is a pointer to a virtual table object, an sqlite3_vtab structure. ** This opcode invokes the corresponding xRename method. The value ** in register P1 is passed as the zName argument to the xRename method. */ case OP_VRename: { sqlite3_vtab *pVtab; Mem *pName; int isLegacy; isLegacy = (db->flags & SQLITE_LegacyAlter); db->flags |= SQLITE_LegacyAlter; pVtab = pOp->p4.pVtab->pVtab; pName = &aMem[pOp->p1]; assert( pVtab->pModule->xRename ); assert( memIsValid(pName) ); assert( p->readOnly==0 ); REGISTER_TRACE(pOp->p1, pName); assert( pName->flags & MEM_Str ); testcase( pName->enc==SQLITE_UTF8 ); testcase( pName->enc==SQLITE_UTF16BE ); testcase( pName->enc==SQLITE_UTF16LE ); rc = sqlite3VdbeChangeEncoding(pName, SQLITE_UTF8); if( rc ) goto abort_due_to_error; rc = pVtab->pModule->xRename(pVtab, pName->z); if( isLegacy==0 ) db->flags &= ~SQLITE_LegacyAlter; sqlite3VtabImportErrmsg(p, pVtab); p->expired = 0; if( rc ) goto abort_due_to_error; break; } #endif |
︙ | ︙ |
Changes to test/altermalloc2.test.
︙ | ︙ | |||
68 69 70 71 72 73 74 75 | } -body { execsql { ALTER TABLE t1 RENAME abcd TO dcba } } -test { faultsim_test_result {0 {}} } finish_test | > > > > > > > > > > > > > > > > > > > > > > > > > > | 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | } -body { execsql { ALTER TABLE t1 RENAME abcd TO dcba } } -test { faultsim_test_result {0 {}} } reset_db do_execsql_test 4.0 { CREATE TABLE rr(a, b); CREATE VIEW vv AS SELECT * FROM rr; CREATE TRIGGER vv1 INSTEAD OF INSERT ON vv BEGIN SELECT 1, 2, 3; END; CREATE TRIGGER tr1 AFTER INSERT ON rr BEGIN INSERT INTO vv VALUES(new.a, new.b); END; } {} faultsim_save_and_close do_faultsim_test 4 -faults oom-* -prep { faultsim_restore_and_reopen execsql { SELECT * FROM sqlite_master } } -body { execsql { ALTER TABLE rr RENAME a TO c; } } -test { faultsim_test_result {0 {}} } finish_test |
Added test/altertab2.test.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | # 2018 September 30 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #************************************************************************* # set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix altertab # If SQLITE_OMIT_ALTERTABLE is defined, omit this file. ifcapable !altertable { finish_test return } ifcapable fts5 { do_execsql_test 1.0 { CREATE TABLE rr(a, b); CREATE VIRTUAL TABLE ff USING fts5(a, b); CREATE TRIGGER tr1 AFTER INSERT ON rr BEGIN INSERT INTO ff VALUES(new.a, new.b); END; INSERT INTO rr VALUES('hello', 'world'); SELECT * FROM ff; } {hello world} do_execsql_test 1.1 { ALTER TABLE ff RENAME TO ffff; } do_execsql_test 1.2 { INSERT INTO rr VALUES('in', 'tcl'); SELECT * FROM ffff; } {hello world in tcl} } finish_test |