diff options
-rw-r--r-- | src/sql/kernel/qsqlquery.cpp | 6 | ||||
-rw-r--r-- | tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp | 33 |
2 files changed, 37 insertions, 2 deletions
diff --git a/src/sql/kernel/qsqlquery.cpp b/src/sql/kernel/qsqlquery.cpp index 86d086c866..afa4882b1b 100644 --- a/src/sql/kernel/qsqlquery.cpp +++ b/src/sql/kernel/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 QtSql module of the Qt Toolkit. @@ -406,6 +406,10 @@ bool QSqlQuery::exec(const QString& query) QElapsedTimer t; t.start(); #endif + if (!driver()) { + qWarning("QSqlQuery::exec: called before driver has been set up"); + return false; + } if (d->ref.loadRelaxed() != 1) { bool fo = isForwardOnly(); *this = QSqlQuery(driver()->createResult()); diff --git a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp index cbc2cc2c1b..d7a4e8840c 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. @@ -70,6 +70,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(); } @@ -2878,6 +2880,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.sliced(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 ); |