diff options
Diffstat (limited to 'tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp')
-rw-r--r-- | tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp | 310 |
1 files changed, 196 insertions, 114 deletions
diff --git a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp index 6980bc19e2..9c93fc2b18 100644 --- a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp +++ b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp @@ -1,30 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QTest> @@ -141,6 +116,8 @@ private slots: void submitAllOnInvalidTable(); void insertRecordsInLoop_data() { generic_data(); } void insertRecordsInLoop(); + void sqlite_escaped_delimiters_data() { generic_data("QSQLITE"); } + void sqlite_escaped_delimiters(); void sqlite_attachedDatabase_data() { generic_data("QSQLITE"); } void sqlite_attachedDatabase(); // For task 130799 void tableModifyWithBlank_data() { generic_data(); } @@ -154,6 +131,9 @@ private slots: void invalidFilterAndHeaderData_data() { generic_data(); } void invalidFilterAndHeaderData(); //QTBUG-23879 + + void sqlite_selectFromIdentifierWithDot_data() { generic_data("QSQLITE"); } + void sqlite_selectFromIdentifierWithDot(); private: void generic_data(const QString& engine=QString()); void generic_data_with_strategies(const QString& engine=QString()); @@ -161,6 +141,7 @@ private: tst_QSqlTableModel::tst_QSqlTableModel() { + QVERIFY(dbs.open()); } tst_QSqlTableModel::~tst_QSqlTableModel() @@ -169,25 +150,22 @@ tst_QSqlTableModel::~tst_QSqlTableModel() void tst_QSqlTableModel::dropTestTables() { - for (int i = 0; i < dbs.dbNames.count(); ++i) { + for (int i = 0; i < dbs.dbNames.size(); ++i) { QSqlDatabase db = QSqlDatabase::database(dbs.dbNames.at(i)); QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db); QSqlQuery q(db); if (dbType == QSqlDriver::PostgreSQL) QVERIFY_SQL( q, exec("set client_min_messages='warning'")); - QStringList tableNames; - tableNames << qTableName("test1", __FILE__, db) - << qTableName("test2", __FILE__, db) - << qTableName("test3", __FILE__, db) - << qTableName("test4", __FILE__, db) - << qTableName("emptytable", __FILE__, db) - << qTableName("bigtable", __FILE__, db) - << qTableName("foo", __FILE__, db) - << qTableName("pktest", __FILE__, db); - if (testWhiteSpaceNames(db.driverName())) - tableNames << qTableName("qtestw hitespace", db); - + QStringList tableNames{qTableName("test1", __FILE__, db), + qTableName("test2", __FILE__, db), + qTableName("test3", __FILE__, db), + qTableName("test4", __FILE__, db), + qTableName("emptytable", __FILE__, db), + qTableName("bigtable", __FILE__, db), + qTableName("foo", __FILE__, db), + qTableName("pktest", __FILE__, db), + qTableName("qtestw hitespace", __FILE__, db)}; tst_Databases::safeDropTables(db, tableNames); if (db.driverName().startsWith("QPSQL")) { @@ -198,7 +176,7 @@ void tst_QSqlTableModel::dropTestTables() void tst_QSqlTableModel::createTestTables() { - for (int i = 0; i < dbs.dbNames.count(); ++i) { + for (int i = 0; i < dbs.dbNames.size(); ++i) { QSqlDatabase db = QSqlDatabase::database(dbs.dbNames.at(i)); QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db); QSqlQuery q(db); @@ -217,10 +195,8 @@ void tst_QSqlTableModel::createTestTables() QVERIFY_SQL(q, exec("create table " + qTableName("emptytable", __FILE__, db) + "(id int)")); - if (testWhiteSpaceNames(db.driverName())) { - QString qry = "create table " + qTableName("qtestw hitespace", db) + " ("+ db.driver()->escapeIdentifier("a field", QSqlDriver::FieldName) + " int)"; - QVERIFY_SQL( q, exec(qry)); - } + const auto fieldStr = db.driver()->escapeIdentifier("a field", QSqlDriver::FieldName); + QVERIFY_SQL(q, exec("create table " + qTableName("qtestw hitespace", __FILE__, db) + " ("+ fieldStr + " int)")); QVERIFY_SQL(q, exec("create table " + qTableName("pktest", __FILE__, db) + "(id int not null primary key, a varchar(20))")); } @@ -228,7 +204,7 @@ void tst_QSqlTableModel::createTestTables() void tst_QSqlTableModel::repopulateTestTables() { - for (int i = 0; i < dbs.dbNames.count(); ++i) { + for (int i = 0; i < dbs.dbNames.size(); ++i) { QSqlDatabase db = QSqlDatabase::database(dbs.dbNames.at(i)); QSqlQuery q(db); const auto test = qTableName("test1", __FILE__, db); @@ -306,35 +282,37 @@ void tst_QSqlTableModel::select() QFETCH(QString, dbName); QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); - const auto test = qTableName("test1", __FILE__, db); - - QSqlTableModel model(0, db); - model.setTable(test); - model.setSort(0, Qt::AscendingOrder); - QVERIFY_SQL(model, select()); + const QStringList tables = {qTableName("test1", __FILE__, db), + qTableName("test1", __FILE__, db).remove(QLatin1Char('"'))}; + for (const QString &tbl : tables) { + QSqlTableModel model(0, db); + model.setTable(tbl); + model.setSort(0, Qt::AscendingOrder); + QVERIFY_SQL(model, select()); - QCOMPARE(model.rowCount(), 3); - QCOMPARE(model.columnCount(), 3); + QCOMPARE(model.rowCount(), 3); + QCOMPARE(model.columnCount(), 3); - QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); - QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry")); - QCOMPARE(model.data(model.index(0, 2)).toInt(), 1); - QCOMPARE(model.data(model.index(0, 3)), QVariant()); + QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); + QCOMPARE(model.data(model.index(0, 1)).toString(), QString("harry")); + QCOMPARE(model.data(model.index(0, 2)).toInt(), 1); + QCOMPARE(model.data(model.index(0, 3)), QVariant()); - QCOMPARE(model.data(model.index(1, 0)).toInt(), 2); - QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond")); - QCOMPARE(model.data(model.index(1, 2)).toInt(), 2); - QCOMPARE(model.data(model.index(1, 3)), QVariant()); + QCOMPARE(model.data(model.index(1, 0)).toInt(), 2); + QCOMPARE(model.data(model.index(1, 1)).toString(), QString("trond")); + QCOMPARE(model.data(model.index(1, 2)).toInt(), 2); + QCOMPARE(model.data(model.index(1, 3)), QVariant()); - QCOMPARE(model.data(model.index(2, 0)).toInt(), 3); - QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi")); - QCOMPARE(model.data(model.index(2, 2)).toInt(), 3); - QCOMPARE(model.data(model.index(2, 3)), QVariant()); + QCOMPARE(model.data(model.index(2, 0)).toInt(), 3); + QCOMPARE(model.data(model.index(2, 1)).toString(), QString("vohi")); + QCOMPARE(model.data(model.index(2, 2)).toInt(), 3); + QCOMPARE(model.data(model.index(2, 3)), QVariant()); - QCOMPARE(model.data(model.index(3, 0)), QVariant()); - QCOMPARE(model.data(model.index(3, 1)), QVariant()); - QCOMPARE(model.data(model.index(3, 2)), QVariant()); - QCOMPARE(model.data(model.index(3, 3)), QVariant()); + QCOMPARE(model.data(model.index(3, 0)), QVariant()); + QCOMPARE(model.data(model.index(3, 1)), QVariant()); + QCOMPARE(model.data(model.index(3, 2)), QVariant()); + QCOMPARE(model.data(model.index(3, 3)), QVariant()); + } } class SelectRowModel: public QSqlTableModel @@ -449,8 +427,7 @@ void tst_QSqlTableModel::insertColumns() { // Just like the select test, with extra stuff QFETCH(QString, dbName); - QFETCH(int, submitpolicy_i); - QSqlTableModel::EditStrategy submitpolicy = (QSqlTableModel::EditStrategy) submitpolicy_i; + QFETCH(QSqlTableModel::EditStrategy, submitpolicy); QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); const auto test = qTableName("test1", __FILE__, db); @@ -600,13 +577,13 @@ void tst_QSqlTableModel::setRecord() CHECK_DATABASE(db); const auto test3 = qTableName("test3", __FILE__, db); - QList<QSqlTableModel::EditStrategy> policies = QList<QSqlTableModel::EditStrategy>() << QSqlTableModel::OnFieldChange << QSqlTableModel::OnRowChange << QSqlTableModel::OnManualSubmit; + const auto policies = { QSqlTableModel::OnFieldChange, QSqlTableModel::OnRowChange, QSqlTableModel::OnManualSubmit }; QString Xsuffix; - foreach( QSqlTableModel::EditStrategy submitpolicy, policies) { + for (QSqlTableModel::EditStrategy submitpolicy : policies) { QSqlTableModel model(0, db); - model.setEditStrategy((QSqlTableModel::EditStrategy)submitpolicy); + model.setEditStrategy(submitpolicy); model.setTable(test3); model.setSort(0, Qt::AscendingOrder); QVERIFY_SQL(model, select()); @@ -620,23 +597,23 @@ void tst_QSqlTableModel::setRecord() QVERIFY(model.setRecord(i, rec)); // dataChanged() emitted by setData() for each *changed* column - if ((QSqlTableModel::EditStrategy)submitpolicy == QSqlTableModel::OnManualSubmit) { - QCOMPARE(spy.count(), 2); - QCOMPARE(spy.at(0).count(), 2); + if (submitpolicy == QSqlTableModel::OnManualSubmit) { + QCOMPARE(spy.size(), 2); + QCOMPARE(spy.at(0).size(), 2); QCOMPARE(qvariant_cast<QModelIndex>(spy.at(0).at(0)), model.index(i, 1)); QCOMPARE(qvariant_cast<QModelIndex>(spy.at(0).at(1)), model.index(i, 1)); QCOMPARE(qvariant_cast<QModelIndex>(spy.at(1).at(0)), model.index(i, 2)); QCOMPARE(qvariant_cast<QModelIndex>(spy.at(1).at(1)), model.index(i, 2)); QVERIFY(model.submitAll()); - } else if ((QSqlTableModel::EditStrategy)submitpolicy == QSqlTableModel::OnRowChange && i == model.rowCount() -1) + } else if (submitpolicy == QSqlTableModel::OnRowChange && i == model.rowCount() -1) model.submit(); else { - if ((QSqlTableModel::EditStrategy)submitpolicy != QSqlTableModel::OnManualSubmit) + if (submitpolicy != QSqlTableModel::OnManualSubmit) // dataChanged() also emitted by selectRow() - QCOMPARE(spy.count(), 3); + QCOMPARE(spy.size(), 3); else - QCOMPARE(spy.count(), 2); - QCOMPARE(spy.at(0).count(), 2); + QCOMPARE(spy.size(), 2); + QCOMPARE(spy.at(0).size(), 2); QCOMPARE(qvariant_cast<QModelIndex>(spy.at(0).at(0)), model.index(i, 1)); QCOMPARE(qvariant_cast<QModelIndex>(spy.at(0).at(1)), model.index(i, 1)); QCOMPARE(qvariant_cast<QModelIndex>(spy.at(1).at(0)), model.index(i, 2)); @@ -733,8 +710,7 @@ void tst_QSqlTableModel::recordReimpl() void tst_QSqlTableModel::insertRow() { QFETCH(QString, dbName); - QFETCH(int, submitpolicy_i); - QSqlTableModel::EditStrategy submitpolicy = (QSqlTableModel::EditStrategy) submitpolicy_i; + QFETCH(QSqlTableModel::EditStrategy, submitpolicy); QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); const auto test = qTableName("test1", __FILE__, db); @@ -843,8 +819,7 @@ void tst_QSqlTableModel::insertRowFailure() { QFETCH(QString, dbName); QSqlDatabase db = QSqlDatabase::database(dbName); - QFETCH(int, submitpolicy_i); - QSqlTableModel::EditStrategy submitpolicy = (QSqlTableModel::EditStrategy) submitpolicy_i; + QFETCH(QSqlTableModel::EditStrategy, submitpolicy); CHECK_DATABASE(db); QSqlTableModel model(0, db); @@ -993,8 +968,7 @@ void tst_QSqlTableModel::insertMultiRecords() void tst_QSqlTableModel::insertWithAutoColumn() { QFETCH(QString, dbName); - QFETCH(int, submitpolicy_i); - QSqlTableModel::EditStrategy submitpolicy = (QSqlTableModel::EditStrategy) submitpolicy_i; + QFETCH(QSqlTableModel::EditStrategy, submitpolicy); QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); @@ -1111,7 +1085,7 @@ void tst_QSqlTableModel::removeRow() QSignalSpy headerDataChangedSpy(&model, SIGNAL(headerDataChanged(Qt::Orientation,int,int))); QVERIFY(model.removeRow(1)); - QCOMPARE(headerDataChangedSpy.count(), 1); + QCOMPARE(headerDataChangedSpy.size(), 1); QCOMPARE(*static_cast<const Qt::Orientation *>(headerDataChangedSpy.at(0).value(0).constData()), Qt::Vertical); QCOMPARE(headerDataChangedSpy.at(0).at(1).toInt(), 1); QCOMPARE(headerDataChangedSpy.at(0).at(2).toInt(), 1); @@ -1131,7 +1105,7 @@ void tst_QSqlTableModel::removeRow() headerDataChangedSpy.clear(); QVERIFY(model.removeRow(1)); - QCOMPARE(headerDataChangedSpy.count(), 1); + QCOMPARE(headerDataChangedSpy.size(), 1); QCOMPARE(model.rowCount(), 3); QVERIFY_SQL(model, select()); @@ -1167,7 +1141,7 @@ void tst_QSqlTableModel::removeRows() QVERIFY_SQL(model, removeRows(0, 1)); QVERIFY_SQL(model, removeRows(1, 1)); - QCOMPARE(beforeDeleteSpy.count(), 2); + QCOMPARE(beforeDeleteSpy.size(), 2); QCOMPARE(beforeDeleteSpy.at(0).at(0).toInt(), 0); QCOMPARE(beforeDeleteSpy.at(1).at(0).toInt(), 1); // deleted rows shown as empty until select @@ -1198,15 +1172,15 @@ void tst_QSqlTableModel::removeRows() qRegisterMetaType<Qt::Orientation>("Qt::Orientation"); QSignalSpy headerDataChangedSpy(&model, SIGNAL(headerDataChanged(Qt::Orientation,int,int))); QVERIFY(model.removeRows(0, 2, QModelIndex())); - QCOMPARE(headerDataChangedSpy.count(), 2); + QCOMPARE(headerDataChangedSpy.size(), 2); QCOMPARE(headerDataChangedSpy.at(0).at(1).toInt(), 1); QCOMPARE(headerDataChangedSpy.at(0).at(2).toInt(), 1); QCOMPARE(headerDataChangedSpy.at(1).at(1).toInt(), 0); QCOMPARE(headerDataChangedSpy.at(1).at(2).toInt(), 0); QCOMPARE(model.rowCount(), 3); - QCOMPARE(beforeDeleteSpy.count(), 0); + QCOMPARE(beforeDeleteSpy.size(), 0); QVERIFY(model.submitAll()); - QCOMPARE(beforeDeleteSpy.count(), 2); + QCOMPARE(beforeDeleteSpy.size(), 2); QCOMPARE(beforeDeleteSpy.at(0).at(0).toInt(), 0); QCOMPARE(beforeDeleteSpy.at(1).at(0).toInt(), 1); QCOMPARE(model.rowCount(), 1); @@ -1216,8 +1190,7 @@ void tst_QSqlTableModel::removeRows() void tst_QSqlTableModel::removeInsertedRow() { QFETCH(QString, dbName); - QFETCH(int, submitpolicy_i); - QSqlTableModel::EditStrategy submitpolicy = (QSqlTableModel::EditStrategy) submitpolicy_i; + QFETCH(QSqlTableModel::EditStrategy, submitpolicy); QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); const auto test = qTableName("test1", __FILE__, db); @@ -1401,8 +1374,7 @@ void tst_QSqlTableModel::removeInsertedRows() void tst_QSqlTableModel::revert() { QFETCH(QString, dbName); - QFETCH(int, submitpolicy_i); - QSqlTableModel::EditStrategy submitpolicy = (QSqlTableModel::EditStrategy) submitpolicy_i; + QFETCH(QSqlTableModel::EditStrategy, submitpolicy); QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); @@ -1478,8 +1450,7 @@ void tst_QSqlTableModel::revert() void tst_QSqlTableModel::isDirty() { QFETCH(QString, dbName); - QFETCH(int, submitpolicy_i); - QSqlTableModel::EditStrategy submitpolicy = (QSqlTableModel::EditStrategy) submitpolicy_i; + QFETCH(QSqlTableModel::EditStrategy, submitpolicy); QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); const auto test = qTableName("test1", __FILE__, db); @@ -1684,11 +1655,11 @@ void tst_QSqlTableModel::emptyTable() QCOMPARE(model.columnCount(), 1); // QTBUG-29108: check correct horizontal header for empty query with pending insert - QCOMPARE(model.headerData(0, Qt::Horizontal).toString(), QString("id")); + QCOMPARE(model.headerData(0, Qt::Horizontal).toString().toLower(), QString("id")); model.setEditStrategy(QSqlTableModel::OnManualSubmit); model.insertRow(0); QCOMPARE(model.rowCount(), 1); - QCOMPARE(model.headerData(0, Qt::Horizontal).toString(), QString("id")); + QCOMPARE(model.headerData(0, Qt::Horizontal).toString().toLower(), QString("id")); model.revertAll(); } @@ -1719,10 +1690,7 @@ void tst_QSqlTableModel::whitespaceInIdentifiers() QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); - if (!testWhiteSpaceNames(db.driverName())) - QSKIP("DBMS doesn't support whitespaces in identifiers"); - - QString tableName = qTableName("qtestw hitespace", db); + QString tableName = qTableName("qtestw hitespace", __FILE__, db); QSqlTableModel model(0, db); model.setTable(tableName); @@ -1803,8 +1771,8 @@ void tst_QSqlTableModel::setFilter() model.setFilter("id = 2"); // check the signals - QCOMPARE(modelAboutToBeResetSpy.count(), 1); - QCOMPARE(modelResetSpy.count(), 1); + QCOMPARE(modelAboutToBeResetSpy.size(), 1); + QCOMPARE(modelResetSpy.size(), 1); QCOMPARE(model.rowCount(), 1); QCOMPARE(model.data(model.index(0, 0)).toInt(), 2); @@ -1947,13 +1915,82 @@ void tst_QSqlTableModel::insertRecordsInLoop() model.submitAll(); // submitAll() calls select() which clears and repopulates the table // model emits reset signals - QCOMPARE(modelAboutToBeResetSpy.count(), 1); - QCOMPARE(modelResetSpy.count(), 1); + QCOMPARE(modelAboutToBeResetSpy.size(), 1); + QCOMPARE(modelResetSpy.size(), 1); QCOMPARE(model.rowCount(), 13); QCOMPARE(model.columnCount(), 3); } +void tst_QSqlTableModel::sqlite_escaped_delimiters() +{ + QFETCH(QString, dbName); + QSqlDatabase db = QSqlDatabase::database(dbName); + CHECK_DATABASE(db); + if (db.databaseName() == ":memory:") + QSKIP(":memory: database, skipping test"); + + auto attachedDb = QSqlDatabase::cloneDatabase(db, db.driverName() + QLatin1String("attached")); + attachedDb.setDatabaseName(db.databaseName() + QLatin1String("attached.dat")); + QVERIFY_SQL(attachedDb, open()); + QSqlQuery q(attachedDb); + TableScope tsAttached(attachedDb, "attachedTestTable", __FILE__); + QVERIFY_SQL(q, + exec("CREATE TABLE attachedTestTable(" + "id int, \"attachedCol [unit]\" varchar(20))")); + QVERIFY_SQL(q, + exec("INSERT INTO attachedTestTable VALUES(" + "1, 'attachTestData')")); + + QSqlQuery q2(db); + TableScope ts(db, "testTable", __FILE__); + QVERIFY_SQL(q2, exec("CREATE TABLE testTable(id int, \"col [unit]\" varchar(20))")); + QVERIFY_SQL(q2, exec("INSERT INTO testTable VALUES(2, 'testData')")); + QVERIFY_SQL(q2, exec("ATTACH DATABASE \"" + attachedDb.databaseName() + "\" AS attachedDb")); + + const std::array<std::pair<QLatin1Char, QLatin1Char>, 3> escapingPairs{ + std::make_pair(QLatin1Char{'"'}, QLatin1Char{'"'}), + std::make_pair(QLatin1Char{'`'}, QLatin1Char{'`'}), + std::make_pair(QLatin1Char{'['}, QLatin1Char{']'}) + }; + + QSqlTableModel model(nullptr, db); + model.setTable("testTable"); + QVERIFY_SQL(model, select()); + for (const auto &escapingPair : escapingPairs) { + model.setTable(escapingPair.first + "testTable" + escapingPair.second); + QVERIFY_SQL(model, select()); + } + + model.setTable("attachedDb.attachedTestTable"); + QFAIL_SQL(model, select()); + for (const auto &escapingPair : escapingPairs) { + model.setTable(escapingPair.first + "attachedDb.attachedTestTable" + escapingPair.second); + QFAIL_SQL(model, select()); + model.setTable(escapingPair.first + "attachedDb" + escapingPair.first + ".a" + + escapingPair.second + "ttachedTestTable" + escapingPair.second); + QFAIL_SQL(model, select()); + } + + for (std::size_t i = 0; i <= escapingPairs.size(); ++i) { + for (std::size_t j = 0; j <= escapingPairs.size(); ++j) { + if (i == escapingPairs.size() && j == escapingPairs.size()) + continue; + + QString leftName = "attachedDb"; + if (i != escapingPairs.size()) + leftName = escapingPairs.at(i).first + leftName + escapingPairs.at(i).second; + QString rightName = "attachedTestTable"; + if (j != escapingPairs.size()) + rightName = escapingPairs.at(j).first + rightName + escapingPairs.at(j).second; + model.setTable(leftName + "." + rightName); + QVERIFY_SQL(model, select()); + } + } + + attachedDb.close(); +} + void tst_QSqlTableModel::sqlite_attachedDatabase() { QFETCH(QString, dbName); @@ -1966,21 +2003,23 @@ void tst_QSqlTableModel::sqlite_attachedDatabase() attachedDb.setDatabaseName(db.databaseName()+QLatin1String("attached.dat")); QVERIFY_SQL(attachedDb, open()); QSqlQuery q(attachedDb); - tst_Databases::safeDropTables(attachedDb, QStringList() << "atest" << "atest2"); + TableScope ts(db, "atest", __FILE__); + TableScope tsAttached(attachedDb, "atest", __FILE__); + TableScope tsAttached2(attachedDb, "atest2", __FILE__); + QVERIFY_SQL( q, exec("CREATE TABLE atest(id int, text varchar(20))")); QVERIFY_SQL( q, exec("CREATE TABLE atest2(id int, text varchar(20))")); QVERIFY_SQL( q, exec("INSERT INTO atest VALUES(1, 'attached-atest')")); QVERIFY_SQL( q, exec("INSERT INTO atest2 VALUES(2, 'attached-atest2')")); QSqlQuery q2(db); - tst_Databases::safeDropTable(db, "atest"); QVERIFY_SQL(q2, exec("CREATE TABLE atest(id int, text varchar(20))")); QVERIFY_SQL(q2, exec("INSERT INTO atest VALUES(3, 'main')")); QVERIFY_SQL(q2, exec("ATTACH DATABASE \""+attachedDb.databaseName()+"\" as adb")); // This should query the table in the attached database (schema supplied) QSqlTableModel model(0, db); - model.setTable("adb.atest"); + model.setTable("\"adb\".\"atest\""); QVERIFY_SQL(model, select()); QCOMPARE(model.rowCount(), 1); QCOMPARE(model.data(model.index(0, 0), Qt::DisplayRole).toInt(), 1); @@ -2160,5 +2199,48 @@ void tst_QSqlTableModel::modelInAnotherThread() QVERIFY(t.isFinished()); } +void tst_QSqlTableModel::sqlite_selectFromIdentifierWithDot() +{ + QFETCH(QString, dbName); + QSqlDatabase db = QSqlDatabase::database(dbName); + TableScope fieldDot(db, "fieldDot", __FILE__); + TableScope tableDot(db, u'[' + qTableName("table.dot", __FILE__, db) + u']'); + CHECK_DATABASE(db); + { + QSqlQuery qry(db); + QVERIFY_SQL(qry, exec("create table " + fieldDot.tableName() + " (id int primary key, " + "\"person.firstname\" varchar(20))")); + QVERIFY_SQL(qry, exec("insert into " + fieldDot.tableName() + " values(1, 'Andy')")); + QSqlTableModel model(0, db); + model.setTable(fieldDot.tableName()); + QVERIFY_SQL(model, select()); + QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); + QCOMPARE(model.data(model.index(0, 1)).toString(), QString("Andy")); + } + { + QSqlQuery qry(db); + QVERIFY_SQL(qry, exec("create table " + tableDot.tableName() + " (id int primary key, " + "\"person.firstname\" varchar(20))")); + QVERIFY_SQL(qry, exec("insert into " + tableDot.tableName() + " values(1, 'Andy')")); + QSqlTableModel model(0, db); + model.setTable(tableDot.tableName()); + QVERIFY_SQL(model, select()); + QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); + QCOMPARE(model.data(model.index(0, 1)).toString(), QString("Andy")); + } + { + QSqlDatabase attachedDb = QSqlDatabase::addDatabase("QSQLITE", "attachedDb"); + attachedDb.setDatabaseName(db.databaseName().replace("foo.db", "attached.db")); + QVERIFY(attachedDb.open()); + QSqlQuery qry(attachedDb); + QVERIFY_SQL(qry, exec(QString("attach '%1' AS 'attached'").arg(db.databaseName()))); + QSqlTableModel model(0, attachedDb); + model.setTable(QString("attached.%1").arg(tableDot.tableName())); + QVERIFY_SQL(model, select()); + QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); + QCOMPARE(model.data(model.index(0, 1)).toString(), QString("Andy")); + } +} + QTEST_MAIN(tst_QSqlTableModel) #include "tst_qsqltablemodel.moc" |