64.3. ÐпоÑнÑе ÑÑнкÑии B-деÑевÑев
Ðак показано в ТаблиÑе 37.9, btree опÑеделÑÐµÑ Ð¾Ð´Ð½Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ÑÑ Ð¸ ÑеÑÑÑе необÑзаÑелÑнÑÑ Ð¾Ð¿Ð¾ÑнÑÑ ÑÑнкÑии. Таким обÑазом, полÑзоваÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°ÑÑ Ð¿ÑÑÑ Ð¼ÐµÑодов:
orderÐÐ»Ñ Ð²ÑÐµÑ ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñий Ñипов даннÑÑ , Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ ÑемейÑÑво опеÑаÑоÑов btree пÑедоÑÑавлÑÐµÑ Ð¾Ð¿ÐµÑаÑоÑÑ ÑÑавнениÑ, оно должно пÑедоÑÑавлÑÑÑ Ð¾Ð¿Ð¾ÑнÑÑ ÑÑнкÑÐ¸Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð²
pg_amprocÑ Ð½Ð¾Ð¼ÐµÑом 1 и camproclefttype/amprocrighttype, ÑавнÑми Ð»ÐµÐ²Ð¾Ð¼Ñ Ð¸ пÑÐ°Ð²Ð¾Ð¼Ñ ÑÐ¸Ð¿Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ (Ñо еÑÑÑ Ñем же Ñипам даннÑÑ , Ñ ÐºÐ¾ÑоÑÑми ÑооÑвеÑÑÑвÑÑÑие опеÑаÑоÑÑ Ð·Ð°ÑегиÑÑÑиÑÐ¾Ð²Ð°Ð½Ñ Ð²pg_amop). ÐÑа ÑÑнкÑÐ¸Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° пÑинимаÑÑ Ð´Ð²Ð° оÑлиÑнÑÑ Ð¾Ñ NULL знаÑениÑAиBи возвÑаÑаÑÑ Ð·Ð½Ð°Ñениеint32, коÑоÑое бÑдеÑ<0,0или>0, когдаA<B,A=BилиA>B, ÑооÑвеÑÑÑвенно. РезÑлÑÑÐ°Ñ NULL не допÑÑкаеÑÑÑ: вÑе знаÑÐµÐ½Ð¸Ñ Ñипа даннÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑÑавнимÑми.ÐÑли ÑÑавниваемÑе знаÑÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÑÑ ÑоÑÑиÑÑемÑй Ñип даннÑÑ , опоÑной ÑÑнкÑии ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð¿ÐµÑедан OID ÑооÑвеÑÑÑвÑÑÑего пÑавила ÑоÑÑиÑовки ÑеÑез ÑÑандаÑÑнÑй Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼
PG_GET_COLLATION().sortsupportÐополниÑелÑно ÑемейÑÑво опеÑаÑоÑов btree Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавиÑÑ ÑÑнкÑии поддеÑжки ÑоÑÑиÑовки, коÑоÑÑе ÑегиÑÑÑиÑÑÑÑÑÑ Ð¿Ð¾Ð´ номеÑом опоÑной ÑÑнкÑии 2. ÐÑи ÑÑнкÑии позволÑÑÑ ÑеализовÑваÑÑ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñелей ÑоÑÑиÑовки гоÑаздо ÑÑÑекÑивнее, Ñем ÑÑо возможно пÑи пÑÑмолинейном вÑзове ÑÑнкÑии поддеÑжки ÑÑавнениÑ. ÐадейÑÑвованнÑе в ÑÑом пÑогÑаммнÑе инÑеÑÑейÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð²
src/include/utils/sortsupport.h.in_rangeÐополниÑелÑно ÑемейÑÑво опеÑаÑоÑов btree Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавиÑÑ Ð¾Ð¿Ð¾ÑнÑе ÑÑнкÑии in_range, коÑоÑÑе ÑегиÑÑÑиÑÑÑÑÑÑ Ð¿Ð¾Ð´ номеÑом 3. Ðни не иÑполÑзÑÑÑÑÑ Ð² Ñ Ð¾Ð´Ðµ опеÑаÑий Ñ Ð¸Ð½Ð´ÐµÐºÑом btree; вмеÑÑо ÑÑого они ÑаÑÑиÑÑÑÑ ÑеманÑÐ¸ÐºÑ ÑемейÑÑва опеÑаÑоÑов, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¾ могло поддеÑживаÑÑ Ð¾ÐºÐ¾Ð½Ð½Ñе пÑедложениÑ
RANGEÑмеÑениеPRECEDINGиRANGEÑмеÑениеFOLLOWING(Ñм. ÐодÑаздел 4.2.8). Ðо ÑÑÑи они пÑедоÑÑавлÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑиÑ, позволÑÑÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑ Ð¸Ð»Ð¸ вÑÑиÑаÑÑÑмеÑениев ÑооÑвеÑÑÑвии Ñ Ð¿Ð¾ÑÑдком ÑоÑÑиÑовки, пÑинÑÑÑм в ÑемейÑÑве.ФÑнкÑиÑ
in_rangeдолжна имеÑÑ ÑигнаÑÑÑÑin_range(
знаÑениеtype1,базаtype1,ÑмеÑениеtype2,вÑÑиÑаниеbool,менÑÑеbool) returns boolÐнаÑÐµÐ½Ð¸ÐµÐ¸Ð±Ð°Ð·Ð°Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñипа даннÑÑ , и ÑÑÐ¾Ñ Ñип должен поддеÑживаÑÑÑÑ ÑемейÑÑвом опеÑаÑоÑов (Ñо еÑÑÑ ÑÑо должен бÑÑÑ Ñип, Ð´Ð»Ñ ÐºÐ¾ÑоÑого ÑеализÑеÑÑÑ ÑоÑÑиÑовка). ÐднакоÑмеÑÐµÐ½Ð¸ÐµÐ¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´ÑÑгого Ñипа, коÑоÑÑй никаким дÑÑгим обÑазом не поддеÑживаеÑÑÑ Ð´Ð°Ð½Ð½Ñм ÑемейÑÑвом. ÐапÑимеÑ, вÑÑÑоенное ÑемейÑÑвоtime_opsпÑедоÑÑавлÑÐµÑ ÑÑнкÑиÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑойÑмеÑÐµÐ½Ð¸ÐµÐ¸Ð¼ÐµÐµÑ Ñипinterval. СемейÑÑво Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавлÑÑÑ ÑÑнкÑииin_rangeÐ´Ð»Ñ Ð»ÑбÑÑ Ð¸Ð· ÑÐ²Ð¾Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаемÑÑ Ñипов и одного или неÑколÑÐºÐ¸Ñ ÑиповÑмеÑений. ÐÐ°Ð¶Ð´Ð°Ñ ÑÑнкÑиÑin_rangeдолжна ÑегиÑÑÑиÑоваÑÑÑÑ Ð²pg_amprocÑ Ð¿Ð¾Ð»ÐµÐ¼amproclefttype, ÑавнÑмtype1, иamprocrighttype, ÑавнÑмtype2.СÑÑÑ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ ÑÑнкÑии
in_rangeзавиÑÐ¸Ñ Ð¾Ñ Ð´Ð²ÑÑ Ð»Ð¾Ð³Ð¸ÑеÑÐºÐ¸Ñ Ñлагов. Ðна должна пÑибавиÑÑ Ð¸Ð»Ð¸ вÑÑеÑÑÑ Ð¸Ð·Ð±Ð°Ð·ÑÑмеÑение, а заÑем ÑÑавниÑÑзнаÑÐµÐ½Ð¸ÐµÑ ÑезÑлÑÑаÑом ÑледÑÑÑим обÑазом:еÑли
!вÑÑиÑаниеи!менÑÑе, возвÑаÑаеÑÑÑзнаÑение>=(база+ÑмеÑение)еÑли
!вÑÑиÑаниеименÑÑе, возвÑаÑаеÑÑÑзнаÑение<=(база+ÑмеÑение)еÑли
вÑÑиÑаниеи!менÑÑе, возвÑаÑаеÑÑÑзнаÑение>=(база-ÑмеÑение)еÑли
вÑÑиÑаниеименÑÑе, возвÑаÑаеÑÑÑзнаÑение<=(база-ÑмеÑение)
ÐÑежде Ñем делаÑÑ ÑÑо, ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° пÑовеÑиÑÑ Ð·Ð½Ð°Ðº
ÑмеÑениÑи, еÑли оно оÑÑиÑаÑелÑное, вÑдаÑÑ Ð¾ÑибкÑERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE(22013) Ñ ÑекÑÑом оÑибки «invalid preceding or following size in window function» (невеÑÐ½Ð°Ñ Ð¿ÑедÑеÑÑвÑÑÑÐ°Ñ Ð¸Ð»Ð¸ поÑледÑÑÑÐ°Ñ Ð²ÐµÐ»Ð¸Ñина в оконной ÑÑнкÑии). (ÐÑо ÑÑебÑеÑÑÑ ÑÑандаÑÑом SQL, но неÑÑандаÑÑнÑе ÑемейÑÑва опеÑаÑоÑов могÑÑ Ð¿ÑоигноÑиÑоваÑÑ Ð´Ð°Ð½Ð½Ð¾Ðµ огÑаниÑение, Ñак как оно не неÑÑÑ Ð±Ð¾Ð»ÑÑой ÑмÑÑловой нагÑÑзки.) ÐÑовеÑка ÑÑого ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´ÐµÐ»ÐµÐ³Ð¸ÑÑеÑÑÑ ÑÑнкÑииin_range, ÑÑÐ¾Ð±Ñ ÐºÐ¾Ð´Ñ ÑдÑа не ÑÑебовалоÑÑ Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÑÑ, ÑÑо ознаÑÐ°ÐµÑ Â«Ð¼ÐµÐ½ÑÑе нÑлÑ» Ð´Ð»Ñ Ð¿ÑоизволÑного Ñипа даннÑÑ .ÐÑоме Ñого, ÑÑнкÑии
in_range, еÑли ÑÑо пÑакÑиÑно, могÑÑ Ð½Ðµ вÑдаваÑÑ Ð¾ÑибкÑ, когда опеÑаÑиÑбаза+ÑмеÑениеилибаза-ÑмеÑениепÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº пеÑеполнениÑ. ÐÑавилÑнÑй ÑезÑлÑÑÐ°Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ полÑÑиÑÑ, даже еÑли ÑÑо знаÑение вÑÑ Ð¾Ð´Ð¸Ñ Ð·Ð° гÑаниÑÑ Ð´Ð¾Ð¿ÑÑÑимого диапазона ÑÑого Ñипа даннÑÑ . ÐамеÑÑÑе, ÑÑо еÑли Ð´Ð»Ñ Ñипа даннÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ñакие понÑÑиÑ, как «беÑконеÑноÑÑÑ» и «NaN», могÑÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе меÑÑ Ð´Ð»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ ÑоглаÑованноÑÑи ÑезÑлÑÑаÑовin_rangeÑ Ð¾Ð±ÑÑнÑм поÑÑдком ÑоÑÑиÑовки данного ÑемейÑÑва опеÑаÑоÑов.РезÑлÑÑаÑÑ ÑÑнкÑии
in_rangeÐ´Ð¾Ð»Ð¶Ð½Ñ ÑооÑвеÑÑÑвоваÑÑ Ð¿Ð¾ÑÑÐ´ÐºÑ ÑоÑÑиÑовки, ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÐ¼Ð¾Ð¼Ñ ÑемейÑÑвом опеÑаÑоÑов. ТоÑнее говоÑÑ, пÑи лÑбÑÑ ÑикÑиÑованнÑÑ Ð°ÑгÑменÑаÑÑмеÑениеивÑÑиÑаниеÑпÑаведливо:ÐÑли
in_rangeÑменÑÑе= true возвÑаÑÐ°ÐµÑ true Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑогознаÑениÑ1ибазÑ, true должно возвÑаÑаÑÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾Ð·Ð½Ð°ÑениÑ2<=знаÑениÑ1Ñ Ñой жебазой.ÐÑли
in_rangeÑменÑÑе= true возвÑаÑÐ°ÐµÑ false Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑогознаÑениÑ1ибазÑ, false должно возвÑаÑаÑÑÑÑ Ð´Ð»Ñ Ð»ÑбогознаÑениÑ2>=знаÑениÑ1Ñ Ñой жебазой.ÐÑли
in_rangeÑменÑÑе= true возвÑаÑÐ°ÐµÑ true Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑогознаÑениÑибазÑ1, true должно возвÑаÑаÑÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹Ð±Ð°Ð·Ñ2>=базе1Ñ Ñем жезнаÑением.ÐÑли
in_rangeÑменÑÑе= true возвÑаÑÐ°ÐµÑ false Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑогознаÑениÑибазÑ1, false должно возвÑаÑаÑÑÑÑ Ð´Ð»Ñ Ð»ÑбойбазÑ2<=базе1Ñ Ñем жезнаÑением.
ÐналогиÑнÑе ÑÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ Ñ Ð¿ÑоÑивоположнÑми ÑÑловиÑми Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑполнÑÑÑÑÑ Ð¿Ñи
менÑÑе= false.ÐÑли ÑпоÑÑдоÑиваемÑй Ñип (
type1) ÑвлÑеÑÑÑ ÑоÑÑиÑÑемÑм, ÑÑнкÑииin_rangeбÑÐ´ÐµÑ Ð¿ÐµÑедан OID ÑооÑвеÑÑÑвÑÑÑего пÑавила ÑоÑÑиÑовки ÑеÑез ÑÑандаÑÑнÑй Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ PG_GET_COLLATION().ФÑнкÑии
in_rangeне Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾Ð±ÑабаÑÑваÑÑ NULL в аÑгÑменÑÐ°Ñ Ð¸ обÑÑно помеÑаÑÑÑÑ ÐºÐ°Ðº ÑÑÑогие.equalimageÐополниÑелÑно ÑемейÑÑво опеÑаÑоÑов btree Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавиÑÑ Ð¾Ð¿Ð¾ÑнÑе ÑÑнкÑии
equalimage(«ÑавенÑÑво подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ ÑавенÑÑво обÑазов»), ÑегиÑÑÑиÑÑемÑе под номеÑом 4. ÐÑи ÑÑнкÑии позволÑÑÑ ÐºÐ¾Ð´Ñ ÑдÑа опÑеделиÑÑ, безопаÑно ли пÑименÑÑÑ Ð¸ÑклÑÑение дÑбликаÑов в B-деÑеве. РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑÑнкÑииequalimageвÑзÑваÑÑÑÑ ÑолÑко пÑи поÑÑÑоении или пеÑеÑÑÑоении индекÑа.ФÑнкÑиÑ
equalimageдолжна имеÑÑ ÑигнаÑÑÑÑequalimage(
opcintypeoid) returns boolÐÑ ÑезÑлÑÑаÑом бÑÐ´ÐµÑ ÑÑаÑиÑеÑÐºÐ°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ клаÑÑе опеÑаÑоÑов и пÑавиле ÑоÑÑиÑовки. РезÑлÑÑаÑ
trueознаÑаеÑ, ÑÑо ÑÑнкÑиÑorderÐ´Ð»Ñ ÐºÐ»Ð°ÑÑа опеÑаÑоÑов бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ0(пÑизнак ÑавенÑÑва аÑгÑменÑов), ÑолÑко когда аÑгÑменÑÑAиBвзаимозаменÑÐµÐ¼Ñ Ð±ÐµÐ· поÑеÑи ÑеманÑиÑеÑкой инÑоÑмаÑии. ÐÑли ÑÑнкÑиÑequalimageне опÑеделена или она возвÑаÑаеÑfalse, ÑаÑÑÑиÑÑваÑÑ Ð½Ð° вÑполнение данного ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð½ÐµÐ»ÑзÑ.РаÑгÑменÑе
opcintypeпеÑедаÑÑÑÑÑипа даннÑÑ , индекÑиÑÑемого даннÑм клаÑÑом опеÑаÑоÑов. ÐÑо Ñделано Ð´Ð»Ñ ÑдобÑÑва повÑоÑного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð¸Ð¶ÐµÐ»ÐµÐ¶Ð°Ñей ÑÑнкÑииpg_type.oidequalimageв ÑазнÑÑ ÐºÐ»Ð°ÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑоÑов. ÐÑли ÑипopcintypeподдеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¿Ñавила ÑоÑÑиÑовки, ÑÑнкÑииequalimageбÑÐ´ÐµÑ Ð¿ÐµÑедан OID ÑооÑвеÑÑÑвÑÑÑего пÑавила ÑеÑез ÑÑандаÑÑнÑй Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼PG_GET_COLLATION().С ÑоÑки зÑÐµÐ½Ð¸Ñ ÐºÐ»Ð°ÑÑа опеÑаÑоÑов возвÑаÑаемое знаÑение
trueознаÑаеÑ, ÑÑо возможно безопаÑное пÑименение иÑклÑÑÐµÐ½Ð¸Ñ Ð´ÑбликаÑов (или оно безопаÑно Ð´Ð»Ñ Ð¿Ñавила ÑоÑÑиÑовки, OID коÑоÑого бÑл пеÑедан ÑÑнкÑииequalimage). Ðднако код ÑдÑа бÑÐ´ÐµÑ ÑÑиÑаÑÑ Ð¸ÑклÑÑение дÑбликаÑов безопаÑнÑм Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа, ÑолÑко еÑли Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÑолбÑа в ÑÑом индекÑе иÑполÑзÑеÑÑÑ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов, ÑегиÑÑÑиÑÑÑÑий ÑÑнкÑиÑequalimage, и вÑе ÑÑи ÑÑнкÑии пÑи вÑзове возвÑаÑаÑÑtrue.РавенÑÑво обÑазов поÑÑи ÑавнознаÑно пÑоÑÑÐ¾Ð¼Ñ Ð±Ð¸ÑÐ¾Ð²Ð¾Ð¼Ñ ÑавенÑÑвÑ. Ðо еÑÑÑ Ð¾Ð´Ð½Ð¾ неболÑÑое ÑазлиÑие: когда индекÑиÑÑеÑÑÑ Ñип даннÑÑ varlena, пÑедÑÑавление двÑÑ ÑавнÑÑ Ð¾Ð±Ñазов на диÑке Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑлиÑаÑÑÑÑ Ð¸Ð·-за ÑазлиÑного пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑжаÑÐ¸Ñ TOAST к Ð²Ñ Ð¾Ð´Ð½Ñм даннÑм. ÐовоÑÑ ÑоÑмалÑно, когда ÑÑнкÑиÑ
equalimageклаÑÑа опеÑаÑоÑов возвÑаÑаеÑtrue, можно полагаÑÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð½Ð° Cdatum_image_eq()гаÑанÑиÑованно бÑÐ´ÐµÑ ÑоглаÑованной Ñ ÑÑнкÑиейorderклаÑÑа опеÑаÑоÑов (пÑи ÑÑловии пеÑедаÑи обеим ÑÑнкÑиÑм одинакового OID пÑавила ÑоÑÑиÑовки).Ðод ÑдÑа в пÑинÑипе не Ð¼Ð¾Ð¶ÐµÑ ÑделаÑÑ ÐºÐ°ÐºÐ¸Ðµ-Ñо вÑÐ²Ð¾Ð´Ñ Ð¾ ÑвойÑÑве клаÑÑа опеÑаÑоÑов «ÑавенÑÑво подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ ÑавенÑÑво обÑазов» в ÑемейÑÑве опеÑаÑоÑов Ð´Ð»Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑва Ñипов, анализиÑÑÑ Ð´ÑÑгие клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов в Ñом же ÑемейÑÑве. Также не Ð¸Ð¼ÐµÐµÑ ÑмÑÑла ÑегиÑÑÑиÑоваÑÑ Ð¼ÐµÐ¶ÑиповÑÑ ÑÑнкÑиÑ
equalimageÐ´Ð»Ñ ÑемейÑÑва опеÑаÑоÑов, и пÑи попÑÑке ÑделаÑÑ ÑÑо пÑоизойдÑÑ Ð¾Ñибка. ÐÑо ÑвÑзано Ñ Ñем, ÑÑо ÑвойÑÑво «ÑавенÑÑво подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ ÑавенÑÑво обÑазов» завиÑÐ¸Ñ Ð½Ðµ ÑолÑко Ð¾Ñ ÑеманÑики ÑоÑÑиÑовки/ÑавенÑÑва, опÑеделÑемой в некоÑоÑой ÑÑепени на ÑÑовне ÑемейÑÑва опеÑаÑоÑов. ÐообÑе говоÑÑ, ÑÑо ÑвойÑÑво оÑноÑиÑÑÑ Ðº конкÑеÑÐ½Ð¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ð¸ должно ÑаÑÑмаÑÑиваÑÑÑÑ Ð¾ÑделÑно.ÐÐ»Ñ ÐºÐ»Ð°ÑÑов опеÑаÑоÑов, поÑÑавлÑемÑÑ Ð² базовом пÑодÑкÑе Postgres Pro, пÑинÑÑо ÑоглаÑение ÑегиÑÑÑиÑоваÑÑ ÑнивеÑÑалÑнÑÑ ÑÑнкÑиÑ
equalimage. ÐолÑÑинÑÑво клаÑÑов опеÑаÑоÑов ÑегиÑÑÑиÑÑÑÑ Ð² каÑеÑÑве Ñакой ÑÑнкÑииbtequalimage(), коÑоÑÐ°Ñ ÑÑÑанавливаеÑ, ÑÑо иÑклÑÑение дÑбликаÑов безопаÑно без дополниÑелÑнÑÑ ÑÑловий. ÐпеÑаÑоÑÑ ÐºÐ»Ð°ÑÑов Ð´Ð»Ñ Ñипов даннÑÑ , поддеÑживаÑÑÐ¸Ñ Ð¿Ñавила ÑоÑÑиÑовки, напÑимеÑ, Ð´Ð»Ñ Ñипаtext, ÑегиÑÑÑиÑÑÑÑ ÑÑнкÑиÑbtvarstrequalimage(), коÑоÑÐ°Ñ ÑÑÑанавливаеÑ, ÑÑо иÑклÑÑение дÑбликаÑов безопаÑно Ñ Ð´ÐµÑеÑминиÑованнÑми пÑавилами ÑоÑÑиÑовки. ÐÐ»Ñ ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑдка в ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ ÑаÑÑиÑениÑÑ Ñакже ÑекомендÑеÑÑÑ ÑегиÑÑÑиÑоваÑÑ Ð¸Ñ ÑобÑÑвеннÑе ÑÑнкÑииequalimage.optionsРдополнение ÑемейÑÑво опеÑаÑоÑов btree Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавиÑÑ Ð¾Ð¿Ð¾ÑнÑе ÑÑнкÑии
options(«паÑамеÑÑÑ ÐºÐ»Ð°ÑÑа опеÑаÑоÑов»), ÑегиÑÑÑиÑÑемÑе под номеÑом 5. ÐÑи ÑÑнкÑии позволÑÑÑ Ð¾Ð¿ÑеделиÑÑ Ð½Ð°Ð±Ð¾Ñ Ð²Ð¸Ð´Ð¸Ð¼ÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¿Ð°ÑамеÑÑов, ÑпÑавлÑÑÑÐ¸Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸ÐµÐ¼ клаÑÑа опеÑаÑоÑов.ÐпоÑÐ½Ð°Ñ ÑÑнкÑиÑ
optionsдолжна имеÑÑ ÑигнаÑÑÑÑoptions(
reloptslocal_relopts *) returns voidÐÑой ÑÑнкÑии пеÑедаÑÑÑÑ ÑказаÑÐµÐ»Ñ Ð½Ð° ÑÑÑÑкÑÑÑÑ
local_relopts, в коÑоÑÑÑ Ð½Ñжно внеÑÑи Ð½Ð°Ð±Ð¾Ñ Ð¿Ð°ÑамеÑÑов, оÑноÑÑÑÐ¸Ñ ÑÑ Ðº клаÑÑÑ Ð¾Ð¿ÐµÑаÑоÑов. ÐбÑаÑаÑÑÑÑ Ðº ÑÑим паÑамеÑÑам из дÑÑÐ³Ð¸Ñ Ð¾Ð¿Ð¾ÑнÑÑ ÑÑнкÑий можно Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼Ð°ÐºÑоÑовPG_HAS_OPCLASS_OPTIONS()иPG_GET_OPCLASS_OPTIONS().РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð¾Ð¿Ð¾ÑÐ½Ð°Ñ ÑÑнкÑиÑ
optionsне опÑеделена ни Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ из клаÑÑов опеÑаÑоÑов btree. Сама оÑганизаÑÐ¸Ñ B-деÑева не позволÑÐµÑ Ð³Ð¸Ð±ÐºÐ¾ менÑÑÑ Ð¿ÑедÑÑавление клÑÑей, как ÑÑо возможно Ñ GiST, SP-GiST, GIN и BRIN. ÐоÑÑÐ¾Ð¼Ñ Ñ ÑÑÑеÑÑвÑÑÑим меÑодом доÑÑÑпа к индекÑÑ-B-деÑÐµÐ²Ñ Ð´Ð»Ñ ÑÑнкÑииoptionsÐ½ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½ÑÑ Ð¿Ñименений. Тем не менее ÑÑа опоÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð±Ñла добавлена Ð´Ð»Ñ B-деÑева Ñади единообÑÐ°Ð·Ð¸Ñ Ð¸ не иÑклÑÑено, ÑÑо она окажеÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾Ð¹ по меÑе ÑазвиÑÐ¸Ñ ÑеализаÑии B-деÑева в PostgreSQL.