forked from pool/libqt5-qtbase
e25a4c083c
- Add patch to restore compatibility with akonadi's PGSQL backend (see https://bugs.archlinux.org/task/62997): * 0001-Revert-Always-escape-the-table-names-when-creating-t.patch - Disable libzstd support again, it breaks various existing codebases (QTBUG-76521) - Update to 5.13.0: * New bugfix release * No changelog available * For more details about Qt 5.13 please see: * http://code.qt.io/cgit/qt/qtbase.git/plain/dist/changes-5.13.0/?h=5.13 - Remove patches, now upstream: * 0001-Add-quoting-to-deal-with-empty-CMAKE_CXX_STANDARD_LI.patch - Add patches to improve compatibility with Krita: * 0001-Fix-notification-of-QDockWidget-when-it-gets-undocke.patch * 0002-Synthesize-Enter-LeaveEvent-for-accepted-QTabletEven.patch * 0003-Add-an-ID-for-recognition-of-UGEE-tablets.patch - Revert yet another commit to fix linker errors: * 0001-Revert-qmake-link-qt-libraries-by-full-path.patch - Enable libzstd support - Revert some commits in the hope of fixing some broken paths (QTBUG-76255): * 0001-Revert-Fix-QMAKE_PRL_INSTALL_REPLACE-for-macOS.patch * 0002-Revert-Replace-absolute-Qt-lib-dir-in-.prl-files.patch * 0003-Revert-Fix-prl-replacements-if-libdir-is-in-QMAKE_DE.patch - Add patch to fix some cmake module config files (QTBUG-76244): OBS-URL: https://build.opensuse.org/request/show/712125 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/libqt5-qtbase?expand=0&rev=97
653 lines
33 KiB
Diff
653 lines
33 KiB
Diff
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
|
|
|