Функция на Си

Проблема следующего плана, как только пытаешь работать с text * в функции, вылетают все процессы PSQL.
То есть она создается, все вроде хорошо, но как только к ней обращаешься.......

#include "postgres.h"
#include
#include "fmgr.h"

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

PG_FUNCTION_INFO_V1(copytext);

Datum copytext(PG_FUNCTION_ARGS)
{
text *t = PG_GETARG_TEXT_P(0);
PG_RETURN_TEXT_P(t);
}

в таком виде все работает:

...
{
PG_RETURN_TEXT_P("gfgfgfdgfdgfd");
}

Подобная ситуация наюлюдалсь и с char*
С чем может быть связанно?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

А что

А что возвращает PG_GETARG_TEXT_P(0)?
Уверены, что что-то сьедобное?

Да то же самое,

Да то же самое, что и ниже, типа:
Select copytext('fdfds') и все.... вылетает...

Точно также вылетает при попытке использовать SPI функции, например
SPI_connect();
SPI_finish();

Я про то, что

Я про то, что люди используют конструкции вида:

IF( PG_ARGISNULL(0) ||
       PG_ARGISNULL(1) )
   {
      PG_RETURN_NULL();
   }

прежде чем делать:

DATA = PG_GETARG_BYTEA_P(0);
type = PG_GETARG_TEXT_P(1);

Нет, не NULL

Нет, не NULL проверил так:

{
if(PG_ARGISNULL(0))
PG_RETURN_INT32(0);
else PG_RETURN_INT32(1);
}

Кстати я не уточнил, что данной проблемы нет если используется integer или float
Вылеты происходят если используется text или идет обращение к SPI функциям :-(

Я поэтому и

Я поэтому и спросил про указатели.
char* и text* - это указатели под которые надо выделять память, а integer или float это ЗНАЧЕНИЯ под которые память выделяется сразу при объявлении.

Единственное что могу посоветовать - погуглить на предмет примеров написания программ и функций другими людьми. Если найдёте в чём была проблема, не забудьте написать сюда, чтобы идущие вслед за вами не наступали на эти же грабли! :)

Я уже 4 день

Я уже 4 день гуглю :-))), до тошноты уже нагуглился, мистика да и только, может dll не так компилится. Или я с папаметрами туплю, в общем уже и не знаю.... admin если не сложно, может скомпилишь верхний код и вышлешь DLL? я по крайней мере отмету вариант с кривой компиляцией, уже и не знаю на что грешить :-(((( Если есть возможность конечно :-)
p.s. Там где пустой #include должен стоять видимо его за тэг приняли :-)

Я бы сделал, но

Я бы сделал, но у меня PostgreSQL только под Linux'ами :(
На будущее, чтобы код отображался верно - бери его в теги <code></code>

Кстати ещё одна мысль - может и дурацкая, но почему бы не проверить?
Сделайте не присвоение указателю, а выделение памяти и memcpy, ну типа

text *t;
 
t = (text *t) malloc(sizeof(PG_GETARG_TEXT_P(0));
memcpy(t, PG_GETARG_TEXT_P(0), sizeof(PG_GETARG_TEXT_P(0));
PG_RETURN_TEXT_P(t);

Не уверен правда точно в синтаксисе и правильности определения размера содержимого по указателю - давно на C не писал, но мысль я думаю вы поняли  :)

Кто нибудь решил проблему?

Такая же проблема. При вызове функции выделения памяти (palloc()) процесс postgresql вылетает с ошибкой (память не может быть read...). Есть подозрение что проблема в неправильном компилировании. Для компиляции пользовался MinGW.Есть даже подробная инструкция (http://www.sql.ru/forum/actualthread.aspx?tid=435875&hl=%f5%f0%e0%ed%e8%...).

P.S.: А фунцию malloc использовать нельзя, ибо выделенная ею память не освободится автоматически постгресом после вызова процедуры....

Решение найдено!

Если кому интересно, дело было в библиотеке libintl. Дело в том что при компиляции я её отключал (потому что небыло такой у меня). Так что решение оказалось простое: качаем библиотеку с сайта MinGW (ссылка с архива: http://sourceforge.net/project/showfiles.php?group_id=23617), укладываем libintl.h и libintl.lib в header и lib директории соответвенно и вперед!

PS: Почему этой библиотеки нет в поставки с posgreSQL, не понятно((

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023