mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-08 14:02:16 +03:00
Fix the fts5 xRename() method.
FossilOrigin-Name: 0f7fd51325875fbf0f1eaca3bbbd170ef99c4208
This commit is contained in:
@@ -2003,8 +2003,8 @@ static int fts5RenameMethod(
|
||||
sqlite3_vtab *pVtab, /* Virtual table handle */
|
||||
const char *zName /* New name of table */
|
||||
){
|
||||
int rc = SQLITE_OK;
|
||||
return rc;
|
||||
Fts5Table *pTab = (Fts5Table*)pVtab;
|
||||
return sqlite3Fts5StorageRename(pTab->pStorage, zName);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -504,6 +504,7 @@ typedef struct Fts5Storage Fts5Storage;
|
||||
|
||||
int sqlite3Fts5StorageOpen(Fts5Config*, Fts5Index*, int, Fts5Storage**, char**);
|
||||
int sqlite3Fts5StorageClose(Fts5Storage *p);
|
||||
int sqlite3Fts5StorageRename(Fts5Storage*, const char *zName);
|
||||
|
||||
int sqlite3Fts5DropAll(Fts5Config*);
|
||||
int sqlite3Fts5CreateTable(Fts5Config*, const char*, const char*, int, char **);
|
||||
|
@@ -198,6 +198,35 @@ int sqlite3Fts5DropAll(Fts5Config *pConfig){
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void fts5StorageRenameOne(
|
||||
Fts5Config *pConfig, /* Current FTS5 configuration */
|
||||
int *pRc, /* IN/OUT: Error code */
|
||||
const char *zTail, /* Tail of table name e.g. "data", "config" */
|
||||
const char *zName /* New name of FTS5 table */
|
||||
){
|
||||
if( *pRc==SQLITE_OK ){
|
||||
*pRc = fts5ExecPrintf(pConfig->db, 0,
|
||||
"ALTER TABLE %Q.'%q_%s' RENAME TO '%q_%s';",
|
||||
pConfig->zDb, pConfig->zName, zTail, zName, zTail
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
int sqlite3Fts5StorageRename(Fts5Storage *pStorage, const char *zName){
|
||||
Fts5Config *pConfig = pStorage->pConfig;
|
||||
int rc = sqlite3Fts5StorageSync(pStorage, 1);
|
||||
|
||||
fts5StorageRenameOne(pConfig, &rc, "data", zName);
|
||||
fts5StorageRenameOne(pConfig, &rc, "config", zName);
|
||||
if( pConfig->bColumnsize ){
|
||||
fts5StorageRenameOne(pConfig, &rc, "docsize", zName);
|
||||
}
|
||||
if( pConfig->eContent==FTS5_CONTENT_NORMAL ){
|
||||
fts5StorageRenameOne(pConfig, &rc, "content", zName);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
** Create the shadow table named zPost, with definition zDefn. Return
|
||||
** SQLITE_OK if successful, or an SQLite error code otherwise.
|
||||
|
81
ext/fts5/test/fts5alter.test
Normal file
81
ext/fts5/test/fts5alter.test
Normal file
@@ -0,0 +1,81 @@
|
||||
# 2015 Jun 10
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
#***********************************************************************
|
||||
#
|
||||
# The tests in this file focus on renaming FTS5 tables using the
|
||||
# "ALTER TABLE ... RENAME TO ..." command
|
||||
#
|
||||
|
||||
source [file join [file dirname [info script]] fts5_common.tcl]
|
||||
set testprefix fts5alter
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# Test renaming regular, contentless and columnsize=0 FTS5 tables.
|
||||
#
|
||||
do_execsql_test 1.1.0 {
|
||||
CREATE VIRTUAL TABLE "a x" USING fts5(a, x);
|
||||
INSERT INTO "a x" VALUES('a a a', 'x x x');
|
||||
ALTER TABLE "a x" RENAME TO "x y";
|
||||
}
|
||||
do_execsql_test 1.1.1 {
|
||||
SELECT * FROM "x y";
|
||||
SELECT rowid FROM "x y" WHERE "x y" MATCH 'a'
|
||||
} {{a a a} {x x x} 1}
|
||||
|
||||
do_execsql_test 1.2.0 {
|
||||
CREATE VIRTUAL TABLE "one/two" USING fts5(one, columnsize=0);
|
||||
INSERT INTO "one/two"(rowid, one) VALUES(456, 'd d d');
|
||||
ALTER TABLE "one/two" RENAME TO "three/four";
|
||||
}
|
||||
do_execsql_test 1.2.1 {
|
||||
SELECT * FROM "three/four";
|
||||
SELECT rowid FROM "three/four" WHERE "three/four" MATCH 'd'
|
||||
} {{d d d} 456}
|
||||
|
||||
do_execsql_test 1.3.0 {
|
||||
CREATE VIRTUAL TABLE t1 USING fts5(val, content='');
|
||||
INSERT INTO t1(rowid, val) VALUES(-1, 'drop table');
|
||||
INSERT INTO t1(rowid, val) VALUES(-2, 'drop view');
|
||||
ALTER TABLE t1 RENAME TO t2;
|
||||
}
|
||||
do_execsql_test 1.3.1 {
|
||||
SELECT rowid, * FROM t2;
|
||||
SELECT rowid FROM t2 WHERE t2 MATCH 'table'
|
||||
} {-2 {} -1 {} -1}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# Test renaming an FTS5 table within a transaction.
|
||||
#
|
||||
do_execsql_test 2.1 {
|
||||
CREATE VIRTUAL TABLE zz USING fts5(a);
|
||||
INSERT INTO zz(rowid, a) VALUES(-56, 'a b c');
|
||||
BEGIN;
|
||||
INSERT INTO zz(rowid, a) VALUES(-22, 'a b c');
|
||||
ALTER TABLE zz RENAME TO yy;
|
||||
SELECT rowid FROM yy WHERE yy MATCH 'a + b + c';
|
||||
COMMIT;
|
||||
} {-56 -22}
|
||||
|
||||
do_execsql_test 2.2 {
|
||||
BEGIN;
|
||||
ALTER TABLE yy RENAME TO ww;
|
||||
INSERT INTO ww(rowid, a) VALUES(-11, 'a b c');
|
||||
SELECT rowid FROM ww WHERE ww MATCH 'a + b + c';
|
||||
} {-56 -22 -11}
|
||||
|
||||
do_execsql_test 2.3 {
|
||||
ROLLBACK;
|
||||
SELECT rowid FROM yy WHERE yy MATCH 'a + b + c';
|
||||
} {-56 -22}
|
||||
|
||||
|
||||
finish_test
|
||||
|
Reference in New Issue
Block a user