Проблема следующего плана, как только пытаешь работать с 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();
Я про то, что
Я про то, что люди используют конструкции вида:
прежде чем делать:
Нет, не 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, ну типа
Не уверен правда точно в синтаксисе и правильности определения размера содержимого по указателю - давно на 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, не понятно((