35.2. СиÑÑема Ñипов Postgres Pro
Ð¢Ð¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Postgres Pro делÑÑÑÑ Ð½Ð° базовÑе, ÑоÑÑавнÑе, доменнÑе и пÑевдоÑипÑ.
35.2.1. ÐазовÑе ÑипÑ
ÐазовÑе ÑÐ¸Ð¿Ñ â ÑÑо ÑÐ¸Ð¿Ñ Ð²Ñоде int4, коÑоÑÑе ÑеализÑÑÑÑÑ Ð½Ð¸Ð¶Ðµ ÑÑÐ¾Ð²Ð½Ñ ÑзÑка SQL (обÑÑно на низкоÑÑовневом ÑзÑке, напÑимеÑ, C). РобÑиÑ
ÑеÑÑаÑ
они ÑооÑвеÑÑÑвÑÑÑ Ñак назÑваемÑм абÑÑÑакÑнÑм Ñипам даннÑÑ
. Postgres Pro Ð¼Ð¾Ð¶ÐµÑ ÑабоÑаÑÑ Ñ Ñакими Ñипами ÑолÑко ÑеÑез ÑÑнкÑии, пÑедоÑÑавленнÑе полÑзоваÑелем, и понимаÑÑ Ð¸Ñ
поведение ÑолÑко в Ñой ÑÑепени, в какой его опиÑÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑ. ÐазовÑе ÑÐ¸Ð¿Ñ Ð¿Ð¾Ð´ÑазделÑÑÑÑÑ Ð½Ð° ÑкалÑÑнÑе ÑÐ¸Ð¿Ñ Ð¸ маÑÑивÑ. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑкалÑÑного Ñипа авÑомаÑиÑеÑки ÑоздаÑÑÑÑ Ñип маÑÑива, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво знаÑений ÑÑого ÑкалÑÑного Ñипа пеÑеменного ÑазмеÑа.
35.2.2. СоÑÑавнÑе ÑипÑ
СоÑÑавнÑе ÑипÑ, или ÑÐ¸Ð¿Ñ ÑÑÑок, обÑазÑÑÑÑÑ Ð¿Ñи Ñоздании лÑбой ÑаблиÑÑ. С помоÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE TYPE Ñакже можно опÑеделиÑÑ Â«Ð½ÐµÐ·Ð°Ð²Ð¸ÑимÑй» ÑоÑÑавной Ñип, не ÑвÑзаннÑй Ñ ÑаблиÑей. СоÑÑавной Ñип пÑедÑÑавлÑÐµÑ Ñобой пÑоÑÑо ÑпиÑок Ñипов Ñ Ð¾Ð¿ÑеделÑннÑми именами полей. ÐнаÑением ÑоÑÑавного Ñипа ÑвлÑеÑÑÑ ÑÑÑока ÑаблиÑÑ Ð¸Ð»Ð¸ запиÑÑ Ð¸Ð· знаÑений полей. ÐолÑзоваÑÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº ÑÑим полÑм из запÑоÑов SQL. Ðа дополниÑелÑнÑми ÑведениÑми о ÑоÑÑавнÑÑ ÑÐ¸Ð¿Ð°Ñ Ð¾Ð±ÑаÑиÑеÑÑ Ðº РазделÑ 8.16.
35.2.3. ÐоменÑ
Ðомен оÑновÑваеÑÑÑ Ð½Ð° опÑеделÑнном базовом Ñипе и во Ð¼Ð½Ð¾Ð³Ð¸Ñ Ð°ÑпекÑÐ°Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð·Ð°Ð¼ÐµÐ½Ñем Ñ Ð½Ð¸Ð¼. Ðднако домен Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе огÑаниÑениÑ, ÑменÑÑаÑÑие множеÑÑво допÑÑÑимÑÑ Ð·Ð½Ð°Ñений оÑноÑиÑелÑно нижележаÑего базового Ñипа.
ÐоменнÑе ÑÐ¸Ð¿Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑоздаваÑÑ, иÑполÑзÑÑ SQL-ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE DOMAIN. ÐÑ Ñоздание и пÑименение в ÑÑой главе не ÑаÑÑмаÑÑиваеÑÑÑ.
35.2.4. ÐÑевдоÑипÑ
ÐÐ»Ñ ÑпеÑиалÑнÑÑ Ñелей ÑÑÑеÑÑвÑÐµÑ Ñакже неÑколÑко «пÑевдоÑипов». ÐÑевдоÑÐ¸Ð¿Ñ Ð½Ðµ могÑÑ Ð¿ÑименÑÑÑÑÑ Ð² ÑÑолбÑÐ°Ñ ÑаблиÑÑ Ð¸Ð»Ð¸ аÑÑибÑÑÐ°Ñ ÑоÑÑавнÑÑ Ñипов, но Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ Ð² обÑÑвлениÑÑ Ð°ÑгÑменÑов и ÑезÑлÑÑаÑов ÑÑнкÑий. ÐÑо даÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð²ÑделиÑÑ Ð² ÑиÑÑеме Ñипов ÑпеÑиалÑнÑе клаÑÑÑ ÑÑнкÑий. ÐÑе ÑÑÑеÑÑвÑÑÑие пÑевдоÑÐ¸Ð¿Ñ Ð¿ÐµÑеÑиÑÐ»ÐµÐ½Ñ Ð² ТаблиÑе 8.25.
35.2.5. ÐолимоÑÑнÑе ÑипÑ
ÐÑобÑй инÑеÑÐµÑ Ð¿ÑедÑÑавлÑÑÑ Ð¿ÑÑÑ Ð¿ÑевдоÑипов: anyelement, anyarray, anynonarray, anyenum и anyrange, коÑоÑÑе назÑваÑÑÑÑ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑнÑми Ñипами. ФÑнкÑиÑ, в обÑÑвлении коÑоÑой иÑполÑзÑÑÑÑÑ ÑÑи ÑипÑ, назÑваеÑÑÑ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑной. ÐолимоÑÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ ÑабоÑаÑÑ Ñо множеÑÑвом ÑазлиÑнÑÑ
Ñипов даннÑÑ
; конкÑеÑнÑй Ñип опÑеделÑеÑÑÑ Ð² завиÑимоÑÑи Ð¾Ñ Ð·Ð½Ð°ÑениÑ, пеÑеданного пÑи вÑзове.
ÐолимоÑÑнÑе аÑгÑменÑÑ Ð¸ ÑезÑлÑÑаÑÑ ÑвÑзÑваÑÑÑÑ Ð´ÑÑг Ñ Ð´ÑÑгом и ÑводÑÑÑÑ Ðº опÑеделÑÐ½Ð½Ð¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
пÑи ÑазбоÑе запÑоÑа, вÑзÑваÑÑего полимоÑÑнÑÑ ÑÑнкÑиÑ. Ркаждой позиÑии (в аÑгÑменÑаÑ
или возвÑаÑаемом знаÑении), обÑÑвленной как anyelement, Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаваÑÑÑÑ Ð»Ñбой ÑакÑиÑеÑкий Ñип даннÑÑ
, но в каждом конкÑеÑном вÑзове вÑе ÑÑи ÑакÑиÑеÑкие ÑÐ¸Ð¿Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми. ÐналогиÑнÑм обÑазом, в каждой позиÑии, обÑÑвленной как anyarray, Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаваÑÑÑÑ Ð»Ñбой Ñип даннÑÑ
маÑÑива, но вÑе ÑакÑиÑеÑкие ÑÐ¸Ð¿Ñ Ð¼Ð°ÑÑивов Ð´Ð¾Ð»Ð¶Ð½Ñ ÑовпадаÑÑ. Так же и во вÑеÑ
позиÑиÑÑ
, обÑÑвленнÑÑ
как anyrange, должен пеÑедаваÑÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñй Ñип-диапазон. Ðолее Ñого, еÑли некоÑоÑÑе позиÑии обÑÑÐ²Ð»ÐµÐ½Ñ ÐºÐ°Ðº anyarray, а дÑÑгие как anyelement, Ñо ÑакÑиÑеÑким Ñипом в позиÑиÑÑ
anyarray должен бÑÑÑ Ð¼Ð°ÑÑив, ÑлеменÑÑ ÐºÐ¾ÑоÑого имеÑÑ ÑÐ¾Ñ Ð¶Ðµ Ñип, ÑÑо и знаÑÐµÐ½Ð¸Ñ Ð² позиÑиÑÑ
anyelement. ÐодобнÑм обÑазом, еÑли одни позиÑии обÑÑÐ²Ð»ÐµÐ½Ñ ÐºÐ°Ðº anyrange, а дÑÑгие как anyelement, ÑакÑиÑеÑким Ñипом в позиÑиÑÑ
anyrange должен бÑÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½, подÑип коÑоÑого ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ñипом, пеÑедаваемÑм в позиÑиÑÑ
anyelement. ÐÑевдоÑип anynonarray обÑабаÑÑваеÑÑÑ Ñак же, как anyelement, но Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑм огÑаниÑением â ÑакÑиÑеÑкий Ñип не должен бÑÑÑ Ñипом маÑÑива. ÐÑевдоÑип anyenum Ñоже обÑабаÑÑваеÑÑÑ ÐºÐ°Ðº anyelement, но его ÑакÑиÑеÑкие ÑÐ¸Ð¿Ñ Ð¾Ð³ÑаниÑиваÑÑÑÑ Ð¿ÐµÑеÑиÑлениÑми.
Таким обÑазом, когда Ñ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑнÑм Ñипом обÑÑвлено неÑколÑко аÑгÑменÑов, в иÑоге допÑÑкаÑÑÑÑ ÑолÑко опÑеделÑннÑе комбинаÑии ÑакÑиÑеÑкиÑ
Ñипов. ÐапÑимеÑ, ÑÑнкÑиÑ, обÑÑÐ²Ð»ÐµÐ½Ð½Ð°Ñ ÐºÐ°Ðº equal(anyelement, anyelement), пÑÐ¸Ð¼ÐµÑ Ð² аÑгÑменÑаÑ
лÑбÑе два знаÑениÑ, но ÑолÑко еÑли иÑ
ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
ÑовпадаÑÑ.
Ðогда Ñ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑнÑм Ñипом обÑÑвлено возвÑаÑаемое знаÑение ÑÑнкÑии, Ñак же полимоÑÑнÑм должен бÑÑÑ Ð¼Ð¸Ð½Ð¸Ð¼Ñм один аÑгÑменÑ, и ÑакÑиÑеÑкий Ñип ÑезÑлÑÑаÑа пÑи конкÑеÑном вÑзове опÑеделиÑÑÑ Ð¿Ð¾ ÑÐ¸Ð¿Ñ ÑакÑиÑеÑки пеÑеданного аÑгÑменÑа. ÐапÑимеÑ, еÑли Ð±Ñ Ð¾ÑÑÑÑÑÑвовал меÑ
анизм обÑаÑÐµÐ½Ð¸Ñ Ðº ÑлеменÑам маÑÑива, его можно бÑло Ð±Ñ ÑеализоваÑÑ, Ñоздав ÑÑнкÑÐ¸Ñ subscript(anyarray, integer) returns anyelement. С Ñаким обÑÑвлением пеÑвÑм ÑакÑиÑеÑким аÑгÑменÑом должен бÑÑÑ Ð¼Ð°ÑÑив, и из него бÑÐ´ÐµÑ Ð²Ñведен пÑавилÑнÑй Ñип ÑезÑлÑÑаÑа пÑи ÑазбоÑе запÑоÑа. РкаÑеÑÑве дÑÑгого пÑимеÑа можно пÑивеÑÑи ÑÑнкÑÐ¸Ñ f(anyarray) returns anyenum, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿ÑинимаÑÑ ÑолÑко маÑÑÐ¸Ð²Ñ Ð¿ÐµÑеÑиÑлений.
ÐамеÑÑÑе, ÑÑо anynonarray и anyenum пÑедÑÑавлÑÑÑ Ð½Ðµ оÑделÑнÑе ÑÐ¸Ð¿Ñ Ð¿ÐµÑеменнÑÑ
; ÑÑо Ñе же ÑипÑ, ÑÑо и anyelement, но Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑми огÑаниÑениÑми. ÐапÑимеÑ, обÑÑвление ÑÑнкÑии f(anyelement, anyenum) ÑавнознаÑно обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ f(anyenum, anyenum): оба ÑакÑиÑеÑкиÑ
аÑгÑменÑа Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми Ñипами-пеÑеÑиÑлениÑми.
ФÑнкÑии Ñ Ð¿ÐµÑеменнÑм ÑиÑлом аÑгÑменÑом (опиÑаннÑе в ÐодÑазделе 35.4.5) Ñоже могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑнÑми: Ð´Ð»Ñ ÑÑого иÑ
поÑледний паÑамеÑÑ Ð¾Ð¿Ð¸ÑÑваеÑÑÑ ÐºÐ°Ðº VARIADIC anyarray. ÐÐ»Ñ Ñелей ÑопоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð°ÑгÑменÑов и опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑакÑиÑеÑкого Ñипа ÑезÑлÑÑаÑа ÑÐ°ÐºÐ°Ñ ÑÑнкÑÐ¸Ñ Ð¿ÑедÑÑавлÑеÑÑÑ Ñак же, как еÑли Ð±Ñ Ð² ней Ñвно обÑÑвлÑлоÑÑ Ð½Ñжное ÑиÑло паÑамеÑÑов anynonarray.