From 27fddec197857db4d54db50a63f311bb0ed7b6fd Mon Sep 17 00:00:00 2001 From: Tom Lane <tgl@sss.pgh.pa.us> Date: Fri, 2 Oct 2015 12:20:01 -0400 Subject: [PATCH] Docs: add another example of creating a range type. The "floatrange" example is a bit too simple because float8mi can be used without any additional type conversion. Add an example that does have to account for that, and do some minor other wordsmithing. --- doc/src/sgml/rangetypes.sgml | 53 ++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/doc/src/sgml/rangetypes.sgml b/doc/src/sgml/rangetypes.sgml index 260545711b3..784f18eb483 100644 --- a/doc/src/sgml/rangetypes.sgml +++ b/doc/src/sgml/rangetypes.sgml @@ -344,6 +344,12 @@ SELECT '[1.234, 5.678]'::floatrange; function in this example. </para> + <para> + Defining your own range type also allows you to specify a different + subtype B-tree operator class or collation to use, so as to change the sort + ordering that determines which values fall into a given range. + </para> + <para> If the subtype is considered to have discrete rather than continuous values, the <command>CREATE TYPE</> command should specify a @@ -365,29 +371,40 @@ SELECT '[1.234, 5.678]'::floatrange; </para> <para> - Defining your own range type also allows you to specify a different - subtype B-tree operator class or collation to use, so as to change the sort - ordering that determines which values fall into a given range. + In addition, any range type that is meant to be used with GiST or SP-GiST + indexes should define a subtype difference, or <literal>subtype_diff</>, + function. (The index will still work without <literal>subtype_diff</>, + but it is likely to be considerably less efficient than if a difference + function is provided.) The subtype difference function takes two input + values of the subtype, and returns their difference + (i.e., <replaceable>X</> minus <replaceable>Y</>) represented as + a <type>float8</> value. In our example above, the + function <function>float8mi</> that underlies the regular <type>float8</> + minus operator can be used; but for any other subtype, some type + conversion would be necessary. Some creative thought about how to + represent differences as numbers might be needed, too. To the greatest + extent possible, the <literal>subtype_diff</> function should agree with + the sort ordering implied by the selected operator class and collation; + that is, its result should be positive whenever its first argument is + greater than its second according to the sort ordering. </para> <para> - In addition, any range type that is meant to be used with GiST or SP-GiST indexes - should define a subtype difference, or <literal>subtype_diff</>, function. - (the index will still work without <literal>subtype_diff</>, but it is - likely to be considerably less efficient than if a difference function is - provided.) The subtype difference function takes two input values of the - subtype, and returns their difference (i.e., <replaceable>X</> minus - <replaceable>Y</>) represented as a <type>float8</> value. In our example - above, the function that underlies the regular <type>float8</> minus - operator can be used; but for any other subtype, some type conversion would - be necessary. Some creative thought about how to represent differences as - numbers might be needed, too. To the greatest extent possible, the - <literal>subtype_diff</> function should agree with the sort ordering - implied by the selected operator class and collation; that is, its result - should be positive whenever its first argument is greater than its second - according to the sort ordering. + A less-oversimplified example of a <literal>subtype_diff</> function is: </para> +<programlisting> +CREATE FUNCTION time_subtype_diff(x time, y time) RETURNS float8 AS +'SELECT EXTRACT(EPOCH FROM (x - y))' LANGUAGE sql STRICT IMMUTABLE; + +CREATE TYPE timerange AS RANGE ( + subtype = time, + subtype_diff = time_subtype_diff +); + +SELECT '[11:10, 23:00]'::timerange; +</programlisting> + <para> See <xref linkend="SQL-CREATETYPE"> for more information about creating range types. -- GitLab