Re: Using substr with user defined types

Поиск
Список
Период
Сортировка
От darcy@druid.net (D'Arcy J.M. Cain)
Тема Re: Using substr with user defined types
Дата
Msg-id m135JRS-000AY3C@druid.net
обсуждение исходный текст
Ответ на Re: Using substr with user defined types  (Tom Lane <tgl@sss.pgh.pa.us>)
Ответы Re: Using substr with user defined types  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-sql
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.


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

Предыдущее
От: Ed Loehr
Дата:
Сообщение: Re: timespan casting
Следующее
От: "Gary MacMinn"
Дата:
Сообщение: Merging two columns into one