37.14. ÐолÑзоваÑелÑÑкие опеÑаÑоÑÑ #
ÐÑбой опеÑаÑÐ¾Ñ Ð¿ÑедÑÑавлÑÐµÑ Ñобой «ÑинÑакÑиÑеÑкий ÑÐ°Ñ Ð°Ñ» Ð´Ð»Ñ Ð²Ñзова нижележаÑей ÑÑнкÑии, вÑполнÑÑÑей ÑеалÑнÑÑ ÑабоÑÑ; поÑÑÐ¾Ð¼Ñ Ð¿Ñежде Ñем Ð²Ñ ÑможеÑе ÑоздаÑÑ Ð¾Ð¿ÐµÑаÑоÑ, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑоздаÑÑ Ð½Ð¸Ð¶ÐµÐ»ÐµÐ¶Ð°ÑÑÑ ÑÑнкÑиÑ. Ðднако опеÑаÑÐ¾Ñ â не иÑклÑÑиÑелÑно ÑинÑакÑиÑеÑкий ÑÐ°Ñ Ð°Ñ, Ñак как он неÑÑÑ Ð¸ дополниÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑиÑ, помогаÑÑÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑовÑÐ¸ÐºÑ Ð·Ð°Ð¿ÑоÑов опÑимизиÑоваÑÑ Ð·Ð°Ð¿ÑоÑÑ Ñ ÑÑим опеÑаÑоÑом. РаÑÑмоÑÑÐµÐ½Ð¸Ñ ÑÑой дополниÑелÑной инÑоÑмаÑии бÑÐ´ÐµÑ Ð¿Ð¾ÑвÑÑÑн ÑледÑÑÑий Ñаздел.
Postgres Pro поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿ÑеÑикÑнÑе и инÑикÑнÑе опеÑаÑоÑÑ. ÐпеÑаÑоÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¿ÐµÑегÑÑженÑ; Ñо еÑÑÑ Ð¾Ð´Ð½Ð¾ Ð¸Ð¼Ñ Ð¾Ð¿ÐµÑаÑоÑа могÑÑ Ð¸Ð¼ÐµÑÑ ÑазлиÑнÑе опеÑаÑоÑÑ Ñ ÑазнÑм колиÑеÑÑвом и Ñипами опеÑандов. Ðогда вÑполнÑеÑÑÑ Ð·Ð°Ð¿ÑоÑ, ÑиÑÑема опÑеделÑеÑ, какой опеÑаÑÐ¾Ñ Ð²ÑзваÑÑ, по колиÑеÑÑÐ²Ñ Ð¸ Ñипам пÑедоÑÑавленнÑÑ Ð¾Ð¿ÐµÑандов.
Ð ÑледÑÑÑем пÑимеÑе ÑоздаÑÑÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ ÑÐ»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð²ÑÑ
комплекÑнÑÑ
ÑиÑел. ÐÑедполагаеÑÑÑ, ÑÑо Ð¼Ñ Ñже Ñоздали опÑеделение Ñипа complex (Ñм. Раздел 37.13). СнаÑала нам нÑжна ÑÑнкÑиÑ, ÑобÑÑвенно вÑполнÑÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑиÑ, а заÑем Ð¼Ñ Ñможем опÑеделиÑÑ Ð¾Ð¿ÐµÑаÑоÑ:
CREATE FUNCTION complex_add(complex, complex)
RETURNS complex
AS 'имÑ_Ñайла', 'complex_add'
LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR + (
leftarg = complex,
rightarg = complex,
function = complex_add,
commutator = +
);ТепеÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ вÑполниÑÑ Ñакой запÑоÑ:
SELECT (a + b) AS c FROM test_complex;
c
-----------------
(5.2,6.05)
(133.42,144.95)
ÐÑ Ð¿ÑодемонÑÑÑиÑовали Ñоздание бинаÑного опеÑаÑоÑа. ЧÑÐ¾Ð±Ñ ÑоздаÑÑ Ð¿ÑеÑикÑнÑй опеÑаÑоÑ, пÑоÑÑо опÑÑÑиÑе leftarg. ÐбÑзаÑелÑнÑми в CREATE OPERATOR ÑвлÑÑÑÑÑ ÑолÑко пÑедложение function и обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð°ÑгÑменÑов. ÐÑедложение commutator, добавленное в данном пÑимеÑе, пÑедÑÑавлÑÐµÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑÑ Ð¿Ð¾Ð´ÑÐºÐ°Ð·ÐºÑ Ð´Ð»Ñ Ð¾Ð¿ÑимизаÑоÑа запÑоÑов. ÐодÑобнее о commutator и дÑÑгиÑ
подÑказкаÑ
Ð´Ð»Ñ Ð¾Ð¿ÑимизаÑоÑа ÑаÑÑказÑваеÑÑÑ Ð² ÑледÑÑÑем Ñазделе.