Thread: Function Inheritance?

Function Inheritance?

From
Mark Butler
Date:
In http://www.postgresql.org/devel-corner/docs/postgres/sql-createtable.html

"Postgres automatically allows the created table to inherit functions on
tables above it in the inheritance hierarchy."

"Postgres automatically allows the created table to inherit functions on
tables above it in the inheritance hierarchy. Inheritance of functions is done
according to the conventions of the Common Lisp Object System (CLOS)."

Neither of these statements is true, right?  I do not beleive that PostgreSQL
current supports inheritable member functions.  Shouldn't both of these
statements be removed?

- Mark Butler

Re: Function Inheritance?

From
Mark Butler
Date:
[Re: Tom Lane's explanation of function inheritance]

That is a really nice capability.  However, the statement is somewhat
confusing because this is a matter of parameter type promotion rather than
member/method function inheritance, which is what I thought was being referred
to.

I suggest something like the following:

"In Postgres, each created table automatically defines a new row object type
in an inheritance hierarchy.  Postgres automatically allows a descendant table
row object to be used anywhere a parent table row object is called for.  This
means that functions declared to accept row objects from a parent table
automatically accept row objects from all of its descendant tables as well."

Is that an improvement?  I believe the SQL3 people were wrestling with similar
nomenclature issues once upon a time...

 - Mark Butler

Re: Function Inheritance?

From
Tom Lane
Date:
Mark Butler <butlerm@middle.net> writes:
> In http://www.postgresql.org/devel-corner/docs/postgres/sql-createtable.html
> "Postgres automatically allows the created table to inherit functions on
> tables above it in the inheritance hierarchy."

> "Postgres automatically allows the created table to inherit functions on
> tables above it in the inheritance hierarchy. Inheritance of functions is done
> according to the conventions of the Common Lisp Object System (CLOS)."

> Neither of these statements is true, right?

It still works.

regression=# create table foo (f1 int);
CREATE
regression=# create function getf1(foo) returns int as 'select $1.f1'
regression-# language 'sql';
CREATE
regression=# insert into foo values (42);
INSERT 149940 1
regression=# select getf1(foo) from foo;
 getf1
-------
    42
(1 row)

regression=# create table foot (g1 int) inherits (foo);
CREATE
regression=# insert into foot values (22,33);
INSERT 149954 1
regression=# select getf1(foot) from foot;
 getf1
-------
    22
(1 row)


We may have to break this at some point in pursuit of SQL-mandated
features, but it's not dead yet ...

            regards, tom lane