diff options
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp')
| -rw-r--r-- | SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp | 58 |
1 files changed, 43 insertions, 15 deletions
diff --git a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp index 7555714..d064cb1 100644 --- a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp @@ -44,11 +44,12 @@ void TableModifier::alterTable(SqliteCreateTablePtr newCreateTable) sqls << newCreateTable->detokenize(); copyDataTo(newCreateTable); + handleFks(tempTableName); + // If temp table was created, it means that table name hasn't changed. In that case we need to cleanup temp table (drop it). // Otherwise, the table name has changed, therefor there still remains the old table which we copied data from - we need to drop it here. sqls << QString("DROP TABLE %1;").arg(wrapObjIfNeeded(tempTableName.isNull() ? originalTable : tempTableName, dialect)); - handleFks(); handleIndexes(); handleTriggers(); handleViews(); @@ -92,7 +93,7 @@ void TableModifier::copyDataTo(const QString& targetTable) copyDataTo(targetTable, colsToCopy, colsToCopy); } -void TableModifier::handleFks() +void TableModifier::handleFks(const QString& tempTableName) { SchemaResolver resolver(db); @@ -108,10 +109,11 @@ void TableModifier::handleFks() continue; } + subModifier.usedTempTableNames = usedTempTableNames; subModifier.tableColMap = tableColMap; subModifier.existingColumns = existingColumns; subModifier.newName = newName; - subModifier.subHandleFks(originalTable); + subModifier.subHandleFks(originalTable, tempTableName); sqls += subModifier.generateSqls(); modifiedTables << fkTable; @@ -125,18 +127,18 @@ void TableModifier::handleFks() } } -void TableModifier::subHandleFks(const QString& oldName) +void TableModifier::subHandleFks(const QString& oldName, const QString& oldTempName) { bool modified = false; foreach (SqliteCreateTable::Constraint* fk, createTable->getForeignKeysByTable(oldName)) { - if (subHandleFks(fk->foreignKey, oldName)) + if (subHandleFks(fk->foreignKey, oldName, oldTempName)) modified = true; } foreach (SqliteCreateTable::Column::Constraint* fk, createTable->getColumnForeignKeysByTable(oldName)) { - if (subHandleFks(fk->foreignKey, oldName)) + if (subHandleFks(fk->foreignKey, oldName, oldTempName)) modified = true; } @@ -151,19 +153,29 @@ void TableModifier::subHandleFks(const QString& oldName) copyDataTo(originalTable); + handleFks(tempName); + sqls << QString("DROP TABLE %1;").arg(wrapObjIfNeeded(tempName, dialect)); simpleHandleIndexes(); simpleHandleTriggers(); } -bool TableModifier::subHandleFks(SqliteForeignKey* fk, const QString& oldName) +bool TableModifier::subHandleFks(SqliteForeignKey* fk, const QString& oldName, const QString& oldTempName) { + // If table was not renamed (but uses temp table name), we will rename temp name into target name. + // If table was renamed, we will rename old name to new name. bool modified = false; // Table if (handleName(oldName, fk->foreignTable)) modified = true; + else if (!oldTempName.isNull() && fk->foreignTable.compare(oldName, Qt::CaseInsensitive) == 0) + { + // This is the case when main table was not renamed - we will stay with the original name, but we need to mark it as modified, + // so the table gets recreated (the temp table is changed to the original table name in this FK). + modified = true; + } // Columns if (handleIndexedColumns(fk->indexedColumns)) @@ -354,9 +366,16 @@ void TableModifier::handleIndex(SqliteCreateIndexPtr index) { handleName(originalTable, index->table); handleIndexedColumns(index->indexedColumns); - index->rebuildTokens(); - sqls << index->detokenize(); - modifiedIndexes << index->index; + if (index->indexedColumns.size() > 0) + { + index->rebuildTokens(); + sqls << index->detokenize(); + modifiedIndexes << index->index; + } + else + { + warnings << QObject::tr("All columns indexed by the index %1 are gone. The index will not be recreated after table modification.").arg(index->index); + } // TODO partial index needs handling expr here } @@ -388,9 +407,16 @@ void TableModifier::handleTrigger(SqliteCreateTriggerPtr trigger) } trigger->queries = newQueries; - trigger->rebuildTokens(); - sqls << trigger->detokenize(); - modifiedTriggers << trigger->trigger; + if (trigger->event->type == SqliteCreateTrigger::Event::UPDATE_OF && trigger->event->columnNames.size() == 0) + { + warnings << QObject::tr("All columns covered by the trigger %1 are gone. The trigger will not be recreated after table modification.").arg(trigger->trigger); + } + else + { + trigger->rebuildTokens(); + sqls << trigger->detokenize(); + modifiedTriggers << trigger->trigger; + } } void TableModifier::handleViews() @@ -688,8 +714,10 @@ void TableModifier::parseDdl() this->createTable = createTable; } -QString TableModifier::getTempTableName() const +QString TableModifier::getTempTableName() { SchemaResolver resolver(db); - return resolver.getUniqueName("sqlitestudio_temp_table"); + QString name = resolver.getUniqueName("sqlitestudio_temp_table", usedTempTableNames); + usedTempTableNames << name; + return name; } |
