SQL/ODBC: add another check to detect unicode availability in driver

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.

Fixes: QTBUG-96616
Fixes: QTBUG-102958
Change-Id: I8ec0115bbfbfc40852bcfb8e94b4b4ad3e395b37
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
(cherry picked from commit f19320748d282b1e68fc2e3de2b0cf9ec44b49ef)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Christian Ehrlicher 2023-03-06 20:44:48 +01:00 committed by Qt Cherry-pick Bot
parent 431a028c18
commit b8f140b70e

View File

@ -2129,7 +2129,18 @@ void QODBCDriverPrivate::checkUnicode()
hDbc,
&hStmt);
r = SQLExecDirect(hStmt, toSQLTCHAR("select 'test'"_L1).data(), SQL_NTS);
// 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 = {
"select 'test'"_L1,
"values('test')"_L1,
"select 'test' from dual"_L1,
};
for (const auto &statement : statements) {
r = SQLExecDirect(hStmt, toSQLTCHAR(statement).data(), SQL_NTS);
if (r == SQL_SUCCESS)
break;
}
if (r == SQL_SUCCESS) {
r = SQLFetch(hStmt);
if (r == SQL_SUCCESS) {