you can find in the code I provide below.

I compile my C library using GCC 4.5 under Linux and Visual Studio 2010

under Windows.

The problem is when I run this command: *SELECT to_composite('((1, 2), (3,

4))'::m_segment_base)*.

This is the result I get in Windows and Linux respectively:

Windows: "("(1,2)","(3,4)")"

Linux: "("(1,)",)"

Probably the composite type is not created well in function "to_composite",

but I guess the code should be OK since it works under MSVC...

*So my question is why this doesn't work under Linux? And how can I fix it

of course.*

Here is my code in SQL and C:

***SQL code***

>

CREATE TYPE m_point_composite AS

(

x double precision,

y double precision

);

CREATE TYPE m_segment_composite AS

(

i m_point_composite,

e m_point_composite

);

CREATE TYPE m_point_base

(

INTERNALLENGTH = 16,

INPUT = m_point_base_in,

OUTPUT = m_point_base_out,

RECEIVE = m_point_base_recv,

SEND = m_point_base_send,

ALIGNMENT = double

);

CREATE TYPE m_segment_base

(

INTERNALLENGTH = 32,

INPUT = m_segment_base_in,

OUTPUT = m_segment_base_out,

RECEIVE = m_segment_base_recv,

SEND = m_segment_base_send,

ALIGNMENT = double

);

CREATE OR REPLACE FUNCTION to_composite(m_segment_base)

RETURNS m_segment_composite AS

'$libdir/myLib','to_composite'

LANGUAGE 'C' IMMUTABLE STRICT;

***C code***

struct m_point_base {

float8 x;

float8 y;

};

struct m_segment_base {

m_point_base i;

m_point_base e;

};

PGDLLEXPORT Datum to_composite(PG_FUNCTION_ARGS) {

m_segment_base *in = (m_segment_base *) PG_GETARG_POINTER(0);

TupleDesc tupdesc;

bool isnull;

Datum vi[2];

HeapTuple i;

Datum ve[2];

HeapTuple e;

Datum vout[2];

HeapTuple out;

TupleDesc tupdesc_m_point_composite =

RelationNameGetTupleDesc("m_point_composite");

vi[0] = Float8GetDatum(in->i.x);

vi[1] = Float8GetDatum(in->i.y);

i = heap_form_tuple(tupdesc_m_point_composite, vi, &isnull);

ve[0] = Float8GetDatum(in->e.x);

ve[1] = Float8GetDatum(in->e.y);

e = heap_form_tuple(tupdesc_m_point_composite, ve, &isnull);

vout[0] = HeapTupleGetDatum(i);

vout[1] = HeapTupleGetDatum(e);

if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)

{

ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),

errmsg("function returning record called in context that cannot accept type

record")));

}

BlessTupleDesc(tupdesc);

out = heap_form_tuple(tupdesc, vout, &isnull);

PG_RETURN_DATUM(HeapTupleGetDatum(out)); }

PG_FUNCTION_INFO_V1(to_composite)

;

x double precision,

y double precision

);

CREATE TYPE m_segment_composite AS

(

i m_point_composite,

e m_point_composite

);

CREATE TYPE m_point_base

(

INTERNALLENGTH = 16,

INPUT = m_point_base_in,

OUTPUT = m_point_base_out,

RECEIVE = m_point_base_recv,

SEND = m_point_base_send,

ALIGNMENT = double

);

CREATE TYPE m_segment_base

(

INTERNALLENGTH = 32,

INPUT = m_segment_base_in,

OUTPUT = m_segment_base_out,

RECEIVE = m_segment_base_recv,

SEND = m_segment_base_send,

ALIGNMENT = double

);

CREATE OR REPLACE FUNCTION to_composite(m_segment_base)

RETURNS m_segment_composite AS

'$libdir/myLib','to_composite'

LANGUAGE 'C' IMMUTABLE STRICT;

***C code***

struct m_point_base {

float8 x;

float8 y;

};

struct m_segment_base {

m_point_base i;

m_point_base e;

};

PGDLLEXPORT Datum to_composite(PG_FUNCTION_ARGS) {

m_segment_base *in = (m_segment_base *) PG_GETARG_POINTER(0);

TupleDesc tupdesc;

bool isnull;

Datum vi[2];

HeapTuple i;

Datum ve[2];

HeapTuple e;

Datum vout[2];

HeapTuple out;

TupleDesc tupdesc_m_point_composite =

RelationNameGetTupleDesc("m_point_composite");

vi[0] = Float8GetDatum(in->i.x);

vi[1] = Float8GetDatum(in->i.y);

i = heap_form_tuple(tupdesc_m_point_composite, vi, &isnull);

ve[0] = Float8GetDatum(in->e.x);

ve[1] = Float8GetDatum(in->e.y);

e = heap_form_tuple(tupdesc_m_point_composite, ve, &isnull);

vout[0] = HeapTupleGetDatum(i);

vout[1] = HeapTupleGetDatum(e);

if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)

{

ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),

errmsg("function returning record called in context that cannot accept type

record")));

}

BlessTupleDesc(tupdesc);

out = heap_form_tuple(tupdesc, vout, &isnull);

PG_RETURN_DATUM(HeapTupleGetDatum(out)); }

PG_FUNCTION_INFO_V1(to_composite)

;