aboutsummaryrefslogtreecommitdiff
path: root/doc/manual/extend.html
diff options
context:
space:
mode:
Diffstat (limited to 'doc/manual/extend.html')
-rw-r--r--doc/manual/extend.html199
1 files changed, 199 insertions, 0 deletions
diff --git a/doc/manual/extend.html b/doc/manual/extend.html
new file mode 100644
index 00000000000..a3cdfc06211
--- /dev/null
+++ b/doc/manual/extend.html
@@ -0,0 +1,199 @@
+<HTML>
+<HEAD>
+ <TITLE>The POSTGRES95 User Manual - EXTENDING SQL: AN OVERVIEW</TITLE>
+</HEAD>
+
+<BODY>
+
+<font size=-1>
+<A HREF="pg95user.html">[ TOC ]</A>
+<A HREF="advanced.html">[ Previous ]</A>
+<A HREF="xfunc.html">[ Next ]</A>
+</font>
+<HR>
+
+<H1>6. EXTENDING SQL: AN OVERVIEW</H1>
+<HR>
+ In the sections that follow, we will discuss how you
+ can extend the POSTGRES <B>SQL</B> query language by adding:
+ <UL>
+ <LI>functions
+ <LI>types
+ <LI>operators
+ <LI>aggregates
+ </UL>
+<p>
+<H2><A NAME="how-extensibility-works">6.1. How Extensibility Works</A></H2>
+ POSTGRES is extensible because its operation is
+ catalog-driven. If you are familiar with standard
+ relational systems, you know that they store information
+ about databases, tables, columns, etc., in what are
+ commonly known as system catalogs. (Some systems call
+ this the data dictionary). The catalogs appear to the
+ user as classes, like any other, but the DBMS stores
+ its internal bookkeeping in them. One key difference
+ between POSTGRES and standard relational systems is
+ that POSTGRES stores much more information in its
+ catalogs -- not only information about tables and columns,
+ but also information about its types, functions, access
+ methods, and so on. These classes can be modified by
+ the user, and since POSTGRES bases its internal operation
+ on these classes, this means that POSTGRES can be
+ extended by users. By comparison, conventional
+ database systems can only be extended by changing hardcoded
+ procedures within the DBMS or by loading modules
+ specially-written by the DBMS vendor.
+ POSTGRES is also unlike most other data managers in
+ that the server can incorporate user-written code into
+ itself through dynamic loading. That is, the user can
+ specify an object code file (e.g., a compiled .o file
+ or shared library) that implements a new type or function
+ and POSTGRES will load it as required. Code written
+ in <B>SQL</B> are even more trivial to add to the server.
+ This ability to modify its operation "on the fly" makes
+ POSTGRES uniquely suited for rapid prototyping of new
+ applications and storage structures.
+
+<H2><A NAME="the-postgres-type-system">6.2. The POSTGRES Type System</A></H2>
+ The POSTGRES type system can be broken down in several
+ ways.
+ Types are divided into base types and composite types.
+ Base types are those, like <CODE>int4</CODE>, that are implemented
+ in a language such as <B>C</B>. They generally correspond to
+ what are often known as "abstract data types"; POSTGRES
+ can only operate on such types through methods provided
+ by the user and only understands the behavior of such
+ types to the extent that the user describes them.
+ Composite types are created whenever the user creates a
+ class. EMP is an example of a composite type.
+ POSTGRES stores these types in only one way (within the
+ file that stores all instances of the class) but the
+ user can "look inside" at the attributes of these types
+ from the query language and optimize their retrieval by
+ (for example) defining indices on the attributes.
+ POSTGRES base types are further divided into built-in
+ types and user-defined types. Built-in types (like
+ <CODE>int4</CODE>) are those that are compiled into the system.
+ User-defined types are those created by the user in the
+ manner to be described below.
+
+<H2><A NAME="about-the-postgres-system-catalogs">6.3. About the POSTGRES System Catalogs</A></H2>
+ Having introduced the basic extensibility concepts, we
+ can now take a look at how the catalogs are actually
+ laid out. You can skip this section for now, but some
+ later sections will be incomprehensible without the
+ information given here, so mark this page for later
+ reference.
+ All system catalogs have names that begin with <CODE>pg_</CODE>.
+ The following classes contain information that may be
+ useful to the end user. (There are many other system
+ catalogs, but there should rarely be a reason to query
+ them directly.)
+ <p>
+<center>
+<table border=1>
+<tr>
+ <th>catalog name</th><th> description </th>
+</tr>
+<tr>
+ <td><CODE>pg_database</CODE> </td><td> databases </td>
+</tr>
+<tr>
+ <td><CODE>pg_class</CODE> </td><td> classes </td>
+</tr>
+<tr>
+ <td><CODE>pg_attribute</CODE> </td><td> class attributes </td>
+ </tr>
+<tr>
+ <td><CODE>pg_index</CODE> </td><td> secondary indices </td>
+</tr>
+<tr>
+</tr>
+<tr>
+ <td><CODE>pg_proc</CODE> </td><td> procedures (both C and SQL) </td>
+</tr>
+<tr>
+ <td><CODE>pg_type</CODE> </td><td> types (both base and complex) </td>
+</tr>
+<tr>
+ <td><CODE>pg_operator</CODE> </td><td> operators </td>
+</tr>
+<tr>
+ <td><CODE>pg_aggregate</CODE> </td><td> aggregates and aggregate functions </td>
+</tr>
+<tr>
+</tr>
+<tr>
+</tr>
+<tr>
+ <td><CODE>pg_am</CODE> </td><td> access methods </td>
+</tr>
+<tr>
+ <td><CODE>pg_amop</CODE> </td><td> access method operators </td>
+</tr>
+<tr>
+ <td><CODE>pg_amproc</CODE> </td><td> access method support functions </td>
+</tr>
+<tr>
+ <td><CODE>pg_opclass</CODE> </td><td> access method operator classes </td>
+</tr>
+</table>
+</center>
+
+<p>
+ <IMG SRC="figure03.gif"
+ ALT="Figure 3. The major POSTGRES system catalogs">
+ The Reference Manual gives a more detailed explanation
+ of these catalogs and their attributes. However, Figure 3
+ shows the major entities and their relationships
+ in the system catalogs. (Attributes that do not refer
+ to other entities are not shown unless they are part of
+ a primary key.)
+ This diagram is more or less incomprehensible until you
+ actually start looking at the contents of the catalogs
+ and see how they relate to each other. For now, the
+ main things to take away from this diagram are as follows:
+
+ <OL>
+ <LI> In several of the sections that follow, we will
+ present various join queries on the system
+ catalogs that display information we need to extend
+ the system. Looking at this diagram should make
+ some of these join queries (which are often
+ three- or four-way joins) more understandable,
+ because you will be able to see that the
+ attributes used in the queries form foreign keys
+ in other classes.
+ <LI> Many different features (classes, attributes,
+ functions, types, access methods, etc.) are
+ tightly integrated in this schema. A simple
+ create command may modify many of these catalogs.
+ <LI> Types and procedures <A HREF="#6"><font size=-1>[6]</font></A>
+ are central to the schema.
+ Nearly every catalog contains some reference to
+ instances in one or both of these classes. For
+ example, POSTGRES frequently uses type
+ signatures (e.g., of functions and operators) to
+ identify unique instances of other catalogs.
+ <LI> There are many attributes and relationships that
+ have obvious meanings, but there are many
+ (particularly those that have to do with access
+ methods) that do not. The relationships between
+ <CODE>pg_am, pg_amop, pg_amproc, pg_operator</CODE> and
+ <CODE>pg_opclass</CODE> are particularly hard to understand
+ and will be described in depth (in the section
+ on interfacing types and operators to indices)
+ after we have discussed basic extensions.
+</OL>
+<p>
+<HR>
+<A NAME="6"><B>6.</B></A> We use the words <I>procedure</I> and <I>function</I> more or less
+interchangably.
+<HR>
+<font size=-1>
+<A HREF="pg95user.html">[ TOC ]</A>
+<A HREF="advanced.html">[ Previous ]</A>
+<A HREF="xfunc.html">[ Next ]</A>
+</font>
+</BODY>
+</HTML>