create_operator.l
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:8k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. ." This is -*-nroff-*-
  2. ." XXX standard disclaimer belongs here....
  3. ." $Header: /usr/local/cvsroot/pgsql/src/man/Attic/create_operator.l,v 1.9 1999/05/20 03:21:02 tgl Exp $
  4. .TH "CREATE OPERATOR" SQL 11/05/95 PostgreSQL PostgreSQL
  5. .SH NAME
  6. create operator - define a new user operator
  7. .SH SYNOPSIS
  8. .nf
  9. fBcreate operatorfR operator_name
  10. fB(fR[ fBleftargfR fB=fR type-1 ]
  11.  [ fB,fR fBrightargfR fB=fR type-2 ]
  12.  , fBprocedure =fR func_name
  13.  [fB, commutator =fR com_op ]
  14.  [fB, negator =fR neg_op ]
  15.  [fB, restrict =fR res_proc ]
  16.  [fB, join =fR join_proc ]
  17.  [fB, hashesfR]
  18.  [fB, sort1 =fR left_sort_op ]
  19.  [fB, sort2 =fR right_sort_op ]
  20. fB)fR
  21. ." fB"arg is ("
  22. ." type [
  23. ." fB,
  24. ." type ]
  25. ." fB)
  26. .fi
  27. .SH DESCRIPTION
  28. This command defines a new user operator,
  29. .IR "operator_name" .
  30. The user who defines an operator becomes its owner.
  31. .PP
  32. The
  33. .IR "operator_name"
  34. is a sequence of punctuation characters.  The following
  35. characters are valid for single-character operator names:
  36. .nf
  37. .ce 1
  38. ~ ! @ # % ^ & ` ?
  39. .fi
  40. If the operator name is more than one character long, it may consist
  41. of any combination of the above characters or the following additional
  42. characters:
  43. .nf
  44. .ce 1
  45. | $ : + - * / < > =
  46. .fi
  47. The operator "!=" is mapped to "<>" on input, and they are
  48. therefore equivalent.
  49. .PP
  50. At least one of
  51. .IR leftarg
  52. and
  53. .IR rightarg
  54. must be defined.  For binary operators, both should be defined. For
  55. right unary operators, only
  56. .IR arg1
  57. should be defined, while for left unary operators only
  58. .IR arg2
  59. should be defined.
  60. .PP
  61. The name of the operator,
  62. .IR operator_name ,
  63. can be composed of symbols only.  Also, the
  64. .IR func_name
  65. procedure must have been previously defined using
  66. .IR create_function(l)
  67. and must have one or two arguments.
  68. .PP
  69. ." that multiple instances of the 
  70. ." operator must be be evaluated
  71. ." For example, consider the area-intersection operator,
  72. ." .q A,
  73. ." and the following expression:
  74. ." .(l
  75. ." MYBOXES2.description A *(lq0,0,1,1*(rq A MYBOXES.description
  76. ." .)l
  77. ." .in .5i
  78. ." The associativity flag indicates that
  79. ." .(l
  80. ." (MYBOXES2.description A *(lq0,0,1,1*(rq) A MYBOXES.description
  81. ." .)l
  82. ." .in .5i
  83. ." is the same as
  84. ." .(l
  85. ." MYBOXES2.description A (*(lq0,0,1,1*(rq A MYBOXES.description).
  86. ." .)l
  87. The commutator operator should be identified if one exists,
  88. so that Postgres can reverse the order of the operands if it wishes.
  89. For example, the operator
  90. area-less-than, >>>, would probably have a commutator operator,
  91. area-greater-than, <<<.  Hence, the query optimizer
  92. could freely convert:
  93. .nf
  94. .ce 1
  95. "0,0,1,1"::box >>> MYBOXES.description
  96. .fi
  97. to
  98. .nf
  99. .ce 1
  100. MYBOXES.description <<< "0,0,1,1"::box
  101. .fi
  102. This allows the execution code to always use the latter representation
  103. and simplifies the query optimizer somewhat.
  104. .PP
  105. Similarly, if there is a negator operator then it should be identified.
  106. Suppose that an operator, area-equal, ===,
  107. exists, as well as an area not equal, !==.
  108. The negator link allows the query optimizer to simplify
  109. .nf
  110. .ce 1
  111. NOT MYBOXES.description === "0,0,1,1"::box
  112. .fi
  113. to
  114. .nf
  115. .ce 1
  116. MYBOXES.description !== "0,0,1,1"::box
  117. .fi
  118. If a commutator operator name is supplied, Postgres searches for it in
  119. the catalog.  If it is found and it does not yet have a commutator
  120. itself, then the commutator's entry is updated to have the newly created
  121. operator as its commutator.  This applies to the negator, as well.
  122. .PP
  123. This is to allow the definition of two operators that are the
  124. commutators or the negators of each other.  The first operator should
  125. be defined without a commutator or negator (as appropriate).  When the
  126. second operator is defined, name the first as the commutator or
  127. negator.  The first will be updated as a side effect.  (As of Postgres 6.5,
  128. it also works to just have both operators refer to each other.)
  129. .PP
  130. The next three specifications are present to support the query optimizer
  131. in performing joins.  Postgres can always evaluate a join (i.e.,
  132. processing a clause with two tuple variables separated by an operator
  133. that returns a boolean) by iterative substitution [WONG76].  In
  134. addition, Postgres can use a hash-join algorithm
  135. along the lines of [SHAP86]; however, it must know whether this
  136. strategy is applicable.
  137. The current hash-join algorithm
  138. is only correct for operators that represent equality tests;
  139. furthermore, equality of the datatype must mean bitwise equality
  140. of the representation of the type.  (For example, a datatype that
  141. contains unused bits that don't matter for equality tests could
  142. not be hashjoined.)
  143. The
  144. .BR hashes
  145. flag indicates to the query optimizer that a hash join may safely be
  146. used with this operator.
  147. .PP
  148. Similarly, the two sort operators indicate to the query optimizer
  149. whether merge-sort is a usable join strategy and which operators should
  150. be used to sort the two operand classes.
  151. Sort operators should only be provided for an equality
  152. operator, and they should refer to less-than operators for the
  153. left and right side data types respectively.
  154. .PP
  155. If other join strategies are found to be practical, Postgres will change
  156. the optimizer and run-time system to use them and will require
  157. additional specification when an operator is defined.  Fortunately,
  158. the research community invents new join strategies infrequently, and
  159. the added generality of user-defined join strategies was not felt to
  160. be worth the complexity involved.
  161. .PP
  162. The last two pieces of the specification are present so the query
  163. optimizer can estimate result sizes.  If a clause of the form:
  164. .nf
  165. .ce 1
  166. MYBOXES.description <<< "0,0,1,1"::box
  167. .fi
  168. is present in the qualification, then Postgres may have to estimate the
  169. fraction of the instances in MYBOXES that satisfy the clause.  The
  170. function res_proc must be a registered function (meaning it is already
  171. defined using
  172. .IR create_function(l))
  173. which accepts arguments of the correct data types and returns a
  174. floating point number.  The query optimizer simply calls this
  175. function, passing the parameter "0,0,1,1"
  176. and multiplies the result by the relation size to get the desired
  177. expected number of instances.
  178. .PP
  179. Similarly, when the operands of the operator both contain instance
  180. variables, the query optimizer must estimate the size of the resulting
  181. join.  The function join_proc will return another floating point
  182. number which will be multiplied by the cardinalities of the two
  183. classes involved to compute the desired expected result size.
  184. .PP
  185. The difference between the function
  186. .nf
  187. .ce 1
  188. my_procedure_1 (MYBOXES.description, "0,0,1,1"::box)
  189. .fi
  190. and the operator
  191. .nf
  192. .ce 1
  193. MYBOXES.description === "0,0,1,1"::box
  194. .fi
  195. is that Postgres attempts to optimize operators and can decide to use an
  196. index to restrict the search space when operators are involved.
  197. However, there is no attempt to optimize functions, and they are
  198. performed by brute force.  Moreover, functions can have any number of
  199. arguments while operators are restricted to one or two.
  200. .SH EXAMPLE
  201. .nf
  202. --
  203. --The following command defines a new operator,
  204. --area-equality, for the BOX data type.
  205. --
  206. create operator === (
  207. leftarg = box,
  208. rightarg = box,
  209. procedure = area_equal_procedure,
  210. commutator = ===,
  211. negator = !==,
  212. restrict = area_restriction_procedure,
  213. join = area_join_procedure,
  214. hashes,
  215. sort1 = <<<,
  216. sort2 = <<<)
  217. ." arg is (box, box)
  218. .fi
  219. .SH "SEE ALSO"
  220. create_function(l),
  221. drop_operator(l).
  222. .SH BUGS
  223. Operator names cannot be composed of alphabetic characters in 
  224. Postgres.
  225. .PP
  226. If an operator is defined before its commuting operator has been defined,
  227. a dummy entry for the commutator (with invalid oprproc field) will be placed
  228. in the system catalogs.  This entry will be overridden when the commutator
  229. is eventually defined.