Обсуждение: [BUGS] There is a case in which psqlodbc-09.03.0400 returns unterminated strings on Windows.
Hi, I found a bug which psqlODBC returns a string without null-terminated when SQLFetch is executed on Windows. IMHO, it seems to be caused by differences of snprintf function between Windows and Linux. You have changed sprintf into snprintf at psqlodbc-09.03.0400 release. But snprintf on Windows(_snprintf) doesn't include a terminating character(\0) when a copy buffer length is less than anoriginal buffer length; besides this returns -1. Their behavior are different from that of Linux but psqlODBC does not currently make allowances for their differences. As you can confirm this bug, I attached a program(test.cpp) which reproduces a bug. This result is following. ---- Please Enter key... SQLAllocHandle() OK SQLAllocHandle() ok SQLConnect ok data-length=24 length=-1 //invalid length 2015-09-15 17:48:44.7300フフフフフフフフフフフフフフフフ・ //unterminated string no data --- To fix this behavior, copy_and_convert_field function and stime2timestamp function need to repair at least. I tried to fix it up and attached a patch on this mail. Could you confirm this? Best Regards --- Naoya Anzai Engineering Department NEC Solution Inovetors, Ltd. E-Mail: nao-anzai@xc.jp.nec.com ---
Вложения
Re: [BUGS] There is a case in which psqlodbc-09.03.0400 returns unterminated strings on Windows.
От
Heikki Linnakangas
Дата:
On 09/16/2015 05:20 AM, Naoya Anzai wrote: > Hi, > > I found a bug which psqlODBC returns a string without null-terminated when SQLFetch is executed on Windows. > IMHO, it seems to be caused by differences of snprintf function between Windows and Linux. > You have changed sprintf into snprintf at psqlodbc-09.03.0400 release. > But snprintf on Windows(_snprintf) doesn't include a terminating character(\0) when a copy buffer length is less than anoriginal buffer length; besides this returns -1. > Their behavior are different from that of Linux but psqlODBC does not currently make allowances for their differences. > > As you can confirm this bug, I attached a program(test.cpp) which reproduces a bug. Yep. This was already fixed in git master in January, in commit 532c0dad20087201feee3851652c114eb820311f. We're long overdue for a release... - Heikki
> Yep. This was already fixed in git master in January, in commit > 532c0dad20087201feee3851652c114eb820311f. Thank you! I confirmed psql-odbc master is already fixed this bug. While you are at it, could you fix a precision argument passed to stime2timestamp? --- C:/work/psqlodbc-a2def3d/convert.c.orig Wed Sep 23 16:14:10 2015 +++ C:/work/psqlodbc-a2def3d/convert.c Thu Sep 24 09:01:50 2015 @@ -1247,8 +1247,7 @@ case PG_TYPE_TIMESTAMP: /* sprintf(rgbValueBindRow, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", std_time.y, std_time.m, std_time.d, std_time.hh, std_time.mm, std_time.ss); */ - len = stime2timestamp(&std_time, rgbValueBindRow, cbValueMax, FALSE, - (int) (cbValueMax - len - 2) ); + len = stime2timestamp(&std_time, rgbValueBindRow, cbValueMax, FALSE, 6 ); if (len + 1 > cbValueMax) result = COPY_RESULT_TRUNCATED; break; In PostgreSQL, I think max number of digits of precision is always 6. I hope to be able to use next release as soon as possible. Regards, Naoya --- Naoya Anzai Engineering Department NEC Solution Inovetors, Ltd. E-Mail: nao-anzai@xc.jp.nec.com ---
Hi, psqlodbc commiters. > --- C:/work/psqlodbc-a2def3d/convert.c.orig Wed Sep 23 16:14:10 2015 > +++ C:/work/psqlodbc-a2def3d/convert.c Thu Sep 24 09:01:50 2015 > @@ -1247,8 +1247,7 @@ > case PG_TYPE_TIMESTAMP: > /* sprintf(rgbValueBindRow, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", > std_time.y, std_time.m, std_time.d, std_time.hh, std_time.mm, std_time.ss); > */ > - len = stime2timestamp(&std_time, rgbValueBindRow, cbValueMax, FALSE, > - (int) (cbValueMax - len - 2) ); > + len = stime2timestamp(&std_time, rgbValueBindRow, cbValueMax, FALSE, 6 ); > if (len + 1 > cbValueMax) > result = COPY_RESULT_TRUNCATED; > break; > > In PostgreSQL, I think max number of digits of precision is always 6. Could someone confirm this? I think this is a tiny bug.. Best Regards, --- Naoya Anzai Engineering Department NEC Solution Inovetors, Ltd. E-Mail: nao-anzai@xc.jp.nec.com ---
Re: [BUGS] There is a case in which psqlodbc-09.03.0400 returns unterminated strings on Windows.
От
"Inoue, Hiroshi"
Дата:
Hi, Oops it was my mistake. I would take care of it. BTW why is the last parameter 6? regards, Hiroshi Inoue On 2015/11/04 12:53, Naoya Anzai wrote > Hi, psqlodbc commiters. > >> --- C:/work/psqlodbc-a2def3d/convert.c.orig Wed Sep 23 16:14:10 2015 >> +++ C:/work/psqlodbc-a2def3d/convert.c Thu Sep 24 09:01:50 2015 >> @@ -1247,8 +1247,7 @@ >> case PG_TYPE_TIMESTAMP: >> /* sprintf(rgbValueBindRow, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", >> std_time.y, std_time.m, std_time.d, std_time.hh, std_time.mm, std_time.ss); >> */ >> - len = stime2timestamp(&std_time, rgbValueBindRow, cbValueMax, FALSE, >> - (int) (cbValueMax - len - 2) ); >> + len = stime2timestamp(&std_time, rgbValueBindRow, cbValueMax, FALSE, 6 ); >> if (len + 1 > cbValueMax) >> result = COPY_RESULT_TRUNCATED; >> break; >> >> In PostgreSQL, I think max number of digits of precision is always 6. > Could someone confirm this? > I think this is a tiny bug.. > > Best Regards, > > --- > Naoya Anzai > Engineering Department > NEC Solution Inovetors, Ltd. > E-Mail: nao-anzai@xc.jp.nec.com
Inoue-san > Oops it was my mistake. > I would take care of it. > BTW why is the last parameter 6? MAX_TIMESTAMP_PRECISION(a macro in timestamp.h(PostgreSQL)) is always 6. --- src/include/utils/timestamp.h #define MAX_TIMESTAMP_PRECISION 6 --- I have confirmed that this specification is not changed from PostgreSQL7.3. MAX_TIME_PRECISION can be changed 6 to 10 with --disable-integer-datetimes, but this precision is used by TIME data type only. --- [naoya@nesitcspg03 ~]$ psql psql (9.5beta1) Type "help" for help. [local] 32289 naoya=# select '2015-11-11 11:11:11.123456789'::time(10); time -------------------- 11:11:11.123456789 (1 row) [local] 32289 naoya=# select '2015-11-11 11:11:11.123456789'::time(10) with time zone; timetz ----------------------- 11:11:11.123456789+09 (1 row) [local] 32289 naoya=# select '2015-11-11 11:11:11.123456789'::timestamp(10); WARNING: TIMESTAMP(10) precision reduced to maximum allowed, 6 at character 41 WARNING: TIMESTAMP(10) precision reduced to maximum allowed, 6 LINE 1: select '2015-11-11 11:11:11.123456789'::timestamp(10); ^ timestamp ---------------------------- 2015-11-11 11:11:11.123457 (1 row) [local] 32289 naoya=# select '2015-11-11 11:11:11.123456789'::timestamp(10) with time zone; WARNING: TIMESTAMP(10) WITH TIME ZONE precision reduced to maximum allowed, 6 at character 41 WARNING: TIMESTAMP(10) WITH TIME ZONE precision reduced to maximum allowed, 6 LINE 1: select '2015-11-11 11:11:11.123456789'::timestamp(10) with t... ^ timestamptz ------------------------------- 2015-11-11 11:11:11.123457+09 (1 row) [local] 32289 naoya=# select '11.123456789'::interval(10); WARNING: INTERVAL(10) precision reduced to maximum allowed, 6 at character 24 WARNING: INTERVAL(10) precision reduced to maximum allowed, 6 LINE 1: select '11.123456789'::interval(10); ^ interval ----------------- 00:00:11.123457 (1 row) --- > >> --- C:/work/psqlodbc-a2def3d/convert.c.orig Wed Sep 23 16:14:10 2015 > >> +++ C:/work/psqlodbc-a2def3d/convert.c Thu Sep 24 09:01:50 2015 > >> @@ -1247,8 +1247,7 @@ > >> case PG_TYPE_TIMESTAMP: > >> /* sprintf(rgbValueBindRow, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d", > >> std_time.y, std_time.m, std_time.d, std_time.hh, std_time.mm, std_time.ss); > >> */ > >> - len = stime2timestamp(&std_time, rgbValueBindRow, cbValueMax, FALSE, > >> - (int) (cbValueMax - len - 2) ); > >> + len = stime2timestamp(&std_time, rgbValueBindRow, cbValueMax, FALSE, 6 ); > >> if (len + 1 > cbValueMax) > >> result = COPY_RESULT_TRUNCATED; > >> break; Regards, Naoya --- Naoya Anzai Engineering Department NEC Solution Inovetors, Ltd. E-Mail: nao-anzai@xc.jp.nec.com ---