From: | "Jeremy Stanley" <jeremy(at)accessdata(dot)com> |
---|---|
To: | pgsql-bugs(at)postgresql(dot)org |
Subject: | BUG #1621: ODBC binding Unicode null-terminated string parameter doesn't work |
Date: | 2005-04-23 00:53:44 |
Message-ID: | 20050423005344.A5F5BF0B24@svr2.postgresql.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
The following bug has been logged online:
Bug reference: 1621
Logged by: Jeremy Stanley
Email address: jeremy(at)accessdata(dot)com
PostgreSQL version: 8.0.2
Operating system: Windows XP SP2
Description: ODBC binding Unicode null-terminated string parameter
doesn't work
Details:
When I attempt to bind a null-terminated Unicode string parameter using
SQLBindParameter, the database engine receives a string representation of
today's date instead of the data I passed. The same issue does not occur if
I explicitly specify the length of the string instead of using SQL_NTS.
Steps to reproduce:
(Step 1) Install PostgreSQL 8.0.2 for Win32, full install
(Step 2) Create database
CREATE DATABASE pgodbctest
WITH ENCODING='UNICODE';
(Step 3) Create table
CREATE TABLE testtable
(
stringa1 text,
stringa2 text,
stringw1 text,
stringw2 text
);
(Step 4) Create ODBC DSN (substitute your own username/password here):
Data Source: pgodbctest
Database: pgodbctest
Server: localhost
User Name: postgres
Password: postgres
(Step 5) Compile and run test program (error checking omitted for
clarity):
I've compiled with VC++ 6.0 and VC++ 7.1 with no difference in behavior.
#include <windows.h>
#include <sqlext.h>
#include <stdio.h>
int main(int argc, char **argv)
{
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLCHAR thestringa[80];
SQLWCHAR thestringw[80];
SQLLEN lena, lenw, nts;
SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);
SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3,
SQL_IS_INTEGER);
SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
/* put in your own username and password here if not postgres/postgres */
SQLConnect(hdbc, "pgodbctest", SQL_NTS, "postgres", SQL_NTS, "postgres",
SQL_NTS);
SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLPrepare(hstmt, "insert into testtable (stringa1, stringa2, stringw1,
stringw2) values (?,?,?,?)", SQL_NTS);
strcpy(thestringa, "ansi test string");
lena = strlen(thestringa) * sizeof(SQLCHAR);
wcscpy(thestringw, L"unicode test string");
lenw = wcslen(thestringw) * sizeof(SQLWCHAR);
nts = SQL_NTS;
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, 0,
0, thestringa, 0, &lena);
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_LONGVARCHAR, 0,
0, thestringa, 0, &nts);
SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_WCHAR, SQL_WLONGVARCHAR,
0, 0, thestringw, 0, &lenw);
SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_WCHAR, SQL_WLONGVARCHAR,
0, 0, thestringw, 0, &nts);
SQLExecute(hstmt);
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
(Step 6) Look at results:
pgodbctest=# select * from testtable;
stringa1 | stringa2 | stringw1 | stringw2
------------------+------------------+---------------------+----------------
----
-
ansi test string | ansi test string | unicode test string | 2005-04-22
00:00:00
(1 row)
(Step 7) Expected results:
"unicode test string" should have been inserted into the stringw2
column--not today's date!
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2005-04-23 05:40:51 | Re: empty array can crash backend using int_array_enum from contrib. |
Previous Message | Nahuel Greco | 2005-04-22 19:39:33 | BUG #1620: triggers breaks with alter table (at least with plpythonu) |