diff options
author | Christian Ehrlicher <ch.ehrlicher@gmx.de> | 2018-02-15 21:34:50 +0100 |
---|---|---|
committer | Christian Ehrlicher <ch.ehrlicher@gmx.de> | 2018-02-22 19:00:08 +0000 |
commit | a924b4d58f66da44cd9a5ed8896f80a5121bac4a (patch) | |
tree | 7cfef13b27f90d92d1c8458697db23b7594512c0 | |
parent | 988c3e4fc0ddcf154e39cc3a0b5969a84f6eff5f (diff) |
psql: do not try to get table name when PQftable returns InvalidOid
When the table for a selected column can't be determined (e.g. because
there is no table for it), PQftable returns InvalidOid. This was not
covered and a query to determine the table name was executed every
time which slowed down calls to QSqlQuery::value(QString).
Task-number: QTBUG-65226
Change-Id: Idd8fbaaef7b01ca4151439f46cad2cce6f1c93e9
Reviewed-by: Andy Shaw <andy.shaw@qt.io>
-rw-r--r-- | src/plugins/sqldrivers/psql/qsql_psql.cpp | 16 | ||||
-rw-r--r-- | tests/benchmarks/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp | 33 |
2 files changed, 42 insertions, 7 deletions
diff --git a/src/plugins/sqldrivers/psql/qsql_psql.cpp b/src/plugins/sqldrivers/psql/qsql_psql.cpp index 368b777ca5..f67c78b2bb 100644 --- a/src/plugins/sqldrivers/psql/qsql_psql.cpp +++ b/src/plugins/sqldrivers/psql/qsql_psql.cpp @@ -817,19 +817,21 @@ QSqlRecord QPSQLResult::record() const else f.setName(QString::fromLocal8Bit(PQfname(d->result, i))); const int tableOid = PQftable(d->result, i); - auto &tableName = d->drv_d_func()->oidToTable[tableOid]; // WARNING: We cannot execute any other SQL queries on // the same db connection while forward-only mode is active // (this would discard all results of forward-only query). // So we just skip this... - if (tableName.isEmpty() && !isForwardOnly()) { - QSqlQuery qry(driver()->createResult()); - if (qry.exec(QStringLiteral("SELECT relname FROM pg_class WHERE pg_class.oid = %1") - .arg(tableOid)) && qry.next()) { - tableName = qry.value(0).toString(); + if (tableOid != InvalidOid && !isForwardOnly()) { + auto &tableName = d->drv_d_func()->oidToTable[tableOid]; + if (tableName.isEmpty()) { + QSqlQuery qry(driver()->createResult()); + if (qry.exec(QStringLiteral("SELECT relname FROM pg_class WHERE pg_class.oid = %1") + .arg(tableOid)) && qry.next()) { + tableName = qry.value(0).toString(); + } } + f.setTableName(tableName); } - f.setTableName(tableName); int ptype = PQftype(d->result, i); f.setType(qDecodePSQLType(ptype)); int len = PQfsize(d->result, i); diff --git a/tests/benchmarks/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp b/tests/benchmarks/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp index 465dabca0e..8d7e70f8c9 100644 --- a/tests/benchmarks/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp +++ b/tests/benchmarks/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp @@ -50,6 +50,10 @@ public slots: private slots: void benchmarkRecord_data() { generic_data(); } void benchmarkRecord(); + void benchFieldName_data() { generic_data(); } + void benchFieldName(); + void benchFieldIndex_data() { generic_data(); } + void benchFieldIndex(); private: void generic_data(const QString &engine = QString()); @@ -188,4 +192,33 @@ void tst_QSqlRecord::benchmarkRecord() tst_Databases::safeDropTables(db, QStringList() << tableName); } +void tst_QSqlRecord::benchFieldName() +{ + QFETCH(QString, dbName); + QSqlDatabase db = QSqlDatabase::database(dbName); + if (tst_Databases::getDatabaseType(db) == QSqlDriver::PostgreSQL) { + QSqlQuery qry(db); + QVERIFY_SQL(qry, exec("SELECT GENERATE_SERIES(1,5000) AS r")); + QBENCHMARK { + while (qry.next()) + qry.value("r"); + } + } +} + +void tst_QSqlRecord::benchFieldIndex() +{ + QFETCH(QString, dbName); + QSqlDatabase db = QSqlDatabase::database(dbName); + if (tst_Databases::getDatabaseType(db) == QSqlDriver::PostgreSQL) { + QSqlQuery qry(db); + QVERIFY_SQL(qry, exec("SELECT GENERATE_SERIES(1,5000) AS r")); + qry = db.exec("SELECT GENERATE_SERIES(1,5000) AS r"); + QBENCHMARK { + while (qry.next()) + qry.value(0); + } + } +} + #include "tst_qsqlrecord.moc" |