Charles Cui <charles.cui1...@gmail.com> writes: > I have a new type defined like this > CREATE TYPE thrift_binary ( > INPUT = thrift_binary_in, > OUTPUT = thrift_binary_out, > LIKE = bytea > );
> in thrift_binary_in, it accepts cstring and returns thrift_binary. OK, that's what it should do. > And in > this function I returned a bytea because the create type tells the system > thrift_binary and bytea are the same. Sure, PG_RETURN_BYTEA_P() would work in the C code. I think it might be worth inventing a macro PG_RETURN_THRIFT_BINARY_P that's a thin wrapper around that, just for clarity's sake, but it doesn't matter functionally. > However, the test passes only when I > explicitly tell thrift_binary_in to return a bytea (change the return type > from thrift_binary to bytea), and it does not work when returns > thrift_binary. What do you mean by "the test passes" (or doesn't pass)? What do you mean by "tell thrift_binary_in to return a bytea"? You just said you were already doing that. This works for me: regression=# create type thrift_binary; CREATE TYPE regression=# create function thrift_binary_in(cstring) returns thrift_binary regression-# strict immutable language internal as 'byteain'; NOTICE: return type thrift_binary is only a shell CREATE FUNCTION regression=# create function thrift_binary_out(thrift_binary) returns cstring regression-# strict immutable language internal as 'byteaout'; NOTICE: argument type thrift_binary is only a shell CREATE FUNCTION regression=# CREATE TYPE thrift_binary ( regression(# INPUT = thrift_binary_in, regression(# OUTPUT = thrift_binary_out, regression(# LIKE = bytea regression(# ); CREATE TYPE I cheated here by pointing to byteain/byteaout instead of C functions that'd actually do what you want, but CREATE TYPE doesn't know that. I suspect you may have forgotten the initial dummy creation of thrift_binary as a "shell type". regards, tom lane