ocilib
ocilib copied to clipboard
OCI_GetServerMajorVersion() returns wrong values for Oracle Server version < 18.1
the code below produces weird shifted results with 4.7.6 compared to 4.7.3 on a 32-bit compile:
< ocilib 4.7.6 0 9 20 920
---
> ocilib 4.7.3 9 2 0 920
fprintf(stderr, "ocilib %d.%d.%d %i %i %i %i\n",
OCILIB_MAJOR_VERSION, OCILIB_MINOR_VERSION, OCILIB_REVISION_VERSION,
OCI_GetServerMajorVersion(cn),
OCI_GetServerMinorVersion(cn),
OCI_GetServerRevisionVersion(cn),
OCI_GetVersionConnection(cn));
Hi,
Found the issue in ocilib code.
In your example, with current versions of OCILIB, OCI_GetVersionConnection() should return 90200 instead of 920 for a Oracle 9.2.0 server version. In v4.7.5, I changed the version integer values returned by OCI_GetVersionConnection() to be on 6 digits instead of 4 to handle the minor and rev number on more than 1 digits.
When using oracle 18+, ver_maj, ver_min and ver_rev are retrieved from oracle OCI APIs and then assembled into a single integer value on 6 digits and OCI_GetVersionConnection() returns a correct integer value. By for previous Oracle version, the version is computed by parsing the server banner (same as the one shown in SQL*PLUS). And the extracted ver_maj, ver_min and ver_rev are not assembled using the new 6 digit scheme introduced in v4.7.5 but with the old scheme on 4 digits.
As OCI_GetServerMajorVersion, OCI_GetServerMinorVersion and OCI_GetServerRevisionVersion are extracting their value from the combined 6 digits integer value, in case the server is pre 18, they are parsing a 4 digits integer value and then lead to the erroneous value you've seen.
It will be fixed in the current 4.7.7 dev branch by the end of the day :)
Regards,
Vincent