Re: SQLGetConnectAttrW + SQL_ATTR_CURRENT_CATALOG => wrong byte count?

From: Marsupilami79 <marsupilami79(at)gmx(dot)de>
To: "Wal, Jan Tjalling van der" <jan_tjalling(dot)vanderwal(at)wur(dot)nl>, Jon Raiford <raiford(at)labware(dot)com>, "pgsql-odbc(at)lists(dot)postgresql(dot)org" <pgsql-odbc(at)lists(dot)postgresql(dot)org>
Subject: Re: SQLGetConnectAttrW + SQL_ATTR_CURRENT_CATALOG => wrong byte count?
Date: 2022-11-28 11:16:59
Message-ID: acca9004-ac38-fedb-8564-ea13edb5eb8c@gmx.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-odbc

Hello Jan Tjalling, hello Jon,

Jon is right - SQLGetConnectAttrW is a WideChar function (2 Bytes per
Character). So the encoding in the PG database should not matter. It
should return the length for the SQL_ATTR_CURRENT_CATALOG attribute in
bytes. So for a database named "topsales" it should return 16 because
each character uses two bytes.

I assume this is a bug in the PostgreSQL ODBC driver. The question is
where to file a bug report and how to get this fixed? Is there a chance
to get this fixed?

With best regards,

Jan Baumgarten

Am 25.11.2022 um 20:22 schrieb Wal, Jan Tjalling van der:
>
> Okay, getting out of my comfort zone here.
>
> I have found encoding options for PostgreSQL (v15) here:
>
> PostgreSQL: Documentation: 15: 24.3. Character Set Support
> <https://www.postgresql.org/docs/current/multibyte.html>; they do not
> include UTF16, just UTF8.
>
> There is no mention of UTF16 anywhere on that page.
>
> I also found this: PostgreSQL: Re: DataDirect Driver, ExecDirect and
> UTF-8
> <https://www.postgresql.org/message-id/C631E68E.133%25ksell@greenplum.com>
> that does mention WCHAR being different form CHAR and how that could work.
>
> I hope there is something on these pages that helps you further.
>
> Kind regards, Jan Tjalling
>
> *From:*Jon Raiford <raiford(at)labware(dot)com>
> *Sent:* 25 November 2022 03:58
> *To:* Wal, Jan Tjalling van der <jan_tjalling(dot)vanderwal(at)wur(dot)nl>;
> Marsupilami79 <marsupilami79(at)gmx(dot)de>; pgsql-odbc(at)lists(dot)postgresql(dot)org
> *Subject:* Re: SQLGetConnectAttrW + SQL_ATTR_CURRENT_CATALOG => wrong
> byte count?
>
> I believe the point is that the function is a "W" (wide char 16-bit)
> function so the strings should be UTF-16.
>
> Jon
>
> ------------------------------------------------------------------------
>
> *From:*Wal, Jan Tjalling van der <jan_tjalling(dot)vanderwal(at)wur(dot)nl>
> *Sent:* Tuesday, November 22, 2022 11:21:56 AM
> *To:* Marsupilami79 <marsupilami79(at)gmx(dot)de>;
> pgsql-odbc(at)lists(dot)postgresql(dot)org <pgsql-odbc(at)lists(dot)postgresql(dot)org>
> *Subject:* RE: SQLGetConnectAttrW + SQL_ATTR_CURRENT_CATALOG => wrong
> byte count?
>
> Hello Marsupilami79, Jan,
>
> It could be that the answers you receive are in fact correct for postgres.
> In a database set to charset=UTF-8 I get the following answers.
>
> select  'topsales' as string, char_length('topsales'),
> length('topsales'), octet_length('topsales');
> "string"                "char_length"   "length" "octet_length"
> "topsales"      8               8               8
>
> However for a variation that requires more bytes to store the answer
> start to differ.
> select  'töpsålés'as string, char_length('töpsålés'),
> length('töpsålés'), octet_length('töpsålés');
> "string"                "char_length"   "length" "octet_length"
> "töpsålés"      8               8               11
>
> In the above octet_length is a postgres-function that yields results
> in bytes.
> And the three characters with a diacritical added, each requires 2
> bytes, yielding a resulting lengt of 11 instead of 8.
>
> Kind regards, Jan Tjalling van der Wal
>
>
> -----Original Message-----
> From: Marsupilami79 <marsupilami79(at)gmx(dot)de>
> Sent: 22 November 2022 16:57
> To: pgsql-odbc(at)lists(dot)postgresql(dot)org
> Subject: SQLGetConnectAttrW + SQL_ATTR_CURRENT_CATALOG => wrong byte
> count?
>
> Hello,
>
> I am a co author of a data access library and we recently added an
> ODBC bridge. This bridge has the capability to detemine the current
> Catalog / Database. This is done by calling SQLGetConnectAttrW.
>
> We try to determine the size of the buffer that is needed for the
> catalog name in the following manner:
> SQLGetConnectAttrW(fHDBC, SQL_ATTR_CURRENT_CATALOG, null, 0, &aLen)
>
> The ODBC driver for Microsoft SQL server correctly returns the number
> of bytes required (10 bytes for the Database name "Stork") in the aLen
> parameter. The ODBC driver for PostgreSQL returns the number of
> characters (8 characters for a database named "topsales"), where it
> should return 16 for the number of bytes required.
>
> I tested this with the psqlodbc_13_02_0000-x86 download for Windows 10
> and installed the Unicode ODBC driver.
>
> I assume this is a bug and needs to be fixed. I just don't know if
> this is the right place to report the bug to?
>
> With best regards,
>
> Jan
>

In response to

Responses

Browse pgsql-odbc by date

  From Date Subject
Next Message Jon Raiford 2022-11-28 14:01:54 Re: SQLGetConnectAttrW + SQL_ATTR_CURRENT_CATALOG => wrong byte count?
Previous Message Wal, Jan Tjalling van der 2022-11-25 19:22:48 RE: SQLGetConnectAttrW + SQL_ATTR_CURRENT_CATALOG => wrong byte count?