Fabian Vogt
53a893e4bd
Qt 5.14.0 Beta 2 OBS-URL: https://build.opensuse.org/request/show/743230 OBS-URL: https://build.opensuse.org/package/show/KDE:Qt:5.14/libqt5-qtbase?expand=0&rev=3
650 lines
34 KiB
Diff
650 lines
34 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(-)
|
|
|
|
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
|