I don't quite understand the difference between a SQL function and a PL/PgSQL function here - since there is a overlapped functionality that we could implement by SQL function or by PL/PgSQL function.
The difference is between an inlined function (which is integrated directly into the plan of the query that invokes it) and a function that is not inlined. Only SQL functions can be inlined, and only some SQL functions at that. With an out-of-line function, we just invoke the function via the fmgr infrastructure -- if it chooses to create any plans (e.g. via SPI), that is its own business, and they would be treated as distinct plans by the cache module.
-Neil
---------------------------(end of broadcast)--------------------------- TIP 9: the planner will ignore your desire to choose an index scan if your joining column's datatypes do not match