Custom data type in C with one fixed and one variable attribute

Поиск
Список
Период
Сортировка
От Adrian Schreyer
Тема Custom data type in C with one fixed and one variable attribute
Дата
Msg-id CACYduyJRE13qye7nBJ+u0=iYE7CR4xX3cYGY+rZU7-c8t=LXuw@mail.gmail.com
обсуждение исходный текст
Ответы Re: Custom data type in C with one fixed and one variable attribute
Список pgsql-general
Hi,

I am trying to create a custom data type in C that has a fixed size
and a variable size attribute - is that actually possible? The
documentation mentions only one or the other but a struct in the
pg_trgm extension (TRGM) seems to have that.

The data type I have is

typedef struct {
        int4   length;
        uint32 foo;
        char   bar[1];
    } oefp;

The external representation of that data type would be (1,
'hexadecimal string here'), for example.

This is my _in function to parse the external cstring.

PG_FUNCTION_INFO_V1(mydatatype_in);
Datum mydatatype_in(PG_FUNCTION_ARGS)
{
    char   *rawcstring = PG_GETARG_CSTRING(0);

    uint32  foo;
    char   *buffer = (char *) palloc(strlen(rawcstring));

    if (sscanf(rawcstring, "(%u,%[^)])", &foo, buffer) != 2)
    {
        ereport(ERROR,
                (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
                 errmsg("Invalid input syntax: \"%s\"", rawcstring)));
    }

    mydatatype *dt = (mydatatype*) palloc(VARHDRSZ + sizeof(uint32) +
strlen(buffer));

    SET_VARSIZE(dt, VARHDRSZ + sizeof(uint32) + strlen(buffer));
    memcpy(dt->bar, buffer, strlen(buffer));
    dt->foo = foo;

    PG_RETURN_POINTER(dt);
}

The problem is however that dt->bar contains not only the input string
but random characters or other garbage as well, so something must go
wrong at the end of the function. Any thoughts what it could be?

Cheers,

Adrian

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

Предыдущее
От: Scott Mead
Дата:
Сообщение: Re: Server hitting 100% CPU usage, system comes to a crawl.
Следующее
От: Brian Fehrle
Дата:
Сообщение: Re: Server hitting 100% CPU usage, system comes to a crawl.