forked from pool/libqt5-qtbase
Accepting request 768104 from KDE:Qt:5.14
Update to 5.14.1 OBS-URL: https://build.opensuse.org/request/show/768104 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/libqt5-qtbase?expand=0&rev=104
This commit is contained in:
commit
b668b82e5b
@ -1,649 +0,0 @@
|
|||||||
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
|
|
@ -1,32 +0,0 @@
|
|||||||
From d0ed9b07eb928c7d037b3fadb7423c87d7b798b0 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Fabian Vogt <fabian@ritter-vogt.de>
|
|
||||||
Date: Wed, 25 Dec 2019 18:54:40 +0100
|
|
||||||
Subject: [PATCH 1/3] Revert "Fix text-rendering regression on semi-transparent
|
|
||||||
background on Linux"
|
|
||||||
|
|
||||||
This reverts commit c0adcf0f226e247c1f2f515cd33d7945573e96a5.
|
|
||||||
---
|
|
||||||
src/gui/painting/qdrawhelper.cpp | 4 ++--
|
|
||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp
|
|
||||||
index e8d129d047..e5f752b94e 100644
|
|
||||||
--- a/src/gui/painting/qdrawhelper.cpp
|
|
||||||
+++ b/src/gui/painting/qdrawhelper.cpp
|
|
||||||
@@ -6044,11 +6044,11 @@ static inline void alphargbblend_argb32(quint32 *dst, uint coverage, const QRgba
|
|
||||||
// nothing
|
|
||||||
} else if (coverage == 0xffffffff && qAlpha(src) == 255) {
|
|
||||||
blend_pixel(*dst, src);
|
|
||||||
+ } else if (!colorProfile) {
|
|
||||||
+ *dst = rgbBlend(*dst, src, coverage);
|
|
||||||
} else if (*dst < 0xff000000) {
|
|
||||||
// Give up and do a naive gray alphablend. Needed to deal with ARGB32 and invalid ARGB32_premultiplied, see QTBUG-60571
|
|
||||||
blend_pixel(*dst, src, qRgbAvg(coverage));
|
|
||||||
- } else if (!colorProfile) {
|
|
||||||
- *dst = rgbBlend(*dst, src, coverage);
|
|
||||||
} else if (srcLinear.isOpaque()) {
|
|
||||||
rgbBlendPixel(dst, coverage, srcLinear, colorProfile);
|
|
||||||
} else {
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
@ -1,60 +0,0 @@
|
|||||||
From a61813ac9cd94a6e7c79ccfacca9e830f905e6dc Mon Sep 17 00:00:00 2001
|
|
||||||
From: Fabian Vogt <fabian@ritter-vogt.de>
|
|
||||||
Date: Wed, 25 Dec 2019 18:54:52 +0100
|
|
||||||
Subject: [PATCH 2/3] Revert "Fix crash with gamma-corrected text blending
|
|
||||||
disabled"
|
|
||||||
|
|
||||||
This reverts commit 6db83e2584a30b1339adba18279fbfd527a10ce7.
|
|
||||||
---
|
|
||||||
src/gui/painting/qdrawhelper.cpp | 14 ++++----------
|
|
||||||
1 file changed, 4 insertions(+), 10 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp
|
|
||||||
index e5f752b94e..3d06a27d8e 100644
|
|
||||||
--- a/src/gui/painting/qdrawhelper.cpp
|
|
||||||
+++ b/src/gui/painting/qdrawhelper.cpp
|
|
||||||
@@ -5670,8 +5670,7 @@ static inline void alphamapblend_argb32(quint32 *dst, int coverage, QRgba64 srcL
|
|
||||||
QRgb s = *dst;
|
|
||||||
blend_pixel(s, src);
|
|
||||||
// Then gamma-corrected blend with glyph shape
|
|
||||||
- QRgba64 s64 = colorProfile ? colorProfile->toLinear64(s) : QRgba64::fromArgb32(s);
|
|
||||||
- grayBlendPixel(dst, coverage, s64, colorProfile);
|
|
||||||
+ grayBlendPixel(dst, coverage, colorProfile->toLinear64(s), colorProfile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -5712,9 +5711,7 @@ static inline void alphamapblend_generic(int coverage, QRgba64 *dest, int x, con
|
|
||||||
QRgba64 s = dest[x];
|
|
||||||
blend_pixel(s, src);
|
|
||||||
// Then gamma-corrected blend with glyph shape
|
|
||||||
- if (colorProfile)
|
|
||||||
- s = colorProfile->toLinear(s);
|
|
||||||
- grayBlendPixel(dest[x], coverage, s, colorProfile);
|
|
||||||
+ grayBlendPixel(dest[x], coverage, colorProfile->toLinear(s), colorProfile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -6056,8 +6053,7 @@ static inline void alphargbblend_argb32(quint32 *dst, uint coverage, const QRgba
|
|
||||||
QRgb s = *dst;
|
|
||||||
blend_pixel(s, src);
|
|
||||||
// Then gamma-corrected blend with glyph shape
|
|
||||||
- QRgba64 s64 = colorProfile ? colorProfile->toLinear64(s) : QRgba64::fromArgb32(s);
|
|
||||||
- rgbBlendPixel(dst, coverage, s64, colorProfile);
|
|
||||||
+ rgbBlendPixel(dst, coverage, colorProfile->toLinear64(s), colorProfile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -6088,9 +6084,7 @@ static inline void alphargbblend_generic(uint coverage, QRgba64 *dest, int x, co
|
|
||||||
QRgba64 s = dest[x];
|
|
||||||
blend_pixel(s, src);
|
|
||||||
// Then gamma-corrected blend with glyph shape
|
|
||||||
- if (colorProfile)
|
|
||||||
- s = colorProfile->toLinear(s);
|
|
||||||
- rgbBlendPixel(dest[x], coverage, s, colorProfile);
|
|
||||||
+ rgbBlendPixel(dest[x], coverage, colorProfile->toLinear(s), colorProfile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
@ -1,336 +0,0 @@
|
|||||||
From 84a71a1b9e600dc641e7ace5a6b384c0e138753e Mon Sep 17 00:00:00 2001
|
|
||||||
From: Fabian Vogt <fabian@ritter-vogt.de>
|
|
||||||
Date: Wed, 25 Dec 2019 18:55:01 +0100
|
|
||||||
Subject: [PATCH 3/3] Revert "Handle transparent pen color in fast text path"
|
|
||||||
|
|
||||||
This reverts commit d0d18b06458edd3b6b0712ea71c787404bbaa7e1.
|
|
||||||
---
|
|
||||||
src/gui/painting/qdrawhelper.cpp | 187 +++++++++++------------
|
|
||||||
src/gui/painting/qdrawhelper_p.h | 2 -
|
|
||||||
src/gui/painting/qpaintengine_raster.cpp | 4 +-
|
|
||||||
src/gui/painting/qrgba64_p.h | 2 -
|
|
||||||
4 files changed, 94 insertions(+), 101 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp
|
|
||||||
index 3d06a27d8e..edb363ac69 100644
|
|
||||||
--- a/src/gui/painting/qdrawhelper.cpp
|
|
||||||
+++ b/src/gui/painting/qdrawhelper.cpp
|
|
||||||
@@ -5658,60 +5658,44 @@ static inline void alphamapblend_argb32(quint32 *dst, int coverage, QRgba64 srcL
|
|
||||||
{
|
|
||||||
if (coverage == 0) {
|
|
||||||
// nothing
|
|
||||||
- } else if (coverage == 255 || !colorProfile) {
|
|
||||||
- blend_pixel(*dst, src, coverage);
|
|
||||||
- } else if (*dst < 0xff000000) {
|
|
||||||
- // Give up and do a naive gray alphablend. Needed to deal with ARGB32 and invalid ARGB32_premultiplied, see QTBUG-60571
|
|
||||||
- blend_pixel(*dst, src, coverage);
|
|
||||||
- } else if (src >= 0xff000000) {
|
|
||||||
- grayBlendPixel(dst, coverage, srcLinear, colorProfile);
|
|
||||||
+ } else if (coverage == 255) {
|
|
||||||
+ *dst = src;
|
|
||||||
+ } else if (!colorProfile) {
|
|
||||||
+ *dst = INTERPOLATE_PIXEL_255(src, coverage, *dst, 255 - coverage);
|
|
||||||
} else {
|
|
||||||
- // First do naive blend with text-color
|
|
||||||
- QRgb s = *dst;
|
|
||||||
- blend_pixel(s, src);
|
|
||||||
- // Then gamma-corrected blend with glyph shape
|
|
||||||
- grayBlendPixel(dst, coverage, colorProfile->toLinear64(s), colorProfile);
|
|
||||||
+ if (*dst >= 0xff000000) {
|
|
||||||
+ grayBlendPixel(dst, coverage, srcLinear, colorProfile);
|
|
||||||
+ } else {
|
|
||||||
+ // Give up and do a naive gray alphablend. Needed to deal with ARGB32 and invalid ARGB32_premultiplied, see QTBUG-60571
|
|
||||||
+ *dst = INTERPOLATE_PIXEL_255(src, coverage, *dst, 255 - coverage);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if QT_CONFIG(raster_64bit)
|
|
||||||
-
|
|
||||||
-static inline void grayBlendPixel(QRgba64 &dst, int coverage, QRgba64 srcLinear, const QColorTrcLut *colorProfile)
|
|
||||||
-{
|
|
||||||
- // Do a gammacorrected gray alphablend...
|
|
||||||
- QRgba64 dstColor = dst;
|
|
||||||
- if (colorProfile) {
|
|
||||||
- if (dstColor.isOpaque())
|
|
||||||
- dstColor = colorProfile->toLinear(dstColor);
|
|
||||||
- else if (!dstColor.isTransparent())
|
|
||||||
- dstColor = colorProfile->toLinear(dstColor.unpremultiplied()).premultiplied();
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- blend_pixel(dstColor, srcLinear, coverage);
|
|
||||||
-
|
|
||||||
- if (colorProfile) {
|
|
||||||
- if (dstColor.isOpaque())
|
|
||||||
- dstColor = colorProfile->fromLinear(dstColor);
|
|
||||||
- else if (!dstColor.isTransparent())
|
|
||||||
- dstColor = colorProfile->fromLinear(dstColor.unpremultiplied()).premultiplied();
|
|
||||||
- }
|
|
||||||
- dst = dstColor;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
static inline void alphamapblend_generic(int coverage, QRgba64 *dest, int x, const QRgba64 &srcLinear, const QRgba64 &src, const QColorTrcLut *colorProfile)
|
|
||||||
{
|
|
||||||
if (coverage == 0) {
|
|
||||||
// nothing
|
|
||||||
} else if (coverage == 255) {
|
|
||||||
- blend_pixel(dest[x], src);
|
|
||||||
- } else if (src.isOpaque()) {
|
|
||||||
- grayBlendPixel(dest[x], coverage, srcLinear, colorProfile);
|
|
||||||
+ dest[x] = src;
|
|
||||||
} else {
|
|
||||||
- // First do naive blend with text-color
|
|
||||||
- QRgba64 s = dest[x];
|
|
||||||
- blend_pixel(s, src);
|
|
||||||
- // Then gamma-corrected blend with glyph shape
|
|
||||||
- grayBlendPixel(dest[x], coverage, colorProfile->toLinear(s), colorProfile);
|
|
||||||
+ QRgba64 dstColor = dest[x];
|
|
||||||
+ if (colorProfile) {
|
|
||||||
+ if (dstColor.isOpaque())
|
|
||||||
+ dstColor = colorProfile->toLinear(dstColor);
|
|
||||||
+ else if (!dstColor.isTransparent())
|
|
||||||
+ dstColor = colorProfile->toLinear(dstColor.unpremultiplied()).premultiplied();
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ dstColor = interpolate255(srcLinear, coverage, dstColor, 255 - coverage);
|
|
||||||
+ if (colorProfile) {
|
|
||||||
+ if (dstColor.isOpaque())
|
|
||||||
+ dstColor = colorProfile->fromLinear(dstColor);
|
|
||||||
+ else if (!dstColor.isTransparent())
|
|
||||||
+ dstColor = colorProfile->fromLinear(dstColor.unpremultiplied()).premultiplied();
|
|
||||||
+ }
|
|
||||||
+ dest[x] = dstColor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -5730,8 +5714,12 @@ static void qt_alphamapblit_generic(QRasterBuffer *rasterBuffer,
|
|
||||||
colorProfile = QGuiApplicationPrivate::instance()->colorProfileForA8Text();
|
|
||||||
|
|
||||||
QRgba64 srcColor = color;
|
|
||||||
- if (colorProfile && color.isOpaque())
|
|
||||||
- srcColor = colorProfile->toLinear(srcColor);
|
|
||||||
+ if (colorProfile) {
|
|
||||||
+ if (color.isOpaque())
|
|
||||||
+ srcColor = colorProfile->toLinear(srcColor);
|
|
||||||
+ else
|
|
||||||
+ srcColor = colorProfile->toLinear(srcColor.unpremultiplied()).premultiplied();
|
|
||||||
+ }
|
|
||||||
|
|
||||||
alignas(8) QRgba64 buffer[BufferSize];
|
|
||||||
const DestFetchProc64 destFetch64 = destFetchProc64[rasterBuffer->format];
|
|
||||||
@@ -5804,8 +5792,12 @@ static void qt_alphamapblit_generic(QRasterBuffer *rasterBuffer,
|
|
||||||
colorProfile = QGuiApplicationPrivate::instance()->colorProfileForA8Text();
|
|
||||||
|
|
||||||
QRgba64 srcColor = color;
|
|
||||||
- if (colorProfile && color.isOpaque())
|
|
||||||
- srcColor = colorProfile->toLinear(srcColor);
|
|
||||||
+ if (colorProfile) {
|
|
||||||
+ if (color.isOpaque())
|
|
||||||
+ srcColor = colorProfile->toLinear(srcColor);
|
|
||||||
+ else
|
|
||||||
+ srcColor = colorProfile->toLinear(srcColor.unpremultiplied()).premultiplied();
|
|
||||||
+ }
|
|
||||||
|
|
||||||
quint32 buffer[BufferSize];
|
|
||||||
const DestFetchProc destFetch = destFetchProc[rasterBuffer->format];
|
|
||||||
@@ -5880,7 +5872,7 @@ void qt_alphamapblit_quint16(QRasterBuffer *rasterBuffer,
|
|
||||||
int mapWidth, int mapHeight, int mapStride,
|
|
||||||
const QClipData *clip, bool useGammaCorrection)
|
|
||||||
{
|
|
||||||
- if (useGammaCorrection || !color.isOpaque()) {
|
|
||||||
+ if (useGammaCorrection) {
|
|
||||||
qt_alphamapblit_generic(rasterBuffer, x, y, color, map, mapWidth, mapHeight, mapStride, clip, useGammaCorrection);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
@@ -5939,8 +5931,12 @@ static void qt_alphamapblit_argb32(QRasterBuffer *rasterBuffer,
|
|
||||||
colorProfile = QGuiApplicationPrivate::instance()->colorProfileForA8Text();
|
|
||||||
|
|
||||||
QRgba64 srcColor = color;
|
|
||||||
- if (colorProfile && color.isOpaque())
|
|
||||||
- srcColor = colorProfile->toLinear(srcColor);
|
|
||||||
+ if (colorProfile) {
|
|
||||||
+ if (color.isOpaque())
|
|
||||||
+ srcColor = colorProfile->toLinear(srcColor);
|
|
||||||
+ else
|
|
||||||
+ srcColor = colorProfile->toLinear(srcColor.unpremultiplied()).premultiplied();
|
|
||||||
+ }
|
|
||||||
|
|
||||||
if (!clip) {
|
|
||||||
quint32 *dest = reinterpret_cast<quint32*>(rasterBuffer->scanLine(y)) + x;
|
|
||||||
@@ -6035,59 +6031,48 @@ static inline QRgb rgbBlend(QRgb d, QRgb s, uint rgbAlpha)
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
-static inline void alphargbblend_argb32(quint32 *dst, uint coverage, const QRgba64 &srcLinear, quint32 src, const QColorTrcLut *colorProfile)
|
|
||||||
+#if QT_CONFIG(raster_64bit)
|
|
||||||
+static inline void alphargbblend_generic(uint coverage, QRgba64 *dest, int x, const QRgba64 &srcLinear, const QRgba64 &src, const QColorTrcLut *colorProfile)
|
|
||||||
{
|
|
||||||
if (coverage == 0xff000000) {
|
|
||||||
// nothing
|
|
||||||
- } else if (coverage == 0xffffffff && qAlpha(src) == 255) {
|
|
||||||
- blend_pixel(*dst, src);
|
|
||||||
- } else if (!colorProfile) {
|
|
||||||
- *dst = rgbBlend(*dst, src, coverage);
|
|
||||||
- } else if (*dst < 0xff000000) {
|
|
||||||
- // Give up and do a naive gray alphablend. Needed to deal with ARGB32 and invalid ARGB32_premultiplied, see QTBUG-60571
|
|
||||||
- blend_pixel(*dst, src, qRgbAvg(coverage));
|
|
||||||
- } else if (srcLinear.isOpaque()) {
|
|
||||||
- rgbBlendPixel(dst, coverage, srcLinear, colorProfile);
|
|
||||||
+ } else if (coverage == 0xffffffff) {
|
|
||||||
+ dest[x] = src;
|
|
||||||
} else {
|
|
||||||
- // First do naive blend with text-color
|
|
||||||
- QRgb s = *dst;
|
|
||||||
- blend_pixel(s, src);
|
|
||||||
- // Then gamma-corrected blend with glyph shape
|
|
||||||
- rgbBlendPixel(dst, coverage, colorProfile->toLinear64(s), colorProfile);
|
|
||||||
+ QRgba64 dstColor = dest[x];
|
|
||||||
+ if (dstColor.isOpaque()) {
|
|
||||||
+ if (colorProfile)
|
|
||||||
+ dstColor = colorProfile->toLinear(dstColor);
|
|
||||||
+ dstColor = rgbBlend(dstColor, srcLinear, coverage);
|
|
||||||
+ if (colorProfile)
|
|
||||||
+ dstColor = colorProfile->fromLinear(dstColor);
|
|
||||||
+ dest[x] = dstColor;
|
|
||||||
+ } else {
|
|
||||||
+ // Do a gray alphablend.
|
|
||||||
+ alphamapblend_generic(qRgbAvg(coverage), dest, x, srcLinear, src, colorProfile);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
-#if QT_CONFIG(raster_64bit)
|
|
||||||
-static inline void rgbBlendPixel(QRgba64 &dst, int coverage, QRgba64 slinear, const QColorTrcLut *colorProfile)
|
|
||||||
-{
|
|
||||||
- // Do a gammacorrected RGB alphablend...
|
|
||||||
- const QRgba64 dlinear = colorProfile ? colorProfile->toLinear64(dst) : dst;
|
|
||||||
-
|
|
||||||
- QRgba64 blend = rgbBlend(dlinear, slinear, coverage);
|
|
||||||
-
|
|
||||||
- dst = colorProfile ? colorProfile->fromLinear(blend) : blend;
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-static inline void alphargbblend_generic(uint coverage, QRgba64 *dest, int x, const QRgba64 &srcLinear, const QRgba64 &src, const QColorTrcLut *colorProfile)
|
|
||||||
+static inline void alphargbblend_argb32(quint32 *dst, uint coverage, const QRgba64 &srcLinear, quint32 src, const QColorTrcLut *colorProfile)
|
|
||||||
{
|
|
||||||
if (coverage == 0xff000000) {
|
|
||||||
// nothing
|
|
||||||
} else if (coverage == 0xffffffff) {
|
|
||||||
- blend_pixel(dest[x], src);
|
|
||||||
- } else if (!dest[x].isOpaque()) {
|
|
||||||
- // Do a gray alphablend.
|
|
||||||
- alphamapblend_generic(qRgbAvg(coverage), dest, x, srcLinear, src, colorProfile);
|
|
||||||
- } else if (src.isOpaque()) {
|
|
||||||
- rgbBlendPixel(dest[x], coverage, srcLinear, colorProfile);
|
|
||||||
- } else {
|
|
||||||
- // First do naive blend with text-color
|
|
||||||
- QRgba64 s = dest[x];
|
|
||||||
- blend_pixel(s, src);
|
|
||||||
- // Then gamma-corrected blend with glyph shape
|
|
||||||
- rgbBlendPixel(dest[x], coverage, colorProfile->toLinear(s), colorProfile);
|
|
||||||
+ *dst = src;
|
|
||||||
+ } else if (*dst < 0xff000000) {
|
|
||||||
+ // Give up and do a naive gray alphablend. Needed to deal with ARGB32 and invalid ARGB32_premultiplied, see QTBUG-60571
|
|
||||||
+ const int a = qRgbAvg(coverage);
|
|
||||||
+ *dst = INTERPOLATE_PIXEL_255(src, a, *dst, 255 - a);
|
|
||||||
+ } else if (!colorProfile) {
|
|
||||||
+ *dst = rgbBlend(*dst, src, coverage);
|
|
||||||
+ } else {
|
|
||||||
+ rgbBlendPixel(dst, coverage, srcLinear, colorProfile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+#if QT_CONFIG(raster_64bit)
|
|
||||||
static void qt_alphargbblit_generic(QRasterBuffer *rasterBuffer,
|
|
||||||
int x, int y, const QRgba64 &color,
|
|
||||||
const uint *src, int mapWidth, int mapHeight, int srcStride,
|
|
||||||
@@ -6102,8 +6087,12 @@ static void qt_alphargbblit_generic(QRasterBuffer *rasterBuffer,
|
|
||||||
colorProfile = QGuiApplicationPrivate::instance()->colorProfileForA32Text();
|
|
||||||
|
|
||||||
QRgba64 srcColor = color;
|
|
||||||
- if (colorProfile && color.isOpaque())
|
|
||||||
- srcColor = colorProfile->toLinear(srcColor);
|
|
||||||
+ if (colorProfile) {
|
|
||||||
+ if (color.isOpaque())
|
|
||||||
+ srcColor = colorProfile->toLinear(srcColor);
|
|
||||||
+ else
|
|
||||||
+ srcColor = colorProfile->toLinear(srcColor.unpremultiplied()).premultiplied();
|
|
||||||
+ }
|
|
||||||
|
|
||||||
alignas(8) QRgba64 buffer[BufferSize];
|
|
||||||
const DestFetchProc64 destFetch64 = destFetchProc64[rasterBuffer->format];
|
|
||||||
@@ -6175,8 +6164,12 @@ static void qt_alphargbblit_generic(QRasterBuffer *rasterBuffer,
|
|
||||||
colorProfile = QGuiApplicationPrivate::instance()->colorProfileForA32Text();
|
|
||||||
|
|
||||||
QRgba64 srcColor = color;
|
|
||||||
- if (colorProfile && color.isOpaque())
|
|
||||||
- srcColor = colorProfile->toLinear(srcColor);
|
|
||||||
+ if (colorProfile) {
|
|
||||||
+ if (color.isOpaque())
|
|
||||||
+ srcColor = colorProfile->toLinear(srcColor);
|
|
||||||
+ else
|
|
||||||
+ srcColor = colorProfile->toLinear(srcColor.unpremultiplied()).premultiplied();
|
|
||||||
+ }
|
|
||||||
|
|
||||||
quint32 buffer[BufferSize];
|
|
||||||
const DestFetchProc destFetch = destFetchProc[rasterBuffer->format];
|
|
||||||
@@ -6249,8 +6242,12 @@ static void qt_alphargbblit_argb32(QRasterBuffer *rasterBuffer,
|
|
||||||
colorProfile = QGuiApplicationPrivate::instance()->colorProfileForA32Text();
|
|
||||||
|
|
||||||
QRgba64 srcColor = color;
|
|
||||||
- if (colorProfile && color.isOpaque())
|
|
||||||
- srcColor = colorProfile->toLinear(srcColor);
|
|
||||||
+ if (colorProfile) {
|
|
||||||
+ if (color.isOpaque())
|
|
||||||
+ srcColor = colorProfile->toLinear(srcColor);
|
|
||||||
+ else
|
|
||||||
+ srcColor = colorProfile->toLinear(srcColor.unpremultiplied()).premultiplied();
|
|
||||||
+ }
|
|
||||||
|
|
||||||
if (!clip) {
|
|
||||||
quint32 *dst = reinterpret_cast<quint32*>(rasterBuffer->scanLine(y)) + x;
|
|
||||||
diff --git a/src/gui/painting/qdrawhelper_p.h b/src/gui/painting/qdrawhelper_p.h
|
|
||||||
index dd42b96d79..9c5d525722 100644
|
|
||||||
--- a/src/gui/painting/qdrawhelper_p.h
|
|
||||||
+++ b/src/gui/painting/qdrawhelper_p.h
|
|
||||||
@@ -671,8 +671,6 @@ static Q_ALWAYS_INLINE void blend_pixel(quint32 &dst, const quint32 src)
|
|
||||||
|
|
||||||
static Q_ALWAYS_INLINE void blend_pixel(quint32 &dst, const quint32 src, const int const_alpha)
|
|
||||||
{
|
|
||||||
- if (const_alpha == 255)
|
|
||||||
- return blend_pixel(dst, src);
|
|
||||||
if (src != 0) {
|
|
||||||
const quint32 s = BYTE_MUL(src, const_alpha);
|
|
||||||
dst = s + BYTE_MUL(dst, qAlpha(~s));
|
|
||||||
diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
|
|
||||||
index 40c822076b..87312b920a 100644
|
|
||||||
--- a/src/gui/painting/qpaintengine_raster.cpp
|
|
||||||
+++ b/src/gui/painting/qpaintengine_raster.cpp
|
|
||||||
@@ -842,8 +842,8 @@ void QRasterPaintEngine::updateRasterState()
|
|
||||||
const QPainter::CompositionMode mode = s->composition_mode;
|
|
||||||
s->flags.fast_text = (s->penData.type == QSpanData::Solid)
|
|
||||||
&& s->intOpacity == 256
|
|
||||||
- && (mode == QPainter::CompositionMode_SourceOver
|
|
||||||
- || (mode == QPainter::CompositionMode_Source
|
|
||||||
+ && (mode == QPainter::CompositionMode_Source
|
|
||||||
+ || (mode == QPainter::CompositionMode_SourceOver
|
|
||||||
&& s->penData.solidColor.isOpaque()));
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/src/gui/painting/qrgba64_p.h b/src/gui/painting/qrgba64_p.h
|
|
||||||
index d145dbfbea..ca879de27c 100644
|
|
||||||
--- a/src/gui/painting/qrgba64_p.h
|
|
||||||
+++ b/src/gui/painting/qrgba64_p.h
|
|
||||||
@@ -284,8 +284,6 @@ static Q_ALWAYS_INLINE void blend_pixel(QRgba64 &dst, QRgba64 src)
|
|
||||||
|
|
||||||
static Q_ALWAYS_INLINE void blend_pixel(QRgba64 &dst, QRgba64 src, const int const_alpha)
|
|
||||||
{
|
|
||||||
- if (const_alpha == 255)
|
|
||||||
- return blend_pixel(dst, src);
|
|
||||||
if (!src.isTransparent()) {
|
|
||||||
src = multiplyAlpha255(src, const_alpha);
|
|
||||||
dst = src + multiplyAlpha65535(dst, 65535 - src.alpha());
|
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
@ -1,3 +1,18 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Jan 27 13:13:57 UTC 2020 - Fabian Vogt <fabian@ritter-vogt.de>
|
||||||
|
|
||||||
|
- Update to 5.14.1:
|
||||||
|
* New bugfix release
|
||||||
|
* Fixes CVE-2020-0570
|
||||||
|
* For more details please see:
|
||||||
|
http://code.qt.io/cgit/qt/qtbase.git/plain/dist/changes-5.14.1/?h=v5.14.1
|
||||||
|
- Drop patch, should be addressed by applications meanwhile:
|
||||||
|
* 0001-Revert-Always-escape-the-table-names-when-creating-t.patch
|
||||||
|
- Drop patches, now upstream:
|
||||||
|
* 0001-Revert-Fix-text-rendering-regression-on-semi-transpa.patch
|
||||||
|
* 0002-Revert-Fix-crash-with-gamma-corrected-text-blending-.patch
|
||||||
|
* 0003-Revert-Handle-transparent-pen-color-in-fast-text-pat.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Fri Dec 27 13:07:32 UTC 2019 - Fabian Vogt <fabian@ritter-vogt.de>
|
Fri Dec 27 13:07:32 UTC 2019 - Fabian Vogt <fabian@ritter-vogt.de>
|
||||||
|
|
||||||
|
@ -36,16 +36,16 @@
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
Name: libqt5-qtbase
|
Name: libqt5-qtbase
|
||||||
Version: 5.14.0
|
Version: 5.14.1
|
||||||
Release: 0
|
Release: 0
|
||||||
Summary: C++ Program Library, Core Components
|
Summary: C++ Program Library, Core Components
|
||||||
License: LGPL-3.0-only or GPL-3.0-with-Qt-Company-Qt-exception-1.1
|
License: LGPL-3.0-only or GPL-3.0-with-Qt-Company-Qt-exception-1.1
|
||||||
Group: System/Libraries
|
Group: System/Libraries
|
||||||
Url: https://www.qt.io
|
Url: https://www.qt.io
|
||||||
%define base_name libqt5
|
%define base_name libqt5
|
||||||
%define real_version 5.14.0
|
%define real_version 5.14.1
|
||||||
%define so_version 5.14.0
|
%define so_version 5.14.1
|
||||||
%define tar_version qtbase-everywhere-src-5.14.0
|
%define tar_version qtbase-everywhere-src-5.14.1
|
||||||
Source: https://download.qt.io/official_releases/qt/5.14/%{real_version}/submodules/%{tar_version}.tar.xz
|
Source: https://download.qt.io/official_releases/qt/5.14/%{real_version}/submodules/%{tar_version}.tar.xz
|
||||||
# to get mtime of file:
|
# to get mtime of file:
|
||||||
Source1: libqt5-qtbase.changes
|
Source1: libqt5-qtbase.changes
|
||||||
@ -65,12 +65,6 @@ Patch21: 0001-Revert-Blacklist-nouveau-and-llvmpipe-for-multithrea.patch
|
|||||||
Patch22: 0002-Revert-qtlite-Fix-build-libs-with-no-feature-regular.patch
|
Patch22: 0002-Revert-qtlite-Fix-build-libs-with-no-feature-regular.patch
|
||||||
Patch23: 0003-Revert-White-list-more-recent-Mesa-version-for-multi.patch
|
Patch23: 0003-Revert-White-list-more-recent-Mesa-version-for-multi.patch
|
||||||
Patch24: fix-fixqt4headers.patch
|
Patch24: fix-fixqt4headers.patch
|
||||||
# Revert to restore compatibility with akonadi and possibly other applications
|
|
||||||
Patch30: 0001-Revert-Always-escape-the-table-names-when-creating-t.patch
|
|
||||||
# Reverts to avoid text rendering bug (QTBUG-80982)
|
|
||||||
Patch40: 0001-Revert-Fix-text-rendering-regression-on-semi-transpa.patch
|
|
||||||
Patch41: 0002-Revert-Fix-crash-with-gamma-corrected-text-blending-.patch
|
|
||||||
Patch42: 0003-Revert-Handle-transparent-pen-color-in-fast-text-pat.patch
|
|
||||||
# patches 1000-2000 and above from upstream 5.14 branch #
|
# patches 1000-2000 and above from upstream 5.14 branch #
|
||||||
# patches 2000-3000 and above from upstream 5.15/dev branch #
|
# patches 2000-3000 and above from upstream 5.15/dev branch #
|
||||||
# Not accepted yet, https://codereview.qt-project.org/c/qt/qtbase/+/255384
|
# Not accepted yet, https://codereview.qt-project.org/c/qt/qtbase/+/255384
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:4ef921c0f208a1624439801da8b3f4344a3793b660ce1095f2b7f5c4246b9463
|
|
||||||
size 49713412
|
|
3
qtbase-everywhere-src-5.14.1.tar.xz
Normal file
3
qtbase-everywhere-src-5.14.1.tar.xz
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:d9d423a6e7bcf1055c0372fc029f14a6fe67dd62c67b83095cde68b60b762cf7
|
||||||
|
size 49828188
|
Loading…
Reference in New Issue
Block a user