36.2. СиÑÑема Ñипов Postgres Pro
Ð¢Ð¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Postgres Pro делÑÑÑÑ Ð½Ð° базовÑе, ÑипÑ-конÑейнеÑÑ, ÑоÑÑавнÑе, доменнÑе и пÑевдоÑипÑ.
36.2.1. ÐазовÑе ÑипÑ
ÐазовÑе ÑÐ¸Ð¿Ñ â ÑÑо ÑипÑ, Ñакие как integer, коÑоÑÑе ÑеализÑÑÑÑÑ Ð½Ð¸Ð¶Ðµ ÑÑÐ¾Ð²Ð½Ñ ÑзÑка SQL (обÑÑно на низкоÑÑовневом ÑзÑке, напÑÐ¸Ð¼ÐµÑ C). РобÑиÑ
ÑеÑÑаÑ
они ÑооÑвеÑÑÑвÑÑÑ Ñак назÑваемÑм абÑÑÑакÑнÑм Ñипам даннÑÑ
. Postgres Pro Ð¼Ð¾Ð¶ÐµÑ ÑабоÑаÑÑ Ñ Ñакими Ñипами ÑолÑко ÑеÑез ÑÑнкÑии, пÑедоÑÑавленнÑе полÑзоваÑелем, и понимаÑÑ Ð¸Ñ
поведение ÑолÑко в Ñой ÑÑепени, в какой его опиÑÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑ. ÐÑÑÑоеннÑе базовÑе ÑÐ¸Ð¿Ñ Ð¾Ð¿Ð¸ÑÑваÑÑÑÑ Ð² Ðлаве 8.
ТипÑ-пеÑеÑиÑÐ»ÐµÐ½Ð¸Ñ (enum) можно ÑÑиÑаÑÑ Ð¿Ð¾Ð´ÐºÐ°ÑегоÑией базовÑÑ Ñипов. Ðни оÑлиÑаÑÑÑÑ Ð¾Ñ Ð´ÑÑÐ³Ð¸Ñ Ñипов Ñем, ÑÑо Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑоздаваÑÑ Ð¿ÑоÑÑо командами SQL, Ð¾Ð±Ñ Ð¾Ð´ÑÑÑ Ð±ÐµÐ· низкоÑÑовневого пÑогÑаммиÑованиÑ. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 8.7.
36.2.2. ТипÑ-конÑейнеÑÑ
Ð Postgres Pro еÑÑÑ ÑÑи вида «Ñипов-конÑейнеÑов», Ñо еÑÑÑ Ñипов, коÑоÑÑе могÑÑ ÑодеÑжаÑÑ Ð² Ñебе неÑколÑко знаÑений дÑÑÐ³Ð¸Ñ Ñипов. ÐÑо маÑÑивÑ, ÑоÑÑавнÑе ÑÐ¸Ð¿Ñ Ð¸ диапазонÑ.
ÐаÑÑÐ¸Ð²Ñ Ð¼Ð¾Ð³ÑÑ ÑодеÑжаÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво знаÑений, имеÑÑÐ¸Ñ Ð¾Ð´Ð¸Ð½ Ñип. Тип маÑÑива авÑомаÑиÑеÑки ÑоздаÑÑÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ базового и ÑоÑÑавного Ñипа, диапазона и домена, но не Ð´Ð»Ñ Ð¼Ð°ÑÑивов â маÑÑÐ¸Ð²Ñ Ð¼Ð°ÑÑивов не ÑÑÑеÑÑвÑÑÑ. ÐÐ»Ñ ÑиÑÑÐµÐ¼Ñ Ñипов многомеÑнÑе маÑÑÐ¸Ð²Ñ Ð½Ðµ оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¾Ð´Ð½Ð¾Ð¼ÐµÑнÑÑ . Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº РазделÑ 8.15.
СоÑÑавнÑе ÑипÑ, или ÑÐ¸Ð¿Ñ ÑÑÑок, обÑазÑÑÑÑÑ Ð¿Ñи Ñоздании лÑбой ÑаблиÑÑ. С помоÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE TYPE Ñакже можно опÑеделиÑÑ Â«Ð½ÐµÐ·Ð°Ð²Ð¸ÑимÑй» ÑоÑÑавной Ñип, не ÑвÑзаннÑй Ñ ÑаблиÑей. СоÑÑавной Ñип пÑедÑÑавлÑÐµÑ Ñобой пÑоÑÑо ÑпиÑок Ñипов Ñ Ð¾Ð¿ÑеделÑннÑми именами полей. ÐнаÑением ÑоÑÑавного Ñипа ÑвлÑеÑÑÑ ÑÑÑока ÑаблиÑÑ Ð¸Ð»Ð¸ запиÑÑ Ð¸Ð· знаÑений полей. Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº РазделÑ 8.16.
ÐиапазоннÑй Ñип Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð´Ð²Ð° знаÑÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñипа, коÑоÑÑе опÑеделÑÑÑ Ð½Ð¸Ð¶Ð½ÑÑ Ð¸ веÑÑ Ð½ÑÑ Ð³ÑаниÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð°. ÐиапазоннÑе ÑÐ¸Ð¿Ñ ÑоздаÑÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелем, Ñ Ð¾ÑÑ ÑÑÑеÑÑвÑÐµÑ Ð¸ неÑколÑко вÑÑÑоеннÑÑ . Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº РазделÑ 8.17.
36.2.3. ÐоменÑ
Ðомен оÑновÑваеÑÑÑ Ð½Ð° опÑеделÑнном нижележаÑем Ñипе и во Ð¼Ð½Ð¾Ð³Ð¸Ñ Ð°ÑпекÑÐ°Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð·Ð°Ð¼ÐµÐ½Ñем Ñ Ð½Ð¸Ð¼. Ðднако домен Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð¾Ð³ÑаниÑениÑ, ÑменÑÑаÑÑие множеÑÑво допÑÑÑимÑÑ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ знаÑений оÑноÑиÑелÑно нижележаÑего Ñипа. ÐÐ¾Ð¼ÐµÐ½Ñ ÑоздаÑÑÑÑ SQL-командой CREATE DOMAIN. Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº РазделÑ 8.18.
36.2.4. ÐÑевдоÑипÑ
ÐÐ»Ñ ÑпеÑиалÑнÑÑ Ñелей ÑÑÑеÑÑвÑÐµÑ Ñакже неÑколÑко «пÑевдоÑипов». ÐÑевдоÑÐ¸Ð¿Ñ Ð½ÐµÐ»ÑÐ·Ñ Ð·Ð°Ð´ÐµÐ¹ÑÑвоваÑÑ Ð² ÑÑолбÑÐ°Ñ ÑаблиÑÑ Ð¸Ð»Ð¸ в ÑÐ¸Ð¿Ð°Ñ -конÑейнеÑÐ°Ñ , но Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ Ð² обÑÑвлениÑÑ Ð°ÑгÑменÑов и ÑезÑлÑÑаÑов ÑÑнкÑий. ÐÑо даÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð²ÑделиÑÑ Ð² ÑиÑÑеме Ñипов ÑпеÑиалÑнÑе клаÑÑÑ ÑÑнкÑий. ÐÑе ÑÑÑеÑÑвÑÑÑие пÑевдоÑÐ¸Ð¿Ñ Ð¿ÐµÑеÑиÑÐ»ÐµÐ½Ñ Ð² ТаблиÑе 8.27.
36.2.5. ÐолимоÑÑнÑе ÑипÑ
ÐÑобÑй инÑеÑÐµÑ Ð¿ÑедÑÑавлÑÑÑ Ð¿ÑÑÑ Ð¿ÑевдоÑипов: anyelement, anyarray, anynonarray, anyenum и anyrange, коÑоÑÑе назÑваÑÑÑÑ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑнÑми Ñипами. ФÑнкÑиÑ, в обÑÑвлении коÑоÑой иÑполÑзÑÑÑÑÑ ÑÑи ÑипÑ, назÑваеÑÑÑ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑной. ÐолимоÑÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ ÑабоÑаÑÑ Ñо множеÑÑвом ÑазлиÑнÑÑ
Ñипов даннÑÑ
; конкÑеÑнÑй Ñип опÑеделÑеÑÑÑ Ð² завиÑимоÑÑи Ð¾Ñ Ð·Ð½Ð°ÑениÑ, пеÑеданного пÑи вÑзове.
ÐолимоÑÑнÑе аÑгÑменÑÑ Ð¸ ÑезÑлÑÑаÑÑ ÑвÑзÑваÑÑÑÑ Ð´ÑÑг Ñ Ð´ÑÑгом и ÑводÑÑÑÑ Ðº опÑеделÑÐ½Ð½Ð¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
пÑи ÑазбоÑе запÑоÑа, вÑзÑваÑÑего полимоÑÑнÑÑ ÑÑнкÑиÑ. Ркаждой позиÑии (в аÑгÑменÑаÑ
или возвÑаÑаемом знаÑении), обÑÑвленной как anyelement, Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаваÑÑÑÑ Ð»Ñбой ÑакÑиÑеÑкий Ñип даннÑÑ
, но в каждом конкÑеÑном вÑзове вÑе ÑÑи ÑакÑиÑеÑкие ÑÐ¸Ð¿Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми. ÐналогиÑнÑм обÑазом, в каждой позиÑии, обÑÑвленной как anyarray, Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаваÑÑÑÑ Ð»Ñбой Ñип даннÑÑ
маÑÑива, но вÑе ÑакÑиÑеÑкие ÑÐ¸Ð¿Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑовпадаÑÑ. Так же и во вÑеÑ
позиÑиÑÑ
, обÑÑвленнÑÑ
как anyrange, должен пеÑедаваÑÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñй диапазоннÑй Ñип. Ðолее Ñого, еÑли некоÑоÑÑе позиÑии обÑÑÐ²Ð»ÐµÐ½Ñ ÐºÐ°Ðº anyarray, а дÑÑгие как anyelement, Ñо ÑакÑиÑеÑким Ñипом в позиÑиÑÑ
anyarray должен бÑÑÑ Ð¼Ð°ÑÑив, ÑлеменÑÑ ÐºÐ¾ÑоÑого имеÑÑ ÑÐ¾Ñ Ð¶Ðµ Ñип, ÑÑо и знаÑÐµÐ½Ð¸Ñ Ð² позиÑиÑÑ
anyelement. ÐодобнÑм обÑазом, еÑли одни позиÑии обÑÑÐ²Ð»ÐµÐ½Ñ ÐºÐ°Ðº anyrange, а дÑÑгие как anyelement или anyarray, ÑакÑиÑеÑким Ñипом в позиÑиÑÑ
anyrange должен бÑÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½, подÑип коÑоÑого ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ñипом ÑлеменÑов в позиÑиÑÑ
anyelement и Ñ Ñипом, пеÑедаваемÑм в позиÑиÑÑ
anyarray. ÐÑевдоÑип anynonarray обÑабаÑÑваеÑÑÑ Ñак же, как anyelement, но Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑм огÑаниÑением â ÑакÑиÑеÑкий Ñип не должен бÑÑÑ Ñипом маÑÑива. ÐÑевдоÑип anyenum Ñоже обÑабаÑÑваеÑÑÑ ÐºÐ°Ðº anyelement, но его ÑакÑиÑеÑкие ÑÐ¸Ð¿Ñ Ð¾Ð³ÑаниÑиваÑÑÑÑ Ð¿ÐµÑеÑиÑлениÑми.
Таким обÑазом, когда Ñ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑнÑм Ñипом обÑÑвлено неÑколÑко аÑгÑменÑов, в иÑоге допÑÑкаÑÑÑÑ ÑолÑко опÑеделÑннÑе комбинаÑии ÑакÑиÑеÑкиÑ
Ñипов. ÐапÑимеÑ, ÑÑнкÑиÑ, обÑÑÐ²Ð»ÐµÐ½Ð½Ð°Ñ ÐºÐ°Ðº equal(anyelement, anyelement), пÑÐ¸Ð¼ÐµÑ Ð² аÑгÑменÑаÑ
лÑбÑе два знаÑениÑ, но ÑолÑко еÑли иÑ
ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
ÑовпадаÑÑ.
Ðогда Ñ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑнÑм Ñипом обÑÑвлено возвÑаÑаемое знаÑение ÑÑнкÑии, Ñак же полимоÑÑнÑм должен бÑÑÑ Ð¼Ð¸Ð½Ð¸Ð¼Ñм один аÑгÑменÑ, и ÑакÑиÑеÑкий Ñип ÑезÑлÑÑаÑа пÑи конкÑеÑном вÑзове опÑеделиÑÑÑ Ð¿Ð¾ ÑÐ¸Ð¿Ñ ÑакÑиÑеÑки пеÑеданного аÑгÑменÑа. ÐапÑимеÑ, еÑли Ð±Ñ Ð¾ÑÑÑÑÑÑвовал меÑ
анизм обÑаÑÐµÐ½Ð¸Ñ Ðº ÑлеменÑам маÑÑива, его можно бÑло Ð±Ñ ÑеализоваÑÑ, Ñоздав ÑÑнкÑÐ¸Ñ subscript(anyarray, integer) returns anyelement. С Ñаким обÑÑвлением пеÑвÑм ÑакÑиÑеÑким аÑгÑменÑом должен бÑÑÑ Ð¼Ð°ÑÑив, и из него бÑÐ´ÐµÑ Ð²Ñведен пÑавилÑнÑй Ñип ÑезÑлÑÑаÑа пÑи ÑазбоÑе запÑоÑа. РкаÑеÑÑве дÑÑгого пÑимеÑа можно пÑивеÑÑи ÑÑнкÑÐ¸Ñ f(anyarray) returns anyenum, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿ÑинимаÑÑ ÑолÑко маÑÑÐ¸Ð²Ñ Ð¿ÐµÑеÑиÑлений.
РболÑÑинÑÑве ÑлÑÑаев пÑи ÑазбоÑе ÑÑнкÑии ÑакÑиÑеÑкий Ñип даннÑÑ
Ð´Ð»Ñ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑного ÑезÑлÑÑаÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñведен из аÑгÑменÑов, имеÑÑиÑ
дÑÑгой полимоÑÑнÑй Ñип; напÑимеÑ, подÑип anyarray Ð¼Ð¾Ð¶ÐµÑ Ð²ÑводиÑÑÑÑ Ð¸Ð· anyelement и наобоÑоÑ. ÐÑклÑÑение пÑедÑÑавлÑÐµÑ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑнÑй ÑезÑлÑÑÐ°Ñ Ñипа anyrange â Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ ÑÑебÑеÑÑÑ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ñипа anyrange; вÑвеÑÑи его ÑакÑиÑеÑкий Ñип из Ñипа аÑгÑменÑов anyarray или anyelement нелÑзÑ. ÐÑо обÑÑÑнÑеÑÑÑ Ñем, ÑÑо на одном подÑипе могÑÑ Ð±Ð°Ð·Ð¸ÑоваÑÑÑÑ Ð½ÐµÑколÑко диапазоннÑÑ
Ñипов.
ÐамеÑÑÑе, ÑÑо anynonarray и anyenum пÑедÑÑавлÑÑÑ Ð½Ðµ оÑделÑнÑе ÑÐ¸Ð¿Ñ Ð¿ÐµÑеменнÑÑ
; ÑÑо Ñе же ÑипÑ, ÑÑо и anyelement, но Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑми огÑаниÑениÑми. ÐапÑимеÑ, обÑÑвление ÑÑнкÑии f(anyelement, anyenum) ÑавнознаÑно обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ f(anyenum, anyenum): оба ÑакÑиÑеÑкиÑ
аÑгÑменÑа Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми Ñипами-пеÑеÑиÑлениÑми.
ФÑнкÑии Ñ Ð¿ÐµÑеменнÑм ÑиÑлом аÑгÑменÑом (опиÑаннÑе в ÐодÑазделе 36.5.5) Ñоже могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑнÑми: Ð´Ð»Ñ ÑÑого иÑ
поÑледний паÑамеÑÑ Ð¾Ð¿Ð¸ÑÑваеÑÑÑ ÐºÐ°Ðº VARIADIC anyarray. ÐÐ»Ñ Ñелей ÑопоÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð°ÑгÑменÑов и опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑакÑиÑеÑкого Ñипа ÑезÑлÑÑаÑа ÑÐ°ÐºÐ°Ñ ÑÑнкÑÐ¸Ñ Ð¿ÑедÑÑавлÑеÑÑÑ Ñак же, как еÑли Ð±Ñ Ð² ней Ñвно обÑÑвлÑлоÑÑ Ð½Ñжное ÑиÑло паÑамеÑÑов anynonarray.