Обсуждение: pgsql: Support opfamily members in get_object_address

Поиск
Список
Период
Сортировка

pgsql: Support opfamily members in get_object_address

От
Alvaro Herrera
Дата:
Support opfamily members in get_object_address

In the spirit of 890192e99af and 4464303405f: have get_object_address
understand individual pg_amop and pg_amproc objects.  There is no way to
refer to such objects directly in the grammar -- rather, they are almost
always considered an integral part of the opfamily that contains them.
(The only case that deals with them individually is ALTER OPERATOR
FAMILY ADD/DROP, which carries the opfamily address separately and thus
does not need it to be part of each added/dropped element's address.)
In event triggers it becomes possible to become involved with individual
amop/amproc elements, and this commit enables pg_get_object_address to
do so as well.

To make the overall coding simpler, this commit also slightly changes
the get_object_address representation for opclasses and opfamilies:
instead of having the AM name in the objargs array, I moved it as the
first element of the objnames array.  This enables the new code to use
objargs for the type names used by pg_amop and pg_amproc.

Reviewed by: Stephen Frost

Branch
------
master

Details
-------
http://git.postgresql.org/pg/commitdiff/a61fd5334eb1040d0dcec0368702398a5b49152c

Modified Files
--------------
src/backend/catalog/objectaddress.c          |  234 ++++++++++++++++++++------
src/backend/commands/dropcmds.c              |   24 ++-
src/backend/commands/event_trigger.c         |    2 +
src/backend/parser/gram.y                    |   43 ++---
src/include/nodes/parsenodes.h               |    2 +
src/test/regress/expected/object_address.out |   60 ++++---
src/test/regress/sql/object_address.sql      |   16 +-
7 files changed, 264 insertions(+), 117 deletions(-)


Re: pgsql: Support opfamily members in get_object_address

От
Peter Eisentraut
Дата:
On 3/16/15 11:07 AM, Alvaro Herrera wrote:
> Support opfamily members in get_object_address

I get compiler warnings from this:

objectaddress.c: In function ‘get_object_address’:
objectaddress.c:1428:12: warning: array subscript is above array bounds
[-Warray-bounds]
objectaddress.c:1430:11: warning: array subscript is above array bounds
[-Warray-bounds]

This looks fishy:

1423   i = 0;
1424   foreach (cell, objargs)
1425   {
1426     ObjectAddress  typaddr;
1427
1428     typenames[i] = strVal(lfirst(cell));
1429     typaddr = get_object_address_type(OBJECT_TYPE, cell, missing_ok);
1430     typeoids[i] = typaddr.objectId;
1431     if (i++ >= 2)
1432       break;
1433   }

Since you're using a postfix increment, the loop will execute with i =
2, which will lead to the array bounds violation.



Re: [HACKERS] get_object_address support for additional object types

От
Alvaro Herrera
Дата:
I pushed a fix for this.

--
Álvaro Herrera                http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services