summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/sqldrivers/psql/qsql_psql.cpp16
-rw-r--r--tests/benchmarks/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp33
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"