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
|
Список | 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 по дате отправления: