aboutsummaryrefslogtreecommitdiffstats
path: root/SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp')
-rw-r--r--SQLiteStudio3/coreSQLiteStudio/tablemodifier.cpp53
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;