Обсуждение: PQftype implementation

Поиск
Список
Период
Сортировка

PQftype implementation

От
Pavel Golub
Дата:
Hello, Pgsql-hackers.

The script:

CREATE TYPE my_varchar;


CREATE OR REPLACE FUNCTION my_varcharout(my_varchar) RETURNS cstring AS
'varcharout' LANGUAGE 'internal' IMMUTABLE STRICT COST 1;

CREATE OR REPLACE FUNCTION my_varcharin(cstring, oid, integer) RETURNS my_varchar AS
'varcharin' LANGUAGE 'internal' IMMUTABLE STRICT COST 1; 
CREATE TYPE my_varchar  (INPUT=my_varcharin, OUTPUT=my_varcharout, DEFAULT='',      INTERNALLENGTH=-1, ALIGNMENT=int4,
STORAGE=EXTENDED,     TYPMOD_IN=varchartypmodin, TYPMOD_OUT=varchartypmodout);
 

CREATE TABLE my_varchar_test(
id serial primary key,
info my_varchar(100)
)

Here I created user-defined type "my_varchar" for internal tests. But
PQftype returns 1043 (varchar oid) for the "info" column.

I'm a little bit confused of such behaviour. What am I missing?
Ans where in the sources can I find the way server fills
res->attDescs[field_num].typid?

Thanks in advance.

-- 
With best wishes,Pavel                          mailto:pavel@gf.microolap.com



Re: PQftype implementation

От
Tom Lane
Дата:
Pavel Golub <pavel@microolap.com> writes:
> Here I created user-defined type "my_varchar" for internal tests. But
> PQftype returns 1043 (varchar oid) for the "info" column.

Really?  I tried it and got 172069, which is about right for where the
OID counter is in my database.  I think you messed up your test.
res = PQexec(conn, "select * from my_varchar_test");if (PQresultStatus(res) != PGRES_TUPLES_OK){    fprintf(stderr,
"SELECTfailed: %s", PQerrorMessage(conn));    PQclear(res);    exit_nicely(conn);}
 
nFields = PQnfields(res);for (i = 0; i < nFields; i++)    printf("%-15s %d\n", PQfname(res, i), PQftype(res, i));
        regards, tom lane


Re: PQftype implementation

От
Pavel Golub
Дата:
Hello, Tom.

Yes, you are absolutely right. My bad!

Sorry guys! :)

You wrote:

TL> Pavel Golub <pavel@microolap.com> writes:
>> Here I created user-defined type "my_varchar" for internal tests. But
>> PQftype returns 1043 (varchar oid) for the "info" column.

TL> Really?  I tried it and got 172069, which is about right for where the
TL> OID counter is in my database.  I think you messed up your test.

TL>         res = PQexec(conn, "select * from my_varchar_test");
TL>         if (PQresultStatus(res) != PGRES_TUPLES_OK)
TL>         {
TL>                 fprintf(stderr, "SELECT failed: %s", PQerrorMessage(conn));
TL>                 PQclear(res);
TL>                 exit_nicely(conn);
TL>         }

TL>         nFields = PQnfields(res);
TL>         for (i = 0; i < nFields; i++)
TL>                 printf("%-15s %d\n", PQfname(res, i), PQftype(res, i));

TL>                         regards, tom lane



-- 
With best wishes,Pavel                          mailto:pavel@gf.microolap.com