Re: 32-bit ints on 64-bit linux

Поиск
Список
Период
Сортировка
От Kelly Burkhart
Тема Re: 32-bit ints on 64-bit linux
Дата
Msg-id 422727B1.9040104@kkcsm.net
обсуждение исходный текст
Ответ на 32-bit ints on 64-bit linux  (Kelly Burkhart <pgkrb@kkcsm.net>)
Ответы Re: 32-bit ints on 64-bit linux  (tomas@nocrew.org (Tomas Skäre))
Re: 32-bit ints on 64-bit linux  (Peter Eisentraut <peter_e@gmx.net>)
Список 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 по дате отправления:

Предыдущее
От: Justin Dahl
Дата:
Сообщение: another access odbc problem
Следующее
От: jross@wykids.org
Дата:
Сообщение: Installation problem with psqlodbc-08_00_0100.zip