mirror of
https://github.com/postgres/postgres.git
synced 2026-01-05 23:38:41 +03:00
Import of PostgreSQL User Manual
This commit is contained in:
199
doc/manual/extend.html
Normal file
199
doc/manual/extend.html
Normal file
@@ -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>
|
||||
Reference in New Issue
Block a user