Обсуждение: PQftype implementation
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
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
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