SQL/ODBC: add another check to detect unicode availability in driver
authorDebian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
Thu, 18 Jun 2026 11:20:31 +0000 (14:20 +0300)
committerDmitry Shachnev <mitya57@debian.org>
Thu, 18 Jun 2026 11:20:31 +0000 (14:20 +0300)
Origin: upstream, https://code.qt.io/cgit/qt/qtbase.git/commit/?id=f19320748d282b1e
Last-Update: 2024-05-25

Since ODBC does not have a direct way finding out if unicode is
supported by the underlying driver the ODBC plugin does some checks. As
a last resort a sql statement is executed which returns a string. But
even this may fail because the select statement has no FROM part which
is rejected by at least Oracle does not allow. Therefore add another
query which is correct for Oracle & DB2 as a workaround. The question
why the first three statements to check for unicode availability fail
is still open but can't be checked since I've no access to an oracle
database.

Gbp-Pq: Name sql_odbc_more_unicode_checks.diff

src/plugins/sqldrivers/odbc/qsql_odbc.cpp

index d14777405557e9a0d78a2237405a88bbeca28327..c52415e7369a6ac76a9901361869b683f10f8c5c 100644 (file)
@@ -2115,9 +2115,18 @@ void QODBCDriverPrivate::checkUnicode()
                                   hDbc,
                                   &hStmt);
 
-    {
-        auto encoded = toSQLTCHAR(QLatin1String("select 'test'"));
+    // for databases which do not return something useful in SQLGetInfo and are picky about a
+    // 'SELECT' statement without 'FROM' but support VALUE(foo) statement like e.g. DB2 or Oracle
+    const auto statements = {
+        QLatin1String("select 'test'"),
+        QLatin1String("values('test')"),
+        QLatin1String("select 'test' from dual"),
+    };
+    for (const auto &statement : statements) {
+        auto encoded = toSQLTCHAR(statement);
         r = SQLExecDirect(hStmt, encoded.data(), SQLINTEGER(encoded.size()));
+        if (r == SQL_SUCCESS)
+            break;
     }
     if(r == SQL_SUCCESS) {
         r = SQLFetch(hStmt);