diff options
Diffstat (limited to 'tests/auto/sql')
-rw-r--r-- | tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp | 20 | ||||
-rw-r--r-- | tests/auto/sql/kernel/qsqlquery/BLACKLIST | 3 | ||||
-rw-r--r-- | tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp | 108 | ||||
-rw-r--r-- | tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp | 96 |
4 files changed, 199 insertions, 28 deletions
diff --git a/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp b/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp index f726139e08..f47cd3e888 100644 --- a/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp +++ b/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp @@ -367,8 +367,10 @@ void tst_QSqlDatabase::dropTestTables(QSqlDatabase db) q.exec("drop schema " + qTableName("qtestScHeMa", __FILE__, db) + " cascade"); } - if (testWhiteSpaceNames(db.driverName())) - tableNames << db.driver()->escapeIdentifier(qtestTable + " test", QSqlDriver::TableName); + if (testWhiteSpaceNames(db.driverName())) { + tableNames << db.driver()->escapeIdentifier(qTableName("qtest test", __FILE__, db), + QSqlDriver::TableName); + } tst_Databases::safeDropTables(db, tableNames); @@ -514,7 +516,8 @@ void tst_QSqlDatabase::tables() const auto qtest(qTableName("qtest", __FILE__, db, false)), qtest_view(qTableName("qtest_view", __FILE__, db, false)), - temp_tab(qTableName("test_tab", __FILE__, db, false)); + temp_tab(qTableName("test_tab", __FILE__, db, false)), + qtestspace(qTableName("qtest test", __FILE__, db, false)); bool views = true; bool tempTables = false; @@ -564,7 +567,7 @@ void tst_QSqlDatabase::tables() QVERIFY(tables.contains(qtest, Qt::CaseInsensitive)); if (dbType == QSqlDriver::PostgreSQL) - QVERIFY(tables.contains(qtest + " test")); + QVERIFY(tables.contains(qtestspace)); } void tst_QSqlDatabase::whitespaceInIdentifiers() @@ -2100,7 +2103,14 @@ void tst_QSqlDatabase::eventNotification() QVERIFY(driver->subscribedToNotifications().contains("event_foo")); // Can't subscribe to the same event multiple times - QVERIFY2(!driver->subscribeToNotification(QLatin1String("event_foo")), "Shouldn't be able to subscribe to event_foo twice"); + const QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db); + if (dbType != QSqlDriver::PostgreSQL) { + // We will resubscribe on PostgreSQL in case it is due to a disconnect, the call will + // do nothing on the PostgreSQL side but it will indicate it succeeded anyway and there + // will still only be one entry for it + QVERIFY2(!driver->subscribeToNotification(QLatin1String("event_foo")), + "Shouldn't be able to subscribe to event_foo twice"); + } QCOMPARE(driver->subscribedToNotifications().size(), 1); // Unsubscribe from "event_foo" diff --git a/tests/auto/sql/kernel/qsqlquery/BLACKLIST b/tests/auto/sql/kernel/qsqlquery/BLACKLIST new file mode 100644 index 0000000000..80a9277959 --- /dev/null +++ b/tests/auto/sql/kernel/qsqlquery/BLACKLIST @@ -0,0 +1,3 @@ +# See qtbase/src/testlib/qtestblacklist.cpp for format +[queryOnInvalidDatabase] +ci macos # QTBUG-106513 diff --git a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp index e29d015031..1b760e87ba 100644 --- a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp +++ b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2022 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -68,6 +68,8 @@ private slots: void query_exec(); void execErrorRecovery_data() { generic_data(); } void execErrorRecovery(); + void prematureExec_data() { generic_data(); } + void prematureExec(); void first_data() { generic_data(); } void first(); void next_data() { generic_data(); } @@ -249,6 +251,9 @@ private slots: void sqlite_real_data() { generic_data("QSQLITE"); } void sqlite_real(); + void prepared_query_json_row_data() { generic_data(); } + void prepared_query_json_row(); + void aggregateFunctionTypes_data() { generic_data(); } void aggregateFunctionTypes(); @@ -258,6 +263,9 @@ private slots: void QTBUG_57138_data() { generic_data("QSQLITE"); } void QTBUG_57138(); + void QTBUG_73286_data() { generic_data("QODBC"); } + void QTBUG_73286(); + void dateTime_data(); void dateTime(); @@ -2767,6 +2775,35 @@ void tst_QSqlQuery::execErrorRecovery() QVERIFY_SQL( q, exec() ); } +void tst_QSqlQuery::prematureExec() +{ + QFETCH(QString, dbName); + // We only want the engine name, for addDatabase(): + int cut = dbName.indexOf(QChar('@')); + if (cut < 0) + QSKIP("Failed to parse database type out of name"); + dbName.truncate(cut); + cut = dbName.indexOf(QChar('_')); + if (cut >= 0) + dbName = dbName.mid(cut + 1); + + auto db = QSqlDatabase::addDatabase(dbName); + QSqlQuery q(db); + + QTest::ignoreMessage(QtWarningMsg, + "QSqlDatabasePrivate::removeDatabase: connection " + "'qt_sql_default_connection' is still in use, all " + "queries will cease to work."); + QTest::ignoreMessage(QtWarningMsg, + "QSqlDatabasePrivate::addDatabase: duplicate connection name " + "'qt_sql_default_connection', old connection removed."); + auto otherDb = QSqlDatabase::addDatabase(dbName); + + QTest::ignoreMessage(QtWarningMsg, "QSqlQuery::exec: called before driver has been set up"); + // QTBUG-100037: shouldn't crash ! + QVERIFY(!q.exec("select stuff from TheVoid")); +} + void tst_QSqlQuery::lastInsertId() { QFETCH( QString, dbName ); @@ -4274,6 +4311,43 @@ void tst_QSqlQuery::sqlite_real() QCOMPARE(q.value(0).toDouble(), 5.6); } +void tst_QSqlQuery::prepared_query_json_row() +{ + QFETCH(QString, dbName); + QSqlDatabase db = QSqlDatabase::database(dbName); + CHECK_DATABASE(db); + if (tst_Databases::getDatabaseType(db) != QSqlDriver::MySqlServer && + tst_Databases::getDatabaseType(db) != QSqlDriver::PostgreSQL) { + QSKIP("PostgreSQL / MySQL specific test"); + } + + const QString tableName(qTableName("tableWithJsonRow", __FILE__, db)); + tst_Databases::safeDropTable(db, tableName); + + QSqlQuery q(db); + const QLatin1String vals[] = {QLatin1String("{\"certificateNumber\": \"CERT-001\"}"), + QLatin1String("{\"certificateNumber\": \"CERT-002\"}")}; + QVERIFY_SQL(q, exec(QLatin1String("CREATE TABLE %1 (id INTEGER, value JSON)").arg(tableName))); + for (const QLatin1String &json : vals) { + QVERIFY_SQL(q, exec(QLatin1String("INSERT INTO %1 (id, value) VALUES (1, '%2')") + .arg(tableName, json))); + } + + QVERIFY_SQL(q, prepare(QLatin1String("SELECT id, value FROM %1 WHERE id = ?").arg(tableName))); + q.addBindValue(1); + QVERIFY_SQL(q, exec()); + + size_t iCount = 0; + while (q.next()) { + QVERIFY(iCount < sizeof(vals)); + const int id = q.value(0).toInt(); + const QByteArray json = q.value(1).toByteArray(); + QCOMPARE(id, 1); + QCOMPARE(json, vals[iCount].data()); + ++iCount; + } +} + void tst_QSqlQuery::aggregateFunctionTypes() { QFETCH(QString, dbName); @@ -4529,6 +4603,7 @@ void tst_QSqlQuery::QTBUG_57138() QSqlQuery create(db); QString tableName = qTableName("qtbug57138", __FILE__, db); + tst_Databases::safeDropTable(db, tableName); QVERIFY_SQL(create, exec("create table " + tableName + " (id int, dt_utc datetime, dt_lt datetime, dt_tzoffset datetime)")); QVERIFY_SQL(create, prepare("insert into " + tableName + " (id, dt_utc, dt_lt, dt_tzoffset) values (?, ?, ?, ?)")); @@ -4552,6 +4627,37 @@ void tst_QSqlQuery::QTBUG_57138() QCOMPARE(q.value(2).toDateTime(), tzoffset); } +void tst_QSqlQuery::QTBUG_73286() +{ + QFETCH(QString, dbName); + QSqlDatabase db = QSqlDatabase::database(dbName); + CHECK_DATABASE(db); + + QSqlQuery create(db); + QString tableName = qTableName("qtbug73286", __FILE__, db); + tst_Databases::safeDropTable(db, tableName); + + QVERIFY_SQL(create, exec("create table " + tableName + " (dec2 decimal(4,2), dec0 decimal(20,0), dec3 decimal(20,3))")); + QVERIFY_SQL(create, prepare("insert into " + tableName + " (dec2, dec0, dec3) values (?, ?, ?)")); + + create.addBindValue("99.99"); + create.addBindValue("12345678901234567890"); + create.addBindValue("12345678901234567.890"); + + QVERIFY_SQL(create, exec()); + + QSqlQuery q(db); + q.prepare("SELECT dec2, dec0, dec3 FROM " + tableName); + q.setNumericalPrecisionPolicy(QSql::HighPrecision); + + QVERIFY_SQL(q, exec()); + QVERIFY(q.next()); + + QCOMPARE(q.value(0).toString(), "99.99"); + QCOMPARE(q.value(1).toString(), "12345678901234567890"); + QCOMPARE(q.value(2).toString(), "12345678901234567.890"); +} + void tst_QSqlQuery::dateTime_data() { QTest::addColumn<QString>("dbName"); diff --git a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp index 44dd4a74cf..935734c070 100644 --- a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp +++ b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp @@ -157,6 +157,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()); @@ -308,33 +311,37 @@ void tst_QSqlTableModel::select() QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); - QSqlTableModel model(0, db); - model.setTable(test); - model.setSort(0, Qt::AscendingOrder); - QVERIFY_SQL(model, select()); + QString withoutQuotes = test; + const QStringList tables = {test, withoutQuotes.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 @@ -2138,5 +2145,50 @@ void tst_QSqlTableModel::modelInAnotherThread() QVERIFY(t.isFinished()); } +void tst_QSqlTableModel::sqlite_selectFromIdentifierWithDot() +{ + QFETCH(QString, dbName); + QSqlDatabase db = QSqlDatabase::database(dbName); + CHECK_DATABASE(db); + { + const auto fieldDot = qTableName("fieldDot", __FILE__, db); + tst_Databases::safeDropTable(db, fieldDot); + QSqlQuery qry(db); + QVERIFY_SQL(qry, exec("create table " + fieldDot + " (id int primary key, " + "\"person.firstname\" varchar(20))")); + QVERIFY_SQL(qry, exec("insert into " + fieldDot + " values(1, 'Andy')")); + QSqlTableModel model(0, db); + model.setTable(fieldDot); + QVERIFY_SQL(model, select()); + QCOMPARE(model.data(model.index(0, 0)).toInt(), 1); + QCOMPARE(model.data(model.index(0, 1)).toString(), QString("Andy")); + } + const auto tableDot = QLatin1Char('[') + qTableName("table.dot", __FILE__, db) + QLatin1Char(']'); + { + tst_Databases::safeDropTable(db, tableDot); + QSqlQuery qry(db); + QVERIFY_SQL(qry, exec("create table " + tableDot + " (id int primary key, " + "\"person.firstname\" varchar(20))")); + QVERIFY_SQL(qry, exec("insert into " + tableDot + " values(1, 'Andy')")); + QSqlTableModel model(0, db); + model.setTable(tableDot); + 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)); + 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" |