Migrating from ODBC Driver 3.x to 4.x¶
Version 4.x of the Snowflake ODBC Driver is built on the Universal Core. It is the next version of the driver you already use, not a new product. Installing 4.x on a machine replaces the 3.x driver.
The Universal Core (sf_core) is a shared Rust library that implements the networking, authentication, result-set fetching, and stage-transfer logic that every Snowflake driver needs. Each driver wraps that core in a thin, language-specific layer that exposes the interface its ecosystem expects; the Rust layer is not visible to application code.
Snowflake previously maintained a separate implementation of this logic in each driver, so a security fix or protocol change had to be applied separately to every one. Because the core is shared, a change to it reaches every driver built on it in that driver’s next release.
The driver implements the same ODBC API surface and accepts the same connection-string keywords as the 3.x driver, except where this page notes differences. Use the explicitly versioned installation guides for your target driver.
Most applications need no code changes. The steps in Migration steps help you find the applications that do.
What’s improved¶
- Improved stage transfers: PUT and GET operations, including multipart upload, chunk-level retry, and cloud-provider-specific signing (S3, Azure Blob Storage, Google Cloud Storage), are handled by the Universal Core. GET now auto-creates missing destination directories and uses atomic
.partfile writes to avoid corrupt partial downloads. - Richer diagnostics: The connection diagnostic service (controlled by
ENABLE_CONNECTION_DIAGin the connection string) runs inside the Universal Core and produces a structured connectivity report. Troubleshooting logs can be captured without any code change by settingSNOWFLAKE_TROUBLESHOOTING_ENABLED=true. - Smaller surface for bugs: The ODBC wrapper itself contains no protocol logic, which reduces the places where driver-specific bugs can be introduced and simplifies maintenance.
- Open sourced code: The driver and Universal Core source are available in the Snowflake drivers repository (https://github.com/snowflakedb/drivers) on GitHub, so you can inspect the implementation, file issues, and contribute.
Unified security model: TLS, certificate revocation checking, token refresh, and OAuth flows are implemented once in the Universal Core and behave the same way across every driver built on it. A fix in any of these areas reaches all of those drivers rather than being reimplemented per language.
Consistent cross-driver behavior: Because networking, authentication, and stage-transfer logic live in the Universal Core, the same query, the same authentication flow, and the same error condition produce the same outcome across drivers built on it.
Migration steps¶
Before changing a production host, save its current installer, DSN settings, and driver configuration. Keep the original 3.x environment available while you validate 4.x separately, and agree on a recovery plan with your application owner before cutover. Installing 3.x again alone does not restore changed configuration.
Step 1: Install on a test host and point a DSN at it¶
Installing ODBC 4.x replaces the 3.x driver on that machine. See Downloading the ODBC Driver 4.x.
Create a new DSN entry pointing to Snowflake ODBC with the same account, role, warehouse, and credentials as your existing DSN. Because 4.x replaces 3.x on the machine, existing DSNs that name SnowflakeDSIIDriver no longer resolve there and must be repointed.
After connecting, call SQLGetInfo(SQL_DRIVER_VER) to confirm you are on 4.x. The version string uses the zero-padded MM.mm.bbbb format, for example 04.00.0000.
Step 2: Run your test suite against the new DSN¶
Point your application or test suite at the new DSN. Watch for the items listed in Behavior differences, especially:
- Key pair authentication using a raw
EVP_PKEY*pointer: useSQLSetConnectAttrwithSQL_SF_CONN_ATTR_PRIV_KEY_CONTENTorSQL_SF_CONN_ATTR_PRIV_KEY_BASE64, or setPRIV_KEY_FILEin the DSN or connection string. - Vendor prefix from
SQLGetDiagRecmessages. - OAuth flows using
http://token or authorization endpoints: switch tohttps://. - Proxy configuration that relied on
HTTP_PROXY/HTTPS_PROXY/NO_PROXYbeing read automatically: setUSE_PROXY_ENV=true. - Catalog calls that pass a NULL
CatalogNameand expect the current database: setUseCurrentCatalog=trueor enableCLIENT_METADATA_REQUEST_USE_CONNECTION_CTX. - Applications that catch SQLSTATE
HY000for an unsupportedSQL_GUIDparameter type: 4.x returns07006. - Applications that catch the server SQLSTATE
42601for skipped parameter numbers onSQLExecDirect: 4.x rejects the call locally withHY000.
Step 3: Switch error handling for diagnostic messages¶
If your application catches specific vendor strings or error-trace content from SQLGetDiagRec, update it to handle the new [Snowflake][Snowflake ODBC Driver] prefix and the appended internal trace, or set ErrorTraceEnabled=false in sf.odbc.ini to suppress the trace.
Step 4: Re-check certificate revocation checking¶
Version 4.x does not implement OCSP. Revocation checking is available only through certificate revocation lists (CRLs), and it is off by default. The DisableOCSPCheck and OCSP_FAIL_OPEN connection parameters are accepted but ignored, with a deprecation warning. Keeping an OCSP fail-close setting in your connection string does not enable revocation checking in 4.x.
If you require fail-close revocation checking, set CRL_MODE=ENABLED and evaluate it in a non-production environment under a realistic workload. Confirm that your network allows outbound access to the CRL distribution points named in Snowflake’s certificate chain. See ODBC 4.x.
Step 5: Re-check OAuth, proxy, and token-cache configuration¶
- If you use
OAUTH_TOKEN_REQUEST_URLorOAUTH_AUTHORIZATION_URLwith a plaintexthttp://endpoint (other than a loopback address), switch it tohttps://. - If you rely on
HTTP_PROXY/HTTPS_PROXY/NO_PROXYenvironment variables being picked up automatically, setUSE_PROXY_ENV=trueon the connection. - Tokens cached by ODBC 3.x are stored in
credential_cache_v1.json. Version 4.x readscredential_cache_v2.json, so expect one extra authentication after upgrading.
Step 6: Validate before cutover¶
Confirm that authentication, representative queries, metadata calls, and any file transfers used by your application work on the test host. Apply the tested configuration to production only after these checks pass. If validation fails, keep the application on its original 3.x environment while you investigate.
Installation changes by operating system¶
Installing 4.x replaces 3.x on that machine. Validate the migration on a dedicated host, VM, or container first. The tables below show only installation differences. Use the linked version-specific guides for complete instructions.
Linux¶
Install ODBC 4.x on Linux · Install ODBC 3.x on Linux
| What changes | 3.x | 4.x |
|---|---|---|
| Driver name | SnowflakeDSIIDriver | Snowflake ODBC |
| Library | libSnowflake.so | libsfodbc.so |
| Configuration file | simba.snowflake.ini | sf.odbc.ini |
| Archive | .tgz, with setup scripts | .tar.gz, manual registration |
After extracting a 4.x archive, register the library from usr/lib64/snowflake/odbc/lib/ under Snowflake ODBC.
The archive does not include unixodbc_setup.sh or iodbc_setup.sh. RPM and DEB installations register the driver
through their installer; both use /usr/lib64/snowflake/odbc/ in 4.x. The 3.x DEB directory was /usr/lib/snowflake/odbc/.
Update DSNs that use the old registration name or library path. For unixODBC, check registration with:
Create a user-level sf.odbc.ini for logging and driver-manager encoding. Do not copy the 3.x INI file unchanged.
See configuration differences and Linux configuration.
macOS¶
Install ODBC 4.x on macOS · Install ODBC 3.x on macOS
| What changes | 3.x | 4.x |
|---|---|---|
| DSN driver reference | Legacy library path | Snowflake ODBC |
| Library | libSnowflake.dylib | libsfodbc.dylib |
| Configuration file | simba.snowflake.ini | sf.odbc.ini |
| Disk image | Legacy .dmg naming | Universal .dmg naming |
Use the exact filenames in 4.x downloads or
3.x macOS installation. Update each DSN’s driver reference before testing.
The 4.x installer sets DriverManagerEncoding=UTF-32 for iODBC. If you use unixODBC, set UTF-16 in a user-level
sf.odbc.ini; see macOS installation.
Windows¶
Install ODBC 4.x on Windows · Install ODBC 3.x on Windows
| What changes | 3.x | 4.x |
|---|---|---|
| Driver name | SnowflakeDSIIDriver | Snowflake ODBC |
| Library | SnowflakeDSIIDriver.dll | sfodbc.dll |
| Logging controls | Legacy tracing controls | sf.odbc.ini |
| MSI architectures | 32-bit or 64-bit | 32-bit, 64-bit, or ARM64 |
Choose an MSI that matches the application architecture. The 4.x installation directory is
%ProgramFiles%\Snowflake ODBC Driver\. Repoint DSNs that still name SnowflakeDSIIDriver to Snowflake ODBC.
Configure logging in sf.odbc.ini instead of the former Tracing(0-6) field; see
configuration differences.
Configuration differences¶
Most connection parameters and DSN keywords are shared with the 3.x ODBC driver. The items below are specific to or behave differently in ODBC 4.x.
sf.odbc.ini (replaces simba.snowflake.ini)¶
Process-wide logging for ODBC 4.x is configured in sf.odbc.ini, not simba.snowflake.ini. The driver searches the following locations and uses the first existing file:
$SF_ODBC_INI(explicit override)- The platform configuration directory:
- Linux:
$XDG_CONFIG_HOME/snowflake/sf.odbc.ini, or~/.config/snowflake/sf.odbc.iniifXDG_CONFIG_HOMEis unset. - macOS:
~/Library/Application Support/snowflake/sf.odbc.ini - Windows:
%APPDATA%\snowflake\sf.odbc.ini(Roaming AppData)
- Linux:
~/.snowflake/sf.odbc.ini(on Windows,%USERPROFILE%\.snowflake\sf.odbc.ini)/opt/snowflake/snowflakeodbc/sf.odbc.ini(macOS only, installer default)
On Unix the file must be chmod 600; the driver logs a warning and falls back to defaults if permissions are looser.
Recognized keys (all case-insensitive):
| Key | Type | Default | Description |
|---|---|---|---|
LogEnabled | bool | true | Master switch for the driver log file. |
LogLevel | enum | INFO | OFF, ERROR, WARN, INFO, DEBUG, TRACE. |
LogPath | path | None | Directory for the rolling log file. |
LogFile | string | snowflake_odbc.log | Log file name. |
LogRotation | enum | NEVER | NEVER, DAILY, HOURLY, MINUTELY. |
LogMaxCount | integer | None | Number of rotated files to retain. |
LogMaxSize | bytes | None | Accepted but ignored. Size-based log rotation is not implemented. |
LogQueryText | bool | false | Log SQL text of executed statements (sensitive). |
LogQueryParameters | bool | false | Log bound parameter values (sensitive). |
ErrorTraceEnabled | bool | true | Append an internal error trace to SQLGetDiagRec messages. Set to false to restore 3.x-driver-shaped error messages. |
DriverManagerEncoding¶
The DriverManagerEncoding key in sf.odbc.ini selects the wide-character encoding the driver uses to communicate with the driver manager:
| Value | Use when |
|---|---|
UTF-16 (default) | unixODBC, Windows DM, or any driver manager where SQLWCHAR is 2 bytes. |
UTF-32 | iODBC with SQLWCHAR as wchar_t (4 bytes on Linux/macOS). |
The macOS installer sets UTF-32 in the bundled sf.odbc.ini to match macOS’s stock iODBC. If you use unixODBC on macOS, create a user-level sf.odbc.ini and set DriverManagerEncoding=UTF-16.
Certificate revocation checking¶
Drivers built on the Universal Core do not support OCSP-based certificate revocation checking. Revocation checking is available only through CRLs (certificate revocation lists), and it is off by default.
If you require revocation checking, enable CRL checking and evaluate it in a non-production environment under a realistic workload. Confirm that your network allows outbound access to the CRL distribution points named in Snowflake’s certificate chain: a driver that cannot reach a distribution point cannot complete a revocation check.
Troubleshooting logs¶
To capture all driver log events at any level with no code change, set these environment variables before starting the ODBC application:
Collect /tmp/sfodbc/sf_driver_troubleshooting.log and include it in support tickets.
Connection diagnostics¶
To run a connectivity probe (DNS, TLS, CRL, proxy, stage allowlist) add these keywords to the connection string:
The probe writes SnowflakeConnectionTestReport.txt to the specified directory.
connections.toml profiles¶
ODBC 4.x supports connections.toml profiles for setting connection parameters outside the DSN or connection string.
It selects the directory for connections.toml as follows:
- Use the directory specified by
SNOWFLAKE_HOME, or~/.snowflakeif the variable is unset, when that directory exists. - If that directory does not exist, use the platform configuration directory:
- Linux:
$XDG_CONFIG_HOME/snowflake/connections.toml, or~/.config/snowflake/connections.tomlifXDG_CONFIG_HOMEis unset. - Windows:
%USERPROFILE%\AppData\Local\snowflake\connections.toml - macOS:
~/Library/Application Support/snowflake/connections.toml
- Linux:
The fallback depends on whether the directory exists, not whether it contains connections.toml.
See Connecting using the connections.toml file.
Renamed or replaced parameters¶
| Previous name (3.x) | 4.x name or replacement |
|---|---|
simba.snowflake.ini | sf.odbc.ini |
SnowflakeDSIIDriver | Snowflake ODBC |
SQL_SF_CONN_ATTR_PRIV_KEY | Set SQL_SF_CONN_ATTR_PRIV_KEY_CONTENT or SQL_SF_CONN_ATTR_PRIV_KEY_BASE64 with SQLSetConnectAttr, or use the PRIV_KEY_FILE DSN/connection-string keyword. |
BROWSER_RESPONSE_TIMEOUT | AUTHENTICATION_TIMEOUT |
PUT_MAXRETRIES / GET_MAXRETRIES | PUT_GET_MAX_ATTEMPTS (aliases still accepted, with an 01000 warning) |
TRACING | Ignored. Configure LogLevel and LogPath in sf.odbc.ini. |
DisableOCSPCheck / OCSP_FAIL_OPEN | Accepted but ignored, with a deprecation warning. Configure 4.x CRL options instead. |
Behavior differences¶
Every behavior difference between the generally available driver and the version built on the Universal Core is catalogued in the driver source repository, as a machine-readable file listing each entry’s previous behavior, new behavior, classification, and whether it is a breaking change. Read it in full before you upgrade an application you cannot easily roll back:
The sections above summarize the entries most likely to affect an existing application. The catalog is the complete list.
The following curated list summarizes accepted breaking behavior differences between the ODBC 3.x and ODBC 4.x drivers. Entries marked fixed in the catalog were preview regressions and are not differences you need to prepare for when migrating from 3.x.
ODBC API compliance¶
- Fixed truncation of DECIMAL/
SQL_C_CHAR. ODBC 4.x returnsSQL_ERRORwith SQLSTATE22003when whole digits do not fit; ODBC 3.x truncated withSQL_SUCCESS_WITH_INFO. (BD#11) - Improved error handling for undersized
SQL_C_BINARYbuffers for DECIMAL/NUMERIC/DECFLOAT. ODBC 4.x returnsSQL_ERRORwith SQLSTATE22003when the buffer is smaller thansizeof(SQL_NUMERIC_STRUCT); ODBC 3.x ignoredBufferLength. (BD#12) - Fixed conversion of
NaNfrom FLOAT/DOUBLE to integer orSQL_C_BIT. ODBC 4.x returnsSQL_ERRORwith SQLSTATE22003; ODBC 3.x wrote0withSQL_SUCCESS_WITH_INFO. (BD#16) - Improved single-field interval precision handling. ODBC 4.x enforces the default precision of two and returns
SQL_ERRORwith SQLSTATE22015for values of 100 or greater; ODBC 3.x did not enforce it. (BD#18) - Improved handling of a null
RowCountPtrduringSQLRowCount. ODBC 4.x returnsSQL_ERRORwith SQLSTATEHY009; ODBC 3.x returnedSQL_SUCCESS. (BD#25) - Fixed handling of negative
DecimalDigitsonSQLBindParameter. ODBC 4.x returnsSQL_ERRORwith SQLSTATEHY104; ODBC 3.x accepted negative scale silently. (BD#26) - Fixed extreme exponent conversion from DECFLOAT to
SQL_C_BINARY. ODBC 4.x returnsSQL_ERRORwith SQLSTATE22003; ODBC 3.x could succeed with a clamped value. (BD#29) - Fixed scale handling during conversion from
SQL_C_NUMERICtoVARCHAR. ODBC 4.x applies the scale fromSQL_NUMERIC_STRUCT; ODBC 3.x ignored scale. (BD#33) - Fixed binding of subnormal doubles near
DBL_MIN. ODBC 4.x preserves the value; ODBC 3.x could store0.0. (BD#36) - Improved conversion from TIME to
SQL_C_CHAR/SQL_C_WCHAR. ODBC 4.x returnsSQL_ERRORwith SQLSTATE22003when the buffer is too small for the base time, andSQL_SUCCESS_WITH_INFOwith SQLSTATE01004when only fractional seconds are truncated. (BD#38) - Tightened conversion from VARCHAR to
SQL_C_INTERVAL_*types. ODBC 4.x follows the ODBC Appendix D conversion rules more strictly. (BD#55) - Fixed
SQL_C_INTERVAL_SECONDwith fractional seconds bound to exact-numeric SQL types. ODBC 4.x truncates the fraction and succeeds; ODBC 3.x rejected the bind with SQLSTATE22015. (BD#60) - Changed binding of exact-numeric C types to single-field
SQL_INTERVAL_*parameters. Approximate-numeric C types bound to any interval target are rejected with SQLSTATE07006. (BD#72) - Changed
SQL_GUIDparameter binding. ODBC 4.x returnsSQL_ERRORwith SQLSTATE07006whenSQL_GUIDis used as the parameter type. Version 3.x returnedHY000. Neither driver supports bindingSQL_GUID. (BD#158) - Changed non-contiguous
SQLExecDirectparameter bindings. ODBC 4.x rejects the call locally with SQLSTATEHY000when bound parameters are not contiguous and do not start at 1. Version 3.x submitted the statement and returned the server SQLSTATE42601. (BD#159) - Changed binding of unbindable Snowflake vendor type codes. ODBC 4.x returns
SQL_ERRORwith SQLSTATEHYC00fromSQLBindParameterforSQL_SF_ARRAY,SQL_SF_OBJECT,SQL_SF_VARIANT, and VECTOR (2006), whichSQLGetTypeInfopublishes but neither driver can bind. A vendor code thatSQLGetTypeInfodoesn’t publish, such as2007, still returnsHY004. ODBC 3.x accepted the bind and failed later during execution withHY000. To insert a semi-structured value, bind it asSQL_VARCHARand convert it in the statement withPARSE_JSON(?),TO_ARRAY(?), orTO_OBJECT(?). (BD#167) - Fixed data-at-execution cleanup after
SQLCancel. ODBC 4.x discards all accumulatedSQLPutDataso a re-entered sequence starts fresh. (BD#86) - Disallowed setting
SQL_ATTR_LOGIN_TIMEOUTafter connect. ODBC 4.x returnsSQL_ERRORwith SQLSTATEHY011; ODBC 3.x returnedSQL_SUCCESSfor a no-op. (BD#94) - Tightened support of
SQL_ATTR_CURSOR_TYPEvalues. ODBC 4.x substitutes unsupported cursor types withSQL_CURSOR_FORWARD_ONLYand returnsSQL_SUCCESS_WITH_INFOwith SQLSTATE01S02. (BD#96) - Changed the diagnostic vendor prefix. ODBC 4.x uses
[Snowflake][Snowflake ODBC Driver]; ODBC 3.x used[Snowflake][Support]. (BD#110) - Fixed invalid
SQLCancelHandle(SQL_HANDLE_DBC)during async or data-at-execution. ODBC 4.x returnsSQL_ERRORwith SQLSTATEHY010; ODBC 3.x returned a no-opSQL_SUCCESS. (BD#111) - Changed when
SQLCancelreturns. ODBC 4.x returns as soon as the cancel is signaled; the cancelled statement still reportsHY008. - Changed
SQLSetStmtAttr(SQL_ROWSET_SIZE, 0). ODBC 4.x returnsSQL_ERRORwith SQLSTATEHY024. - Implemented
SQLFreeConnectandSQLFreeEnv. ODBC 4.x exports both as wrappers aroundSQLFreeHandle.
Catalog functions¶
- Fixed
SQLColumns/SQLProcedureColumnsBUFFER_LENGTHforNUMBER/DECIMAL. ODBC 4.x returns precision + 2; ODBC 3.x returned the Snowflake storage width. (BD#122) - Changed catalog
REMARKSandCOLUMN_DEF. ODBC 4.x returnsSQL_NULL_DATAwhen absent instead of an empty string. (BD#121) - Added native
INTERVALresult types. ODBC 4.x reportsINTERVAL YEAR TO MONTHandINTERVAL DAY TO SECONDas nativeSQL_INTERVAL_*types with ANSI literals. (BD#145) - Fixed unquoted identifier case-folding in identifier mode. When
SQL_ATTR_METADATA_IDisSQL_TRUE, ODBC 4.x folds unquoted catalog, schema, table, procedure, and column identifiers to uppercase before the lookup, so a lowercase identifier matches the stored name. ODBC 3.x compared case-sensitively and returned an empty result set. Double-quoted identifiers stay case-sensitive, and the default pattern mode is case-sensitive in both versions. (BD#87, BD#91, BD#113) - Changed
SQLForeignKeysside selection for an empty table name. ODBC 4.x treats an empty string table name the same as an omitted one, so an emptyPKTableNamewith a populatedFKTableNameresolves toSHOW IMPORTED KEYSand returns the relationship. ODBC 3.x returned an empty result set. (BD#90)
PUT/GET behavior¶
- Fixed stage array binding thresholds. ODBC 4.x honors
arrayBindSupportedandCLIENT_STAGE_ARRAY_BINDING_THRESHOLD. (BD#78) - Changed PUT and GET to transfer several files in parallel, bounded by the statement
PARALLELvalue. - Mapped
PUT_MAXRETRIESandGET_MAXRETRIESto a sharedPUT_GET_MAX_ATTEMPTScount. (BD#141)
Authentication and security¶
- Changed private-key connection attributes. ODBC 4.x removed support for
SQL_SF_CONN_ATTR_PRIV_KEY. SetSQL_SF_CONN_ATTR_PRIV_KEY_CONTENTorSQL_SF_CONN_ATTR_PRIV_KEY_BASE64withSQLSetConnectAttr, or use thePRIV_KEY_FILEDSN/connection-string keyword. (BD#10) - Tightened OAuth endpoint URL scheme requirements. ODBC 4.x requires HTTPS for token and authorization endpoints (loopback
http://allowed). (BD#81) - Refined SQLSTATE for OAuth IdP token-exchange rejection. ODBC 4.x returns SQLSTATE
28000; ODBC 3.x surfaced genericHY000. (BD#83) - Hardened workload identity federation parameter validation. ODBC 4.x rejects WIF-only parameters unless
authenticatorisWORKLOAD_IDENTITY. (BD#108) - Hardened
workload_identity_impersonation_pathwith providerOIDC. ODBC 4.x rejects the combination. (BD#109) - Removed OCSP support in favor of CRLs. (BD#124)
- Renamed
BROWSER_RESPONSE_TIMEOUTtoAUTHENTICATION_TIMEOUT. (BD#138)
Snowflake extensions and diagnostics¶
- Tightened Snowflake statement attributes.
SQL_SF_STMT_ATTR_LAST_QUERY_IDis read-only and populated in all cases.SQL_SF_STMT_ATTR_MULTI_STATEMENT_COUNTkeeps its-1default, but ODBC 4.x now validates the range and returns the value throughSQLGetStmtAttr. (BD#56) - Changed diagnostic message text. ODBC 4.x appends an internal error trace by default (
ErrorTraceEnabledinsf.odbc.ini). (BD#77) - Fixed DECFLOAT string formatting. ODBC 4.x returns normalized scientific notation, for example
1.2e200instead of12e199. (BD#19)
iODBC-specific behavior¶
- Fixed success codes and diagnostics under iODBC to match the ODBC specification. (BD#61)
- Fixed orphaned statement handle release under iODBC. (BD#68)
- Fixed descriptor calls during
SQL_NEED_DATAto returnSQL_ERRORwith SQLSTATEHY010. (BD#69) - Fixed ODBC 3.x SQLSTATEs under iODBC. (BD#70)
- Fixed
SQL_C_WCHARfetch encoding under iODBC to use uniform UTF-32 driven byDriverManagerEncoding. (BD#79) - iODBC might return different codes or SQLSTATEs because ODBC 4.x and 3.x advertise different capabilities. (BD#62)
Additional reviewed behavior differences¶
The following entries are reviewed and allowed in BehaviorDifferences.yaml. Validate applications that depend on these behaviors when migrating from 3.x.
SQLColumnsSQL_DATA_TYPEfor DATE/TIME/TIMESTAMP returns verboseSQL_DATETIME(9) with the subtype inSQL_DATETIME_SUB. (BD#125)- A second
SQLFreeHandleon an already-freed statement returnsSQL_INVALID_HANDLEunder iODBC. (BD#126) SQLColumnsTIMESTAMPCOLUMN_SIZEis20+ scale (19when scale is0), not a fixed35. (BD#128)SQLColumnsTIMESTAMPBUFFER_LENGTHis16, not35. (BD#129)SQLColumnsVARIANT/OBJECT/ARRAYsize followsVARCHAR_AND_BINARY_MAX_SIZE_IN_RESULT. (BD#130)SQLColumnsDATE/TIMEBUFFER_LENGTHis6. (BD#133)CLIENT_REQUEST_MFA_TOKENreplaced byCLIENT_STORE_TEMPORARY_CREDENTIALfor MFA caching. If you previously setCLIENT_REQUEST_MFA_TOKEN=false, setCLIENT_STORE_TEMPORARY_CREDENTIAL=falseto keep MFA caching disabled. (BD#137)SQLColumnsGEOGRAPHY/GEOMETRYsizes follow the session VARCHAR maximum. (BD#146)MaxHttpRetriesmaps toretry_max_attemptswith different default, floor, and zero semantics. (BD#148)MAX_CON_RETRY_ATTEMPTSis not recognized. (BD#149)RetryOn403is not recognized; 403 retry is opt-in viaretry_extra_status_codes. (BD#150)SQLGetTypeInfoTIMESTAMPCOLUMN_SIZEis29;ODBC_USE_STANDARD_TIMESTAMP_COLUMNSIZEis not accepted. (BD#151)SQLDriverConnectfails with SQLSTATE28000and native error0for an invalid WIF provider, missing OIDC token, or malformed JWT. (BD#155)
Resolved during preview¶
These items were preview regressions. ODBC 4.x now matches ODBC 3.x, so they are not differences you need to prepare for when migrating from 3.x.
- PUT result compression tokens are lowercase. (BD#2)
- Gzip-compressed PUT uploads omit
FNAMEfrom the gzip header. (BD#5) SQL_C_BINARYfetch ofFLOAT/DOUBLE/REALreturns the native 8-byte IEEE 754 value. (BD#14)SQL_BITparameter binding from integer andSQL_C_NUMERICsources accepts only0and1. (BD#37)- Binding of
"Infinity","-Infinity", and"NaN"asSQL_C_CHAR/SQL_C_WCHARto float SQL types forwards the non-finite value. (BD#48) - Character hex literals bound to
SQL_BINARYhex-decode the value. (BD#49) SQLDescribeParampreserves Snowflake vendorTIMESTAMPtype codes (2000/2001/2002). (BD#50)SQLBrowseConnectunder iODBC returnsSQL_NEED_DATAfor an incomplete connection string. (BD#63)- OAuth Authorization Code token caching defaults
CLIENT_STORE_TEMPORARY_CREDENTIALtotrue. (BD#85) SQLForeignKeyswithSQL_ATTR_METADATA_ID=TRUEreturnsSQL_ERROR(HY009) for aNULLcatalog, schema, or table pointer. (BD#89)