From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | Charles Cui <charles(dot)cui1984(at)gmail(dot)com> |
Cc: | Aleksander Alekseev <a(dot)alekseev(at)postgrespro(dot)ru>, Aleksandr Parfenov <a(dot)parfenov(at)postgrespro(dot)ru>, Anastasia Lubennikova <a(dot)lubennikova(at)postgrespro(dot)ru>, Andrey Borodin <x4mmm(at)yandex-team(dot)ru>, PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: [GSoC] create type questions |
Date: | 2018-06-02 01:28:09 |
Message-ID: | 9906.1527902889@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Charles Cui <charles(dot)cui1984(at)gmail(dot)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
From | Date | Subject | |
---|---|---|---|
Next Message | Masahiko Sawada | 2018-06-02 01:32:19 | Re: New committers announced at PGCon 2018 |
Previous Message | Tatsuo Ishii | 2018-06-02 01:21:10 | Re: New committers announced at PGCon 2018 |