1
0
mirror of https://github.com/postgres/postgres.git synced 2025-09-02 04:21:28 +03:00

Support type modifiers for user-defined types, and pull most knowledge

about typmod representation for standard types out into type-specific
typmod I/O functions.  Teodor Sigaev, with some editorialization by
Tom Lane.
This commit is contained in:
Tom Lane
2006-12-30 21:21:56 +00:00
parent 24b1f14eae
commit 5725b9d9af
47 changed files with 1628 additions and 685 deletions

View File

@@ -1,4 +1,4 @@
<!-- $PostgreSQL: pgsql/doc/src/sgml/catalogs.sgml,v 2.139 2006/12/23 00:43:08 tgl Exp $ -->
<!-- $PostgreSQL: pgsql/doc/src/sgml/catalogs.sgml,v 2.140 2006/12/30 21:21:52 tgl Exp $ -->
<!--
Documentation of the system catalogs, directed toward PostgreSQL developers
-->
@@ -4393,6 +4393,20 @@
<entry>Output conversion function (binary format), or 0 if none</entry>
</row>
<row>
<entry><structfield>typmodin</structfield></entry>
<entry><type>regproc</type></entry>
<entry><literal><link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.oid</literal></entry>
<entry>Type modifier input function, or 0 if type does not support modifiers</entry>
</row>
<row>
<entry><structfield>typmodout</structfield></entry>
<entry><type>regproc</type></entry>
<entry><literal><link linkend="catalog-pg-proc"><structname>pg_proc</structname></link>.oid</literal></entry>
<entry>Type modifier output function, or 0 to use the standard format</entry>
</row>
<row>
<entry><structfield>typanalyze</structfield></entry>
<entry><type>regproc</type></entry>

View File

@@ -1,4 +1,4 @@
<!-- $PostgreSQL: pgsql/doc/src/sgml/keywords.sgml,v 2.18 2006/10/08 20:51:52 petere Exp $ -->
<!-- $PostgreSQL: pgsql/doc/src/sgml/keywords.sgml,v 2.19 2006/12/30 21:21:52 tgl Exp $ -->
<appendix id="sql-keywords-appendix">
<title><acronym>SQL</acronym> Key Words</title>
@@ -45,16 +45,17 @@
In <xref linkend="keywords-table"> in the column for
<productname>PostgreSQL</productname> we classify as
<quote>non-reserved</quote> those key words that are explicitly
known to the parser but are allowed in most or all contexts where an
identifier is expected. Some key words that are otherwise
known to the parser but are allowed as column or table names.
Some key words that are otherwise
non-reserved cannot be used as function or data type names and are
marked accordingly. (Most of these words represent built-in
functions or data types with special syntax. The function or type
is still available but it cannot be redefined by the user.) Labeled
<quote>reserved</quote> are those tokens that are only allowed as
<quote>AS</quote> column label names (and perhaps in very few other
contexts). Some reserved key words are allowable as names for
functions; this is also shown in the table.
<quote>reserved</quote> are those tokens that are not allowed as
column or table names. Some reserved key words are
allowable as names for functions or data types; this is also shown in the
table. If not so marked, a reserved key word is only allowed as an
<quote>AS</quote> column label name.
</para>
<para>
@@ -326,7 +327,7 @@
</row>
<row>
<entry><token>AUTHORIZATION</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry>reserved</entry>
<entry>reserved</entry>
<entry>reserved</entry>
@@ -368,7 +369,7 @@
</row>
<row>
<entry><token>BETWEEN</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry>reserved</entry>
<entry>non-reserved</entry>
<entry>reserved</entry>
@@ -382,7 +383,7 @@
</row>
<row>
<entry><token>BINARY</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry>reserved</entry>
<entry>reserved</entry>
<entry></entry>
@@ -956,7 +957,7 @@
</row>
<row>
<entry><token>CROSS</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry>reserved</entry>
<entry>reserved</entry>
<entry>reserved</entry>
@@ -1642,7 +1643,7 @@
</row>
<row>
<entry><token>FREEZE</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry></entry>
<entry></entry>
<entry></entry>
@@ -1656,7 +1657,7 @@
</row>
<row>
<entry><token>FULL</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry>reserved</entry>
<entry>reserved</entry>
<entry>reserved</entry>
@@ -1831,7 +1832,7 @@
</row>
<row>
<entry><token>ILIKE</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry></entry>
<entry></entry>
<entry></entry>
@@ -1943,7 +1944,7 @@
</row>
<row>
<entry><token>INNER</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry>reserved</entry>
<entry>reserved</entry>
<entry>reserved</entry>
@@ -2048,14 +2049,14 @@
</row>
<row>
<entry><token>IS</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry>reserved</entry>
<entry>reserved</entry>
<entry>reserved</entry>
</row>
<row>
<entry><token>ISNULL</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry></entry>
<entry></entry>
<entry></entry>
@@ -2076,7 +2077,7 @@
</row>
<row>
<entry><token>JOIN</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry>reserved</entry>
<entry>reserved</entry>
<entry>reserved</entry>
@@ -2160,7 +2161,7 @@
</row>
<row>
<entry><token>LEFT</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry>reserved</entry>
<entry>reserved</entry>
<entry>reserved</entry>
@@ -2188,7 +2189,7 @@
</row>
<row>
<entry><token>LIKE</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry>reserved</entry>
<entry>reserved</entry>
<entry>reserved</entry>
@@ -2475,7 +2476,7 @@
</row>
<row>
<entry><token>NATURAL</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry>reserved</entry>
<entry>reserved</entry>
<entry>reserved</entry>
@@ -2608,7 +2609,7 @@
</row>
<row>
<entry><token>NOTNULL</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry></entry>
<entry></entry>
<entry></entry>
@@ -2811,7 +2812,7 @@
</row>
<row>
<entry><token>OUTER</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry>reserved</entry>
<entry>reserved</entry>
<entry>reserved</entry>
@@ -2832,7 +2833,7 @@
</row>
<row>
<entry><token>OVERLAPS</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry>reserved</entry>
<entry>non-reserved</entry>
<entry>reserved</entry>
@@ -3385,7 +3386,7 @@
</row>
<row>
<entry><token>RIGHT</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry>reserved</entry>
<entry>reserved</entry>
<entry>reserved</entry>
@@ -3658,7 +3659,7 @@
</row>
<row>
<entry><token>SIMILAR</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry>reserved</entry>
<entry>non-reserved</entry>
<entry></entry>
@@ -4414,7 +4415,7 @@
</row>
<row>
<entry><token>VERBOSE</token></entry>
<entry>reserved (can be function)</entry>
<entry>reserved (can be function or type)</entry>
<entry></entry>
<entry></entry>
<entry></entry>

View File

@@ -1,5 +1,5 @@
<!--
$PostgreSQL: pgsql/doc/src/sgml/ref/create_type.sgml,v 1.65 2006/12/23 01:28:09 momjian Exp $
$PostgreSQL: pgsql/doc/src/sgml/ref/create_type.sgml,v 1.66 2006/12/30 21:21:52 tgl Exp $
PostgreSQL documentation
-->
@@ -28,6 +28,8 @@ CREATE TYPE <replaceable class="parameter">name</replaceable> (
OUTPUT = <replaceable class="parameter">output_function</replaceable>
[ , RECEIVE = <replaceable class="parameter">receive_function</replaceable> ]
[ , SEND = <replaceable class="parameter">send_function</replaceable> ]
[ , TYPMOD_IN = <replaceable class="parameter">type_modifier_input_function</replaceable> ]
[ , TYPMOD_OUT = <replaceable class="parameter">type_modifier_output_function</replaceable> ]
[ , ANALYZE = <replaceable class="parameter">analyze_function</replaceable> ]
[ , INTERNALLENGTH = { <replaceable class="parameter">internallength</replaceable> | VARIABLE } ]
[ , PASSEDBYVALUE ]
@@ -83,12 +85,14 @@ CREATE TYPE <replaceable class="parameter">name</replaceable>
(scalar type). The parameters may appear in any order, not only that
illustrated above, and most are optional. You must register
two or more functions (using <command>CREATE FUNCTION</command>) before
defining the type. The support functions
defining the type. The support functions
<replaceable class="parameter">input_function</replaceable> and
<replaceable class="parameter">output_function</replaceable>
are required, while the functions
<replaceable class="parameter">receive_function</replaceable>,
<replaceable class="parameter">send_function</replaceable> and
<replaceable class="parameter">send_function</replaceable>,
<replaceable class="parameter">type_modifier_input_function</replaceable>,
<replaceable class="parameter">type_modifier_output_function</replaceable> and
<replaceable class="parameter">analyze_function</replaceable>
are optional. Generally these functions have to be coded in C
or another low-level language.
@@ -169,6 +173,34 @@ CREATE TYPE <replaceable class="parameter">name</replaceable>
used normally.
</para>
<para>
The optional
<replaceable class="parameter">type_modifier_input_function</replaceable>
and <replaceable class="parameter">type_modifier_output_function</replaceable>
are needed if the type supports modifiers, that is optional constraints
attached to a type declaration, such as <literal>char(5)</> or
<literal>numeric(30,2)</>. <productname>PostgreSQL</productname> allows
user-defined types to take one or more integer constants as modifiers;
however, this information must be capable of being packed into a single
non-negative integer value for storage in the system catalogs. The
<replaceable class="parameter">type_modifier_input_function</replaceable>
is passed the declared modifier(s) in the form of an <type>integer</>
array. It must check the values for validity (throwing an error if they
are wrong), and if they are correct, return a single non-negative
<type>integer</> value that will be stored as the column <quote>typmod</>.
Type modifiers will be rejected if the type does not have a
<replaceable class="parameter">type_modifier_input_function</replaceable>.
The <replaceable class="parameter">type_modifier_output_function</replaceable>
converts the internal integer typmod value back to the correct form for
user display. It must return a <type>cstring</> value that is the exact
string to append to the type name; for example <type>numeric</>'s
function might return <literal>(30,2)</>.
It is allowed to omit the
<replaceable class="parameter">type_modifier_output_function</replaceable>,
in which case the default display format is just the stored typmod value
enclosed in parentheses.
</para>
<para>
The optional <replaceable class="parameter">analyze_function</replaceable>
performs type-specific statistics collection for columns of the data type.
@@ -265,7 +297,7 @@ CREATE TYPE <replaceable class="parameter">name</replaceable>
<title>Array Types</title>
<para>
Whenever a user-defined base data type is created,
Whenever a user-defined base data type is created,
<productname>PostgreSQL</productname> automatically creates an
associated array type, whose name consists of the base type's
name prepended with an underscore. The parser understands this
@@ -298,7 +330,7 @@ CREATE TYPE <replaceable class="parameter">name</replaceable>
</para>
</refsect2>
</refsect1>
<refsect1>
<title>Parameters</title>
@@ -371,6 +403,26 @@ CREATE TYPE <replaceable class="parameter">name</replaceable>
</listitem>
</varlistentry>
<varlistentry>
<term><replaceable class="parameter">type_modifier_input_function</replaceable></term>
<listitem>
<para>
The name of a function that converts numeric modifier(s) for the type
into internal form.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><replaceable class="parameter">type_modifier_output_function</replaceable></term>
<listitem>
<para>
The name of a function that converts the internal form of the type's
modifier(s) to external textual form.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><replaceable class="parameter">analyze_function</replaceable></term>
<listitem>
@@ -499,7 +551,7 @@ CREATE TYPE <replaceable class="parameter">name</replaceable>
</para>
</refsect1>
<refsect1>
<title>Examples</title>