File 0001-Revert-Always-escape-the-table-names-when-creating-t.patch of Package libqt5-qtbase

From abc2468e46b1f0263f79615cd8d78c559436e3d4 Mon Sep 17 00:00:00 2001
From: Fabian Vogt <fabian@ritter-vogt.de>
Date: Wed, 26 Jun 2019 14:18:58 +0200
Subject: [PATCH] Revert "Always escape the table names when creating the SQL
 statement"

This reverts commit 461ef575bcf778ba24b0be6b775098d4b80ae5e1.
---
 src/plugins/sqldrivers/mysql/qsql_mysql.cpp   |   2 +-
 src/plugins/sqldrivers/psql/qsql_psql.cpp     |  24 +++-
 .../doc/snippets/code/doc_src_sql-driver.qdoc |  13 ---
 src/sql/doc/src/sql-driver.qdoc               |  17 ---
 src/sql/kernel/qsqldatabase.cpp               |  10 --
 src/sql/kernel/qsqldriver.cpp                 |  16 +--
 .../sql/kernel/qsqldatabase/tst_databases.h   |  14 +--
 .../kernel/qsqldatabase/tst_qsqldatabase.cpp  | 110 +++++++-----------
 .../sql/kernel/qsqlquery/tst_qsqlquery.cpp    |  14 ++-
 .../tst_qsqlrelationaltablemodel.cpp          |  14 ++-
 .../qsqltablemodel/tst_qsqltablemodel.cpp     |  10 ++
 11 files changed, 106 insertions(+), 138 deletions(-)

diff --git a/src/plugins/sqldrivers/mysql/qsql_mysql.cpp b/src/plugins/sqldrivers/mysql/qsql_mysql.cpp
index febbe58506..80c0c9c522 100644
--- a/src/plugins/sqldrivers/mysql/qsql_mysql.cpp
+++ b/src/plugins/sqldrivers/mysql/qsql_mysql.cpp
@@ -1551,7 +1551,7 @@ QSqlIndex QMYSQLDriver::primaryIndex(const QString& tablename) const
     QSqlQuery i(createResult());
     QString stmt(QLatin1String("show index from %1;"));
     QSqlRecord fil = record(tablename);
-    i.exec(stmt.arg(escapeIdentifier(tablename, QSqlDriver::TableName)));
+    i.exec(stmt.arg(tablename));
     while (i.isActive() && i.next()) {
         if (i.value(2).toString() == QLatin1String("PRIMARY")) {
             idx.append(fil.field(i.value(4).toString()));
diff --git a/src/plugins/sqldrivers/psql/qsql_psql.cpp b/src/plugins/sqldrivers/psql/qsql_psql.cpp
index c1be91cb22..7abd1f242b 100644
--- a/src/plugins/sqldrivers/psql/qsql_psql.cpp
+++ b/src/plugins/sqldrivers/psql/qsql_psql.cpp
@@ -1396,8 +1396,16 @@ QSqlIndex QPSQLDriver::primaryIndex(const QString &tablename) const
     QString tbl = tablename;
     QString schema;
     qSplitTableName(tbl, schema);
-    schema = stripDelimiters(schema, QSqlDriver::TableName);
-    tbl = stripDelimiters(tbl, QSqlDriver::TableName);
+
+    if (isIdentifierEscaped(tbl, QSqlDriver::TableName))
+        tbl = stripDelimiters(tbl, QSqlDriver::TableName);
+    else
+        tbl = std::move(tbl).toLower();
+
+    if (isIdentifierEscaped(schema, QSqlDriver::TableName))
+        schema = stripDelimiters(schema, QSqlDriver::TableName);
+    else
+        schema = std::move(schema).toLower();
 
     QString stmt = QStringLiteral("SELECT pg_attribute.attname, pg_attribute.atttypid::int, "
                                   "pg_class.relname "
@@ -1432,8 +1440,16 @@ QSqlRecord QPSQLDriver::record(const QString &tablename) const
     QString tbl = tablename;
     QString schema;
     qSplitTableName(tbl, schema);
-    schema = stripDelimiters(schema, QSqlDriver::TableName);
-    tbl = stripDelimiters(tbl, QSqlDriver::TableName);
+
+    if (isIdentifierEscaped(tbl, QSqlDriver::TableName))
+        tbl = stripDelimiters(tbl, QSqlDriver::TableName);
+    else
+        tbl = std::move(tbl).toLower();
+
+    if (isIdentifierEscaped(schema, QSqlDriver::TableName))
+        schema = stripDelimiters(schema, QSqlDriver::TableName);
+    else
+        schema = std::move(schema).toLower();
 
     QString stmt = QStringLiteral("SELECT pg_attribute.attname, pg_attribute.atttypid::int, "
                                   "pg_attribute.attnotnull, pg_attribute.attlen, pg_attribute.atttypmod, "
diff --git a/src/sql/doc/snippets/code/doc_src_sql-driver.qdoc b/src/sql/doc/snippets/code/doc_src_sql-driver.qdoc
index 9709deeccb..d127bdf8a5 100644
--- a/src/sql/doc/snippets/code/doc_src_sql-driver.qdoc
+++ b/src/sql/doc/snippets/code/doc_src_sql-driver.qdoc
@@ -237,16 +237,3 @@ Could not create database object
 //! [38]
 QPSQLDriver::getResult: Query results lost - probably discarded on executing another SQL query.
 //! [38]
-
-//! [39]
-CREATE TABLE "testTable" ("id" INTEGER);
-//! [39]
-
-//! [40]
-QString tableString("testTable");
-QSqlQuery q;
-// Create table query is not quoted, therefore it is mapped to lower case
-q.exec(QString("CREATE TABLE %1 (id INTEGER)").arg(tableString));
-// Call toLower() on the string so that it can be matched
-QSqlRecord rec = database.record(tableString.toLower());
-//! [40]
diff --git a/src/sql/doc/src/sql-driver.qdoc b/src/sql/doc/src/sql-driver.qdoc
index cccce48bb3..fd95e89812 100644
--- a/src/sql/doc/src/sql-driver.qdoc
+++ b/src/sql/doc/src/sql-driver.qdoc
@@ -381,23 +381,6 @@
     multibyte enabled PostgreSQL server can be found in the PostgreSQL
     Administrator Guide, Chapter 5.
 
-    \section3 QPSQL Case Sensitivity
-
-    PostgreSQL databases will only respect case sensitivity if the table or field
-    name is quoted when the table is created. So for example, a SQL query such
-    as:
-
-    \snippet code/doc_src_sql-driver.qdoc 39
-
-    will ensure that it can be accessed with the same case that was used. If the
-    table or field name is not quoted when created, the actual table name
-    or field name will be lower-case. When QSqlDatabase::record() or
-    QSqlDatabase::primaryIndex() access a table or field that was unquoted
-    when created, the name passed to the function must be lower-case to
-    ensure it is found. For example:
-
-    \snippet code/doc_src_sql-driver.qdoc 40
-
     \section3 QPSQL BLOB Support
 
     Binary Large Objects are supported through the \c BYTEA field type in
diff --git a/src/sql/kernel/qsqldatabase.cpp b/src/sql/kernel/qsqldatabase.cpp
index d63a9e59a8..12ab9671b5 100644
--- a/src/sql/kernel/qsqldatabase.cpp
+++ b/src/sql/kernel/qsqldatabase.cpp
@@ -1088,11 +1088,6 @@ QStringList QSqlDatabase::tables(QSql::TableType type) const
     Returns the primary index for table \a tablename. If no primary
     index exists, an empty QSqlIndex is returned.
 
-    \note Some drivers, such as the \l {QPSQL Case Sensitivity}{QPSQL}
-    driver, may may require you to pass \a tablename in lower case if
-    the table was not quoted when created. See the
-    \l{sql-driver.html}{Qt SQL driver} documentation for more information.
-
     \sa tables(), record()
 */
 
@@ -1107,11 +1102,6 @@ QSqlIndex QSqlDatabase::primaryIndex(const QString& tablename) const
     the table (or view) called \a tablename. The order in which the
     fields appear in the record is undefined. If no such table (or
     view) exists, an empty record is returned.
-
-    \note Some drivers, such as the \l {QPSQL Case Sensitivity}{QPSQL}
-    driver, may may require you to pass \a tablename in lower case if
-    the table was not quoted when created. See the
-    \l{sql-driver.html}{Qt SQL driver} documentation for more information.
 */
 
 QSqlRecord QSqlDatabase::record(const QString& tablename) const
diff --git a/src/sql/kernel/qsqldriver.cpp b/src/sql/kernel/qsqldriver.cpp
index 7f7b81b05b..8c6ae382f6 100644
--- a/src/sql/kernel/qsqldriver.cpp
+++ b/src/sql/kernel/qsqldriver.cpp
@@ -488,8 +488,6 @@ QString QSqlDriver::stripDelimiters(const QString &identifier, IdentifierType ty
 QString QSqlDriver::sqlStatement(StatementType type, const QString &tableName,
                                  const QSqlRecord &rec, bool preparedStatement) const
 {
-    const auto tableNameString = tableName.isEmpty() ? QString()
-                                    : prepareIdentifier(tableName, QSqlDriver::TableName, this);
     int i;
     QString s;
     s.reserve(128);
@@ -502,12 +500,13 @@ QString QSqlDriver::sqlStatement(StatementType type, const QString &tableName,
         if (s.isEmpty())
             return s;
         s.chop(2);
-        s = QLatin1String("SELECT ") + s + QLatin1String(" FROM ") + tableNameString;
+        s.prepend(QLatin1String("SELECT ")).append(QLatin1String(" FROM ")).append(tableName);
         break;
     case WhereStatement:
     {
-        const QString tableNamePrefix = tableNameString.isEmpty()
-                                            ? QString() : tableNameString + QLatin1Char('.');
+        const QString tableNamePrefix = tableName.isEmpty()
+            ? QString()
+            : prepareIdentifier(tableName, QSqlDriver::TableName, this) + QLatin1Char('.');
         for (int i = 0; i < rec.count(); ++i) {
             if (!rec.isGenerated(i))
                 continue;
@@ -524,7 +523,8 @@ QString QSqlDriver::sqlStatement(StatementType type, const QString &tableName,
         break;
     }
     case UpdateStatement:
-        s = s + QLatin1String("UPDATE ") + tableNameString + QLatin1String(" SET ");
+        s.append(QLatin1String("UPDATE ")).append(tableName).append(
+                 QLatin1String(" SET "));
         for (i = 0; i < rec.count(); ++i) {
             if (!rec.isGenerated(i))
                 continue;
@@ -541,10 +541,10 @@ QString QSqlDriver::sqlStatement(StatementType type, const QString &tableName,
             s.clear();
         break;
     case DeleteStatement:
-        s = s + QLatin1String("DELETE FROM ") + tableNameString;
+        s.append(QLatin1String("DELETE FROM ")).append(tableName);
         break;
     case InsertStatement: {
-        s = s + QLatin1String("INSERT INTO ") + tableNameString + QLatin1String(" (");
+        s.append(QLatin1String("INSERT INTO ")).append(tableName).append(QLatin1String(" ("));
         QString vals;
         for (i = 0; i < rec.count(); ++i) {
             if (!rec.isGenerated(i))
diff --git a/tests/auto/sql/kernel/qsqldatabase/tst_databases.h b/tests/auto/sql/kernel/qsqldatabase/tst_databases.h
index 55875359ff..97397e3159 100644
--- a/tests/auto/sql/kernel/qsqldatabase/tst_databases.h
+++ b/tests/auto/sql/kernel/qsqldatabase/tst_databases.h
@@ -79,14 +79,14 @@ inline QString fixupTableName(const QString &tableName, QSqlDatabase db)
     return tbName;
 }
 
-inline static QString qTableName(const QString &prefix, const char *sourceFileName,
-                                 QSqlDatabase db, bool escape = true)
+inline static QString qTableName(const QString& prefix, const char *sourceFileName, QSqlDatabase db)
 {
-    const auto tableStr = fixupTableName(QString(QLatin1String("dbtst") + db.driverName() +
-                                                 QString::number(qHash(QLatin1String(sourceFileName) +
-                                                 "_" + qGetHostName().replace("-", "_")), 16) +
-                                                 "_" + prefix), db);
-    return escape ? db.driver()->escapeIdentifier(tableStr, QSqlDriver::TableName) : tableStr;
+    QString tableStr = QLatin1String("dbtst");
+    if (db.driverName().toLower().contains("ODBC"))
+        tableStr += QLatin1String("_odbc");
+    return fixupTableName(QString(QLatin1String("dbtst") + db.driverName() +
+                          QString::number(qHash(QLatin1String(sourceFileName) +
+                          "_" + qGetHostName().replace( "-", "_" )), 16) + "_" + prefix), db);
 }
 
 inline static QString qTableName(const QString& prefix, QSqlDatabase db)
diff --git a/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp b/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
index f309231b10..75db31e45f 100644
--- a/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
+++ b/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
@@ -314,8 +314,10 @@ void tst_QSqlDatabase::createTestTables(QSqlDatabase db)
                " (id integer not null, t_varchar varchar(40) not null, "
                "t_char char(40), t_numeric numeric(6, 3), primary key (id, t_varchar))"));
     }
+
     if (testWhiteSpaceNames(db.driverName())) {
-        QString qry = "create table " + qTableName("qtest test", __FILE__, db)
+        QString qry = "create table "
+            + db.driver()->escapeIdentifier(tableName + " test", QSqlDriver::TableName)
             + '('
             + db.driver()->escapeIdentifier(QLatin1String("test test"), QSqlDriver::FieldName)
             + " int not null primary key)";
@@ -339,7 +341,6 @@ void tst_QSqlDatabase::dropTestTables(QSqlDatabase db)
     const QString qtestTable = qTableName("qtest", __FILE__, db);
     QStringList tableNames;
     tableNames << qtestTable
-            << qTableName("qtest test", __FILE__, db)
             << qTableName("qtestfields", __FILE__, db)
             << qTableName("qtestalter", __FILE__, db)
             << qTableName("qtest_temp", __FILE__, db)
@@ -512,9 +513,7 @@ void tst_QSqlDatabase::tables()
     CHECK_DATABASE(db);
     QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db);
 
-    const auto qtest(qTableName("qtest", __FILE__, db, false)),
-               qtest_view(qTableName("qtest_view", __FILE__, db, false)),
-               temp_tab(qTableName("test_tab", __FILE__, db, false));
+    const QString qtest(qTableName("qtest", __FILE__, db)), qtest_view(qTableName("qtest_view", __FILE__, db)), temp_tab(qTableName("test_tab", __FILE__, db));
 
     bool views = true;
     bool tempTables = false;
@@ -579,10 +578,10 @@ void tst_QSqlDatabase::whitespaceInIdentifiers()
     const QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db);
 
     if (testWhiteSpaceNames(db.driverName())) {
-        const auto tableName(qTableName("qtest test", __FILE__, db, false));
+        const QString tableName(qTableName("qtest", __FILE__, db) + " test");
         QVERIFY(db.tables().contains(tableName, Qt::CaseInsensitive));
 
-        QSqlRecord rec = db.record(tableName);
+        QSqlRecord rec = db.record(db.driver()->escapeIdentifier(tableName, QSqlDriver::TableName));
         QCOMPARE(rec.count(), 1);
         QCOMPARE(rec.fieldName(0), QString("test test"));
         if (dbType == QSqlDriver::Oracle)
@@ -590,7 +589,7 @@ void tst_QSqlDatabase::whitespaceInIdentifiers()
         else
             QCOMPARE(rec.field(0).type(), QVariant::Int);
 
-        QSqlIndex idx = db.primaryIndex(tableName);
+        QSqlIndex idx = db.primaryIndex(db.driver()->escapeIdentifier(tableName, QSqlDriver::TableName));
         QCOMPARE(idx.count(), 1);
         QCOMPARE(idx.fieldName(0), QString("test test"));
         if (dbType == QSqlDriver::Oracle)
@@ -608,12 +607,11 @@ void tst_QSqlDatabase::alterTable()
     QSqlDatabase db = QSqlDatabase::database(dbName);
     CHECK_DATABASE(db);
     const QString qtestalter(qTableName("qtestalter", __FILE__, db));
-    const auto noEscapeAlterTable = qTableName("qtestalter", __FILE__, db, false);
 
     QSqlQuery q(db);
 
     QVERIFY_SQL(q, exec("create table " + qtestalter + " (F1 char(20), F2 char(20), F3 char(20))"));
-    QSqlRecord rec = db.record(noEscapeAlterTable);
+    QSqlRecord rec = db.record(qtestalter);
     QCOMPARE((int)rec.count(), 3);
 
     int i;
@@ -625,7 +623,7 @@ void tst_QSqlDatabase::alterTable()
         QSKIP("DBMS doesn't support dropping columns in ALTER TABLE statement");
     }
 
-    rec = db.record(noEscapeAlterTable);
+    rec = db.record(qtestalter);
 
     QCOMPARE((int)rec.count(), 2);
 
@@ -683,16 +681,13 @@ void tst_QSqlDatabase::testRecord(const FieldDef fieldDefs[], const QSqlRecord&
 void tst_QSqlDatabase::commonFieldTest(const FieldDef fieldDefs[], QSqlDatabase db, const int fieldCount)
 {
     CHECK_DATABASE(db);
-    const QStringList tableNames = { qTableName("qtestfields", __FILE__, db),
-                                     qTableName("qtestfields", __FILE__, db, false) };
-    for (const QString table : tableNames) {
-        QSqlRecord rec = db.record(table);
-        QCOMPARE(rec.count(), fieldCount + 1);
-        testRecord(fieldDefs, rec, db);
-    }
+    const QString tableName = qTableName("qtestfields", __FILE__, db);
+    QSqlRecord rec = db.record(tableName);
+    QCOMPARE((int)rec.count(), fieldCount+1);
+    testRecord(fieldDefs, rec, db);
+
     QSqlQuery q(db);
-    // Only check the escaped entry
-    QVERIFY_SQL(q, exec("select * from " + tableNames.at(0)));
+    QVERIFY_SQL(q, exec("select * from " + tableName));
 }
 
 void tst_QSqlDatabase::recordTDS()
@@ -851,8 +846,12 @@ void tst_QSqlDatabase::recordPSQL()
     QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db);
     if (dbType == QSqlDriver::PostgreSQL)
         QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
-    q.exec("drop sequence " + qTableName("qtestfields_t_bigserial_seq", __FILE__, db));
-    q.exec("drop sequence " + qTableName("qtestfields_t_serial_seq", __FILE__, db));
+    const QString tableName = qTableName("qtestfields", __FILE__, db);
+    q.exec("drop sequence " + tableName + "_t_bigserial_seq");
+    q.exec("drop sequence " + tableName + "_t_serial_seq");
+    // older psql cut off the table name
+    q.exec("drop sequence " + tableName + "_t_bigserial_seq");
+    q.exec("drop sequence " + tableName + "_t_serial_seq");
 
     const int fieldCount = createFieldTable(fieldDefs, db);
     QVERIFY(fieldCount > 0);
@@ -1206,40 +1205,27 @@ void tst_QSqlDatabase::caseSensivity()
     const QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db);
 
     bool cs = false;
-    if (dbType == QSqlDriver::MySqlServer || dbType == QSqlDriver::SQLite
-        || dbType == QSqlDriver::Sybase || dbType == QSqlDriver::PostgreSQL
+    if (dbType == QSqlDriver::MySqlServer || dbType == QSqlDriver::SQLite || dbType == QSqlDriver::Sybase
         || dbType == QSqlDriver::MSSqlServer || db.driverName().startsWith("QODBC"))
     cs = true;
 
-    QSqlRecord rec = db.record(qTableName("qtest", __FILE__, db, false));
+    QSqlRecord rec = db.record(qTableName("qtest", __FILE__, db));
     QVERIFY((int)rec.count() > 0);
     if (!cs) {
-    rec = db.record(qTableName("QTEST", __FILE__, db, false).toUpper());
+    rec = db.record(qTableName("QTEST", __FILE__, db).toUpper());
     QVERIFY((int)rec.count() > 0);
-    rec = db.record(qTableName("qTesT", __FILE__, db, false));
+    rec = db.record(qTableName("qTesT", __FILE__, db));
     QVERIFY((int)rec.count() > 0);
     }
 
-    rec = db.primaryIndex(qTableName("qtest", __FILE__, db, false));
+    rec = db.primaryIndex(qTableName("qtest", __FILE__, db));
     QVERIFY((int)rec.count() > 0);
     if (!cs) {
-    rec = db.primaryIndex(qTableName("QTEST", __FILE__, db, false).toUpper());
+    rec = db.primaryIndex(qTableName("QTEST", __FILE__, db).toUpper());
     QVERIFY((int)rec.count() > 0);
-    rec = db.primaryIndex(qTableName("qTesT", __FILE__, db, false));
+    rec = db.primaryIndex(qTableName("qTesT", __FILE__, db));
     QVERIFY((int)rec.count() > 0);
     }
-
-    // Explicit test for case sensitive table creation without quoting
-    QSqlQuery qry(db);
-    const auto noQuotesTable = qTableName("NoQuotes", __FILE__, db, false);
-    tst_Databases::safeDropTable(db, noQuotesTable);
-    QVERIFY_SQL(qry, exec("CREATE TABLE " + noQuotesTable + " (id INTEGER)"));
-    QVERIFY_SQL(qry, exec("INSERT INTO " + noQuotesTable + " VALUES(1)"));
-    QVERIFY_SQL(qry, exec("SELECT * FROM " + noQuotesTable));
-    QVERIFY_SQL(qry, next());
-    QCOMPARE(qry.value(0).toInt(), 1);
-    rec = db.record(cs ? noQuotesTable.toLower() : noQuotesTable);
-    QVERIFY(rec.count() > 0);
 }
 
 void tst_QSqlDatabase::noEscapedFieldNamesInRecord()
@@ -1274,19 +1260,17 @@ void tst_QSqlDatabase::psql_schemas()
     const QString schemaName = qTableName("qtestschema", __FILE__, db);
     QVERIFY_SQL(q, exec("CREATE SCHEMA " + schemaName));
 
-    const auto table = schemaName + '.' + qTableName("qtesttable", __FILE__, db);
-    const auto noescapeTable = qTableName("qtestschema", __FILE__, db, false) + '.' +
-                               qTableName("qtesttable", __FILE__, db, false);
+    QString table = schemaName + '.' + qTableName("qtesttable", __FILE__, db);
     QVERIFY_SQL(q, exec("CREATE TABLE " + table + " (id int primary key, name varchar(20))"));
 
-    QVERIFY(db.tables().contains(noescapeTable, Qt::CaseInsensitive));
+    QVERIFY(db.tables().contains(table, Qt::CaseInsensitive));
 
-    QSqlRecord rec = db.record(noescapeTable);
+    QSqlRecord rec = db.record(table);
     QCOMPARE(rec.count(), 2);
     QCOMPARE(rec.fieldName(0), QString("id"));
     QCOMPARE(rec.fieldName(1), QString("name"));
 
-    QSqlIndex idx = db.primaryIndex(noescapeTable);
+    QSqlIndex idx = db.primaryIndex(table);
     QCOMPARE(idx.count(), 1);
     QCOMPARE(idx.fieldName(0), QString("id"));
 }
@@ -1304,21 +1288,18 @@ void tst_QSqlDatabase::psql_escapedIdentifiers()
     QSqlQuery q(db);
     QVERIFY_SQL( q, exec("set client_min_messages='warning'"));
 
-    const char bumpyCase[] = "qtestScHeMa";
-    const QString schemaName(qTableName(bumpyCase, __FILE__, db)),
+    const QString schemaName(qTableName("qtestScHeMa", __FILE__, db)),
                   tableName(qTableName("qtest", __FILE__, db)),
                   field1Name(QLatin1String("fIeLdNaMe")),
                   field2Name(QLatin1String("ZuLu"));
 
-    q.exec(QString("DROP SCHEMA %1 CASCADE").arg(schemaName));
-    const auto createSchema = QString("CREATE SCHEMA %1").arg(schemaName);
+    q.exec(QString("DROP SCHEMA \"%1\" CASCADE").arg(schemaName));
+    QString createSchema = QString("CREATE SCHEMA \"%1\"").arg(schemaName);
     QVERIFY_SQL(q, exec(createSchema));
-    const auto createTable = QString("CREATE TABLE %1.%2 (\"%3\" int PRIMARY KEY, \"%4\" varchar(20))")
-                                .arg(schemaName, tableName, field1Name, field2Name);
+    QString createTable = QString("CREATE TABLE \"%1\".\"%2\" (\"%3\" int PRIMARY KEY, \"%4\" varchar(20))").arg(schemaName).arg(tableName).arg(field1Name).arg(field2Name);
     QVERIFY_SQL(q, exec(createTable));
 
-    QVERIFY(db.tables().contains(qTableName(bumpyCase, __FILE__, db, false) + '.' +
-                                 qTableName("qtest", __FILE__, db, false), Qt::CaseSensitive));
+    QVERIFY(db.tables().contains(schemaName + '.' + tableName, Qt::CaseSensitive));
 
     QSqlField fld1(field1Name, QVariant::Int);
     QSqlField fld2(field2Name, QVariant::String);
@@ -1326,9 +1307,7 @@ void tst_QSqlDatabase::psql_escapedIdentifiers()
     rec.append(fld1);
     rec.append(fld2);
 
-    QVERIFY_SQL(q, exec(drv->sqlStatement(QSqlDriver::SelectStatement,
-                                          schemaName + '.' + tableName,
-                                          rec, false)));
+    QVERIFY_SQL(q, exec(drv->sqlStatement(QSqlDriver::SelectStatement, db.driver()->escapeIdentifier(schemaName, QSqlDriver::TableName) + '.' + db.driver()->escapeIdentifier(tableName, QSqlDriver::TableName), rec, false)));
 
     rec = q.record();
     QCOMPARE(rec.count(), 2);
@@ -1336,7 +1315,7 @@ void tst_QSqlDatabase::psql_escapedIdentifiers()
     QCOMPARE(rec.fieldName(1), field2Name);
     QCOMPARE(rec.field(0).type(), QVariant::Int);
 
-    q.exec(QString("DROP SCHEMA %1 CASCADE").arg(schemaName));
+    q.exec(QString("DROP SCHEMA \"%1\" CASCADE").arg(schemaName));
 }
 
 void tst_QSqlDatabase::psql_escapeBytea()
@@ -2167,7 +2146,7 @@ void tst_QSqlDatabase::eventNotificationPSQL()
     CHECK_DATABASE(db);
 
     QSqlQuery query(db);
-    const auto procedureName = qTableName("posteventProc", __FILE__, db, false);
+    QString procedureName = qTableName("posteventProc", __FILE__, db);
     QString payload = "payload";
     QSqlDriver &driver=*(db.driver());
     QVERIFY_SQL(driver, subscribeToNotification(procedureName));
@@ -2191,22 +2170,21 @@ void tst_QSqlDatabase::eventNotificationSQLite()
         QSKIP("QSQLITE specific test");
     }
     const QString tableName(qTableName("sqlitnotifytest", __FILE__, db));
-    const auto noEscapeTableName(qTableName("sqlitnotifytest", __FILE__, db, false));
     tst_Databases::safeDropTable(db, tableName);
 
     QSignalSpy notificationSpy(db.driver(), SIGNAL(notification(QString)));
     QSignalSpy notificationSpyExt(db.driver(), SIGNAL(notification(QString,QSqlDriver::NotificationSource,QVariant)));
     QSqlQuery q(db);
     QVERIFY_SQL(q, exec("CREATE TABLE " + tableName + " (id INTEGER, realVal REAL)"));
-    db.driver()->subscribeToNotification(noEscapeTableName);
+    db.driver()->subscribeToNotification(tableName);
     QVERIFY_SQL(q, exec("INSERT INTO " + tableName + " (id, realVal) VALUES (1, 2.3)"));
     QTRY_COMPARE(notificationSpy.count(), 1);
     QTRY_COMPARE(notificationSpyExt.count(), 1);
     QList<QVariant> arguments = notificationSpy.takeFirst();
-    QCOMPARE(arguments.at(0).toString(), noEscapeTableName);
+    QCOMPARE(arguments.at(0).toString(), tableName);
     arguments = notificationSpyExt.takeFirst();
-    QCOMPARE(arguments.at(0).toString(), noEscapeTableName);
-    db.driver()->unsubscribeFromNotification(noEscapeTableName);
+    QCOMPARE(arguments.at(0).toString(), tableName);
+    db.driver()->unsubscribeFromNotification(tableName);
     QVERIFY_SQL(q, exec("INSERT INTO " + tableName + " (id, realVal) VALUES (1, 2.3)"));
     QTRY_COMPARE(notificationSpy.count(), 0);
     QTRY_COMPARE(notificationSpyExt.count(), 0);
diff --git a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
index 784d0a70d7..710f26b72d 100644
--- a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
+++ b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
@@ -1098,7 +1098,7 @@ void tst_QSqlQuery::record()
     for (int i = 0; i < 3; ++i)
         QCOMPARE(q.record().field(i).tableName().toLower(), lowerQTest);
     q.clear();
-    const auto tst_record = qTableName("tst_record", __FILE__, db, false).toLower();
+    const auto tst_record = qTableName("tst_record", __FILE__, db).toLower();
     SETUP_RECORD_TABLE;
     CHECK_RECORD;
     q.clear();
@@ -3763,13 +3763,15 @@ void tst_QSqlQuery::QTBUG_5251()
     const QString timetest(qTableName("timetest", __FILE__, db));
     tst_Databases::safeDropTable(db, timetest);
     QSqlQuery q(db);
-    QVERIFY_SQL(q, exec(QStringLiteral("CREATE TABLE ") + timetest + QStringLiteral(" (t TIME)")));
-    QVERIFY_SQL(q, exec(QStringLiteral("INSERT INTO ") + timetest +
-                        QStringLiteral(" VALUES ('1:2:3.666')")));
+    QVERIFY_SQL(q, exec(QStringLiteral("CREATE TABLE \"") + timetest + QStringLiteral("\" (t TIME)")));
+    QVERIFY_SQL(q, exec(QStringLiteral("INSERT INTO \"") + timetest +
+                        QStringLiteral("\" VALUES ('1:2:3.666')")));
 
     QSqlTableModel timetestModel(0,db);
     timetestModel.setEditStrategy(QSqlTableModel::OnManualSubmit);
     timetestModel.setTable(timetest);
+    if (tst_Databases::getDatabaseType(db) == QSqlDriver::PostgreSQL)
+        QEXPECT_FAIL("", "Currently broken for PostgreSQL due to case sensitivity problems - see QTBUG-65788", Abort);
     QVERIFY_SQL(timetestModel, select());
 
     QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("01:02:03.666"));
@@ -3778,8 +3780,8 @@ void tst_QSqlQuery::QTBUG_5251()
     QVERIFY_SQL(timetestModel, submitAll());
     QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("00:12:34.500"));
 
-    QVERIFY_SQL(q, exec(QStringLiteral("UPDATE ") + timetest +
-                        QStringLiteral(" SET t = '0:11:22.33'")));
+    QVERIFY_SQL(q, exec(QStringLiteral("UPDATE \"") + timetest +
+                        QStringLiteral("\" SET t = '0:11:22.33'")));
     QVERIFY_SQL(timetestModel, select());
     QCOMPARE(timetestModel.record(0).field(0).value().toTime().toString("HH:mm:ss.zzz"), QString("00:11:22.330"));
 
diff --git a/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp b/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp
index 722ef9c570..e4a277e096 100644
--- a/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp
+++ b/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp
@@ -122,13 +122,13 @@ void tst_QSqlRelationalTableModel::recreateTestTables(QSqlDatabase db)
     QVERIFY_SQL( q, exec("insert into " + reltest5 + " values('mister', 'Mr')"));
 
     if (testWhiteSpaceNames(db.driverName())) {
-        const auto reltest6 = qTableName("rel test6", __FILE__, db);
+        QString reltest6 = db.driver()->escapeIdentifier(qTableName("rel", __FILE__, db) + " test6", QSqlDriver::TableName);
         QVERIFY_SQL( q, exec("create table " + reltest6 + " (id int not null primary key, " + db.driver()->escapeIdentifier("city key", QSqlDriver::FieldName) +
                     " int, " + db.driver()->escapeIdentifier("extra field", QSqlDriver::FieldName) + " int)"));
         QVERIFY_SQL( q, exec("insert into " + reltest6 + " values(1, 1,9)"));
         QVERIFY_SQL( q, exec("insert into " + reltest6 + " values(2, 2,8)"));
 
-        const auto reltest7 = qTableName("rel test7", __FILE__, db);
+        QString reltest7 = db.driver()->escapeIdentifier(qTableName("rel", __FILE__, db) + " test7", QSqlDriver::TableName);
         QVERIFY_SQL( q, exec("create table " + reltest7 + " (" + db.driver()->escapeIdentifier("city id", QSqlDriver::TableName) + " int not null primary key, " + db.driver()->escapeIdentifier("city name", QSqlDriver::FieldName) + " varchar(20))"));
         QVERIFY_SQL( q, exec("insert into " + reltest7 + " values(1, 'New York')"));
         QVERIFY_SQL( q, exec("insert into " + reltest7 + " values(2, 'Washington')"));
@@ -170,8 +170,8 @@ void tst_QSqlRelationalTableModel::dropTestTables( QSqlDatabase db )
             << reltest3
             << reltest4
             << reltest5
-            << qTableName("rel test6", __FILE__, db)
-            << qTableName("rel test7", __FILE__, db)
+            << (qTableName("rel", __FILE__, db) + " test6")
+            << (qTableName( "rel", __FILE__, db) + " test7")
             << qTableName("CASETEST1", db)
             << qTableName("casetest1", db);
     tst_Databases::safeDropTables( db, tableNames );
@@ -1379,9 +1379,9 @@ void tst_QSqlRelationalTableModel::whiteSpaceInIdentifiers()
     if (!testWhiteSpaceNames(db.driverName()))
         QSKIP("White space test irrelevant for driver");
     QSqlRelationalTableModel model(0, db);
-    model.setTable(qTableName("rel test6", __FILE__, db));
+    model.setTable(db.driver()->escapeIdentifier(qTableName("rel", __FILE__, db) + " test6", QSqlDriver::TableName));
     model.setSort(0, Qt::DescendingOrder);
-    model.setRelation(1, QSqlRelation(qTableName("rel test7", __FILE__, db),
+    model.setRelation(1, QSqlRelation(db.driver()->escapeIdentifier(qTableName("rel", __FILE__, db) + " test7", QSqlDriver::TableName),
                         db.driver()->escapeIdentifier("city id", QSqlDriver::FieldName),
                         db.driver()->escapeIdentifier("city name", QSqlDriver::FieldName)));
     QVERIFY_SQL(model, select());
@@ -1547,6 +1547,8 @@ void tst_QSqlRelationalTableModel::relationOnFirstColumn()
 
     //modify the model data
     QVERIFY_SQL(model, setData(model.index(0, 0), 40));
+    if (tst_Databases::getDatabaseType(db) == QSqlDriver::PostgreSQL)
+        QEXPECT_FAIL("", "Currently broken for PostgreSQL due to case sensitivity problems - see QTBUG-65788", Abort);
     QVERIFY_SQL(model, submit());
     QVERIFY_SQL(model, setData(model.index(1, 0), 50));
     QVERIFY_SQL(model, submit());
diff --git a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
index b617151a36..da31f437d9 100644
--- a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
+++ b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
@@ -383,6 +383,8 @@ void tst_QSqlTableModel::selectRow()
     q.exec("UPDATE " + tbl + " SET a = 'Qt' WHERE id = 1");
     QCOMPARE(model.data(idx).toString(), QString("b"));
     model.selectRow(1);
+    if (tst_Databases::getDatabaseType(db) == QSqlDriver::PostgreSQL)
+        QEXPECT_FAIL("", "Currently broken for PostgreSQL due to case sensitivity problems - see QTBUG-65788", Abort);
     QCOMPARE(model.data(idx).toString(), QString("Qt"));
 
     // Check if selectRow() refreshes a changed row.
@@ -439,6 +441,8 @@ void tst_QSqlTableModel::selectRowOverride()
     // both rows should have changed
     QCOMPARE(model.data(idx).toString(), QString("Qt"));
     idx = model.index(2, 1);
+    if (tst_Databases::getDatabaseType(db) == QSqlDriver::PostgreSQL)
+        QEXPECT_FAIL("", "Currently broken for PostgreSQL due to case sensitivity problems - see QTBUG-65788", Abort);
     QCOMPARE(model.data(idx).toString(), QString("Qt"));
 
     q.exec("DELETE FROM " + tbl);
@@ -850,6 +854,8 @@ void tst_QSqlTableModel::insertRowFailure()
 
     // populate 1 row
     const QSqlDriver::DbmsType dbType = tst_Databases::getDatabaseType(db);
+    if (dbType == QSqlDriver::PostgreSQL && submitpolicy != QSqlTableModel::OnManualSubmit)
+        QEXPECT_FAIL("", "Currently broken for PostgreSQL due to case sensitivity problems - see QTBUG-65788", Abort);
     QVERIFY_SQL(model, insertRecord(0, values));
     QVERIFY_SQL(model, submitAll());
     QVERIFY_SQL(model, select());
@@ -893,6 +899,8 @@ void tst_QSqlTableModel::insertRowFailure()
     // restore empty table
     model.revertAll();
     QVERIFY_SQL(model, removeRow(0));
+    if (dbType == QSqlDriver::PostgreSQL)
+        QEXPECT_FAIL("", "Currently broken for PostgreSQL due to case sensitivity problems - see QTBUG-65788", Abort);
     QVERIFY_SQL(model, submitAll());
     QVERIFY_SQL(model, select());
     QCOMPARE(model.rowCount(), 0);
@@ -2001,6 +2009,8 @@ void tst_QSqlTableModel::tableModifyWithBlank()
     //Should be equivalent to QSqlQuery INSERT INTO... command)
     QVERIFY_SQL(model, insertRow(0));
     QVERIFY_SQL(model, setData(model.index(0,0),timeString));
+    if (tst_Databases::getDatabaseType(db) == QSqlDriver::PostgreSQL)
+        QEXPECT_FAIL("", "Currently broken for PostgreSQL due to case sensitivity problems - see QTBUG-65788", Abort);
     QVERIFY_SQL(model, submitAll());
 
     //set a filter on the table so the only record we get is the one we just made
-- 
2.21.0