Re: [DOCS] bug in 8.0 manual, section 37.6, PL/Perl Triggers - Mailing list pgsql-patches
From | Bruce Momjian |
---|---|
Subject | Re: [DOCS] bug in 8.0 manual, section 37.6, PL/Perl Triggers |
Date | |
Msg-id | 200501222205.j0MM5tB28700@candle.pha.pa.us Whole thread Raw |
List | pgsql-patches |
Rainer Brandt wrote: > Hi, > > All places that mention the trigger event info hash pointer $_TD > end with the "->" characters. The hash keys are omitted. > That is certainly not what you wanted. > (Also, the code examples will not compile under Perl. (I didn't > try, but can see that they won't.)) > > Probably due to the character '>' and some Docbook -> HTML conversion? Good catch. I have fixed CVS HEAD and 8.0.X. Patch attached. Thanks. -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073 Index: doc/src/sgml/cvs.sgml =================================================================== RCS file: /cvsroot/pgsql/doc/src/sgml/cvs.sgml,v retrieving revision 1.30 diff -c -c -r1.30 cvs.sgml *** doc/src/sgml/cvs.sgml 6 Jan 2005 01:49:22 -0000 1.30 --- doc/src/sgml/cvs.sgml 22 Jan 2005 21:33:58 -0000 *************** *** 214,220 **** <programlisting> file1 file2 file3 file4 file5 ! 1.1 1.1 1.1 1.1 /--1.1* <-*- TAG 1.2*- 1.2 1.2 -1.2*- 1.3 \- 1.3*- 1.3 / 1.3 1.4 \ 1.4 / 1.4 --- 214,220 ---- <programlisting> file1 file2 file3 file4 file5 ! 1.1 1.1 1.1 1.1 /--1.1* <-*- TAG 1.2*- 1.2 1.2 -1.2*- 1.3 \- 1.3*- 1.3 / 1.3 1.4 \ 1.4 / 1.4 Index: doc/src/sgml/indexcost.sgml =================================================================== RCS file: /cvsroot/pgsql/doc/src/sgml/indexcost.sgml,v retrieving revision 2.18 diff -c -c -r2.18 indexcost.sgml *** doc/src/sgml/indexcost.sgml 29 Nov 2003 19:51:37 -0000 2.18 --- doc/src/sgml/indexcost.sgml 22 Jan 2005 21:33:59 -0000 *************** *** 205,211 **** <programlisting> *indexSelectivity = clauselist_selectivity(root, indexQuals, ! rel->relid, JOIN_INNER); </programlisting> </para> </step> --- 205,211 ---- <programlisting> *indexSelectivity = clauselist_selectivity(root, indexQuals, ! rel->relid, JOIN_INNER); </programlisting> </para> </step> Index: doc/src/sgml/plhandler.sgml =================================================================== RCS file: /cvsroot/pgsql/doc/src/sgml/plhandler.sgml,v retrieving revision 1.4 diff -c -c -r1.4 plhandler.sgml *** doc/src/sgml/plhandler.sgml 5 Jan 2005 23:42:03 -0000 1.4 --- doc/src/sgml/plhandler.sgml 22 Jan 2005 21:33:59 -0000 *************** *** 121,127 **** /* * Called as a trigger procedure */ ! TriggerData *trigdata = (TriggerData *) fcinfo->context; retval = ... } --- 121,127 ---- /* * Called as a trigger procedure */ ! TriggerData *trigdata = (TriggerData *) fcinfo->context; retval = ... } Index: doc/src/sgml/release.sgml =================================================================== RCS file: /cvsroot/pgsql/doc/src/sgml/release.sgml,v retrieving revision 1.321 diff -c -c -r1.321 release.sgml *** doc/src/sgml/release.sgml 15 Jan 2005 21:11:46 -0000 1.321 --- doc/src/sgml/release.sgml 22 Jan 2005 21:34:22 -0000 *************** *** 7138,7144 **** <programlisting> Fix many CLUSTER failures (Tom) Allow ALTER TABLE RENAME works on indexes (Tom) ! Fix plpgsql to handle datetime->timestamp and timespan->interval (Bruce) New configure --with-setproctitle switch to use setproctitle() (Marc, Bruce) Fix the off by one errors in ResultSet from 6.5.3, and more. jdbc ResultSet fixes (Joseph Shraibman) --- 7138,7144 ---- <programlisting> Fix many CLUSTER failures (Tom) Allow ALTER TABLE RENAME works on indexes (Tom) ! Fix plpgsql to handle datetime->timestamp and timespan->interval (Bruce) New configure --with-setproctitle switch to use setproctitle() (Marc, Bruce) Fix the off by one errors in ResultSet from 6.5.3, and more. jdbc ResultSet fixes (Joseph Shraibman) *************** *** 8017,8023 **** <programlisting> Bug Fixes --------- ! Fix text<->float8 and text<->float4 conversion functions(Thomas) Fix for creating tables with mixed-case constraints(Billy) Change exp()/pow() behavior to generate error on underflow/overflow(Jan) Fix bug in pg_dump -z --- 8017,8023 ---- <programlisting> Bug Fixes --------- ! Fix text<->float8 and text<->float4 conversion functions(Thomas) Fix for creating tables with mixed-case constraints(Billy) Change exp()/pow() behavior to generate error on underflow/overflow(Jan) Fix bug in pg_dump -z *************** *** 9225,9231 **** using an axis-crossing algorithm(Thomas) Add routine to convert circle-box(Thomas) Merge conflicting operators for different geometric data types(Thomas) ! Replace distance operator "<===>" with "<->"(Thomas) Replace "above" operator "!^" with ">^" and "below" operator "!|" with "<^"(Thomas) Add routines for text trimming on both ends, substring, and string position(Thomas) Added conversion routines circle(box) and poly(circle)(Thomas) --- 9225,9231 ---- using an axis-crossing algorithm(Thomas) Add routine to convert circle-box(Thomas) Merge conflicting operators for different geometric data types(Thomas) ! Replace distance operator "<===>" with "<->"(Thomas) Replace "above" operator "!^" with ">^" and "below" operator "!|" with "<^"(Thomas) Add routines for text trimming on both ends, substring, and string position(Thomas) Added conversion routines circle(box) and poly(circle)(Thomas) *************** *** 10093,10101 **** char(N), varchar(N), date and time. The following are aliases to existing postgres types: ! smallint -> int2 ! integer, int -> int4 ! float, real -> float4 char(N) and varchar(N) are implemented as truncated text types. In addition, char(N) does blank-padding. * single-quote (') is used for quoting string literals; '' (in addition to --- 10093,10101 ---- char(N), varchar(N), date and time. The following are aliases to existing postgres types: ! smallint -> int2 ! integer, int -> int4 ! float, real -> float4 char(N) and varchar(N) are implemented as truncated text types. In addition, char(N) does blank-padding. * single-quote (') is used for quoting string literals; '' (in addition to Index: doc/src/sgml/rules.sgml =================================================================== RCS file: /cvsroot/pgsql/doc/src/sgml/rules.sgml,v retrieving revision 1.37 diff -c -c -r1.37 rules.sgml *** doc/src/sgml/rules.sgml 30 Dec 2004 03:13:56 -0000 1.37 --- doc/src/sgml/rules.sgml 22 Jan 2005 21:34:27 -0000 *************** *** 1565,1590 **** <literallayout class="monospaced"> Nested Loop ! -> Merge Join ! -> Seq Scan ! -> Sort ! -> Seq Scan on s ! -> Seq Scan ! -> Sort ! -> Seq Scan on shoelace_arrive ! -> Seq Scan on shoelace_data </literallayout> while omitting the extra range table entry would result in a <literallayout class="monospaced"> Merge Join ! -> Seq Scan ! -> Sort ! -> Seq Scan on s ! -> Seq Scan ! -> Sort ! -> Seq Scan on shoelace_arrive </literallayout> which produces exactly the same entries in the log table. Thus, --- 1565,1590 ---- <literallayout class="monospaced"> Nested Loop ! -> Merge Join ! -> Seq Scan ! -> Sort ! -> Seq Scan on s ! -> Seq Scan ! -> Sort ! -> Seq Scan on shoelace_arrive ! -> Seq Scan on shoelace_data </literallayout> while omitting the extra range table entry would result in a <literallayout class="monospaced"> Merge Join ! -> Seq Scan ! -> Sort ! -> Seq Scan on s ! -> Seq Scan ! -> Sort ! -> Seq Scan on shoelace_arrive </literallayout> which produces exactly the same entries in the log table. Thus, *************** *** 1943,1950 **** <literallayout class="monospaced"> Nestloop ! -> Index Scan using comp_hostidx on computer ! -> Index Scan using soft_hostidx on software </literallayout> So there would be not that much difference in speed between --- 1943,1950 ---- <literallayout class="monospaced"> Nestloop ! -> Index Scan using comp_hostidx on computer ! -> Index Scan using soft_hostidx on software </literallayout> So there would be not that much difference in speed between *************** *** 1973,1981 **** <literallayout class="monospaced"> Hash Join ! -> Seq Scan on software ! -> Hash ! -> Index Scan using comp_hostidx on computer </literallayout> The other possible command is --- 1973,1981 ---- <literallayout class="monospaced"> Hash Join ! -> Seq Scan on software ! -> Hash ! -> Index Scan using comp_hostidx on computer </literallayout> The other possible command is *************** *** 1989,1996 **** <literallayout class="monospaced"> Nestloop ! -> Index Scan using comp_hostidx on computer ! -> Index Scan using soft_hostidx on software </literallayout> This shows, that the planner does not realize that the --- 1989,1996 ---- <literallayout class="monospaced"> Nestloop ! -> Index Scan using comp_hostidx on computer ! -> Index Scan using soft_hostidx on software </literallayout> This shows, that the planner does not realize that the *************** *** 2030,2037 **** <ProgramListing> Nestloop ! -> Index Scan using comp_manufidx on computer ! -> Index Scan using soft_hostidx on software </ProgramListing> In any of these cases, the extra commands from the rule system --- 2030,2037 ---- <ProgramListing> Nestloop ! -> Index Scan using comp_manufidx on computer ! -> Index Scan using soft_hostidx on software </ProgramListing> In any of these cases, the extra commands from the rule system Index: doc/src/sgml/spi.sgml =================================================================== RCS file: /cvsroot/pgsql/doc/src/sgml/spi.sgml,v retrieving revision 1.37 diff -c -c -r1.37 spi.sgml *** doc/src/sgml/spi.sgml 30 Dec 2004 21:45:37 -0000 1.37 --- doc/src/sgml/spi.sgml 22 Jan 2005 21:34:32 -0000 *************** *** 2931,2949 **** */ if (ret == SPI_OK_SELECT && SPI_processed > 0) { ! TupleDesc tupdesc = SPI_tuptable->tupdesc; SPITupleTable *tuptable = SPI_tuptable; char buf[8192]; int i, j; for (j = 0; j < proc; j++) { ! HeapTuple tuple = tuptable->vals[j]; ! for (i = 1, buf[0] = 0; i <= tupdesc->natts; i++) snprintf(buf + strlen (buf), sizeof(buf) - strlen(buf), " %s%s", SPI_getvalue(tuple, tupdesc, i), ! (i == tupdesc->natts) ? " " : " |"); elog (INFO, "EXECQ: %s", buf); } } --- 2931,2949 ---- */ if (ret == SPI_OK_SELECT && SPI_processed > 0) { ! TupleDesc tupdesc = SPI_tuptable->tupdesc; SPITupleTable *tuptable = SPI_tuptable; char buf[8192]; int i, j; for (j = 0; j < proc; j++) { ! HeapTuple tuple = tuptable->vals[j]; ! for (i = 1, buf[0] = 0; i <= tupdesc->natts; i++) snprintf(buf + strlen (buf), sizeof(buf) - strlen(buf), " %s%s", SPI_getvalue(tuple, tupdesc, i), ! (i == tupdesc->natts) ? " " : " |"); elog (INFO, "EXECQ: %s", buf); } } Index: doc/src/sgml/trigger.sgml =================================================================== RCS file: /cvsroot/pgsql/doc/src/sgml/trigger.sgml,v retrieving revision 1.39 diff -c -c -r1.39 trigger.sgml *** doc/src/sgml/trigger.sgml 30 Dec 2004 03:13:56 -0000 1.39 --- doc/src/sgml/trigger.sgml 22 Jan 2005 21:34:33 -0000 *************** *** 271,280 **** </programlisting> which expands to <programlisting> ! ((fcinfo)->context != NULL && IsA((fcinfo)->context, TriggerData)) </programlisting> If this returns true, then it is safe to cast ! <literal>fcinfo->context</> to type <literal>TriggerData *</literal> and make use of the pointed-to <structname>TriggerData</> structure. The function must <emphasis>not</emphasis> alter the <structname>TriggerData</> --- 271,280 ---- </programlisting> which expands to <programlisting> ! ((fcinfo)->context != NULL && IsA((fcinfo)->context, TriggerData)) </programlisting> If this returns true, then it is safe to cast ! <literal>fcinfo->context</> to type <literal>TriggerData *</literal> and make use of the pointed-to <structname>TriggerData</> structure. The function must <emphasis>not</emphasis> alter the <structname>TriggerData</> *************** *** 393,400 **** A pointer to a structure describing the relation that the trigger fired for. Look at <filename>utils/rel.h</> for details about this structure. The most interesting things are ! <literal>tg_relation->rd_att</> (descriptor of the relation ! tuples) and <literal>tg_relation->rd_rel->relname</> (relation name; the type is not <type>char*</> but <type>NameData</>; use <literal>SPI_getrelname(tg_relation)</> to get a <type>char*</> if you --- 393,400 ---- A pointer to a structure describing the relation that the trigger fired for. Look at <filename>utils/rel.h</> for details about this structure. The most interesting things are ! <literal>tg_relation->rd_att</> (descriptor of the relation ! tuples) and <literal>tg_relation->rd_rel->relname</> (relation name; the type is not <type>char*</> but <type>NameData</>; use <literal>SPI_getrelname(tg_relation)</> to get a <type>char*</> if you *************** *** 541,547 **** Datum trigf(PG_FUNCTION_ARGS) { ! TriggerData *trigdata = (TriggerData *) fcinfo->context; TupleDesc tupdesc; HeapTuple rettuple; char *when; --- 541,547 ---- Datum trigf(PG_FUNCTION_ARGS) { ! TriggerData *trigdata = (TriggerData *) fcinfo->context; TupleDesc tupdesc; HeapTuple rettuple; char *when; *************** *** 554,575 **** elog(ERROR, "trigf: not called by trigger manager"); /* tuple to return to executor */ ! if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event)) ! rettuple = trigdata->tg_newtuple; else ! rettuple = trigdata->tg_trigtuple; /* check for null values */ ! if (!TRIGGER_FIRED_BY_DELETE(trigdata->tg_event) ! && TRIGGER_FIRED_BEFORE(trigdata->tg_event)) checknull = true; ! if (TRIGGER_FIRED_BEFORE(trigdata->tg_event)) when = "before"; else when = "after "; ! tupdesc = trigdata->tg_relation->rd_att; /* connect to SPI manager */ if ((ret = SPI_connect()) < 0) --- 554,575 ---- elog(ERROR, "trigf: not called by trigger manager"); /* tuple to return to executor */ ! if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event)) ! rettuple = trigdata->tg_newtuple; else ! rettuple = trigdata->tg_trigtuple; /* check for null values */ ! if (!TRIGGER_FIRED_BY_DELETE(trigdata->tg_event) ! && TRIGGER_FIRED_BEFORE(trigdata->tg_event)) checknull = true; ! if (TRIGGER_FIRED_BEFORE(trigdata->tg_event)) when = "before"; else when = "after "; ! tupdesc = trigdata->tg_relation->rd_att; /* connect to SPI manager */ if ((ret = SPI_connect()) < 0) *************** *** 582,589 **** elog(NOTICE, "trigf (fired %s): SPI_exec returned %d", when, ret); /* count(*) returns int8, so be careful to convert */ ! i = DatumGetInt64(SPI_getbinval(SPI_tuptable->vals[0], ! SPI_tuptable->tupdesc, 1, &isnull)); --- 582,589 ---- elog(NOTICE, "trigf (fired %s): SPI_exec returned %d", when, ret); /* count(*) returns int8, so be careful to convert */ ! i = DatumGetInt64(SPI_getbinval(SPI_tuptable->vals[0], ! SPI_tuptable->tupdesc, 1, &isnull)); Index: doc/src/sgml/xfunc.sgml =================================================================== RCS file: /cvsroot/pgsql/doc/src/sgml/xfunc.sgml,v retrieving revision 1.96 diff -c -c -r1.96 xfunc.sgml *** doc/src/sgml/xfunc.sgml 14 Jan 2005 21:46:09 -0000 1.96 --- doc/src/sgml/xfunc.sgml 22 Jan 2005 21:34:44 -0000 *************** *** 1482,1489 **** { Point *new_point = (Point *) palloc(sizeof(Point)); ! new_point->x = pointx->x; ! new_point->y = pointy->y; return new_point; } --- 1482,1489 ---- { Point *new_point = (Point *) palloc(sizeof(Point)); ! new_point->x = pointx->x; ! new_point->y = pointy->y; return new_point; } *************** *** 1665,1672 **** Point *pointy = PG_GETARG_POINT_P(1); Point *new_point = (Point *) palloc(sizeof(Point)); ! new_point->x = pointx->x; ! new_point->y = pointy->y; PG_RETURN_POINT_P(new_point); } --- 1665,1672 ---- Point *pointy = PG_GETARG_POINT_P(1); Point *new_point = (Point *) palloc(sizeof(Point)); ! new_point->x = pointx->x; ! new_point->y = pointy->y; PG_RETURN_POINT_P(new_point); } *************** *** 2447,2453 **** if (SRF_IS_FIRSTCALL()) { funcctx = SRF_FIRSTCALL_INIT(); ! oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); /* One-time setup code appears here: */ <replaceable>user code</replaceable> <replaceable>if returning composite</replaceable> --- 2447,2453 ---- if (SRF_IS_FIRSTCALL()) { funcctx = SRF_FIRSTCALL_INIT(); ! oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); /* One-time setup code appears here: */ <replaceable>user code</replaceable> <replaceable>if returning composite</replaceable> *************** *** 2503,2509 **** funcctx = SRF_FIRSTCALL_INIT(); /* switch to memory context appropriate for multiple function calls */ ! oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); /* total number of tuples to be returned */ funcctx->max_calls = PG_GETARG_UINT32(0); --- 2503,2509 ---- funcctx = SRF_FIRSTCALL_INIT(); /* switch to memory context appropriate for multiple function calls */ ! oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); /* total number of tuples to be returned */ funcctx->max_calls = PG_GETARG_UINT32(0);
pgsql-patches by date: