From: | Charles Cui <charles(dot)cui1984(at)gmail(dot)com> |
---|---|
To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
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 15:36:18 |
Message-ID: | CA+SXE9stA4WdnPDAHpKrBs1CCTaruo1OT16SOD7H1vzA=wHDMg@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Hi Tom,
Thanks for your comments, I do forget create type shell.
But even if I add this line still does not work.
Here is the commit that can demo my bug (
https://github.com/charles-cui/pg_thrift/commit/8b43f3e2172f4a1b4e61211f7d76b061a90c38f7
)
To see it, download the repo and do make install && make installcheck.
It cannot return a bytea as expected.
Thanks Charles!
2018-06-01 18:28 GMT-07:00 Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>:
> 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 | Heikki Linnakangas | 2018-06-02 17:08:56 | Re: SCRAM with channel binding downgrade attack |
Previous Message | Haroon . | 2018-06-02 10:06:30 | Re: New committers announced at PGCon 2018 |