PQftype implementation

Started by Pavlo Golubabout 16 years ago3 messageshackers
Jump to latest
#1Pavlo Golub
pavlo.golub@cybertec.at

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

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Pavlo Golub (#1)
Re: PQftype implementation

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, "SELECT failed: %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

#3Pavlo Golub
pavlo.golub@cybertec.at
In reply to: Tom Lane (#2)
Re: PQftype implementation

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