Thread: Problems with 8.4, FLOAT8PASSBYVAL and x86_64 GNU/Linux

Problems with 8.4, FLOAT8PASSBYVAL and x86_64 GNU/Linux

From
Rafael Martinez
Date:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hello

We have a C function that works without problems when we use it with
postgresql 8.3 (32/64bit) and with postgreSQL 8.4 (32bit).

But with 8.4 in a 64bit server, postgresql generates this error when we
try to install the function:

ERROR:  incompatible library "/usr/local/lib/pg_uname_8.4.so": magic
block mismatch
DETAIL:  Server has FLOAT8PASSBYVAL = true, library has false.

This is the query we use to install the function:

CREATE OR REPLACE FUNCTION pg_uname(text) RETURNS text
    AS '/usr/local/lib/pg_uname_8.4.so', 'pg_uname'
    LANGUAGE c STRICT;

The only reference we have found about this is in the 8.4 changelog:

" ... Pass float8, int8, and related datatypes by value inside the
server on 64-bit platforms (Zoltan Boszormenyi)

Add configure option --disable-float8-byval to use the old behavior. As
above, this change might break old-style external C functions. ..."

We cannot find more information in the documentation about things we
should change so the function works with 8.4 without using
- --disable-float8-byval under the compilation of postgresql.

What do we need to change in the function to avoid this problem?

The function we are talking about is this one:
- -------------------------------------------------------------------
#include "postgres.h"
#include <string.h>
#include "fmgr.h"
#include <sys/utsname.h>

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

PG_FUNCTION_INFO_V1(pg_uname);

Datum
pg_uname(PG_FUNCTION_ARGS)
{
    text *argument = PG_GETARG_TEXT_P(0);
    size_t argumentlen = VARSIZE(argument)-VARHDRSZ;

    text *result = (text *) palloc(256);
    char *option = (char *) palloc(argumentlen+1);

    char sysname[] = "sysname";
    char nodename[] = "nodename";
    char release[] = "release";
    char version[] = "version";
    char machine[] = "machine";
    char null[] = "null";

    struct utsname uname_pointer;
    uname(&uname_pointer);

    memcpy(option,VARDATA(argument),argumentlen);
    option[argumentlen] = '\0';

    if (strcmp(option,sysname) == 0){
      SET_VARSIZE(result, strlen(uname_pointer.sysname) + VARHDRSZ);

memcpy(VARDATA(result),uname_pointer.sysname,strlen(uname_pointer.sysname));
    }
    else if (strcmp(option,nodename) == 0){
      SET_VARSIZE(result, strlen(uname_pointer.nodename) + VARHDRSZ);

memcpy(VARDATA(result),uname_pointer.nodename,strlen(uname_pointer.nodename));
    }
    else if (strcmp(option,release) == 0){
       SET_VARSIZE(result, strlen(uname_pointer.release) + VARHDRSZ);

memcpy(VARDATA(result),uname_pointer.release,strlen(uname_pointer.release));
    }
    else if (strcmp(option,version) == 0){
      SET_VARSIZE(result, strlen(uname_pointer.version) + VARHDRSZ);

memcpy(VARDATA(result),uname_pointer.version,strlen(uname_pointer.version));
 }
    else if (strcmp(option,machine) == 0){
      SET_VARSIZE(result, strlen(uname_pointer.machine) + VARHDRSZ);

memcpy(VARDATA(result),uname_pointer.machine,strlen(uname_pointer.machine));
    }
    else{
      memcpy(VARDATA(result),null,sizeof(null));
    }

    pfree(option);
    PG_RETURN_TEXT_P(result);
}

- -------------------------------------------------------------------
Thanks in advance.

regards,
- --
 Rafael Martinez, <r.m.guerrero@usit.uio.no>
 Center for Information Technology Services
 University of Oslo, Norway

 PGP Public Key: http://folk.uio.no/rafael/
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.7 (GNU/Linux)

iD8DBQFKXu+GBhuKQurGihQRAqP/AJ4p7DPCwMYzEdO/cykEqf2QpSuiygCeMp9D
GGwluLrii7FRy6+GLo86P3I=
=APUL
-----END PGP SIGNATURE-----

Re: Problems with 8.4, FLOAT8PASSBYVAL and x86_64 GNU/Linux

From
Peter Eisentraut
Date:
On Thursday 16 July 2009 12:14:48 Rafael Martinez wrote:
> ERROR:  incompatible library "/usr/local/lib/pg_uname_8.4.so": magic
> block mismatch
> DETAIL:  Server has FLOAT8PASSBYVAL = true, library has false.

You need to recompile your module.

Re: Problems with 8.4, FLOAT8PASSBYVAL and x86_64 GNU/Linux

From
Rafael Martinez
Date:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Peter Eisentraut wrote:
> On Thursday 16 July 2009 12:14:48 Rafael Martinez wrote:
>> ERROR:  incompatible library "/usr/local/lib/pg_uname_8.4.so": magic
>> block mismatch
>> DETAIL:  Server has FLOAT8PASSBYVAL = true, library has false.
>
> You need to recompile your module.

Hei

We recompile the module automatically when a new postgres cluster gets
installed. The module has been compiled locally on the 64bit server that
is going to use it.

Any other ideas?

This is the Makefile we use:
- ---------------------------------------
PG_SRC=/usr/local/src
PG_LIB=/usr/local/lib
SERVER_INCLUDES += -I $(shell /local/opt/pgsql-8.4/bin/pg_config
- --includedir)
SERVER_INCLUDES += -I $(shell /local/opt/pgsql-8.4/bin/pg_config
- --includedir-server)

CFLAGS = $(SERVER_INCLUDES)
CC = gcc

all:            clean pg_uname_8.4 install

pg_uname_8.4:   pg_uname_8.4.c
                $(CC) $(CFLAGS) -fpic -c $<
                $(CC) $(CFLAGS) -shared -o $(basename $<).so $(basename
$<).o

install:
                cp $(PG_SRC)/pg_uname_8.4.so $(PG_LIB)/pg_uname_8.4.so

clean:
                rm -f *.o
                rm -f *.so
                rm -f *~
- ---------------------------------------

regards,
- --
 Rafael Martinez, <r.m.guerrero@usit.uio.no>
 Center for Information Technology Services
 University of Oslo, Norway

 PGP Public Key: http://folk.uio.no/rafael/
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.7 (GNU/Linux)

iD8DBQFKXvoZBhuKQurGihQRAiJdAJ9HBG33gDF16Uiu+Z5QvGDHtnzj7gCaAmBz
Lfll6Lshy8shhLK62lb3fMs=
=sIud
-----END PGP SIGNATURE-----

Re: Problems with 8.4, FLOAT8PASSBYVAL and x86_64 GNU/Linux

From
Marko Kreen
Date:
On 7/16/09, Rafael Martinez <r.m.guerrero@usit.uio.no> wrote:
> Peter Eisentraut wrote:
>  > On Thursday 16 July 2009 12:14:48 Rafael Martinez wrote:
>  >> ERROR:  incompatible library "/usr/local/lib/pg_uname_8.4.so": magic
>  >> block mismatch
>  >> DETAIL:  Server has FLOAT8PASSBYVAL = true, library has false.
>  >
>  > You need to recompile your module.
>
>  We recompile the module automatically when a new postgres cluster gets
>  installed. The module has been compiled locally on the 64bit server that
>  is going to use it.
>
>  Any other ideas?

The version you compile against is not the version you have running.

--
marko

Re: Problems with 8.4, FLOAT8PASSBYVAL and x86_64 GNU/Linux

From
Rafael Martinez
Date:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Marko Kreen wrote:
> On 7/16/09, Rafael Martinez <r.m.guerrero@usit.uio.no> wrote:
>> Peter Eisentraut wrote:
>>  >
>>  > You need to recompile your module.
>>
>>  We recompile the module automatically when a new postgres cluster gets
>>  installed. The module has been compiled locally on the 64bit server that
>>  is going to use it.
>>
>>  Any other ideas?
>
> The version you compile against is not the version you have running.
>

Well, the only version I have installed on this server is 8.4.0

- --
 Rafael Martinez, <r.m.guerrero@usit.uio.no>
 Center for Information Technology Services
 University of Oslo, Norway

 PGP Public Key: http://folk.uio.no/rafael/
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.7 (GNU/Linux)

iD4DBQFKXxucBhuKQurGihQRAi66AJiNoPt8BWw/Re7/pWY+hDCS/5ZzAKCJt/P+
psR8cTaHE8NNFC/ZjtxHFA==
=wKmk
-----END PGP SIGNATURE-----

Re: Problems with 8.4, FLOAT8PASSBYVAL and x86_64 GNU/Linux

From
Marko Kreen
Date:
On 7/16/09, Rafael Martinez <r.m.guerrero@usit.uio.no> wrote:
> Marko Kreen wrote:
>  > On 7/16/09, Rafael Martinez <r.m.guerrero@usit.uio.no> wrote:
>  >> Peter Eisentraut wrote:
>  >>  >
>
> >>  > You need to recompile your module.
>  >>
>  >>  We recompile the module automatically when a new postgres cluster gets
>  >>  installed. The module has been compiled locally on the 64bit server that
>  >>  is going to use it.
>  >>
>  >>  Any other ideas?
>  >
>  > The version you compile against is not the version you have running.
>  >
>
>
> Well, the only version I have installed on this server is 8.4.0

Yes, but the 8.4.0 you have running seems to be compiled with different
options than the 8.4.0 you compile against.

--
marko

Re: Problems with 8.4, FLOAT8PASSBYVAL and x86_64 GNU/Linux

From
Rafael Martinez
Date:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Marko Kreen wrote:
> On 7/16/09, Rafael Martinez <r.m.guerrero@usit.uio.no> wrote:

>>  >>  Any other ideas?
>>  >
>>  > The version you compile against is not the version you have running.
>>  >
>>
>> Well, the only version I have installed on this server is 8.4.0
>
> Yes, but the 8.4.0 you have running seems to be compiled with different
> options than the 8.4.0 you compile against.
>

It is the same installation and I have checked that we only have
one/same version installed.

Are you sure this problem is related to compilation? Could the problem
be anywhere else?

Thanks so far for your time

regards,
- --
 Rafael Martinez, <r.m.guerrero@usit.uio.no>
 Center for Information Technology Services
 University of Oslo, Norway

 PGP Public Key: http://folk.uio.no/rafael/
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.7 (GNU/Linux)

iD8DBQFKXyE4BhuKQurGihQRAlqQAJ9Gv12fWZHZmwRGJRwHH54WMVb1OwCgkIa3
q9Dt3nWe9UYGzjfxq1UawEA=
=5G4F
-----END PGP SIGNATURE-----

Re: Problems with 8.4, FLOAT8PASSBYVAL and x86_64 GNU/Linux

From
Alvaro Herrera
Date:
Rafael Martinez wrote:

> This is the Makefile we use:
> - ---------------------------------------
> PG_SRC=/usr/local/src
> PG_LIB=/usr/local/lib
> SERVER_INCLUDES += -I $(shell /local/opt/pgsql-8.4/bin/pg_config
> - --includedir)
> SERVER_INCLUDES += -I $(shell /local/opt/pgsql-8.4/bin/pg_config
> - --includedir-server)

I suggest you rewrite your makefile to use PGXS.  The problem might be a
difference in CFLAGS.  It would make the makefile a lot simpler too.

--
Alvaro Herrera                                http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.