PostgreSQL 9.0.23 Documentation | ||||
---|---|---|---|---|
Prev | Up | Chapter 35. Extending SQL | Next |
It is possible to use a compiler in C++ mode to build PostgreSQL extensions by following these guidelines:
All functions accessed by the backend must present a C interface to the backend; these C functions can then call C++ functions. For example, extern C linkage is required for backend-accessed functions. This is also necessary for any functions that are passed as pointers between the backend and C++ code.
Free memory using the appropriate deallocation method. For
example, most backend memory is allocated using palloc()
, so use pfree()
to free it, i.e. using C++
delete()
in such cases will
fail.
Prevent exceptions from propagating into the C code (use a
catch-all block at the top level of all extern C functions). This is necessary even if
the C++ code does not throw any exceptions because events
like out-of-memory still throw exceptions. Any exceptions
must be caught and appropriate errors passed back to the C
interface. If possible, compile C++ with -fno-exceptions to eliminate exceptions
entirely; in such cases, you must check for failures in your
C++ code, e.g. check for NULL returned by new()
.
If calling backend functions from C++ code, be sure that
the C++ call stack contains only plain old data structures
(POD). This is necessary
because backend errors generate a distant longjmp()
that does not properly unroll a
C++ call stack with non-POD objects.
In summary, it is best to place C++ code behind a wall of extern C functions that interface to the backend, and avoid exception, memory, and call stack leakage.