| PostgreSQL | ||
|---|---|---|
| 上一页 | 下一页 | |
CREATE OPERATOR — 定义一个新的用户操作符
CREATE OPERATOR name ( PROCEDURE = func_name
[, LEFTARG = type1 ] [, RIGHTARG = type2 ]
[, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]
[, RESTRICT = res_proc ] [, JOIN = join_proc ]
[, HASHES ] [, SORT1 = left_sort_op ] [, SORT2 = right_sort_op ] )
CREATE OPERATOR 定义一个新的操作符, name .定义该操作符的用户成为其所有者.
操作符 name 是下列字符的小于32个字符的任意组合:
+ - * / < > = ~ ! @ # % ^ & | ` ? $ :
注意: 在操作符名里不允许有字符存在.这就允许Postgres 将 SQL 输入分析成一个一个的令牌(token)而不需要在令牌之间插入空白.
操作符 "!=" 在输入时映射成 "<>" , 因而他们是相等的.
至少需要定义一个 LEFTARG 或 RIGHTARG .对于双目操作符来说,两者都需要定义.对右目操作符来说,只需要定义 LEFTARG,而对于左目操作符来说,只需要定义 RIGHTARG.
同样, func_name 过程必须已经用 CREATE FUNCTION 定义过,而且必须定义为接受正确数量的参数(一个或是两个).
换向操作符用于令 Postgres 可以按它的意愿转换操作符的方向.例如,操作符面积小于,<<<,就有一个转换操作符:面积大于操作符, >>>.因此,查询优化器可以自由的将下面查询从:
"0,0,1,1"::box >>> MYBOXES.description
转换到
MYBOXES.description <<< "0,0,1,1"::box
这就允许执行代码总是使用后面的形式而某种程度上简化了查询优化器.
类似地,如果存在负号操作符则应该声明。假设一个操作符,面积相等, ===,存在,同样有一个面积不等操作符,!==.负号操作符允许查询优化器将
NOT MYBOXES.description === "0,0,1,1"::box
简化成
MYBOXES.description !== "0,0,1,1"::box
如果提供了一个转换器操作符名称,Postgres 将在目录中查找它.如果找到,而且其本身没有一个转换器,那么转换器表将被更新,以当前(最新)操作符作为它的转换器.这一点一样适用于负号操作符.
这就允许定义两个互为转换器或负号符的操作符.第一个操作符应该定义为没有转换器或负号符(as appropriate).当定义第二个操作符时,将第一个符号作为转换器或负号符.第一个将因上述的副作用一样被更新(而获得转换器或负号符).(对于 Postgres 6.5,把两个操作符指向对方同样也行。)
另外三个声明将为查询优化器进行联合查询时提供支持.Postgres 总是用迭代 [WONG76](译注:好象作者编辑器出事了.)评估一个联合查询.(比如,处理一个用返回布尔值的操作符分隔开的有两个字段的语句)另外, Postgres 准备在行[SHAP86](?)实现一个哈希-联合算法(hash-join algorithm);但是,我们必须知道这个策略是否可行.目前的哈希-联合算法只是对代表相等测试的操作符有效;而且,数据类型的相等必须意味着类型的表现是按位相等的。(例如,一个包含未用的位的数据类型,这些位对相等测试没有影响,但却不能用于哈希联合。)HASHES 标记告诉优化器,对这个操作符可以安全地使用哈希联合。
类似的,两目排序操作符告诉查询优化器一个混合-排序(merge-sort)是否是一个可用的联合策略,并且告诉优化器使用哪个操作符来对这两个操作数表排序.排序操作符应该只提供给相等操作符,并且它们应该对应用于对应的左边和右边数据类型的小于操作符。
如果发现其他联合策略可用, Postgres 将更改优化器和运行时系统以利用这些策略,并且在定义一个操作符时将需要更多的声明.幸运的是,研究团队不经常发明新的联合策略,而且增加用户定义联合策略的方法看来与其实现的复杂性相比是不值得的。
最后两个声明可提供给优化器用于估计结果的尺寸大小.如果像下面的语句:
MYBOXES.description <<< "0,0,1,1"::box
在判断条件中出现,那么 Postgres 将不得不估计记录 MYBOXES 中的部分区域的大小.函数 res_proc 必需是一个注册过的函数(也就是说它已经用 CREATE FUNCTION 定义过了),它接受一个正确数据的数据类型作为参数,返回一个浮点数.查询优化器只是简单的调用这个函数,将参数 "0,0,1,1" 传入并且计算相关尺寸的结果以获得所需要的记录的数值。
类似的,当操作符的操作数都包含记录变量时,优化器必须估计联合结果的尺寸.函数 join_proc 将返回另一个浮点数,这个数就是将两个表相关的记录相乘,计算出预期结果的尺寸.
函数
my_procedure_1 (MYBOXES.description, "0,0,1,1"::box)
和操作符
MYBOXES.description === "0,0,1,1"::box
之间的区别是 Postgres 试图优化操作符并且可以决定使用索引来缩小相关操作符的搜索区间.但是,对函数将不会有任何优化的动作,而且是强制执行.最后,函数可有任意个参数,而操作符限于一个或两个.
请参阅PostgreSQL 用户手册 中操作符章节获取更多信息.请使用 DROP OPERATOR 从数据库中删除用户定义操作符.
下面命令定义一个新操作符,面积相等,用于 BOX 数据类型.
CREATE OPERATOR === ( LEFTARG = box, RIGHTARG = box, PROCEDURE = area_equal_procedure, COMMUTATOR = ===, NEGATOR = !==, RESTRICT = area_restriction_procedure, JOIN = area_join_procedure, HASHES, SORT1 = <<<, SORT2 = <<< );
CREATE OPERATOR 是 Postgres 扩展.在 SQL92 中没有 CREATE OPERATOR 语句.
| 上一页 | 首页 | 下一页 |
| CREATE LANGUAGE | 开头 | CREATE RULE |