diff options
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp')
| -rw-r--r-- | SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp | 53 |
1 files changed, 33 insertions, 20 deletions
diff --git a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp index 3558ec1..59d978c 100644 --- a/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp +++ b/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp @@ -36,8 +36,7 @@ void TableModifier::alterTable(SqliteCreateTablePtr newCreateTable) existingColumns = newCreateTable->getColumnNames(); newName = newCreateTable->table; - if (db->getDialect() == Dialect::Sqlite3) - sqls << "PRAGMA foreign_keys = 0;"; + sqls << "PRAGMA foreign_keys = 0;"; handleFkConstrains(newCreateTable.data(), createTable->table, newName); @@ -53,14 +52,13 @@ void TableModifier::alterTable(SqliteCreateTablePtr newCreateTable) // 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)); + sqls << QString("DROP TABLE %1;").arg(wrapObjIfNeeded(tempTableName.isNull() ? originalTable : tempTableName)); handleIndexes(); handleTriggers(); handleViews(); - if (db->getDialect() == Dialect::Sqlite3) - sqls << "PRAGMA foreign_keys = 1;"; + sqls << "PRAGMA foreign_keys = 1;"; } void TableModifier::renameTo(const QString& newName) @@ -70,8 +68,8 @@ void TableModifier::renameTo(const QString& newName) // Using ALTER TABLE RENAME TO is not a good solution here, because it automatically renames all occurrences in REFERENCES, // which we don't want, because we rename a lot to temporary tables and drop them. - sqls << QString("CREATE TABLE %1 AS SELECT * FROM %2;").arg(wrapObjIfNeeded(newName, dialect), wrapObjIfNeeded(table, dialect)) - << QString("DROP TABLE %1;").arg(wrapObjIfNeeded(table, dialect)); + sqls << QString("CREATE TABLE %1 AS SELECT * FROM %2;").arg(wrapObjIfNeeded(newName), wrapObjIfNeeded(table)) + << QString("DROP TABLE %1;").arg(wrapObjIfNeeded(table)); table = newName; createTable->table = newName; @@ -87,11 +85,17 @@ QString TableModifier::renameToTemp() void TableModifier::copyDataTo(const QString& targetTable) { SchemaResolver resolver(db); + resolver.setIgnoreSystemObjects(true); QStringList targetColumns = resolver.getTableColumns(targetTable); QStringList colsToCopy; for (SqliteCreateTable::Column* column : createTable->columns) + { + if (column->hasConstraint(SqliteCreateTable::Column::Constraint::GENERATED)) + continue; + if (targetColumns.contains(column->name, Qt::CaseInsensitive)) - colsToCopy << wrapObjIfNeeded(column->name, dialect); + colsToCopy << wrapObjIfNeeded(column->name); + } copyDataTo(targetTable, colsToCopy, colsToCopy); } @@ -101,7 +105,7 @@ void TableModifier::handleFks() tablesHandledForFk << originalTable; SchemaResolver resolver(db); - + resolver.setIgnoreSystemObjects(true); QStringList fkTables = resolver.getFkReferencingTables(originalTable); for (const QString& fkTable : fkTables) @@ -159,7 +163,7 @@ void TableModifier::handleFks(const QString& oldName, const QString& theNewName) handleFks(); - sqls << QString("DROP TABLE %1;").arg(wrapObjIfNeeded(tempName, dialect)); + sqls << QString("DROP TABLE %1;").arg(wrapObjIfNeeded(tempName)); simpleHandleIndexes(); simpleHandleTriggers(); @@ -405,11 +409,14 @@ void TableModifier::copyDataTo(SqliteCreateTablePtr newCreateTable) QStringList dstCols; for (SqliteCreateTable::Column* column : newCreateTable->columns) { + if (column->hasConstraint(SqliteCreateTable::Column::Constraint::GENERATED)) + continue; + if (!existingColumns.contains(column->originalName)) continue; // not copying columns that didn't exist before - srcCols << wrapObjIfNeeded(column->originalName, dialect); - dstCols << wrapObjIfNeeded(column->name, dialect); + srcCols << wrapObjIfNeeded(column->originalName); + dstCols << wrapObjIfNeeded(column->name); } copyDataTo(newCreateTable->table, srcCols, dstCols); @@ -418,6 +425,7 @@ void TableModifier::copyDataTo(SqliteCreateTablePtr newCreateTable) void TableModifier::handleIndexes() { SchemaResolver resolver(db); + resolver.setIgnoreSystemObjects(true); QList<SqliteCreateIndexPtr> parsedIndexesForTable = resolver.getParsedIndexesForTable(originalTable); for (SqliteCreateIndexPtr index : parsedIndexesForTable) handleIndex(index); @@ -444,6 +452,7 @@ void TableModifier::handleIndex(SqliteCreateIndexPtr index) void TableModifier::handleTriggers() { SchemaResolver resolver(db); + resolver.setIgnoreSystemObjects(true); QList<SqliteCreateTriggerPtr> parsedTriggersForTable = resolver.getParsedTriggersForTable(originalTable, true); for (SqliteCreateTriggerPtr trig : parsedTriggersForTable) handleTrigger(trig); @@ -473,7 +482,7 @@ void TableModifier::handleTrigger(SqliteCreateTriggerPtr trigger) { // The trigger was already modified by handling of some referencing table. QString oldDdl = triggerNameToDdlMap[trigger->trigger]; - Parser parser(dialect); + Parser parser; trigger = parser.parse<SqliteCreateTrigger>(oldDdl); if (!trigger) { @@ -506,7 +515,7 @@ void TableModifier::handleTrigger(SqliteCreateTriggerPtr trigger) if (!forThisTable) { // If this is for other table, than trigger might be still existing, cause altering this table will not delete trigger. - sqls << QString("DROP TRIGGER IF EXISTS %1").arg(wrapObjIfNeeded(trigger->trigger, dialect)); + sqls << QString("DROP TRIGGER IF EXISTS %1").arg(wrapObjIfNeeded(trigger->trigger)); } sqls << newQueryString; @@ -533,6 +542,7 @@ void TableModifier::handleTriggerQueries(SqliteCreateTriggerPtr trigger) void TableModifier::handleViews() { SchemaResolver resolver(db); + resolver.setIgnoreSystemObjects(true); QList<SqliteCreateViewPtr> parsedViewsForTable = resolver.getParsedViewsForTable(originalTable); for (SqliteCreateViewPtr view : parsedViewsForTable) handleView(view); @@ -561,7 +571,7 @@ void TableModifier::handleView(SqliteCreateViewPtr view) view->select->setParent(view.data()); view->rebuildTokens(); - sqls << QString("DROP VIEW %1;").arg(wrapObjIfNeeded(view->view, dialect)); + sqls << QString("DROP VIEW %1;").arg(wrapObjIfNeeded(view->view)); sqls << view->detokenize(); simpleHandleTriggers(view->view); @@ -894,6 +904,7 @@ bool TableModifier::handleExpr(SqliteExpr* expr) void TableModifier::simpleHandleIndexes() { SchemaResolver resolver(db); + resolver.setIgnoreSystemObjects(true); QList<SqliteCreateIndexPtr> parsedIndexesForTable = resolver.getParsedIndexesForTable(originalTable); for (SqliteCreateIndexPtr index : parsedIndexesForTable) sqls << index->detokenize(); @@ -902,6 +913,7 @@ void TableModifier::simpleHandleIndexes() void TableModifier::simpleHandleTriggers(const QString& view) { SchemaResolver resolver(db); + resolver.setIgnoreSystemObjects(true); QList<SqliteCreateTriggerPtr> parsedTriggers ; if (!view.isNull()) parsedTriggers = resolver.getParsedTriggersForView(view); @@ -914,7 +926,7 @@ void TableModifier::simpleHandleTriggers(const QString& view) SqliteQueryPtr TableModifier::parseQuery(const QString& ddl) { - Parser parser(dialect); + Parser parser; if (!parser.parse(ddl) || parser.getQueries().size() == 0) return SqliteQueryPtr(); @@ -923,8 +935,8 @@ SqliteQueryPtr TableModifier::parseQuery(const QString& ddl) void TableModifier::copyDataTo(const QString& targetTable, const QStringList& srcCols, const QStringList& dstCols) { - sqls << QString("INSERT INTO %1 (%2) SELECT %3 FROM %4;").arg(wrapObjIfNeeded(targetTable, dialect), dstCols.join(", "), srcCols.join(", "), - wrapObjIfNeeded(table, dialect)); + sqls << QString("INSERT INTO %1 (%2) SELECT %3 FROM %4;").arg(wrapObjIfNeeded(targetTable), dstCols.join(", "), srcCols.join(", "), + wrapObjIfNeeded(table)); } QStringList TableModifier::generateSqls() const @@ -949,7 +961,6 @@ QStringList TableModifier::getWarnings() const void TableModifier::init() { - dialect = db->getDialect(); originalTable = table; parseDdl(); } @@ -957,6 +968,7 @@ void TableModifier::init() void TableModifier::parseDdl() { SchemaResolver resolver(db); + resolver.setIgnoreSystemObjects(true); QString ddl = resolver.getObjectDdl(database, table, SchemaResolver::TABLE); if (ddl.isNull()) { @@ -964,7 +976,7 @@ void TableModifier::parseDdl() return; } - Parser parser(dialect); + Parser parser; if (!parser.parse(ddl)) { qCritical() << "Could not parse table's' ddl in the TableModifier. The ddl is:" << ddl; @@ -991,6 +1003,7 @@ void TableModifier::parseDdl() QString TableModifier::getTempTableName() { SchemaResolver resolver(db); + resolver.setIgnoreSystemObjects(true); QString name = resolver.getUniqueName("sqlitestudio_temp_table", usedTempTableNames); usedTempTableNames << name; return name; |
