1
0
forked from pool/libqt5-qtbase
libqt5-qtbase/0001-Revert-Always-escape-the-table-names-when-creating-t.patch

650 lines
34 KiB
Diff
Raw Normal View History

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(-)
Index: qtbase-everywhere-src-5.14.0-beta2/src/plugins/sqldrivers/mysql/qsql_mysql.cpp
===================================================================
--- qtbase-everywhere-src-5.14.0-beta2.orig/src/plugins/sqldrivers/mysql/qsql_mysql.cpp
+++ qtbase-everywhere-src-5.14.0-beta2/src/plugins/sqldrivers/mysql/qsql_mysql.cpp
@@ -1551,7 +1551,7 @@ QSqlIndex QMYSQLDriver::primaryIndex(con
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()));
Index: qtbase-everywhere-src-5.14.0-beta2/src/plugins/sqldrivers/psql/qsql_psql.cpp
===================================================================
--- qtbase-everywhere-src-5.14.0-beta2.orig/src/plugins/sqldrivers/psql/qsql_psql.cpp
+++ qtbase-everywhere-src-5.14.0-beta2/src/plugins/sqldrivers/psql/qsql_psql.cpp
@@ -1402,8 +1402,16 @@ QSqlIndex QPSQLDriver::primaryIndex(cons
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 "
@@ -1438,8 +1446,16 @@ QSqlRecord QPSQLDriver::record(const QSt
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();
const QString adsrc = protocol() < Version8
? QStringLiteral("pg_attrdef.adsrc")
Index: qtbase-everywhere-src-5.14.0-beta2/src/sql/doc/snippets/code/doc_src_sql-driver.qdoc
===================================================================
--- qtbase-everywhere-src-5.14.0-beta2.orig/src/sql/doc/snippets/code/doc_src_sql-driver.qdoc
+++ qtbase-everywhere-src-5.14.0-beta2/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]
Index: qtbase-everywhere-src-5.14.0-beta2/src/sql/doc/src/sql-driver.qdoc
===================================================================
--- qtbase-everywhere-src-5.14.0-beta2.orig/src/sql/doc/src/sql-driver.qdoc
+++ qtbase-everywhere-src-5.14.0-beta2/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
Index: qtbase-everywhere-src-5.14.0-beta2/src/sql/kernel/qsqldatabase.cpp
===================================================================
--- qtbase-everywhere-src-5.14.0-beta2.orig/src/sql/kernel/qsqldatabase.cpp
+++ qtbase-everywhere-src-5.14.0-beta2/src/sql/kernel/qsqldatabase.cpp
@@ -1096,11 +1096,6 @@ QStringList QSqlDatabase::tables(QSql::T
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()
*/
@@ -1115,11 +1110,6 @@ QSqlIndex QSqlDatabase::primaryIndex(con
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
Index: qtbase-everywhere-src-5.14.0-beta2/src/sql/kernel/qsqldriver.cpp
===================================================================
--- qtbase-everywhere-src-5.14.0-beta2.orig/src/sql/kernel/qsqldriver.cpp
+++ qtbase-everywhere-src-5.14.0-beta2/src/sql/kernel/qsqldriver.cpp
@@ -488,8 +488,6 @@ QString QSqlDriver::stripDelimiters(cons
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(Stateme
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(Stateme
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(Stateme
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))
Index: qtbase-everywhere-src-5.14.0-beta2/tests/auto/sql/kernel/qsqldatabase/tst_databases.h
===================================================================
--- qtbase-everywhere-src-5.14.0-beta2.orig/tests/auto/sql/kernel/qsqldatabase/tst_databases.h
+++ qtbase-everywhere-src-5.14.0-beta2/tests/auto/sql/kernel/qsqldatabase/tst_databases.h
@@ -80,14 +80,14 @@ inline QString fixupTableName(const QStr
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)
Index: qtbase-everywhere-src-5.14.0-beta2/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
===================================================================
--- qtbase-everywhere-src-5.14.0-beta2.orig/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
+++ qtbase-everywhere-src-5.14.0-beta2/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
@@ -314,8 +314,10 @@ void tst_QSqlDatabase::createTestTables(
" (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(QS
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::whitespaceInIdent
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::whitespaceInIdent
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
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_escapedIdent
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_escapedIdent
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_escapedIdent
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::eventNotification
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::eventNotification
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);
Index: qtbase-everywhere-src-5.14.0-beta2/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
===================================================================
--- qtbase-everywhere-src-5.14.0-beta2.orig/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
+++ qtbase-everywhere-src-5.14.0-beta2/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
@@ -1092,7 +1092,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();
@@ -3673,13 +3673,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"));
@@ -3688,8 +3690,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"));
Index: qtbase-everywhere-src-5.14.0-beta2/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp
===================================================================
--- qtbase-everywhere-src-5.14.0-beta2.orig/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp
+++ qtbase-everywhere-src-5.14.0-beta2/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp
@@ -122,13 +122,13 @@ void tst_QSqlRelationalTableModel::recre
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::dropT
<< 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::white
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::relat
//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());
Index: qtbase-everywhere-src-5.14.0-beta2/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
===================================================================
--- qtbase-everywhere-src-5.14.0-beta2.orig/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
+++ qtbase-everywhere-src-5.14.0-beta2/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
@@ -384,6 +384,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.
@@ -440,6 +442,8 @@ void tst_QSqlTableModel::selectRowOverri
// 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);
@@ -851,6 +855,8 @@ void tst_QSqlTableModel::insertRowFailur
// 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());
@@ -894,6 +900,8 @@ void tst_QSqlTableModel::insertRowFailur
// 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);
@@ -2002,6 +2010,8 @@ void tst_QSqlTableModel::tableModifyWith
//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