diff options
Diffstat (limited to 'src/plugins/sqldrivers')
-rw-r--r-- | src/plugins/sqldrivers/CMakeLists.txt | 3 | ||||
-rw-r--r-- | src/plugins/sqldrivers/ibase/main.cpp | 2 | ||||
-rw-r--r-- | src/plugins/sqldrivers/odbc/qsql_odbc.cpp | 3 | ||||
-rw-r--r-- | src/plugins/sqldrivers/psql/CMakeLists.txt | 14 | ||||
-rw-r--r-- | src/plugins/sqldrivers/psql/qsql_psql.cpp | 4 | ||||
-rw-r--r-- | src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp | 33 |
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, |