On Wed, Feb 1, 2012 at 5:23 AM, Chetan Suttraway <chetan(dot)suttraway(at)enterprisedb(dot)com> wrote:
> Hi All, > > This is regarding the TODO item : > "Add SPI_gettypmod() to return a field's typemod from a TupleDesc" > > The related message is: > http://archives.postgresql.org/pgsql-hackers/2005-11/msg00250.php > > This basically talks about having an SPI_gettypemod() which returns the > typmod of a field of tupdesc > > Please refer the attached patch based on the suggested implementation. Here's my review of this patch. Basic stuff: ------------ - Patch applies OK - Compiles cleanly with no warnings - Regression tests pass. - Documentation changes missing - "43.2. Interface Support Functions" need to add information about "SPI_gettypmod". as well as need to add the Description about "SPI_gettypmod". What it does: ---------------------- New SPI interface function is exposed. It is used for returning the atttypmod of the specified column. If attribute number is out of range then set the SPI_result to "SPI_ERROR_NOATTRIBUTE" and returns -1 else returns attributes typmod Testing: ------------------- Created C function and validated type mode for - output basic data types - numeric, varchar with valid typmod =================C-Function============================= PG_FUNCTION_INFO_V1(test_SPI_gettypmod); Datum test_SPI_gettypmod(PG_FUNCTION_ARGS) { Oid relid = PG_GETARG_OID(0); Oid AttidNo = PG_GETARG_OID(1); Relation rel; TupleDesc tupdesc; /* tuple description */ int4 retval; rel = relation_open(relid, NoLock); if (!rel) { PG_RETURN_INT32(0); } tupdesc = rel->rd_att; retval = SPI_gettypmod(tupdesc, AttidNo); relation_close(rel, NoLock); PG_RETURN_INT32(retval); } ==============Function creation================================== CREATE FUNCTION test_spi_gettypmod (oid, int) RETURNS int AS '/lib/mytest.so','test_SPI_gettypmod' LANGUAGE C STRICT; ===============Output============================================= postgres=# \d tbl Table "public.tbl" Column | Type | Modifiers --------+-----------------------------+----------- a | integer | b | character varying(100) | c | numeric(10,5) | d | numeric | e | character varying | f | timestamp without time zone | postgres=# \d tt1 Table "public.tt1" Column | Type | Modifiers --------+------------------------+----------- t | tbl | b | character varying(200) | postgres=# select atttypmod, attname from pg_attribute where attrelid = 24577; atttypmod | attname -----------+---------- -1 | tableoid -1 | cmax -1 | xmax -1 | cmin -1 | xmin -1 | ctid -1 | a 104 | b 655369 | c (9 rows) postgres=# select test_spi_gettypmod(24577, 3); test_spi_gettypmod -------------------- 655369 (1 row) postgres=# alter table tbl add column d numeric; ALTER TABLE postgres=# alter table tbl add column e varchar; ALTER TABLE postgres=# select test_spi_gettypmod(24577, 4); test_spi_gettypmod -------------------- -1 (1 row) postgres=# select test_spi_gettypmod(24577, 5); test_spi_gettypmod -------------------- -1 (1 row) postgres=# select test_spi_gettypmod( 24592, 1); test_spi_gettypmod -------------------- -1 (1 row) postgres=# alter table tt1 add column b varchar(200); ALTER TABLE postgres=# select test_spi_gettypmod( 24592, 2); test_spi_gettypmod -------------------- 204 (1 row) ============================================================ Conclusion: ------------------- The patch changes are okay but needs documentation update, So I am marking it as Waiting On Author 1. For such kind of patch, even if new regression test is not added, it is okay. 2. Documentation need to be updated. 3. In case attribute number is not in valid range, currently it return -1, but -1 is a valid typmod. Committer can verify if this is appropriate. 4. In functions exec_eval_datum & exec_get_datum_type_info according to me if we use SPI_gettypmod() to get the attribute typmod, it is better as a. there is comment /* XXX there's no SPI_gettypmod, for some reason */" and it uses SPI_gettypeid to get the typeid. b. it will maintain consistency of nearby code such as it will use functions to get typeid and binval. However there are other places in code which has similar inconsistency. Committer can suggest if these changes are required. With Regards, Amit Kapila.