summaryrefslogtreecommitdiffstats
path: root/src/plugins/sqldrivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/sqldrivers')
-rw-r--r--src/plugins/sqldrivers/CMakeLists.txt3
-rw-r--r--src/plugins/sqldrivers/ibase/main.cpp2
-rw-r--r--src/plugins/sqldrivers/odbc/qsql_odbc.cpp3
-rw-r--r--src/plugins/sqldrivers/psql/CMakeLists.txt14
-rw-r--r--src/plugins/sqldrivers/psql/qsql_psql.cpp4
-rw-r--r--src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp33
6 files changed, 40 insertions, 19 deletions
diff --git a/src/plugins/sqldrivers/CMakeLists.txt b/src/plugins/sqldrivers/CMakeLists.txt
index e11840d182..6de087839e 100644
--- a/src/plugins/sqldrivers/CMakeLists.txt
+++ b/src/plugins/sqldrivers/CMakeLists.txt
@@ -16,9 +16,6 @@ if (NOT CMAKE_PROJECT_NAME STREQUAL "QtBase" AND NOT CMAKE_PROJECT_NAME STREQUAL
Sql
)
qt_prepare_standalone_project()
-
- # needed by qt_internal_add_plugin
- add_custom_target(qt_plugins)
else()
qt_internal_upgrade_cmake_policies()
endif()
diff --git a/src/plugins/sqldrivers/ibase/main.cpp b/src/plugins/sqldrivers/ibase/main.cpp
index 8d462afcdc..9f34899d8c 100644
--- a/src/plugins/sqldrivers/ibase/main.cpp
+++ b/src/plugins/sqldrivers/ibase/main.cpp
@@ -51,7 +51,7 @@ class QIBaseDriverPlugin : public QSqlDriverPlugin
public:
QIBaseDriverPlugin();
- QSqlDriver* create(const QString &);
+ QSqlDriver* create(const QString &) override;
};
QIBaseDriverPlugin::QIBaseDriverPlugin()
diff --git a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp
index dd6eaab9cf..eb34f6e4cb 100644
--- a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp
+++ b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp
@@ -1283,7 +1283,8 @@ QVariant QODBCResult::data(int field)
d->fieldCache[i] = qGetDoubleData(d->hStmt, i);
break;
case QSql::HighPrecision:
- d->fieldCache[i] = qGetStringData(d->hStmt, i, info.length(), false);
+ const int extra = info.precision() > 0 ? 1 : 0;
+ d->fieldCache[i] = qGetStringData(d->hStmt, i, info.length() + extra, false);
break;
}
break;
diff --git a/src/plugins/sqldrivers/psql/CMakeLists.txt b/src/plugins/sqldrivers/psql/CMakeLists.txt
index 62e9619d16..ab3d6c03aa 100644
--- a/src/plugins/sqldrivers/psql/CMakeLists.txt
+++ b/src/plugins/sqldrivers/psql/CMakeLists.txt
@@ -1,8 +1,5 @@
# Generated from psql.pro.
-# FIXME cmake FindPostgreSQL is more exhaustive than the check we have for libpq-fe.h
-# it also checks for catalog/pg_type.h which is a more internal include, we should
-# add a way to tell cmake FindPostgreSQL to optionally only look for the libpq-fe.h one
qt_find_package(PostgreSQL) # special case
#####################################################################
@@ -27,3 +24,14 @@ qt_internal_add_plugin(QPSQLDriverPlugin
#### Keys ignored in scope 1:.:.:psql.pro:<TRUE>:
# OTHER_FILES = "psql.json"
+
+# PostgreSQL delivers header files that are not a part of PostgreSQL itself. When precompiled
+# headers are processed, MinGW uses 'pthread.h' from the PostgreSQL installation directory.
+# As result, we disable precompile headers for the plugin.
+# See also QTBUG-90850.
+if(MINGW)
+ set_target_properties(QPSQLDriverPlugin
+ PROPERTIES
+ DISABLE_PRECOMPILE_HEADERS ON
+ )
+endif()
diff --git a/src/plugins/sqldrivers/psql/qsql_psql.cpp b/src/plugins/sqldrivers/psql/qsql_psql.cpp
index b6b2174a01..4c3d6ca13f 100644
--- a/src/plugins/sqldrivers/psql/qsql_psql.cpp
+++ b/src/plugins/sqldrivers/psql/qsql_psql.cpp
@@ -696,8 +696,8 @@ QVariant QPSQLResult::data(int i)
#endif
case QMetaType::QByteArray: {
size_t len;
- unsigned char *data = PQunescapeBytea((const unsigned char*)val, &len);
- QByteArray ba(reinterpret_cast<const char *>(data), int(len));
+ unsigned char *data = PQunescapeBytea(reinterpret_cast<const unsigned char *>(val), &len);
+ QByteArray ba(reinterpret_cast<const char *>(data), len);
qPQfreemem(data);
return QVariant(ba);
}
diff --git a/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp b/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp
index 4f70728d73..3527d2cd32 100644
--- a/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp
+++ b/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp
@@ -74,13 +74,18 @@ Q_DECLARE_METATYPE(sqlite3_stmt*)
QT_BEGIN_NAMESPACE
-static QString _q_escapeIdentifier(const QString &identifier)
+static QString _q_escapeIdentifier(const QString &identifier, QSqlDriver::IdentifierType type)
{
QString res = identifier;
+ // If it contains [ and ] then we assume it to be escaped properly already as this indicates
+ // the syntax is exactly how it should be
+ if (identifier.contains(QLatin1Char('[')) && identifier.contains(QLatin1Char(']')))
+ return res;
if (!identifier.isEmpty() && !identifier.startsWith(QLatin1Char('"')) && !identifier.endsWith(QLatin1Char('"'))) {
res.replace(QLatin1Char('"'), QLatin1String("\"\""));
res.prepend(QLatin1Char('"')).append(QLatin1Char('"'));
- res.replace(QLatin1Char('.'), QLatin1String("\".\""));
+ if (type == QSqlDriver::TableName)
+ res.replace(QLatin1Char('.'), QLatin1String("\".\""));
}
return res;
}
@@ -905,13 +910,24 @@ static QSqlIndex qGetTableInfo(QSqlQuery &q, const QString &tableName, bool only
{
QString schema;
QString table(tableName);
- int indexOfSeparator = tableName.indexOf(QLatin1Char('.'));
+ const int indexOfSeparator = tableName.indexOf(QLatin1Char('.'));
if (indexOfSeparator > -1) {
- schema = tableName.left(indexOfSeparator).append(QLatin1Char('.'));
- table = tableName.mid(indexOfSeparator + 1);
+ const int indexOfCloseBracket = tableName.indexOf(QLatin1Char(']'));
+ if (indexOfCloseBracket != tableName.size() - 1) {
+ // Handles a case like databaseName.tableName
+ schema = tableName.left(indexOfSeparator + 1);
+ table = tableName.mid(indexOfSeparator + 1);
+ } else {
+ const int indexOfOpenBracket = tableName.lastIndexOf(QLatin1Char('['), indexOfCloseBracket);
+ if (indexOfOpenBracket > 0) {
+ // Handles a case like databaseName.[tableName]
+ schema = tableName.left(indexOfOpenBracket);
+ table = tableName.mid(indexOfOpenBracket);
+ }
+ }
}
- q.exec(QLatin1String("PRAGMA ") + schema + QLatin1String("table_info (") + _q_escapeIdentifier(table) + QLatin1Char(')'));
-
+ q.exec(QLatin1String("PRAGMA ") + schema + QLatin1String("table_info (") +
+ _q_escapeIdentifier(table, QSqlDriver::TableName) + QLatin1Char(')'));
QSqlIndex ind;
while (q.next()) {
bool isPk = q.value(5).toInt();
@@ -973,8 +989,7 @@ QVariant QSQLiteDriver::handle() const
QString QSQLiteDriver::escapeIdentifier(const QString &identifier, IdentifierType type) const
{
- Q_UNUSED(type);
- return _q_escapeIdentifier(identifier);
+ return _q_escapeIdentifier(identifier, type);
}
static void handle_sqlite_callback(void *qobj,int aoperation, char const *adbname, char const *atablename,