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: