CREATE OPERATOR
CREATE OPERATOR â ÑоздаÑÑ Ð¾Ð¿ÐµÑаÑоÑ
СинÑакÑиÑ
CREATE OPERATORимÑ( {FUNCTION|PROCEDURE} =имÑ_ÑÑнкÑии[, LEFTARG =Ñип_Ñлева] [, RIGHTARG =Ñип_ÑпÑава] [, COMMUTATOR =коммÑÑ_опеÑаÑоÑ] [, NEGATOR =обÑаÑнÑй_опеÑаÑоÑ] [, RESTRICT =пÑоÑедÑÑа_огÑаниÑениÑ] [, JOIN =пÑоÑедÑÑа_ÑоединениÑ] [, HASHES ] [, MERGES ] )
ÐпиÑание
CREATE OPERATOR опÑеделÑÐµÑ Ð½Ð¾Ð²Ñй опеÑаÑоÑ, имÑ. ÐладелÑÑем опеÑаÑоÑа ÑÑановиÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ, его ÑоздавÑий. ÐÑли Ñказано Ð¸Ð¼Ñ ÑÑ
емÑ, опеÑаÑÐ¾Ñ ÑоздаÑÑÑÑ Ð² ней, в пÑоÑивном ÑлÑÑае â в ÑекÑÑей ÑÑ
еме.
ÐÐ¼Ñ Ð¾Ð¿ÐµÑаÑоÑа обÑазÑÐµÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ð¸Ð· неÑколÑкиÑ
Ñимволов (не более Ñем NAMEDATALEN-1, по ÑмолÑÐ°Ð½Ð¸Ñ 63) из ÑледÑÑÑего ÑпиÑка:
+ - * / < > = ~ ! @ # % ^ & | ` ?
Ðднако вÑÐ±Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ огÑаниÑен еÑÑ ÑледÑÑÑими ÑÑловиÑми:
СоÑеÑÐ°Ð½Ð¸Ñ Ñимволов
--и/*не могÑÑ Ð¿ÑиÑÑÑÑÑвоваÑÑ Ð² имени опеÑаÑоÑа, Ñак как они бÑдÑÑ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑаÑÑ Ð½Ð°Ñало комменÑаÑиÑ.ÐногоÑимволÑное Ð¸Ð¼Ñ Ð¾Ð¿ÐµÑаÑоÑа не Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°ÐºÐ°Ð½ÑиваÑÑÑÑ Ð·Ð½Ð°ÐºÐ¾Ð¼
+или-, еÑли ÑолÑко оно не ÑодеÑÐ¶Ð¸Ñ Ñакже один из ÑÑÐ¸Ñ Ñимволов:
~ ! @ # % ^ & | ` ?ÐапÑимеÑ,
@-â допÑÑÑимое Ð¸Ð¼Ñ Ð¾Ð¿ÐµÑаÑоÑа, а*-â неÑ. ÐлагодаÑÑ ÑÑÐ¾Ð¼Ñ Ð¾Ð³ÑаниÑениÑ, PostgreSQL Ð¼Ð¾Ð¶ÐµÑ ÑазбиÑаÑÑ ÐºÐ¾ÑÑекÑнÑе SQL-запÑоÑÑ Ð±ÐµÐ· пÑобелов Ð¼ÐµÐ¶Ð´Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñами.Символ
=>заÑезеÑвиÑован Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² гÑаммаÑике ÑзÑка SQL, поÑÑÐ¾Ð¼Ñ ÐµÐ³Ð¾ нелÑÐ·Ñ Ð¸ÑполÑзоваÑÑ Ð² каÑеÑÑве имени опеÑаÑоÑа.
ÐпеÑаÑÐ¾Ñ != оÑобÑажаеÑÑÑ Ð² <> пÑи вводе, Ñак ÑÑо ÑÑи два имени вÑегда ÑавнознаÑнÑ.
ÐÐ»Ñ Ð±Ð¸Ð½Ð°ÑнÑÑ
опеÑаÑоÑов Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð¿ÑеделÑÑÑÑÑ Ð¾Ð±Ð° паÑамеÑÑа LEFTARG и RIGHTARG, а Ð´Ð»Ñ Ð¿ÑеÑикÑнÑÑ
опеÑаÑоÑов нÑжно опÑеделиÑÑ ÑолÑко паÑамеÑÑ RIGHTARG. ФÑнкÑÐ¸Ñ Ð¸Ð¼Ñ_ÑÑнкÑии должна бÑÑÑ Ñже опÑеделена Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ CREATE FUNCTION и имеÑÑ ÑооÑвеÑÑÑвÑÑÑее ÑиÑло аÑгÑменÑов (один или два) ÑказаннÑÑ
Ñипов.
Ð ÑинÑакÑиÑе CREATE OPERATOR клÑÑевÑе Ñлова FUNCTION и PROCEDURE ÑавнознаÑнÑ, но ÑказÑÐ²Ð°ÐµÐ¼Ð°Ñ ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° в лÑбом ÑлÑÑае бÑÑÑ ÑÑнкÑией, а не пÑоÑедÑÑой. ÐлÑÑевое Ñлово PROCEDURE здеÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаеÑÑÑ Ð¿Ð¾ иÑÑоÑиÑеÑким пÑиÑинам и ÑÑиÑаеÑÑÑ ÑÑÑаÑевÑим.
ÐÑÑгие пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð¿ÑеделÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе Ñ Ð°ÑакÑеÑиÑÑики опÑимизаÑии. ÐÑ Ð·Ð½Ð°Ñение опиÑано в Разделе 36.15.
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ Ð¾Ð¿ÐµÑаÑоÑ, необÑ
одимо имеÑÑ Ð¿Ñаво USAGE Ð´Ð»Ñ Ñипов аÑгÑменÑов и ÑезÑлÑÑаÑа, а Ñакже пÑаво EXECUTE Ð´Ð»Ñ Ð½Ð¸Ð¶ÐµÐ»ÐµÐ¶Ð°Ñей ÑÑнкÑии. ÐÑли ÑказÑваеÑÑÑ ÐºÐ¾Ð¼Ð¼ÑÑиÑÑÑÑий или обÑаÑнÑй опеÑаÑоÑ, нÑжно бÑÑÑ ÐµÐ³Ð¾ владелÑÑем.
ÐаÑамеÑÑÑ
имÑÐÐ¼Ñ Ð¾Ð¿ÑеделÑемого опеÑаÑоÑа. ÐопÑÑÑимÑе в нÑм ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¿ÐµÑеÑиÑÐ»ÐµÐ½Ñ Ð½Ð¸Ð¶Ðµ. Указанное Ð¸Ð¼Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¾ ÑÑ ÐµÐ¼Ð¾Ð¹, напÑÐ¸Ð¼ÐµÑ Ñак:
CREATE OPERATOR myschema.+ (...). ÐÑли ÑÑ ÐµÐ¼Ð° не Ñказана, опеÑаÑÐ¾Ñ ÑоздаÑÑÑÑ Ð² ÑекÑÑей ÑÑ ÐµÐ¼Ðµ. ÐÑи ÑÑом два опеÑаÑоÑа в одной ÑÑ ÐµÐ¼Ðµ могÑÑ Ð¸Ð¼ÐµÑÑ Ð¾Ð´Ð½Ð¾ имÑ, еÑли они ÑабоÑаÑÑ Ñ ÑазнÑми Ñипами даннÑÑ . Такое опÑеделение опеÑаÑоÑов назÑваеÑÑÑ Ð¿ÐµÑегÑÑзкой.имÑ_ÑÑнкÑииФÑнкÑиÑ, ÑеализÑÑÑÐ°Ñ ÑÑÐ¾Ñ Ð¾Ð¿ÐµÑаÑоÑ.
Ñип_ÑлеваТип даннÑÑ Ð»ÐµÐ²Ð¾Ð³Ð¾ опеÑанда опеÑаÑоÑа, еÑли он еÑÑÑ. ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¾Ð¿ÑÑкаеÑÑÑ Ð´Ð»Ñ Ð¿ÑеÑикÑнÑÑ Ð¾Ð¿ÐµÑаÑоÑов.
Ñип_ÑпÑаваТип даннÑÑ Ð¿Ñавого опеÑанда опеÑаÑоÑа.
коммÑÑ_опеÑаÑоÑÐпеÑаÑоÑ, коммÑÑиÑÑÑÑий Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾.
обÑаÑнÑй_опеÑаÑоÑÐпеÑаÑоÑ, обÑаÑнÑй Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾.
пÑоÑедÑÑа_огÑаниÑениÑФÑнкÑÐ¸Ñ Ð¾Ñенки избиÑаÑелÑноÑÑи огÑаниÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ опеÑаÑоÑа.
пÑоÑедÑÑа_ÑоединениÑФÑнкÑÐ¸Ñ Ð¾Ñенки избиÑаÑелÑноÑÑи ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑÑого опеÑаÑоÑа.
HASHESÐоказÑваеÑ, ÑÑо ÑÑÐ¾Ñ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ Ñоединение по Ñ ÐµÑÑ.
MERGESÐоказÑваеÑ, ÑÑо ÑÑÐ¾Ñ Ð¾Ð¿ÐµÑаÑÐ¾Ñ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ Ñоединение ÑлиÑнием.
ЧÑÐ¾Ð±Ñ Ð·Ð°Ð´Ð°ÑÑ Ð¸Ð¼Ñ Ð¾Ð¿ÐµÑаÑоÑа Ñ Ñказанием ÑÑ
ÐµÐ¼Ñ Ð² коммÑÑ_опеÑаÑÐ¾Ñ Ð¸Ð»Ð¸ дÑÑгом дополниÑелÑном аÑгÑменÑе, пÑименÑеÑÑÑ ÑинÑакÑÐ¸Ñ OPERATOR(), напÑимеÑ:
COMMUTATOR = OPERATOR(myschema.===) ,
ÐÑимеÑаниÑ
Ðолее подÑобно инÑоÑмаÑÐ¸Ñ Ð¾Ð¿Ð¸Ñана в Разделе 36.14 и Разделе 36.15.
Ðогда Ð²Ñ Ð¾Ð¿ÑеделÑеÑе опеÑаÑоÑ, коммÑÑиÑÑÑÑий Ñам Ð´Ð»Ñ ÑебÑ, Ð²Ñ Ð´ÐµÐ»Ð°ÐµÑе именно ÑÑо. ÐÑли же Ð²Ñ Ð¾Ð¿ÑеделÑеÑе паÑÑ ÐºÐ¾Ð¼Ð¼ÑÑиÑÑÑÑÐ¸Ñ Ð¾Ð¿ÐµÑаÑоÑов, Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð½ÐµÐ±Ð¾Ð»ÑÑое заÑÑÑднение: как опеÑаÑоÑ, опÑеделÑемÑй пеÑвÑм, Ð¼Ð¾Ð¶ÐµÑ ÑÑÑлаÑÑÑÑ Ð½Ð° дÑÑгой, еÑÑ Ð½Ðµ опÑеделÑннÑй? ÐÑÑÑ ÑÑи ÑеÑÐµÐ½Ð¸Ñ ÑÑой пÑоблемÑ:
Ðо-пеÑвÑÑ , можно опÑÑÑиÑÑ Ð¿Ñедложение
COMMUTATORÐ´Ð»Ñ Ð¿ÐµÑвого опеÑаÑоÑа, коÑоÑÑй Ð²Ñ Ð¾Ð¿ÑеделÑеÑе, а заÑем добавиÑÑ ÐµÐ³Ð¾ в опÑеделении вÑоÑого. Так как PostgreSQL знаеÑ, ÑÑо коммÑÑиÑÑÑÑие опеÑаÑоÑÑ ÑвÑÐ·Ð°Ð½Ñ Ð¿Ð°Ñами, вÑÑÑеÑÐ°Ñ Ð²ÑоÑое опÑеделение, он авÑомаÑиÑеÑки возвÑаÑаеÑÑÑ Ðº пеÑÐ²Ð¾Ð¼Ñ Ð¸ добавлÑÐµÑ Ð² него недоÑÑаÑÑее пÑедложениеCOMMUTATOR.ÐÑÑгой и более оÑевиднÑй ÑпоÑоб â вклÑÑиÑÑ Ð¿ÑедложениÑ
COMMUTATORв оба опÑеделениÑ. ÐÑи обÑабоÑке пеÑвого опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ PostgreSQL поймÑÑ, ÑÑоCOMMUTATORÑÑÑлаеÑÑÑ Ð½Ð° неÑÑÑеÑÑвÑÑÑий опеÑаÑÐ¾Ñ Ð¸ ÑоздаÑÑ ÑикÑивнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð´Ð»Ñ ÑÑого опеÑаÑоÑа в ÑиÑÑемном каÑалоге. ÐоÑÑекÑнÑми в Ñакой ÑикÑивной запиÑи бÑдÑÑ ÑолÑко Ð¸Ð¼Ñ Ð¾Ð¿ÐµÑаÑоÑа, Ñип левого или пÑавого опеÑанда и владелеÑ, поÑколÑÐºÑ Ð½Ð° ÑÑом ÑÑапе ÑолÑко ÑÑи даннÑе Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ PostgreSQL. Ðа ÑÑÑ ÑикÑивнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð±ÑÐ´ÐµÑ ÑÑÑлаÑÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ ÐºÐ°Ñалога пеÑвого опеÑаÑоÑа. ÐÑи опÑеделении вÑоÑого опеÑаÑоÑа ÑиÑÑема Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ ÑикÑивнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð½Ð¾Ð²Ð¾Ð¹ инÑоÑмаÑией. ÐÑи попÑÑке иÑполÑзоваÑÑ ÑикÑивнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð´Ð¾ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑой инÑоÑмаÑии бÑÐ´ÐµÑ Ð²Ñдана оÑибка.Также можно опÑеделиÑÑ Ð¾Ð±Ð° опеÑаÑоÑа без пÑедложений
COMMUTATOR, в Ñаком ÑлÑÑае ÑÑÑлки на коммÑÑиÑÑÑÑие опеÑаÑоÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ бÑÐ´ÐµÑ ÑÑÑановиÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ALTER OPERATOR. ÐоÑÑаÑоÑно запÑÑÑиÑÑALTERÐ´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ из опеÑаÑоÑов.
Ðо вÑÐµÑ ÑÑÑÑ ÑлÑÑаÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ бÑÑÑ Ð²Ð»Ð°Ð´ÐµÐ»ÑÑем Ð¾Ð±Ð¾Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑов, ÑÑÐ¾Ð±Ñ Ð½Ð°Ð·Ð½Ð°ÑиÑÑ Ð¸Ñ ÐºÐ¾Ð¼Ð¼ÑÑиÑÑÑÑими опеÑаÑоÑами.
ÐаÑÑ Ð¾Ð±ÑаÑнÑÑ Ð¾Ð¿ÐµÑаÑоÑов можно опÑеделиÑÑ Ñеми же ÑпоÑобами, ÑÑо и паÑÑ ÐºÐ¾Ð¼Ð¼ÑÑиÑÑÑÑÐ¸Ñ .
ÐадаÑÑ Ð»ÐµÐºÑиÑеÑкий пÑиоÑиÑÐµÑ Ð¾Ð¿ÐµÑаÑоÑа в команде CREATE OPERATOR невозможно, Ñак как обÑабоÑка пÑиоÑиÑеÑов жÑÑÑко заÑиÑа в анализаÑоÑе. ÐодÑобнее пÑиоÑиÑеÑÑ Ð¾Ð¿Ð¸ÑÐ°Ð½Ñ Ð² ÐодÑазделе 4.1.6.
УÑÑаÑевÑие паÑамеÑÑÑ SORT1, SORT2, LTCMP и GTCMP Ñанее иÑполÑзовалиÑÑ Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸Ð¼Ñн опеÑаÑоÑов ÑоÑÑиÑовки, ÑвÑзаннÑÑ
Ñ Ð¾Ð¿ÐµÑаÑоÑом, пÑименÑемÑм пÑи Ñоединении ÑлиÑнием. ТепеÑÑ ÑÑо не ÑÑебÑеÑÑÑ, Ñак как инÑоÑмаÑÐ¸Ñ Ð¾ ÑвÑзаннÑÑ
опеÑаÑоÑаÑ
ÑепеÑÑ Ð´Ð°ÑÑ ÑемейÑÑва опеÑаÑоÑов B-деÑева. ÐÑли в команде оÑÑÑÑÑÑвÑÐµÑ Ñвное Ñказание MERGES, вÑе ÑÑи паÑамеÑÑÑ Ð¸Ð³Ð½Ð¾ÑиÑÑÑÑÑÑ.
ÐÐ»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелÑÑкиÑ
опеÑаÑоÑов из Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
пÑименÑеÑÑÑ DROP OPERATOR, а Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ñ
ÑвойÑÑв â ALTER OPERATOR.
ÐÑимеÑÑ
СледÑÑÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° опÑеделÑÐµÑ Ð½Ð¾Ð²Ñй опеÑаÑоÑ, пÑовеÑÑÑÑий ÑавенÑÑво плоÑадей, Ð´Ð»Ñ Ñипа box:
CREATE OPERATOR === (
LEFTARG = box,
RIGHTARG = box,
FUNCTION = area_equal_function,
COMMUTATOR = ===,
NEGATOR = !==,
RESTRICT = area_restriction_function,
JOIN = area_join_function,
HASHES, MERGES
);СовмеÑÑимоÑÑÑ
CREATE OPERATOR ÑвлÑеÑÑÑ ÑзÑковÑм ÑаÑÑиÑением PostgreSQL. СÑедÑÑва опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑелÑÑкиÑ
опеÑаÑоÑов в ÑÑандаÑÑе SQL не опиÑанÑ.