Thread: Function Inheritance?
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: 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
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