mirror of https://github.com/postgres/postgres
200 lines
8.3 KiB
HTML
200 lines
8.3 KiB
HTML
<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>
|