Thus spake Tom Lane
> darcy@druid.net (D'Arcy J.M. Cain) writes:
> > create function chkpass_rout(opaque)
> > returns opaque
> > as '/usr/pgsql/modules/chkpass.so'
> > language 'c';
>
> > Here is what happens.
>
> > soccer=> select chkpass_rout('hello'::chkpass);
> > ERROR: typeidTypeRelid: Invalid type - oid = 0
>
> Functions that you intend to invoke as ordinary functions shouldn't have
> inputs or outputs declared "opaque", because the expression evaluation
> code won't have any idea what to do. When you are building functions
> that will be the input or output converters for a datatype, you can read
> "opaque" as meaning "C string", so for example the input converter takes
> opaque and returns your type. But otherwise you don't want to be using
> opaque. Perhaps what you wanted here was
> "create function chkpass_rout(chkpass) returns text".
OK, I tried this.
load '/usr/pgsql/modules/chkpass.so';
--
-- Input and output functions and the type itself:
--
create function chkpass_in(opaque) returns opaque as '/usr/pgsql/modules/chkpass.so' language 'c';
create function chkpass_out(opaque) returns opaque as '/usr/pgsql/modules/chkpass.so' language 'c';
create type chkpass ( internallength = 16, externallength = 13, input = chkpass_in, output = chkpass_out
);
create function raw(chkpass) returns text as '/usr/pgsql/modules/chkpass.so', 'chkpass_rout' language 'c';
Then I did this.
darcy=> select 'hello'::chkpass;
?column?
--------------
:Rd1xqQo0.2V6.
(1 row)
darcy=> select raw('hello'::chkpass);
pqReadData() -- backend closed the channel unexpectedly. This probably means the backend terminated abnormally
before or while processing the request.
I added an fprintf to stderr as the first statement in chkpass_rout() which
doesn't print so I am pretty sure it isn't my function. The same thing
happens if I create a table with a chkpass type. Any ideas?
--
D'Arcy J.M. Cain <darcy@{druid|vex}.net> | Democracy is three wolves
http://www.druid.net/darcy/ | and a sheep voting on
+1 416 425 1212 (DoD#0082) (eNTP) | what's for dinner.