From: | Unprivileged user <nobody> |
---|---|
To: | pgsql-bugs(at)postgresql(dot)org |
Subject: | General Bug Report: using of user defined types in language C |
Date: | 1999-02-06 16:53:24 |
Message-ID: | 199902061653.LAA01651@hub.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
============================================================================
POSTGRESQL BUG REPORT TEMPLATE
============================================================================
Your name : Petr Danecek
Your email address : petr(at)ics(dot)cas(dot)cz
Category : runtime: back-end: SQL
Severity : critical
Summary: using of user defined types in language C
System Configuration
--------------------
Operating System : SunOS sun4u sparc
PostgreSQL version : 6.4.2
Compiler used : gcc 2.7.2
Hardware:
---------
SunOS academy 5.5.1 Generic_103640-20 sun4u sparc
Versions of other tools:
------------------------
flex version 2.5.4
GNU Make version 3.75
--------------------------------------------------------------------------
Problem Description:
--------------------
When I define my own type in language C or C++,
it is not possible to work with it (except in one rare case,
that I will describe below).
Psql (or also my own interface) halts (may be doing an
infinite loop? - in earlier versions of postgres it
core dumped).
I do not observe this situation, when the new type
is in the postgres table as the *last* one.
But when it is followed with anything, it crashes.
I can define the type, I can insert into table, but the
query "SELECT * FROM table" will never succeed.
I prepared a very simple type, so I may be pretty sure
that I did not make any mistake. Then I compile it (using
the example from the documentation), run postgres,
create new table, function and insert values in it.
>From debug outputs from my _in and _out functions I now
my code runs correctly.
The problem comes when my function is left. Postmaster
writes: "NOTICE: PortalHeapMemoryFree: 0x1a32d0 not in alloc set!"
--------------------------------------------------------------------------
Test Case:
----------
Here is my example.
First the C code:
---------------------------------
#include <string.h>
#include <malloc.h>
typedef struct mComplex {
double x;
double y;
} mComplex;
mComplex *
mcomplex_in(char *str) {
double x, y;
mComplex *result = NULL;
result = malloc (sizeof(mComplex));
result->x = 1;
result->y = 2;
return (result);
}
char *
mcomplex_out(mComplex *mcomplex) {
char *result = NULL;
result = strdup ("(2,3)");
return(result);
}
----------------------------------------
Then what I send to backend:
----------------------------------------
CREATE FUNCTION mcomplex_in(opaque)
RETURNS mcomplex
AS '/export/home/gis/projekt/mapa/date/libpgdate.so'
LANGUAGE 'c';
CREATE FUNCTION mcomplex_out(opaque)
RETURNS opaque
AS '/export/home/gis/projekt/mapa/date/libpgdate.so'
LANGUAGE 'c';
CREATE TYPE mcomplex (
internallength = 16,
input = mcomplex_in,
output = mcomplex_out
);
create table pok3 (co mcomplex, jmeno varchar);
insert into pok3 (co,jmeno) values ('pok','pok');
select * from pok3;
-------------------------------------
The C code I compile as:
gcc -fPIC -shared -c file.c
ld -dc -dp -Bdynamic -o libpgdate.so file.o
--------------------------------------------------------------------------
Solution:
---------
--------------------------------------------------------------------------
From | Date | Subject | |
---|---|---|---|
Next Message | bugsbuny | 1999-02-09 20:12:43 | Re: info |
Previous Message | Bruce Momjian | 1999-02-05 02:08:56 | Re: [BUGS] General Bug Report: Manpage for pgbuiltin(3) missing |