Re: 32-bit ints on 64-bit linux - Mailing list pgsql-odbc
From | Kelly Burkhart |
---|---|
Subject | Re: 32-bit ints on 64-bit linux |
Date | |
Msg-id | 422727B1.9040104@kkcsm.net Whole thread Raw |
In response to | 32-bit ints on 64-bit linux (Kelly Burkhart <pgkrb@kkcsm.net>) |
Responses |
Re: 32-bit ints on 64-bit linux
Re: 32-bit ints on 64-bit linux |
List | pgsql-odbc |
Replying to my own message... Kelly Burkhart wrote: > Greetings, > > I am having a problem in running some code in 64 bit unix. I'm running > unixODBC and psqlodbc-08.00.0005 on SuSE 9.1 x86-64. > > If I bind a 32 bit integer using SQL_INTEGER/SQL_C_LONG and pass a value > of -1, the insert fails with an 'integer out of range' error. The > reason this happens is the sprintf near line 2658 of convert.c. > > case SQL_C_SLONG: > case SQL_C_LONG: > sprintf(param_string, "%ld", > *((SDWORD *) buffer)); > break; It appears that SQL_C_LONG does correspond to a 32-bit integer and not the native long. I'm attaching a patch which fixes this, and some other questionable sprintf format strings in convert.c. -K --- psqlodbc-08.00.0005/convert.c 2005-01-17 04:12:52.000000000 -0600 +++ psqlodbc-08.00.0005.patch/convert.c 2005-03-03 08:26:38.443591978 -0600 @@ -180,18 +180,31 @@ #ifdef WIN32 #define ATOI64 _atoi64 #define ATOI64U _atoi64 -#define FORMATI64 "%I64d" -#define FORMATI64U "%I64u" #elif defined(HAVE_STRTOLL) #define ATOI64(val) strtoll(val, NULL, 10) #define ATOI64U(val) strtoull(val, NULL, 10) -#define FORMATI64 "%lld" -#define FORMATI64U "%llu" #else /* HAVE_STRTOLL */ #endif /* WIN32 */ #endif /* ODBCINT64 */ /* + * sprintf formats + */ +#define FORMATI8 "%hhd" +#define FORMATI8U "%hhu" +#define FORMATI16 "%hd" +#define FORMATI16U "%hu" +#define FORMATI32 "%d" +#define FORMATI32U "%u" +#ifdef WIN32 +# define FORMATI64 "%I64d" +# define FORMATI64U "%I64u" +#else +# define FORMATI64 "%lld" +# define FORMATI64U "%llu" +#endif + +/* * TIMESTAMP <-----> SIMPLE_TIME * precision support since 7.2. * time zone support is unavailable(the stuff is unreliable) @@ -2655,7 +2668,7 @@ case SQL_C_SLONG: case SQL_C_LONG: - sprintf(param_string, "%ld", + sprintf(param_string, FORMATI32, *((SDWORD *) buffer)); break; @@ -2673,28 +2686,28 @@ #endif /* ODBCINT64 */ case SQL_C_SSHORT: case SQL_C_SHORT: - sprintf(param_string, "%d", + sprintf(param_string, FORMATI16, *((SWORD *) buffer)); break; case SQL_C_STINYINT: case SQL_C_TINYINT: - sprintf(param_string, "%d", + sprintf(param_string, FORMATI8, *((SCHAR *) buffer)); break; case SQL_C_ULONG: - sprintf(param_string, "%lu", + sprintf(param_string, FORMATI32U, *((UDWORD *) buffer)); break; case SQL_C_USHORT: - sprintf(param_string, "%u", + sprintf(param_string, FORMATI16U, *((UWORD *) buffer)); break; case SQL_C_UTINYINT: - sprintf(param_string, "%u", + sprintf(param_string, FORMATI8U, *((UCHAR *) buffer)); break;
pgsql-odbc by date: