ocilib icon indicating copy to clipboard operation
ocilib copied to clipboard

OCI_GetServerMajorVersion() returns wrong values for Oracle Server version < 18.1

Open freakout42 opened this issue 2 years ago • 1 comments

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));

freakout42 avatar Feb 23 '23 08:02 freakout42

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

vrogier avatar Feb 23 '23 10:02 vrogier