Re: PL/PGSQL: Dynamic Record Introspection
От | Pavel Stehule |
---|---|
Тема | Re: PL/PGSQL: Dynamic Record Introspection |
Дата | |
Msg-id | Pine.LNX.4.44.0507140836300.31492-100000@kix.fsv.cvut.cz обсуждение исходный текст |
Ответ на | PL/PGSQL: Dynamic Record Introspection (Titus von Boxberg <ut@bhi-hamburg.de>) |
Список | pgsql-patches |
good idea. it's what can eliminate not neccessery using plperl. I would to see it in plpgsql. regards Pavel On Thu, 14 Jul 2005, Titus von Boxberg wrote: > Hi all, > > I needed introspection capabilities for record types to write more generic > trigger procedures in PL/PGSQL. > > With the following patch it's possible to > - extract all field names of a record into an array > - extract field count of a record > - address a single field of a record with a variable > containing the field name (additional to the usual record.fieldname > notation where the fieldname is hardcoded). > > The syntax is > - record%NFIELDS gives the number of fields in the record > - record%FIELDNAMES gives the array of the field names > - record%scalarvariable extracts the field whose name > is equal to the contents of scalarvariable > > ------------ > > The patch is nonintrusive in the sense that it only adds things > with one exception: > In function exec_eval_datum(), file pl_exec.c, line 3557 (after the patch) > I chose to convert the record field values to TEXT if the caller does > not require a certain type (expectedtypeid == InvalidOid). > Additionally, I cast the value from the record field type if > the destination Datum is of different type. > > As far as I can see, this does no harm because in most cases > the expectedtypeid is correctly set. I just wanted to avoid that > if it is not set, the returned datum is of a more restrictive type > than TEXT. > > ------------ > > The patch is against a HEAD checkout from 07/12/05 > The output comes from difforig. > > Test code for the patch can be extracted from an example I put into > plpgsql.sgml > > ------------ > > Here is a summary of things that get patched by the file: > - add three new special parsing functions to pl_comp.c > (plpgsql_parse_wordpercentword, plpgsql_parse_wordnfields, > plpgsql_parse_wordfieldnames). > - modify PLpgSQL_recfield in plpgsql.h to either hold > a conventional field name (record.fieldname) or a dno > for the variable (record%variable). > - add two PLPGSQL_DTYPEs for the two new % notations > - modify "case PLPGSQL_DTYPE_RECFIELD:" > in exec_eval_datum() and exec_assign_value() > to deal with index strings from a variable > - add "case PLPGSQL_DTYPE_RECFIELDNAMES" > and "case PLPGSQL_DTYPE_NRECFIELD" > to exec_eval_datum() to evaluate %FIELDNAMES > and %NFIELDS expressions. > - update plpgsql.sgml in the docs directory > > ------------ > > Please notify me if I can be of further assistance. > > Regards > Titus >
В списке pgsql-patches по дате отправления: