Discussion:
writing custom data type
(too old to reply)
Arthur Chan
2013-02-01 20:27:25 UTC
Permalink
Hey Guys,

I've been having trouble writing my own custom datatype for PG. when I do
my `CREATE FUNCTION` call, it fails with:

resultsets=# CREATE FUNCTION fuzzytime_in(cstring)
RETURNS fuzzytime
AS 'fuzzytimetype'
LANGUAGE C IMMUTABLE STRICT;
NOTICE: return type fuzzytime is only a shell
ERROR: could not find function "fuzzytime_in" in file
"/usr/lib/postgresql/9.1/lib/fuzzytimetype.so"

--

now I checked my shared lib, and surely enough, it's there

$ objdump -t /usr/lib/postgresql/9.1/lib/fuzzytimetype.so
...
00000000000018b0 g F .text 0000000000000070 fuzzytime_in
...

--

So what gives? The code has PG_MODULE_MAGIC, and I'm
calling PG_FUNCTION_INFO_V1(fuzzytime_in);

I'd really appreciate any help with this.

Cheers,
Arthur Chan
Tom Lane
2013-02-01 20:58:29 UTC
Permalink
Post by Arthur Chan
I've been having trouble writing my own custom datatype for PG. when I do
resultsets=# CREATE FUNCTION fuzzytime_in(cstring)
RETURNS fuzzytime
AS 'fuzzytimetype'
LANGUAGE C IMMUTABLE STRICT;
NOTICE: return type fuzzytime is only a shell
ERROR: could not find function "fuzzytime_in" in file
"/usr/lib/postgresql/9.1/lib/fuzzytimetype.so"
now I checked my shared lib, and surely enough, it's there
$ objdump -t /usr/lib/postgresql/9.1/lib/fuzzytimetype.so
...
00000000000018b0 g F .text 0000000000000070 fuzzytime_in
...
So what gives? The code has PG_MODULE_MAGIC, and I'm
calling PG_FUNCTION_INFO_V1(fuzzytime_in);
Huh, looks like it should work. I can think of a couple of gotchas:

(1) If the library is already loaded, CREATE FUNCTION doesn't reload it.
Maybe you have an old image of the .so in memory, which doesn't contain
the function? Try starting a fresh psql session.

(2) Maybe you compiled the function as C++, so it has a mangled name?
This theory requires that objdump automatically de-mangles names, which
I don't know for sure one way or the other.

regards, tom lane
--
Sent via pgsql-novice mailing list (pgsql-***@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-novice
Michael Swierczek
2013-02-01 21:35:55 UTC
Permalink
Post by Arthur Chan
I've been having trouble writing my own custom datatype for PG. when I do
resultsets=# CREATE FUNCTION fuzzytime_in(cstring)
RETURNS fuzzytime
AS 'fuzzytimetype'
LANGUAGE C IMMUTABLE STRICT;
NOTICE: return type fuzzytime is only a shell
ERROR: could not find function "fuzzytime_in" in file
"/usr/lib/postgresql/9.1/lib/fuzzytimetype.so"
now I checked my shared lib, and surely enough, it's there
$ objdump -t /usr/lib/postgresql/9.1/lib/fuzzytimetype.so
...
00000000000018b0 g F .text 0000000000000070 fuzzytime_in
...
I hope you are not offended if I ask the obvious question, but could it be
a permissions problem? The lib exists, but are the user or group such that
the PostgreSQL account can access it?

Good luck,
-Mike
Arthur Chan
2013-02-01 21:59:22 UTC
Permalink
Hey Tom,

Thanks for the help. It was what you said. I had to start a new psql
session. And yea, i'm pretty sure objdump does not demangle names. It would
be a nice feature if they had the demangled name in parens or something,
and that'd probably require support from glibc and gcc, no?

-Arthur
Post by Tom Lane
Post by Arthur Chan
I've been having trouble writing my own custom datatype for PG. when I do
resultsets=# CREATE FUNCTION fuzzytime_in(cstring)
RETURNS fuzzytime
AS 'fuzzytimetype'
LANGUAGE C IMMUTABLE STRICT;
NOTICE: return type fuzzytime is only a shell
ERROR: could not find function "fuzzytime_in" in file
"/usr/lib/postgresql/9.1/lib/fuzzytimetype.so"
now I checked my shared lib, and surely enough, it's there
$ objdump -t /usr/lib/postgresql/9.1/lib/fuzzytimetype.so
...
00000000000018b0 g F .text 0000000000000070 fuzzytime_in
...
So what gives? The code has PG_MODULE_MAGIC, and I'm
calling PG_FUNCTION_INFO_V1(fuzzytime_in);
(1) If the library is already loaded, CREATE FUNCTION doesn't reload it.
Maybe you have an old image of the .so in memory, which doesn't contain
the function? Try starting a fresh psql session.
(2) Maybe you compiled the function as C++, so it has a mangled name?
This theory requires that objdump automatically de-mangles names, which
I don't know for sure one way or the other.
regards, tom lane
Loading...