Added patch by Christof Petig to work around gcc bug...
authorMichael Meskes
Fri, 18 Mar 2005 10:00:43 +0000 (10:00 +0000)
committerMichael Meskes
Fri, 18 Mar 2005 10:00:43 +0000 (10:00 +0000)
src/interfaces/ecpg/ChangeLog
src/interfaces/ecpg/ecpglib/execute.c
src/interfaces/ecpg/ecpglib/extern.h

index 16332f014c59b81a3481e17725d959422a78a2c4..ecd7bc6026e6b901410ec91f28c516cb25df4122 100644 (file)
@@ -1914,3 +1914,10 @@ Thu Feb 10 09:03:56 CET 2005
      pointing out all these problems.
    - Set ecpg version to 3.2.1.
 
+Fri Mar 18 10:54:47 CET 2005
+     
+   - Added patch by Christof Petig  to work
+     around gcc bug on powerpc and amd64.
+   - Set ecpg library version to 5.1.
+   - Set ecpg version to 4.1.1.
+
index ac16e457dd8dc7ad3fc66d583f234bdd684e2f46..db82073ad50c64956f68c42bed5bfb6f30e318d8 100644 (file)
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.38 2004/08/29 05:06:59 momjian Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.39 2005/03/18 10:00:43 meskes Exp $ */
 
 /*
  * The aim is to get a simpler inteface to the database routines.
@@ -69,15 +69,21 @@ quote_postgres(char *arg, int lineno)
    return res;
 }
 
+#if defined(__GNUC__) && (defined (__powerpc__) || defined(__AMD64__))
+#define APREF ap
+#else
+#define APREF *ap
+#endif
+
 void
-ECPGget_variable(va_list *ap, enum ECPGttype type, struct variable * var, bool indicator)
+ECPGget_variable(va_list APREF, enum ECPGttype type, struct variable * var, bool indicator)
 {
    var->type = type;
-   var->pointer = va_arg(*ap, char *);
+   var->pointer = va_arg(APREF, char *);
 
-   var->varcharsize = va_arg(*ap, long);
-   var->arrsize = va_arg(*ap, long);
-   var->offset = va_arg(*ap, long);
+   var->varcharsize = va_arg(APREF, long);
+   var->arrsize = va_arg(APREF, long);
+   var->offset = va_arg(APREF, long);
 
    if (var->arrsize == 0 || var->varcharsize == 0)
        var->value = *((char **) (var->pointer));
@@ -97,11 +103,11 @@ ECPGget_variable(va_list *ap, enum ECPGttype type, struct variable * var, bool i
 
    if (indicator)
    {
-       var->ind_type = va_arg(*ap, enum ECPGttype);
-       var->ind_pointer = va_arg(*ap, char *);
-       var->ind_varcharsize = va_arg(*ap, long);
-       var->ind_arrsize = va_arg(*ap, long);
-       var->ind_offset = va_arg(*ap, long);
+       var->ind_type = va_arg(APREF, enum ECPGttype);
+       var->ind_pointer = va_arg(APREF, char *);
+       var->ind_varcharsize = va_arg(APREF, long);
+       var->ind_arrsize = va_arg(APREF, long);
+       var->ind_offset = va_arg(APREF, long);
 
        if (var->ind_type != ECPGt_NO_INDICATOR
            && (var->ind_arrsize == 0 || var->ind_varcharsize == 0))
@@ -120,6 +126,7 @@ ECPGget_variable(va_list *ap, enum ECPGttype type, struct variable * var, bool i
            var->ind_varcharsize = 0;
    }
 }
+#undef APREF
 
 /*
  * create a list of variables
@@ -170,7 +177,11 @@ create_statement(int lineno, int compat, int force_indicator, struct connection
            if (!(var = (struct variable *) ECPGalloc(sizeof(struct variable), lineno)))
                return false;
 
+#if defined(__GNUC__) && (defined (__powerpc__) || defined(__AMD64__))
+           ECPGget_variable(ap, type, var, true);
+#else
            ECPGget_variable(&ap, type, var, true);
+#endif
 
            /* if variable is NULL, the statement hasn't been prepared */
            if (var->pointer == NULL)
index 8a04ad0aaf12d7ed59d38593139238e5ad14ec77..846e205d281b8ee5c585c07703f096355d1810a5 100644 (file)
@@ -125,7 +125,12 @@ PGresult  **ECPGdescriptor_lvalue(int line, const char *descriptor);
 bool ECPGstore_result(const PGresult *results, int act_field,
                 const struct statement * stmt, struct variable * var);
 bool       ECPGstore_input(const int, const bool, const struct variable *, const char **, bool *);
+#if defined(__GNUC__) && (defined (__powerpc__) || defined(__AMD64__))
+  // work around a gcc/ABI bug with va_lists on ppc+amd64
+void       ECPGget_variable(va_list, enum ECPGttype, struct variable *, bool);
+#else
 void       ECPGget_variable(va_list *, enum ECPGttype, struct variable *, bool);
+#endif
 
 /* SQLSTATE values generated or processed by ecpglib (intentionally
  * not exported -- users should refer to the codes directly) */