Major problem with custom data type

Поиск
Список
Период
Сортировка
От Morgan Kita
Тема Major problem with custom data type
Дата
Msg-id 08B420FF5BF7BC42A064212C2EB768801C1093@neutron.verseon.com
обсуждение исходный текст
Ответы Re: Major problem with custom data type  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-novice
Hi,

I posted a message yesterday about creating a custom datatype where I store an array of custom strucs. Well I finished
implementingit today, but I can not get it to work within postgres. I have compiled the C code in a seperate test
file(rippingout all the postgres related function calls), and gotten it to store my custom data type perfectly and then
spitit back out as a string. My problem is when I try to use it in postgres, the input argument to my output
function(thepointer to the data) seems to be corrupted somehow. 

In my input function I have this(after parsing the input string and setting up the data):
/*
The AtomLocation is the type of the struc to be stored in the array
temp_index is the number of structs to be stored and I add 4 for the word at the beginning that tells postgres the
length.
point_strucs is a pointer to the beginning of the actual strucs.
temp_points is a local array that is temporarily holding the data that is internal to the strucs./*

  result = (void *) palloc((sizeof(AtomLocation) * temp_index) + 4);
  *((int *) result) = (sizeof(AtomLocation) * temp_index) + 4;
  point_strucs = (AtomLocation *) (((char *) result) + 4);

  for(i = 0; i < temp_index; i++){
    point_strucs[i].index = temp_points[i].index;
    point_strucs[i].x = temp_points[i].x;
    point_strucs[i].y = temp_points[i].y;
    point_strucs[i].z = temp_points[i].z;
  }

  PG_RETURN_POINTER(result);

My output function is obviously not getting passed something correctly. My first two lines are:

int* result = (int *) PG_GETARG_POINTER(0);
int length = *result - 4;

By some simple fprintf statements I can see that when I try to call *result - 4, that it crashes. I used an if
statementand result is not a null pointer. So what could be going on here? I am really stumped... Keep in mind if I
abstractthis to seperate file with no postgres refrences, then IT WORKS PERFECT. So somehow I have passed something
incorrectlyto the PG database. 

P.S I tried detoasting the value and all that did was cause it to fail on the first output function line of code. This
customdata type is defined as : 
CREATE TYPE atomlocation (
   internallength = VARIABLE,
   input = atomlocation_in,
   output = atomlocation_out
);

В списке pgsql-novice по дате отправления:

Предыдущее
От: Michael Fuhr
Дата:
Сообщение: Re: how to ignore accents?
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Major problem with custom data type