CREATE TYPE
CREATE TYPE â ÑоздаÑÑ Ð½Ð¾Ð²Ñй Ñип даннÑÑ
СинÑакÑиÑ
CREATE TYPEимÑAS ( [имÑ_аÑÑибÑÑаÑип_даннÑÑ[ COLLATEпÑавило_ÑоÑÑиÑовки] [, ... ] ] ) CREATE TYPEимÑAS ENUM ( [ 'меÑка' [, ... ] ] ) CREATE TYPEимÑAS RANGE ( SUBTYPE =подÑип[ , SUBTYPE_OPCLASS =клаÑÑ_опеÑаÑоÑа_подÑипа] [ , COLLATION =пÑавило_ÑоÑÑиÑовки] [ , CANONICAL =ÑÑнкÑиÑ_ноÑмализаÑии] [ , SUBTYPE_DIFF =ÑÑнкÑиÑ_ÑазниÑÑ_подÑипа] [ , MULTIRANGE_TYPE_NAME =имÑ_мÑлÑÑидиапазонного_Ñипа] ) CREATE TYPEимÑ( INPUT =ÑÑнкÑиÑ_ввода, OUTPUT =ÑÑнкÑиÑ_вÑвода[ , RECEIVE =ÑÑнкÑиÑ_полÑÑениÑ] [ , SEND =ÑÑнкÑиÑ_оÑпÑавки] [ , TYPMOD_IN =ÑÑнкÑиÑ_ввода_модиÑикаÑоÑа_Ñипа] [ , TYPMOD_OUT =ÑÑнкÑиÑ_вÑвода_модиÑикаÑоÑа_Ñипа] [ , ANALYZE =ÑÑнкÑиÑ_анализа] [ , SUBSCRIPT =ÑÑнкÑиÑ_обÑаÑениÑ_по_индекÑÑ] [ , INTERNALLENGTH = {внÑÑÑ_длина| VARIABLE } ] [ , PASSEDBYVALUE ] [ , ALIGNMENT =вÑÑавнивание] [ , STORAGE =Ñ Ñанение] [ , LIKE =Ñип_обÑазеÑ] [ , CATEGORY =каÑегоÑиÑ] [ , PREFERRED =пÑедпоÑиÑаемÑй] [ , DEFAULT =default] [ , ELEMENT =ÑлеменÑ] [ , DELIMITER =ÑазделиÑелÑ] [ , COLLATABLE =ÑоÑÑиÑÑемÑй] ) CREATE TYPEимÑ
ÐпиÑание
CREATE TYPE ÑегиÑÑÑиÑÑÐµÑ Ð½Ð¾Ð²Ñй Ñип даннÑÑ
Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² ÑекÑÑей базе даннÑÑ
. ÐладелÑÑем Ñипа ÑÑановиÑÑÑ ÑоздавÑий его полÑзоваÑелÑ.
ÐÑли Ñказано Ð¸Ð¼Ñ ÑÑ ÐµÐ¼Ñ, Ñип ÑоздаÑÑÑÑ Ð² Ñказанной ÑÑ ÐµÐ¼Ðµ. РпÑоÑивном ÑлÑÑае он ÑоздаÑÑÑÑ Ð² ÑекÑÑей ÑÑ ÐµÐ¼Ðµ. ÐÐ¼Ñ Ñипа должно оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¸Ð¼Ñн лÑбÑÑ Ð´ÑÑÐ³Ð¸Ñ ÑÑÑеÑÑвÑÑÑÐ¸Ñ Ñипов или доменов в Ñой же ÑÑ ÐµÐ¼Ðµ. (Ð Ñак как Ñ ÑаблиÑами ÑвÑзÑваÑÑÑÑ ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ , Ð¸Ð¼Ñ Ñипа должно Ñакже оÑлиÑаÑÑÑÑ Ð¸ Ð¾Ñ Ð¸Ð¼Ñн ÑÑÑеÑÑвÑÑÑÐ¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ Ð² ÑÑой ÑÑ ÐµÐ¼Ðµ.)
Ðоманда CREATE TYPE Ð¸Ð¼ÐµÐµÑ Ð¿ÑÑÑ ÑоÑм, показаннÑÑ
вÑÑе в Ñводке ÑинÑакÑиÑа. Ðни ÑоздаÑÑ ÑооÑвеÑÑÑвенно ÑоÑÑавной Ñип, пеÑеÑиÑление, диапазон, базовÑй Ñип или Ñип-пÑÑÑÑÑкÑ. ÐеÑвÑе ÑеÑÑÑе ÑÑи Ñипа ÑаÑÑмаÑÑиваÑÑÑÑ Ð¿Ð¾ поÑÑÐ´ÐºÑ Ð½Ð¸Ð¶Ðµ. Тип-пÑÑÑÑÑка пÑедÑÑавлÑÐµÑ Ñобой пÑоÑÑо загоÑÐ¾Ð²ÐºÑ Ð´Ð»Ñ Ñипа, коÑоÑÑй бÑÐ´ÐµÑ Ð¾Ð¿ÑеделÑн позже; он ÑоздаÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ CREATE TYPE Ñ Ð¾Ð´Ð½Ð¸Ð¼ именем, без паÑамеÑÑов. ТипÑ-пÑÑÑÑÑки необÑ
Ð¾Ð´Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿ÑÑмÑÑ
ÑÑÑлок пÑи Ñоздании базовÑÑ
Ñипов и Ñипов-диапазонов, как опиÑÑваеÑÑÑ Ð² ÑооÑвеÑÑÑвÑÑÑиÑ
ÑазделаÑ
.
СоÑÑавнÑе ÑипÑ
ÐеÑÐ²Ð°Ñ ÑоÑма CREATE TYPE ÑоздаÑÑ ÑоÑÑавной Ñип. СоÑÑавной Ñип задаÑÑÑÑ ÑпиÑком имÑн и Ñипами даннÑÑ
аÑÑибÑÑов. ÐÑли Ñип даннÑÑ
ÑвлÑеÑÑÑ ÑоÑÑиÑÑемÑм, Ñо Ð´Ð»Ñ Ð°ÑÑибÑÑа можно Ñакже задаÑÑ Ð¿Ñавило ÑоÑÑиÑовки. СоÑÑавной Ñип по ÑÑÑи не оÑлиÑаеÑÑÑ Ð¾Ñ Ñипа ÑÑÑоки ÑаблиÑÑ, но CREATE TYPE избавлÑÐµÑ Ð¾Ñ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи ÑоздаваÑÑ ÑаблиÑÑ, когда вÑÑ, ÑÑо нÑжно, ÑÑо ÑоздаÑÑ Ñип. ÐÑделÑнÑй ÑоÑÑавной Ñип Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½, напÑимеÑ, Ð´Ð»Ñ Ð¿ÐµÑедаÑи аÑгÑменÑов или ÑезÑлÑÑаÑов ÑÑнкÑии.
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ ÑоÑÑавной Ñип, необÑ
одимо имеÑÑ Ð¿Ñаво USAGE Ð´Ð»Ñ Ñипов вÑеÑ
его аÑÑибÑÑов.
Ð¢Ð¸Ð¿Ñ Ð¿ÐµÑеÑиÑлений
ÐÑоÑÐ°Ñ ÑоÑма CREATE TYPE ÑоздаÑÑ Ñип-пеÑеÑиÑление (Ñакие ÑÐ¸Ð¿Ñ Ð¾Ð¿Ð¸ÑÑваÑÑÑÑ Ð² Разделе 8.7). ÐеÑеÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿ÑинимаÑÑ ÑпиÑок меÑок в кавÑÑкаÑ
. ÐакÑималÑÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° каждой меÑки â NAMEDATALEN Ð±Ð°Ð¹Ñ (64 байÑа в ÑÑандаÑÑной ÑбоÑке PostgreSQL). (Также возможно ÑоздаÑÑ Ð¿ÐµÑеÑиÑлÑемÑй Ñип без меÑок, но ÑÑÐ¾Ñ Ñип нелÑÐ·Ñ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñений, пока командой ALTER TYPE не бÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð° Ñ
оÑÑ Ð±Ñ Ð¾Ð´Ð½Ð° меÑка.)
ÐиапазоннÑе ÑипÑ
ТÑеÑÑÑ ÑоÑма CREATE TYPE ÑоздаÑÑ Ñип-диапазон (Ñакие ÑÐ¸Ð¿Ñ Ð¾Ð¿Ð¸ÑÑваÑÑÑÑ Ð² Разделе 8.17).
ÐадаваемÑй Ð´Ð»Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° подÑип Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»ÑбÑм Ñипом Ñо ÑвÑзаннÑм клаÑÑом опеÑаÑоÑов B-деÑева (ÑÑо позволÑÐµÑ Ð¾Ð¿ÑеделиÑÑ Ð¿Ð¾ÑÑдок знаÑений в диапазоне). ÐбÑÑно поÑÑдок ÑлеменÑов опÑеделÑÐµÑ ÐºÐ»Ð°ÑÑ Ð¾Ð¿ÐµÑаÑоÑов B-деÑева по ÑмолÑаниÑ, но его можно измениÑÑ, задав Ð¸Ð¼Ñ Ð´ÑÑгого клаÑÑа в паÑамеÑÑе клаÑÑ_опеÑаÑоÑов_подÑипа. ÐÑли подÑип поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑоÑÑиÑÐ¾Ð²ÐºÑ Ð¸ ÑÑебÑеÑÑÑ, ÑÑÐ¾Ð±Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑпоÑÑдоÑивалиÑÑ Ñ Ð½ÐµÑÑандаÑÑнÑм пÑавилом ÑоÑÑиÑовки, его Ð¸Ð¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ задаÑÑ Ð² паÑамеÑÑе пÑавило_ÑоÑÑиÑовки.
ÐеобÑзаÑелÑÐ½Ð°Ñ ÑÑнкÑиÑ_ноÑмализаÑии должна пÑинимаÑÑ Ð¾Ð´Ð¸Ð½ аÑгÑÐ¼ÐµÐ½Ñ Ð¾Ð¿ÑеделÑемого Ñипа диапазона и возвÑаÑаÑÑ Ð·Ð½Ð°Ñение Ñого же Ñипа. Ðна иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð½Ð°Ñений диапазона в ноÑмализованнÑÑ ÑоÑмÑ, когда ÑÑо ÑмеÑÑно. Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 8.17.8. СоздаÑÑÑÑ ÑÑнкÑиÑ_ноÑмализаÑии неÑколÑко неÑÑивиалÑно, Ñак как она должна бÑÑÑ Ñже опÑеделена, пÑежде Ñем можно бÑÐ´ÐµÑ Ð¾Ð±ÑÑвиÑÑ Ñип-диапазон. ÐÐ»Ñ ÑÑого нÑжно ÑнаÑала ÑоздаÑÑ Ñип-пÑÑÑÑÑкÑ, коÑоÑÑй бÑÐ´ÐµÑ Ð·Ð°Ð³Ð¾Ñовкой Ñипа, не имеÑÑей никакиÑ
ÑвойÑÑв, кÑоме имени и владелÑÑа. ÐÑо можно ÑделаÑÑ, вÑполнив ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE TYPE без дополниÑелÑнÑÑ
паÑамеÑÑов. ÐаÑем можно обÑÑвиÑÑ ÑÑнкÑиÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑой Ñип-пÑÑÑÑÑка бÑÐ´ÐµÑ Ñипом аÑгÑменÑа и ÑезÑлÑÑаÑа, и, наконеÑ, обÑÑвиÑÑ Ñип-диапазон Ñ Ñем же именем. ÐÑи ÑÑом Ñип-пÑÑÑÑÑка авÑомаÑиÑеÑки замениÑÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑеннÑм Ñипом-диапазоном.имÑ
ÐеобÑзаÑелÑÐ½Ð°Ñ ÑÑнкÑиÑ_ÑазниÑÑ_подÑипа должна пÑинимаÑÑ Ð² аÑгÑменÑаÑ
два знаÑÐµÐ½Ð¸Ñ Ñипа подÑип и возвÑаÑаÑÑ Ð·Ð½Ð°Ñение double precision, пÑедÑÑавлÑÑÑее ÑазниÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð´Ð²ÑÐ¼Ñ Ð´Ð°Ð½Ð½Ñми знаÑениÑми. ХоÑÑ ÑÑÑ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ не иÑполÑзоваÑÑ, она позволÑÐµÑ ÐºÐ°ÑдиналÑно ÑвелиÑиÑÑ ÑÑÑекÑивноÑÑÑ Ð¸Ð½Ð´ÐµÐºÑов GiST Ð´Ð»Ñ ÑÑолбÑов Ñ Ñипом-диапазоном. Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 8.17.8.
РнеобÑзаÑелÑном паÑамеÑÑе имÑ_мÑлÑÑидиапазонного_Ñипа задаÑÑÑÑ Ð¸Ð¼Ñ ÑооÑвеÑÑÑвÑÑÑего Ñипа. РоÑÑÑÑÑÑвие данного паÑамеÑÑа Ð¸Ð¼Ñ ÑÑого Ñипа вÑбиÑаеÑÑÑ Ð°Ð²ÑомаÑиÑеÑки ÑледÑÑÑим обÑазом. ÐÑли Ð¸Ð¼Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð½Ð¾Ð³Ð¾ Ñипа ÑодеÑÐ¶Ð¸Ñ Ð¿Ð¾Ð´ÑÑÑÐ¾ÐºÑ range, в имени мÑлÑÑидиапазонного Ñипа она заменÑеÑÑÑ Ð¿Ð¾Ð´ÑÑÑокой multirange. РпÑоÑивном ÑлÑÑае к имени диапазонного Ñипа добавлÑеÑÑÑ Ð¾ÐºÐ¾Ð½Ñание _multirange.
ÐазовÑе ÑипÑ
ЧеÑвÑÑÑÐ°Ñ ÑоÑма CREATE TYPE ÑоздаÑÑ Ð½Ð¾Ð²Ñй базовÑй Ñип (ÑкалÑÑнÑй Ñип). ЧÑÐ¾Ð±Ñ ÑоздаÑÑ Ð½Ð¾Ð²Ñй базовÑй Ñип, нÑжно бÑÑÑ ÑÑпеÑполÑзоваÑелем. (ÐÑо огÑаниÑение введено поÑомÑ, ÑÑо оÑибоÑное опÑеделение Ñипа Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзваÑÑ Ð½Ð°ÑÑÑÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ даже Ñбой в ÑабоÑе ÑеÑвеÑа.)
ÐÑи паÑамеÑÑÑ Ð¼Ð¾Ð³ÑÑ Ð¿ÐµÑеÑиÑлÑÑÑÑÑ Ð² лÑбом поÑÑдке, не ÑолÑко в показанном вÑÑе, и болÑÑинÑÑво из ниÑ
необÑзаÑелÑнÑе. ÐÑежде Ñем ÑоздаваÑÑ Ñип, необÑ
одимо заÑегиÑÑÑиÑоваÑÑ Ð´Ð²Ðµ или более ÑÑнкÑий (Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ CREATE FUNCTION). ÐбÑзаÑелÑнÑми ÑвлÑÑÑÑÑ ÑÑнкÑии ÑÑнкÑиÑ_ввода и ÑÑнкÑиÑ_вÑвода, Ñогда как ÑÑнкÑиÑ_полÑÑениÑ, ÑÑнкÑиÑ_оÑпÑавки, ÑÑнкÑиÑ_модиÑикаÑоÑа_Ñипа, ÑÑнкÑиÑ_вÑвода_модиÑикаÑоÑа_Ñипа, ÑÑнкÑиÑ_анализа и ÑÑнкÑиÑ_обÑаÑениÑ_по_индекÑÑ Ð¼Ð¾Ð³ÑÑ Ð¾ÑÑÑÑÑÑвоваÑÑ. ÐбÑÑно ÑÑи ÑÑнкÑии ÑазÑабаÑÑваÑÑÑÑ Ð½Ð° C или дÑÑгом низкоÑÑовневом ÑзÑке.
ФÑнкÑиÑ_ввода пÑеобÑазÑÐµÑ Ð²Ð½ÐµÑнее ÑекÑÑовое пÑедÑÑавление Ñипа во внÑÑÑеннее, Ñ ÐºÐ¾ÑоÑÑм ÑабоÑаÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ Ð¸ ÑÑнкÑии, опÑеделÑннÑе Ð´Ð»Ñ ÑÑого Ñипа. ФÑнкÑиÑ_вÑвода вÑполнÑÐµÑ Ð¾Ð±ÑаÑное пÑеобÑазование. ФÑнкÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð° можно обÑÑвиÑÑ ÐºÐ°Ðº пÑинимаÑÑÑÑ Ð¾Ð´Ð¸Ð½ аÑгÑÐ¼ÐµÐ½Ñ Ñипа cstring, либо как пÑинимаÑÑÑÑ ÑÑи аÑгÑменÑа Ñипов cstring, oid и integer. РпеÑвом аÑгÑменÑе пеÑедаÑÑÑÑ Ð²Ð²Ð¾Ð´Ð¸Ð¼Ñй ÑекÑÑ Ð² виде ÑÑÑоки в ÑÑиле C, во вÑоÑом аÑгÑменÑе â ÑобÑÑвеннÑй OID Ñипа (кÑоме Ñипов маÑÑивов, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
пеÑедаÑÑÑÑ OID Ñипа ÑлеменÑа), а в ÑÑеÑÑем â модиÑикаÑоÑ_Ñипа Ð´Ð»Ñ Ñелевого ÑÑолбÑа, еÑли он опÑеделÑн (или -1 в пÑоÑивном ÑлÑÑае). ФÑнкÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð° должна возвÑаÑаÑÑ Ð·Ð½Ð°Ñение нового Ñипа даннÑÑ
. ÐбÑÑно ÑÑнкÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð° должна бÑÑÑ ÑÑÑогой (STRICT); еÑли ÑÑо не Ñак, пÑи полÑÑении на вÑ
од знаÑÐµÐ½Ð¸Ñ NULL она бÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ñ Ð¿ÐµÑвÑм паÑамеÑÑом NULL. ФÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð² ÑÑом ÑлÑÑае Ñама веÑнÑÑÑ NULL или вÑзваÑÑ Ð¾ÑибкÑ. (ÐÑо полезно в оÑновном Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки ÑÑнкÑий ввода доменнÑÑ
Ñипов, коÑоÑÑе не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑинимаÑÑ Ð´Ð°Ð½Ð½Ñе NULL.) ФÑнкÑÐ¸Ñ Ð²Ñвода должна пÑинимаÑÑ Ð¾Ð´Ð¸Ð½ аÑгÑÐ¼ÐµÐ½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ñипа даннÑÑ
, а возвÑаÑаÑÑ Ð¾Ð½Ð° должна cstring. ÐÐ»Ñ Ð·Ð½Ð°Ñений NULL ÑÑнкÑии вÑвода не вÑзÑваÑÑÑÑ.
ÐеобÑзаÑелÑÐ½Ð°Ñ ÑÑнкÑиÑ_полÑÑÐµÐ½Ð¸Ñ Ð¿ÑеобÑазÑÐµÑ Ð´Ð²Ð¾Ð¸Ñное внеÑнее пÑедÑÑавление Ñипа во внÑÑÑеннее пÑедÑÑавление. ÐÑли ÑÑа ÑÑнкÑÐ¸Ñ Ð¾ÑÑÑÑÑÑвÑеÑ, новÑй Ñип не ÑÐ¼Ð¾Ð¶ÐµÑ ÑÑаÑÑвоваÑÑ Ð² двоиÑном вводе. ÐвоиÑное пÑедÑÑавление ÑледÑÐµÑ Ð²ÑбиÑаÑÑ Ñаким, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¾ легко пеÑеводилоÑÑ Ð²Ð¾ внÑÑÑеннÑÑ ÑоÑÐ¼Ñ Ð¸ пÑи ÑÑом бÑло пеÑеноÑимÑм до ÑазÑмной ÑÑепени. (ÐапÑимеÑ, Ð´Ð»Ñ ÑÑандаÑÑнÑÑ
ÑелоÑиÑленнÑÑ
Ñипов даннÑÑ
во внеÑнем двоиÑном пÑедÑÑавлении вÑбÑан ÑеÑевой поÑÑдок байÑов, Ñогда как внÑÑÑеннее пÑедÑÑавление опÑеделÑеÑÑÑ Ð¿Ð¾ÑÑдком байÑов в пÑоÑеÑÑоÑе.) ФÑнкÑÐ¸Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° вÑполниÑÑ Ð¿ÑовеÑÐºÑ Ð²Ð²Ð¾Ð´Ð¸Ð¼Ð¾Ð³Ð¾ знаÑÐµÐ½Ð¸Ñ Ð½Ð° допÑÑÑимоÑÑÑ. ФÑнкÑÐ¸Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð±ÑÑвлена как пÑинимаÑÑÐ°Ñ Ð¾Ð´Ð¸Ð½ аÑгÑÐ¼ÐµÐ½Ñ Ñипа internal, либо как пÑинимаÑÑÐ°Ñ ÑÑи аÑгÑменÑа Ñипов internal, oid и integer. РпеÑвом аÑгÑменÑе пеÑедаÑÑÑÑ ÑказаÑÐµÐ»Ñ Ð½Ð° бÑÑÐµÑ StringInfo, ÑодеÑжаÑий полÑÑеннÑÑ Ð±Ð°Ð¹ÑовÑÑ ÑÑÑокÑ, а дополниÑелÑнÑе аÑгÑменÑÑ Ñакие же, как и Ð´Ð»Ñ ÑÑнкÑии ввода ÑекÑÑа. ФÑнкÑÐ¸Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° возвÑаÑаÑÑ Ð·Ð½Ð°Ñение нового Ñипа даннÑÑ
. ÐбÑÑно ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° бÑÑÑ ÑÑÑогой (STRICT); еÑли ÑÑо не Ñак, пÑи полÑÑении на вÑ
од знаÑÐµÐ½Ð¸Ñ NULL, она бÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ñ Ð¿ÐµÑвÑм паÑамеÑÑом NULL. ФÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð² ÑÑом ÑлÑÑае Ñама веÑнÑÑÑ NULL или вÑзÑваÑÑ Ð¾ÑибкÑ. (ÐÑо полезно в оÑновном Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки ÑÑнкÑий полÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð¼ÐµÐ½Ð½ÑÑ
Ñипов, коÑоÑÑе не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑинимаÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ NULL.) ÐодобнÑм обÑазом, необÑзаÑелÑÐ½Ð°Ñ ÑÑнкÑиÑ_оÑпÑавки пÑеобÑазÑÐµÑ Ð´Ð°Ð½Ð½Ñе из внÑÑÑеннего во внеÑнее двоиÑное пÑедÑÑавление. ÐÑли ÑÑа ÑÑнкÑÐ¸Ñ Ð½Ðµ опÑеделена, новÑй Ñип не Ð¼Ð¾Ð¶ÐµÑ ÑÑаÑÑвоваÑÑ Ð² двоиÑном вÑводе. ФÑнкÑÐ¸Ñ Ð¾ÑпÑавки должна пÑинимаÑÑ Ð¾Ð´Ð¸Ð½ аÑгÑÐ¼ÐµÐ½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ñипа даннÑÑ
, а возвÑаÑаÑÑ Ð¾Ð½Ð° должна bytea. ÐÐ»Ñ Ð·Ð½Ð°Ñений NULL ÑÑнкÑии оÑпÑавки не вÑзÑваÑÑÑÑ.
ÐдеÑÑ Ñ Ð²Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÑÑÑ Ð²Ð¾Ð¿ÑоÑ, как ÑÑнкÑии ввода и вÑвода могÑÑ Ð±ÑÑÑ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ñ Ð¿ÑинимаÑÑими или возвÑаÑаÑÑими знаÑÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ñипа, еÑли они Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ñ Ð´Ð¾ обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ñипа. ÐÑÐ²ÐµÑ Ð´Ð¾Ð²Ð¾Ð»Ñно пÑоÑÑ: ÑнаÑала нÑжно ÑоздаÑÑ Ñип-пÑÑÑÑÑкÑ, коÑоÑÑй бÑÐ´ÐµÑ Ð·Ð°Ð³Ð¾Ñовкой Ñипа, не имеÑÑей никакиÑ
ÑвойÑÑв, кÑоме имени и владелÑÑа. ÐÑо можно ÑделаÑÑ, вÑполнив ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE TYPE без дополниÑелÑнÑÑ
паÑамеÑÑов. ÐаÑем можно бÑÐ´ÐµÑ Ð¾Ð¿ÑеделиÑÑ ÑÑнкÑии ввода-вÑвода на C, ÑÑÑлаÑÑиеÑÑ Ð½Ð° ÑÑÐ¾Ñ Ñип. РнаконеÑ, команда имÑCREATE TYPE Ñ Ð¿Ð¾Ð»Ð½Ñм опÑеделением Ð·Ð°Ð¼ÐµÐ½Ð¸Ñ Ñип-пÑÑÑÑÑÐºÑ Ð¾ÐºÐ¾Ð½ÑаÑелÑнÑм и полноÑеннÑм опÑеделением, поÑле Ñего новÑй Ñип можно бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ ÐºÐ°Ðº обÑÑно.
ÐеобÑзаÑелÑнÑе ÑÑнкÑиÑ_ввода_модиÑикаÑоÑа_Ñипа и ÑÑнкÑиÑ_вÑвода_модиÑикаÑоÑа_Ñипа ÑÑебÑÑÑÑÑ, ÑолÑко еÑли ÑÐ¸Ð¿Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ Ð¼Ð¾Ð´Ð¸ÑикаÑоÑÑ, или, дÑÑгими Ñловами, дополниÑелÑнÑе огÑаниÑениÑ, ÑвÑзÑваемÑе Ñ Ð¾Ð±ÑÑвлением Ñипа, напÑÐ¸Ð¼ÐµÑ char(5) или numeric(30,2). Ð PostgreSQL ÑÐ¸Ð¿Ñ Ð¼Ð¾Ð³ÑÑ Ð¿ÑинимаÑÑ Ð² каÑеÑÑве модиÑикаÑоÑов Ð¾Ð´Ð½Ñ Ð¸Ð»Ð¸ неÑколÑко пÑоÑÑÑÑ
конÑÑÐ°Ð½Ñ Ð¸Ð»Ð¸ иденÑиÑикаÑоÑов. Ðднако ÑÑи даннÑе Ð´Ð¾Ð»Ð¶Ð½Ñ ÑпаковÑваÑÑÑÑ Ð² единÑÑвенное неоÑÑиÑаÑелÑное ÑелоÑиÑленное знаÑение, коÑоÑое и бÑÐ´ÐµÑ Ñ
ÑаниÑÑÑÑ Ð² ÑиÑÑемнÑÑ
каÑалогаÑ
. ФÑнкÑиÑ_ввода_модиÑикаÑоÑа_Ñипа полÑÑÐ°ÐµÑ Ð¾Ð±ÑÑвленнÑе модиÑикаÑоÑÑ Ð² виде ÑÑÑоки cstring. Ðна должна пÑовеÑиÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð½Ð° допÑÑÑимоÑÑÑ (и вÑзваÑÑ Ð¾ÑибкÑ, еÑли они невеÑнÑ), а заÑем вÑдаÑÑ Ð½ÐµÐ¾ÑÑиÑаÑелÑное знаÑение integer, коÑоÑое бÑÐ´ÐµÑ ÑоÑ
Ñанено в ÑÑолбÑе «typmod». ÐÑли Ð´Ð»Ñ Ñипа не опÑеделена ÑÑнкÑиÑ_ввода_модиÑикаÑоÑа_Ñипа, модиÑикаÑоÑÑ Ñипа пÑинимаÑÑÑÑ Ð½Ðµ бÑдÑÑ. ФÑнкÑиÑ_вÑвода_модиÑикаÑоÑа_Ñипа пÑеобÑазÑÐµÑ Ð²Ð½ÑÑÑеннее ÑелоÑиÑленное знаÑение typmod обÑаÑно, в ÑоÑмÑ, понÑÑнÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ. Ðна должна веÑнÑÑÑ Ð·Ð½Ð°Ñение cstring, коÑоÑое именно в ÑÑом виде бÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¾ к имени Ñипа; напÑимеÑ, ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ numeric должна веÑнÑÑÑ (30,2). ФÑнкÑиÑ_вÑвода_модиÑикаÑоÑа_Ñипа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð¿ÑÑена, в ÑÑом ÑлÑÑае ÑоÑ
ÑанÑнное ÑелоÑиÑленное знаÑение typmod по ÑмолÑÐ°Ð½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑводиÑÑÑÑ Ð¿ÑоÑÑо в виде ÑиÑла, заклÑÑÑнного в Ñкобки.
ÐеобÑзаÑелÑÐ½Ð°Ñ ÑÑнкÑиÑ_анализа вÑполнÑÐµÑ ÑÐ±Ð¾Ñ ÑпеÑиÑиÑеÑкой Ð´Ð»Ñ ÑÑого Ñипа ÑÑаÑиÑÑики в ÑÑолбÑаÑ
Ñ Ñаким Ñипом даннÑÑ
. Ðо ÑмолÑÐ°Ð½Ð¸Ñ ANALYZE пÑÑаеÑÑÑ ÑобÑаÑÑ ÑÑаÑиÑÑикÑ, иÑполÑзÑÑ Ð¾Ð¿ÐµÑаÑоÑÑ Â«Ñавно» и «менÑÑе», еÑли Ð´Ð»Ñ ÑÑого Ñипа опÑеделÑн клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов B-деÑева по ÑмолÑаниÑ. ÐÐ»Ñ Ð½ÐµÑкалÑÑнÑÑ
Ñипов ÑÑо поведение ÑкоÑее вÑего не подойдÑÑ, поÑÑÐ¾Ð¼Ñ ÐµÐ³Ð¾ можно пеÑеопÑеделиÑÑ, задав ÑобÑÑвеннÑÑ ÑÑнкÑÐ¸Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°. ÐÑа ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° пÑинимаÑÑ ÐµÐ´Ð¸Ð½ÑÑвеннÑй аÑгÑÐ¼ÐµÐ½Ñ Ñипа internal и возвÑаÑаÑÑ ÑезÑлÑÑÐ°Ñ boolean. Ðолее глÑбоко API ÑÑнкÑий анализа опиÑан в src/include/commands/vacuum.h.
ÐеобÑзаÑелÑное Ñказание ÑÑнкÑии_обÑаÑениÑ_по_индекÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð´Ð»Ñ Ñипа возможноÑÑÑ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ индекÑÑ Ð² SQL-командаÑ
. Указание ÑÑой ÑÑнкÑии не Ð´ÐµÐ»Ð°ÐµÑ Ñип «наÑÑоÑÑим» маÑÑивом; напÑимеÑ, Ñакой Ñип не бÑÐ´ÐµÑ ÑаÑÑмаÑÑиваÑÑÑÑ ÐºÐ°Ðº возможнÑй Ñип ÑезÑлÑÑаÑа конÑÑÑÑкÑий ARRAY[]. Ðо еÑли извлеÑение знаÑений пÑи обÑаÑении по индекÑÑ Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑого Ñипа вÑглÑÐ´Ð¸Ñ ÐµÑÑеÑÑвеннÑм, Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ ÑÑнкÑиÑ_обÑаÑениÑ_по_индекÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð¾Ð¿ÑеделиÑÑ, ÑÑо именно подÑазÑмеваеÑÑÑ Ð¿Ð¾Ð´ Ñаким обÑаÑением. ÐÐ°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° обÑÑвлÑÑÑÑÑ ÐºÐ°Ðº пÑинимаÑÑÐ°Ñ Ð¾Ð´Ð¸Ð½ аÑгÑÐ¼ÐµÐ½Ñ Ñипа internal и возвÑаÑаÑÑÐ°Ñ ÑезÑлÑÑÐ°Ñ Ñипа internal, в коÑоÑом пеÑедаÑÑÑÑ ÑказаÑÐµÐ»Ñ Ð½Ð° ÑÑÑÑкÑÑÑÑ Ñ Ð¼ÐµÑодами (ÑÑнкÑиÑми), ÑеализÑÑÑими обÑаÑение по индекÑÑ. РдеÑалÑÑ
API ÑÑиÑ
меÑодов опиÑÑваеÑÑÑ Ð² src/include/nodes/subscripting.h. Также Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ изÑÑиÑÑ ÑеализаÑÐ¸Ñ Ð¼Ð°ÑÑивов в src/backend/utils/adt/arraysubs.c или более пÑоÑÑой код в contrib/hstore/hstore_subs.c. ÐополниÑелÑÐ½Ð°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¿Ñиведена в Ð¢Ð¸Ð¿Ñ Ð¼Ð°ÑÑивов ниже.
ÐÑли оÑобенноÑÑи внÑÑÑеннего пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ñипа извеÑÑÐ½Ñ ÑÑнкÑиÑм ввода-вÑвода и дÑÑгим ÑÑнкÑиÑм, ÑозданнÑм ÑпеÑиалÑно Ð´Ð»Ñ ÑабоÑÑ Ñ ÑÑим Ñипом, необÑ
одимо опÑеделиÑÑ ÑÑд Ñ
аÑакÑеÑиÑÑик внÑÑÑеннего пÑедÑÑавлениÑ, о коÑоÑÑÑ
должен знаÑÑ PostgreSQL. РпеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ ÑÑо internallength (внÑÑÑеннÑÑ Ð´Ð»Ð¸Ð½Ð°). ÐÑли базовÑй Ñип даннÑÑ
Ð¸Ð¼ÐµÐµÑ ÑикÑиÑованнÑÑ Ð´Ð»Ð¸Ð½Ñ, в internallength ÑказÑваеÑÑÑ ÑÑа длина в виде положиÑелÑного ÑиÑла, а еÑли длина пеÑеменнаÑ, в internallength задаÑÑÑÑ Ð·Ð½Ð°Ñение VARIABLE. (ÐнÑÑÑи пÑи ÑÑом typlen пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð·Ð½Ð°Ñение -1.) ÐнÑÑÑеннее пÑедÑÑавление вÑеÑ
Ñипов пеÑеменной Ð´Ð»Ð¸Ð½Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ наÑинаÑÑÑÑ Ñ 4-байÑового Ñелого, задаÑÑего обÑÑÑ Ð´Ð»Ð¸Ð½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑÑого Ñипа. (ÐамеÑÑÑе, ÑÑо поле Ð´Ð»Ð¸Ð½Ñ ÑаÑÑо кодиÑÑеÑÑÑ, как опиÑано в Разделе 66.2; обÑаÑаÑÑÑÑ Ðº Ð½ÐµÐ¼Ñ Ð½Ð°Ð¿ÑÑмÑÑ Ð½ÐµÑазÑмно.)
ÐеобÑзаÑелÑнÑй Ñлаг PASSEDBYVALUE ÑказÑваеÑ, ÑÑо знаÑÐµÐ½Ð¸Ñ ÑÑого Ñипа даннÑÑ
пеÑедаÑÑÑÑ Ð¿Ð¾ знаÑениÑ, а не по ÑÑÑлке. ТипÑ, пеÑедаваемÑе по знаÑениÑ, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑикÑиÑованной Ð´Ð»Ð¸Ð½Ñ Ð¸ иÑ
внÑÑÑеннее пÑедÑÑавление не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð±Ð¾Ð»ÑÑе ÑазмеÑа Ñипа Datum (4 байÑа на одниÑ
маÑинаÑ
, 8 â на дÑÑгиÑ
).
ÐаÑамеÑÑ Ð²ÑÑавнивание опÑеделÑеÑ, как ÑÑебÑеÑÑÑ Ð²ÑÑавниваÑÑ Ð´Ð°Ð½Ð½Ñе ÑÑого Ñипа. ÐопÑÑкаеÑÑÑ Ð²ÑÑавнивание по гÑаниÑам 1, 2, 4 или 8 байÑ. ÐамеÑÑÑе, ÑÑо ÑÐ¸Ð¿Ñ Ð¿ÐµÑеменной Ð´Ð»Ð¸Ð½Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð²ÑÑÐ¾Ð²Ð½ÐµÐ½Ñ ÐºÐ°Ðº минимÑм по гÑаниÑе 4 байÑ, Ñак как иÑ
пеÑвÑм компоненÑом обÑзаÑелÑно должен бÑÑÑ int4.
ÐаÑамеÑÑ Ñ
Ñанение позволÑÐµÑ Ð²ÑбÑаÑÑ ÑÑÑаÑÐµÐ³Ð¸Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñипов даннÑÑ
пеÑеменной длинÑ. (ÐÐ»Ñ Ñипов Ñ ÑикÑиÑованной длиной поддеÑживаеÑÑÑ ÑолÑко ваÑÐ¸Ð°Ð½Ñ plain.) ÐÑли вÑбÑана ÑÑÑаÑÐµÐ³Ð¸Ñ plain, даннÑе ÑÑого Ñипа вÑегда Ñ
ÑанÑÑÑÑ Ð²Ð½ÑÑÑи, без ÑжаÑиÑ. Со ÑÑÑаÑегией extended ÑиÑÑема ÑнаÑала попÑÑаеÑÑÑ ÑжаÑÑ Ð±Ð¾Ð»ÑÑое знаÑение, а заÑем вÑноÑÐ¸Ñ ÐµÐ³Ð¾ из ÑÑÑоки оÑновной ÑаблиÑÑ, еÑли оно вÑÑ Ð¶Ðµ окажеÑÑÑ ÑлиÑком болÑÑим. С external знаÑение Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²ÑнеÑено из оÑновной ÑаблиÑÑ, но ÑиÑÑема не бÑÐ´ÐµÑ Ð¿ÑÑаÑÑÑÑ ÑжаÑÑ ÐµÐ³Ð¾. СÑÑаÑÐµÐ³Ð¸Ñ main позволÑÐµÑ ÑжаÑÑ Ð´Ð°Ð½Ð½Ñе, но не ÑÑÑемиÑÑÑ Ð²ÑнеÑÑи иÑ
из оÑновной ÑаблиÑÑ. (ÐлеменÑÑ Ð´Ð°Ð½Ð½ÑÑ
Ñ ÑÑой ÑÑÑаÑегией Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ñем не менее могÑÑ Ð±ÑÑÑ Ð²ÑнеÑÐµÐ½Ñ Ð¸Ð· оÑновной ÑаблиÑÑ, еÑли дÑÑгого ÑпоÑоба ÑмеÑÑиÑÑ Ð¸Ñ
в ÑÑÑоке неÑ, но вÑÑ Ð¶Ðµ она оÑдаÑÑ Ð±Ð¾Ð»ÑÑее пÑедпоÑÑение оÑновной ÑаблиÑе, по ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ñо ÑÑÑаÑегиÑми extended и external.)
ÐнаÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑа Ñ
Ñанение, оÑлиÑнÑе Ð¾Ñ plain, подÑазÑмеваÑÑ, ÑÑо ÑÑнкÑии Ñипа даннÑÑ
могÑÑ Ð¿ÑинимаÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² ÑоÑмаÑе toast, опиÑанном в Разделе 66.2 и ÐодÑазделе 36.13.1. ÐÑи знаÑÐµÐ½Ð¸Ñ Ð¿ÑоÑÑо опÑеделÑÑÑ ÑÑÑаÑÐµÐ³Ð¸Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ TOAST по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ ÑÑолбÑов оÑделÑемого в TOAST Ñипа даннÑÑ
; полÑзоваÑели могÑÑ Ð²ÑбиÑаÑÑ Ð´ÑÑгие ÑÑÑаÑегии Ð´Ð»Ñ Ð¾ÑделÑнÑÑ
ÑÑолбÑов, пÑименÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ALTER TABLE SET STORAGE.
ÐаÑамеÑÑ Ñип_обÑÐ°Ð·ÐµÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð·Ð°Ð´Ð°ÑÑ Ð¾ÑновнÑе ÑвойÑÑва пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñипа дÑÑгим ÑпоÑобом: ÑкопиÑоваÑÑ Ð¸Ñ
из ÑÑÑеÑÑвÑÑÑего Ñипа. Ð ÑаÑÑноÑÑи, из Ñказанного Ñипа бÑдÑÑ ÑкопиÑÐ¾Ð²Ð°Ð½Ñ ÑвойÑÑва internallength, passedbyvalue, alignment и storage. (Также возможно, Ñ
оÑÑ Ð¾Ð±ÑÑно ÑÑо не ÑÑебÑеÑÑÑ, пеÑеопÑеделиÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе из ÑÑиÑ
знаÑений, Ñказав иÑ
вмеÑÑе Ñ Ð¿Ñедложением LIKE.) ÐпÑеделÑÑÑ Ð¿ÑедÑÑавление Ñипа Ñаким обÑазом оÑобенно Ñдобно, когда низкоÑÑÐ¾Ð²Ð½ÐµÐ²Ð°Ñ ÑеализаÑÐ¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ñипа некоÑоÑÑм обÑазом опиÑаеÑÑÑ Ð½Ð° ÑÑÑеÑÑвÑÑÑий Ñип.
ÐаÑамеÑÑÑ ÐºÐ°ÑегоÑÐ¸Ñ Ð¸ пÑедпоÑиÑаемÑй позволÑÑÑ Ð¾Ð¿ÑеделÑÑÑ, какое неÑвное пÑиведение бÑÐ´ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð² неоднознаÑнÑÑ
ÑиÑÑаÑиÑÑ
. ÐаждÑй Ñип даннÑÑ
пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ Ðº некоÑоÑой каÑегоÑии, обознаÑаемой одним Ñимволом ASCII, пÑи ÑÑом он Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ, либо не бÑÑÑ Â«Ð¿ÑедпоÑиÑаемÑм» в ÑÑой каÑегоÑии. ÐнализаÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑа по возможноÑÑи вÑбеÑÐµÑ Ð¿Ñиведение к пÑедпоÑиÑÐ°ÐµÐ¼Ð¾Ð¼Ñ ÑÐ¸Ð¿Ñ (но ÑолÑко ÑÑеди дÑÑгиÑ
Ñипов Ñой же каÑегоÑии), когда ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð¼Ð¾ÑÑ ÑазÑеÑиÑÑ Ð¸Ð¼Ñ Ð¿ÐµÑегÑÑженной ÑÑнкÑии или опеÑаÑоÑа. Ðа дополниÑелÑнÑми подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº Ðлаве 10. ÐÑли Ð´Ð»Ñ Ñипа не опÑеделено неÑвное пÑиведение к какомÑ-либо дÑÑÐ³Ð¾Ð¼Ñ ÑÐ¸Ð¿Ñ Ð¸Ð»Ð¸ обÑаÑное, Ð´Ð»Ñ ÑÑиÑ
паÑамеÑÑов доÑÑаÑоÑно оÑÑавиÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ. Ðднако еÑли еÑÑÑ Ð³ÑÑппа ÑвÑзаннÑÑ
Ñипов, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð½ÐµÑвнÑе пÑиведениÑ, ÑаÑÑо бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ помеÑиÑÑ Ð¸Ñ
вÑе как пÑинадлежаÑие некоÑоÑой каÑегоÑии и назнаÑиÑÑ Ð¾Ð´Ð¸Ð½ или два «наиболее обÑиÑ
» пÑедпоÑиÑаемÑми в ÑÑой каÑегоÑии. ÐаÑамеÑÑ ÐºÐ°ÑегоÑÐ¸Ñ Ð¾Ñобенно полезен пÑи добавлении Ñипа, опÑеделÑнного полÑзоваÑелем, в ÑÑÑеÑÑвÑÑÑÑÑ Ð²ÑÑÑоеннÑÑ ÐºÐ°ÑегоÑиÑ, напÑимеÑ, в каÑегоÑÐ¸Ñ ÑиÑловÑÑ
или ÑÑÑоковÑÑ
Ñипов. Ðднако Ñак же возможно ÑоздаÑÑ ÐºÐ°ÑегоÑии Ñипов, полноÑÑÑÑ Ð¾Ð¿ÑеделÑннÑе полÑзоваÑелем. РкаÑеÑÑве имени Ñакой каÑегоÑии можно вÑбÑаÑÑ Ð»Ñбой ASCII-Ñимвол, кÑоме лаÑинÑкой заглавной бÑквÑ.
ÐÑли полÑзоваÑÐµÐ»Ñ Ñ
оÑÐµÑ Ð½Ð°Ð·Ð½Ð°ÑиÑÑ ÑÑолбÑам Ñ ÑÑим Ñипом даннÑÑ
знаÑение по ÑмолÑаниÑ, оÑлиÑное Ð¾Ñ NULL, он Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°ÑÑ ÐµÐ³Ð¾ в ÑÑой команде, Ñказав его поÑле клÑÑевого Ñлова DEFAULT. (Такое знаÑение по ÑмолÑÐ°Ð½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ пеÑеопÑеделиÑÑ ÑвнÑм пÑедложением DEFAULT, добавленнÑм пÑи Ñоздании ÑÑолбÑа.)
ЧÑÐ¾Ð±Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑиÑÑ, ÑÑо Ñип ÑвлÑеÑÑÑ Ð¼Ð°ÑÑивом ÑикÑиÑованной длинÑ, ÑкажиÑе Ñип ÑлеменÑов маÑÑива, воÑполÑзовавÑиÑÑ ÐºÐ»ÑÑевÑм Ñловом ELEMENT. ÐапÑимеÑ, ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ Ð¼Ð°ÑÑив из ÑеÑÑÑÑÑ
байÑовÑÑ
ÑелÑÑ
(int4), ÑкажиÑе ELEMENT = int4. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº Ð¢Ð¸Ð¿Ñ Ð¼Ð°ÑÑивов.
ÐаÑамеÑÑ delimiter позволÑÐµÑ Ð·Ð°Ð´Ð°ÑÑ ÑазделиÑелÑ, коÑоÑÑй бÑÐ´ÐµÑ Ð²ÑÑавлÑÑÑÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð·Ð½Ð°ÑениÑми во внеÑнем пÑедÑÑавлении маÑÑива Ñ ÑлеменÑами ÑÑого Ñипа. Ðо ÑмолÑÐ°Ð½Ð¸Ñ ÑазделиÑелем ÑвлÑеÑÑÑ Ð·Ð°Ð¿ÑÑÐ°Ñ (,). ÐамеÑÑÑе, ÑÑо ÑазделиÑÐµÐ»Ñ ÑвÑзÑваеÑÑÑ Ñ Ñипом ÑлеменÑов маÑÑива, а не Ñ Ñипом Ñамого маÑÑива.
ÐÑли необÑзаÑелÑнÑй логиÑеÑкий паÑамеÑÑ ÑоÑÑиÑÑемÑй Ñавен true, опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑолбÑов и вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñ ÑÑим Ñипом могÑÑ Ð²ÐºÐ»ÑÑаÑÑ ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¾ поÑÑдке ÑоÑÑиÑовки, в пÑедложении COLLATE. Ðак именно бÑдÑÑ Ð¸ÑполÑзоваÑÑÑÑ ÑÑи ÑказаниÑ, завиÑÐ¸Ñ Ð¾Ñ ÑеализаÑии ÑÑнкÑий, ÑабоÑаÑÑиÑ
Ñ ÑÑим Ñипом; ÑÑи ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð½Ðµ дейÑÑвÑÑÑ Ð°Ð²ÑомаÑиÑеÑки пÑоÑÑо Ð¾Ñ Ñого, ÑÑо Ñип помеÑен как ÑоÑÑиÑÑемÑй.
Ð¢Ð¸Ð¿Ñ Ð¼Ð°ÑÑивов
ÐÑи Ñоздании лÑбого нового Ñипа PostgreSQL авÑомаÑиÑеÑки ÑоздаÑÑ ÑооÑвеÑÑÑвÑÑÑий Ñип маÑÑива, Ð¸Ð¼Ñ ÐºÐ¾ÑоÑого он полÑÑаеÑ, добавлÑÑ Ð¿Ð¾Ð´ÑÑÑкивание пеÑед именем Ñипа ÑлеменÑов. ÐÑли полÑÑенное Ð¸Ð¼Ñ Ð¾ÐºÐ°Ð·ÑваеÑÑÑ Ð½Ðµ коÑоÑе NAMEDATALEN байÑ, оно ÑÑекаеÑÑÑ. (ÐÑли полÑÑенное Ñаким обÑазом Ð¸Ð¼Ñ ÐºÐ¾Ð½ÑликÑÑÐµÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Ñже ÑÑÑеÑÑвÑÑÑего Ñипа, пÑоÑеÑÑ Ð¿Ð¾Ð²ÑоÑÑеÑÑÑ, пока не бÑÐ´ÐµÑ Ð¿Ð¾Ð»ÑÑено ÑникалÑное имÑ.) ÐÑÐ¾Ñ Ð½ÐµÑвно ÑоздаваемÑй Ñип маÑÑива Ð¸Ð¼ÐµÐµÑ Ð¿ÐµÑеменнÑÑ Ð´Ð»Ð¸Ð½Ñ Ð¸ иÑполÑзÑÐµÑ Ð²ÑÑÑоеннÑе ÑÑнкÑии ввода и вÑвода array_in и array_out. Ðолее Ñого, ÑÑÐ¾Ñ Ñип иÑполÑзÑеÑÑÑ ÑиÑÑемой пÑи обÑабоÑке конÑÑÑÑкÑий ARRAY[] Ñ Ñипом, ÑозданнÑм полÑзоваÑелем. Тип маÑÑива оÑÑÐ°Ð¶Ð°ÐµÑ Ð»ÑбÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑÑа или ÑÑ
ÐµÐ¼Ñ ÑвÑзанного Ñипа ÑлеменÑа и ÑдалÑеÑÑÑ Ñам пÑи Ñдалении Ñипа ÑлеменÑа.
ÐÑ Ð¼Ð¾Ð¶ÐµÑе вполне Ñезонно ÑпÑоÑиÑÑ, заÑем нÑжен паÑамеÑÑ ELEMENT, еÑли ÑиÑÑема ÑоздаÑÑ Ð¿ÑавилÑнÑй Ñип маÑÑива авÑомаÑиÑеÑки. РоÑновном паÑамеÑÑ ELEMENT полезен в ÑлÑÑае, когда Ð²Ñ ÑоздаÑÑе Ñип ÑикÑиÑованной длинÑ, коÑоÑÑй внÑÑÑи оказÑваеÑÑÑ Ð¼Ð°ÑÑивом одинаковÑÑ
ÑлеменÑов, и Ð²Ñ Ñ
оÑиÑе, ÑÑÐ¾Ð±Ñ Ðº ÑÑим ÑлеменÑам можно бÑло обÑаÑаÑÑÑÑ Ð¿Ð¾ индекÑÑ, помимо Ñого, ÑÑо Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑеализоваÑÑ ÐºÐ°ÐºÐ¸Ðµ Ñгодно опеÑаÑии Ñ Ñипом в Ñелом. ÐапÑимеÑ, Ñип point пÑедÑÑавлен пÑоÑÑо как два ÑиÑла Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой, к коÑоÑÑм можно обÑаÑиÑÑÑÑ Ñак: point[0] и point[1]. ÐамеÑÑÑе, ÑÑо ÑÑо ÑабоÑÐ°ÐµÑ ÑолÑко Ñ Ñипами ÑикÑиÑованной длинÑ, коÑоÑÑе пÑедÑÑавлÑÑÑ Ñобой в ÑоÑноÑÑи поÑледоваÑелÑноÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²ÑÑ
полей ÑикÑиÑованной длинÑ. Ðо иÑÑоÑиÑеÑким пÑиÑинам (Ñ. е. ÑÑо опÑеделÑнно некоÑÑекÑно, но менÑÑÑ Ñже ÑлиÑком поздно), индекÑÑ Ð² маÑÑиваÑ
ÑикÑиÑованной Ð´Ð»Ð¸Ð½Ñ Ð½Ð°ÑинаÑÑÑÑ Ñ Ð½ÑлÑ, а не Ñ 1, как в маÑÑиваÑ
пеÑеменной длинÑ.
Указание SUBSCRIPT позволÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð´Ð»Ñ Ñипа даннÑÑ
поддеÑÐ¶ÐºÑ Ð¾Ð±ÑаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ индекÑÑ, даже Ð´Ð»Ñ Ñипов, коÑоÑÑе ÑиÑÑема не ÑÑиÑÐ°ÐµÑ Ð¼Ð°ÑÑивами. Ðоведение, опиÑанное вÑÑе Ð´Ð»Ñ Ð¼Ð°ÑÑивов ÑикÑиÑованной длинÑ, на Ñамом деле ÑеализÑеÑÑÑ ÑÑнкÑией raw_array_subscript_handler, заданной в каÑеÑÑве обÑабоÑÑика SUBSCRIPT â она иÑполÑзÑеÑÑÑ Ð°Ð²ÑомаÑиÑеÑки, еÑли Ð´Ð»Ñ Ñипа ÑикÑиÑованной Ð´Ð»Ð¸Ð½Ñ Ð·Ð°Ð´Ð°Ð½ паÑамеÑÑ ELEMENT, но не задан SUBSCRIPT.
Ðогда задаÑÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑÐºÐ°Ñ ÑÑнкÑÐ¸Ñ SUBSCRIPT, ÑказÑваÑÑ Ñакже ELEMENT обÑзаÑелÑно, ÑолÑко еÑли ÑÑнкÑиÑ-обÑабоÑÑик SUBSCRIPT должна ÑзнаÑÑ typelem, ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ Ð²Ð¾Ð·Ð²ÑаÑаемÑй Ñип. УÑÑиÑе, ÑÑо Ñ Ñказанием ELEMENT ÑиÑÑема бÑÐ´ÐµÑ Ð¿ÑедполагаÑÑ, ÑÑо новÑй Ñип ÑодеÑÐ¶Ð¸Ñ Ñип ÑлеменÑа либо каким-либо обÑазом ÑизиÑеÑки завиÑÐ¸Ñ Ð¾Ñ Ð½ÐµÐ³Ð¾; напÑимеÑ, измениÑÑ ÑвойÑÑва Ñипа ÑлеменÑа нелÑзÑ, еÑли ÑÐ¾Ð·Ð´Ð°Ð½Ñ ÐºÐ°ÐºÐ¸Ðµ-либо ÑÑолбÑÑ Ð·Ð°Ð²Ð¸Ñимого Ñипа.
ÐаÑамеÑÑÑ
имÑÐÐ¼Ñ Ñоздаваемого Ñипа (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹).
имÑ_аÑÑибÑÑаÐÐ¼Ñ Ð°ÑÑибÑÑа (ÑÑолбÑа) ÑоÑÑавного Ñипа.
Ñип_даннÑÑÐÐ¼Ñ ÑÑÑеÑÑвÑÑÑего Ñипа даннÑÑ , коÑоÑÑй ÑÑÐ°Ð½ÐµÑ Ñипом ÑÑолбÑа ÑоÑÑавного Ñипа.
пÑавило_ÑоÑÑиÑовкиÐÐ¼Ñ ÑÑÑеÑÑвÑÑÑего пÑавила ÑоÑÑиÑовки, ÑвÑзÑваемого Ñо ÑÑолбÑом ÑоÑÑавного Ñипа или Ñ Ñипом-диапазоном.
меÑкаСÑÑÐ¾ÐºÐ¾Ð²Ð°Ñ ÐºÐ¾Ð½ÑÑанÑа, пÑедÑÑавлÑÑÑÐ°Ñ ÑекÑÑовÑÑ Ð¼ÐµÑкÑ, ÑвÑзаннÑÑ Ñ Ð¾ÑделÑнÑм знаÑением Ñипа-пеÑеÑиÑлениÑ.
подÑипÐÐ¼Ñ Ñипа ÑлеменÑа, множеÑÑво знаÑений коÑоÑого бÑÐ´ÐµÑ Ð¿ÑедÑÑавлÑÑÑ Ñип-диапазон.
клаÑÑ_опеÑаÑоÑа_подÑипаÐÐ¼Ñ ÐºÐ»Ð°ÑÑа опеÑаÑоÑов B-деÑева Ð´Ð»Ñ Ð¿Ð¾Ð´Ñипа.
ÑÑнкÑиÑ_ноÑмализаÑииÐÐ¼Ñ ÑÑнкÑии ноÑмализаÑии Ð´Ð»Ñ Ñипа-диапазона.
ÑÑнкÑиÑ_ÑазниÑÑ_подÑипаÐÐ¼Ñ ÑÑнкÑии ÑазниÑÑ Ð´Ð»Ñ Ð·Ð½Ð°Ñений подÑипа.
имÑ_мÑлÑÑидиапазонного_ÑипаÐÐ¼Ñ ÑооÑвеÑÑÑвÑÑÑего мÑлÑÑидиапазонного Ñипа.
ÑÑнкÑиÑ_вводаÐÐ¼Ñ ÑÑнкÑии, пÑеобÑазÑÑÑей даннÑе из внеÑнего ÑекÑÑового пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñипа во внÑÑÑеннÑÑ ÑоÑмÑ.
ÑÑнкÑиÑ_вÑводаÐÐ¼Ñ ÑÑнкÑии, пÑеобÑазÑÑÑей даннÑе из внÑÑÑенней ÑоÑÐ¼Ñ Ð²Ð¾ внеÑнее ÑекÑÑовое пÑедÑÑавление Ñипа.
ÑÑнкÑиÑ_полÑÑениÑÐÐ¼Ñ ÑÑнкÑии, пÑеобÑазÑÑÑей даннÑе из внеÑнего двоиÑного пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñипа во внÑÑÑеннÑÑ ÑоÑмÑ.
ÑÑнкÑиÑ_оÑпÑавкиÐÐ¼Ñ ÑÑнкÑии, пÑеобÑазÑÑÑей даннÑе из внÑÑÑенней ÑоÑÐ¼Ñ Ð²Ð¾ внеÑнее двоиÑное пÑедÑÑавление Ñипа.
ÑÑнкÑиÑ_ввода_модиÑикаÑоÑа_ÑипаÐÐ¼Ñ ÑÑнкÑии, пÑеобÑазÑÑÑей маÑÑив модиÑикаÑоÑов Ñипа во внÑÑÑеннÑÑ ÑоÑмÑ.
ÑÑнкÑиÑ_вÑвода_модиÑикаÑоÑа_ÑипаÐÐ¼Ñ ÑÑнкÑии, пÑеобÑазÑÑÑей внÑÑÑеннÑÑ ÑоÑÐ¼Ñ Ð¼Ð¾Ð´Ð¸ÑикаÑоÑов Ñипа во внеÑнее ÑекÑÑовое пÑедÑÑавление.
ÑÑнкÑиÑ_анализаÐÐ¼Ñ ÑÑнкÑии, пÑоизводÑÑей ÑÑаÑиÑÑиÑеÑкий анализ Ñипа даннÑÑ .
ÑÑнкÑиÑ_обÑаÑениÑ_по_индекÑÑÐÐ¼Ñ ÑÑнкÑии, опÑеделÑÑÑей, как Ð´Ð»Ñ Ñипа даннÑÑ ÑабоÑÐ°ÐµÑ Ð¸Ð·Ð²Ð»ÐµÑение знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ индекÑÑ.
внÑÑÑ_длинаЧиÑÐ»Ð¾Ð²Ð°Ñ ÐºÐ¾Ð½ÑÑанÑа, задаÑÑÐ°Ñ ÑÐ°Ð·Ð¼ÐµÑ Ð²Ð½ÑÑÑеннего пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ñипа в байÑÐ°Ñ . Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿ÑедполагаеÑÑÑ, ÑÑо Ñип Ð¸Ð¼ÐµÐµÑ Ð¿ÐµÑеменнÑÑ Ð´Ð»Ð¸Ð½Ñ.
вÑÑавниваниеТÑебÑемое вÑÑавнивание Ð´Ð»Ñ Ñипа даннÑÑ . ÐопÑÑÑимÑе знаÑÐµÐ½Ð¸Ñ ÑÑого паÑамеÑÑа, еÑли он ÑказÑваеÑÑÑ:
char,int2,int4илиdouble; по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑint4.Ñ ÑанениеСÑÑаÑÐµÐ³Ð¸Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñипа даннÑÑ . ÐопÑÑÑимÑе знаÑÐµÐ½Ð¸Ñ ÑÑого паÑамеÑÑа, еÑли он ÑказÑваеÑÑÑ:
plain,external,extendedилиmain; по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑplain.Ñип_обÑазеÑÐÐ¼Ñ ÑÑÑеÑÑвÑÑÑего Ñипа даннÑÑ , Ð¾Ñ ÐºÐ¾ÑоÑого новÑй Ñип полÑÑÐ¸Ñ ÑвойÑÑва пÑедÑÑавлениÑ. Ðз ÑÑого Ñипа бÑдÑÑ ÑкопиÑÐ¾Ð²Ð°Ð½Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑов
internallength,passedbyvalue,alignmentиstorage, еÑли Ð¸Ñ Ð½Ðµ пеÑеопÑеделÑÑ ÑвнÑе ÑказаниÑ, заданнÑе дополниÑелÑно в ÑÑой командеCREATE TYPE.каÑегоÑиÑÐод каÑегоÑии (один Ñимвол ASCII) Ð´Ð»Ñ ÑÑого Ñипа. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ
'U'(ÑÑо ознаÑÐ°ÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкий Ñип, «User-defined»). ÐÐ¾Ð´Ñ Ð´ÑÑÐ³Ð¸Ñ ÑÑандаÑÑнÑÑ ÐºÐ°ÑегоÑий можно найÑи в ТаблиÑе 52.65. ÐÐ»Ñ Ð½ÐµÑÑандаÑÑнÑÑ ÐºÐ°ÑегоÑий можно вÑбÑаÑÑ Ð´ÑÑгие ASCII-ÑимволÑ.пÑедпоÑиÑаемÑйÐÑли знаÑение ÑÑого паÑамеÑÑа Ñавно true, ÑоздаваемÑй Ñип бÑÐ´ÐµÑ Ð¿ÑедпоÑиÑаемÑм в Ñвоей каÑегоÑии. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ false. ÐÑдÑÑе оÑÐµÐ½Ñ Ð¾ÑÑоÑожнÑ, ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ Ð½Ð¾Ð²Ñй пÑедпоÑиÑаемÑй Ñип в ÑÑÑеÑÑвÑÑÑей каÑегоÑии, Ñак как ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð¼ÐµÐ½ÑÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ вÑÑажений неожиданнÑм обÑазом.
defaultÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ñоздаваемого Ñипа даннÑÑ . ÐÑли не Ñказано, знаÑением по ÑмолÑÐ°Ð½Ð¸Ñ Ð±ÑÐ´ÐµÑ NULL.
ÑлеменÑСоздаваемÑй Ñип бÑÐ´ÐµÑ Ð¼Ð°ÑÑивом; ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¾Ð¿ÑеделÑÐµÑ Ñип ÑлеменÑов маÑÑива.
ÑазделиÑелÑСимвол, ÑазделÑÑÑий знаÑÐµÐ½Ð¸Ñ Ð² маÑÑÐ¸Ð²Ð°Ñ , обÑазованнÑÑ Ð¸Ð· знаÑений Ñоздаваемого Ñипа.
ÑоÑÑиÑÑемÑйÐÑли знаÑение ÑÑого паÑамеÑÑа Ñавно true, в опеÑаÑиÑÑ Ñ ÑоздаваемÑм Ñипом Ð¼Ð¾Ð¶ÐµÑ ÑÑиÑÑваÑÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ пÑÐ°Ð²Ð¸Ð»Ð°Ñ ÑоÑÑиÑовки. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑазÑмеваеÑÑÑ false.
ÐÑимеÑаниÑ
Так как на иÑполÑзование Ñипа даннÑÑ Ð¿Ð¾Ñле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ðµ накладÑваÑÑÑÑ Ð¾Ð³ÑаниÑениÑ, обÑÑвление базового Ñипа или Ñипа-диапазона по ÑÑÑи даÑÑ Ð²Ñем пÑаво на вÑполнение ÑÑнкÑий, ÑпомÑнÑÑÑÑ Ð² опÑеделении Ñипа. ÐбÑÑно ÑÑо не пÑоблема Ð´Ð»Ñ ÑÐ°ÐºÐ¸Ñ ÑÑнкÑий, какие бÑваÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð² опÑеделении Ñипов. Ðо пÑежде Ñем ÑоздаÑÑ Ñип, пÑеобÑазование коÑоÑого во внеÑнÑÑ ÑоÑÐ¼Ñ Ð¸ обÑаÑно бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ Â«ÑекÑеÑнÑÑ» инÑоÑмаÑиÑ, ÑÑÐ¾Ð¸Ñ Ð¿Ð¾Ð´ÑмаÑÑ Ð´Ð²Ð°Ð¶Ð´Ñ.
Ð PostgreSQL до веÑÑии 8.3 Ð¸Ð¼Ñ Ð³ÐµÐ½ÐµÑиÑÑемого Ñипа-маÑÑива вÑегда обÑазовалоÑÑ Ð¸Ð· имени Ñипа ÑлеменÑа и добавленного ÑпеÑеди Ñимвола подÑÑÑÐºÐ¸Ð²Ð°Ð½Ð¸Ñ (_). (Таким обÑазом, допÑÑÑÐ¸Ð¼Ð°Ñ Ð¼Ð°ÐºÑималÑÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° имени Ñипа бÑла на Ñимвол менÑÑе, Ñем Ð´Ð»Ð¸Ð½Ñ Ð´ÑÑгиÑ
имÑн.) ХоÑÑ Ð¸ ÑейÑÐ°Ñ Ð¸Ð¼Ñ Ñипа маÑÑива ÑаÑе вÑего обÑазÑеÑÑÑ Ñаким обÑазом, оно Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ дÑÑгим в ÑлÑÑае доÑÑÐ¸Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑималÑной Ð´Ð»Ð¸Ð½Ñ Ð¸Ð»Ð¸ конÑликÑов Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ полÑзоваÑелÑÑкиÑ
Ñипов, наÑинаÑÑиÑ
ÑÑ Ñ Ð¿Ð¾Ð´ÑÑÑкиваниÑ. ÐоÑÑÐ¾Ð¼Ñ Ð¿Ð¾Ð»Ð°Ð³Ð°ÑÑÑÑ Ð½Ð° ÑÑо ÑоглаÑение в коде не ÑекомендÑеÑÑÑ. ÐмеÑÑо ÑÑого, Ð¸Ð¼Ñ Ñипа маÑÑива, ÑвÑзанного Ñ Ð´Ð°Ð½Ð½Ñм Ñипом, ÑледÑÐµÑ Ð¾Ð¿ÑеделÑÑÑ Ð¿Ð¾ знаÑÐµÐ½Ð¸Ñ pg_type.typarray.
ÐообÑе же можно поÑовеÑоваÑÑ Ð½Ðµ иÑполÑзоваÑÑ Ð¸Ð¼ÐµÐ½Ð° Ñипов и ÑаблиÑ, наÑинаÑÑиеÑÑ Ñ Ð¿Ð¾Ð´ÑÑÑкиваниÑ. ХоÑÑ ÑеÑÐ²ÐµÑ ÑÐ¼Ð¾Ð¶ÐµÑ ÑгенеÑиÑоваÑÑ Ð´ÑÑгое имÑ, не конÑликÑÑÑÑее Ñ Ð¿Ð¾Ð»ÑзоваÑелÑÑким, некоÑоÑÐ°Ñ Ð¿ÑÑаниÑа вÑÑ Ð¶Ðµ возможна, оÑобенно Ñо ÑÑаÑÑми клиенÑÑкими пÑиложениÑми, коÑоÑÑе могÑÑ Ð¿Ð¾Ð»Ð°Ð³Ð°ÑÑ, ÑÑо Ð¸Ð¼Ñ Ñипа, наÑинаÑÑееÑÑ Ñ Ð¿Ð¾Ð´ÑÑÑкиваниÑ, вÑегда оÑноÑиÑÑÑ Ðº ÑÐ¸Ð¿Ñ Ð¼Ð°ÑÑива.
Ð PostgreSQL до веÑÑии 8.2 Ñ CREATE TYPE оÑÑÑÑÑÑвовала ÑоÑма Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñипа-пÑÑÑÑÑки. ÐоÑÑÐ¾Ð¼Ñ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ базового Ñипа ÑÑебовалоÑÑ ÑнаÑала ÑоздаÑÑ ÑÑнкÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð°. ÐÑи Ñаком подÑ
оде PostgreSQL воÑпÑинимал Ñип возвÑаÑа ÑÑнкÑии ввода как Ð¸Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ñипа даннÑÑ
и неÑвно Ñоздавал Ñип-пÑÑÑÑÑкÑ, на коÑоÑÑй заÑем можно бÑло ÑÑÑлаÑÑÑÑ Ð² опÑеделениÑÑ
оÑÑалÑнÑÑ
ÑÑнкÑий ввода-вÑвода. ÐÑÐ¾Ñ Ð¿Ð¾Ð´Ñ
од по-пÑÐµÐ¶Ð½ÐµÐ¼Ñ ÑабоÑаеÑ, но ÑÑиÑаеÑÑÑ ÑÑÑаÑевÑим и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð¿ÑеÑÑн в бÑдÑÑиÑ
веÑÑиÑÑ
. ÐÑоме Ñого, во избежание непÑеднамеÑенного Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ°Ñалогов Ñипами-пÑÑÑÑÑками, поÑвлÑÑÑимиÑÑ Ð² ÑезÑлÑÑаÑе пÑоÑÑÑÑ
опеÑаÑок в опÑеделении ÑÑнкÑий, Ñип-пÑÑÑÑÑка бÑÐ´ÐµÑ ÑоздаваÑÑÑÑ Ñаким обÑазом, ÑолÑко еÑли ÑÑнкÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð° напиÑана на C.name
ÐаÑÐ¸Ð½Ð°Ñ Ñ PostgreSQL 16, ÑекомендÑеÑÑÑ, ÑÑÐ¾Ð±Ñ ÑÑнкÑии, пÑинимаÑÑие базовÑе ÑипÑ, возвÑаÑали «мÑгкие» оÑибки Ñ Ð¸ÑполÑзованием меÑ
анизма errsave()/ereturn() вмеÑÑо вÑдаÑи иÑклÑÑений ereport(), как в пÑедÑдÑÑиÑ
веÑÑиÑÑ
. Ðа дополниÑелÑной инÑоÑмаÑией обÑаÑиÑеÑÑ Ðº src/backend/utils/fmgr/README.
ÐÑимеÑÑ
Ð ÑÑом пÑимеÑе ÑоздаÑÑÑÑ ÑоÑÑавной Ñип, а заÑем он иÑполÑзÑеÑÑÑ Ð² опÑеделении ÑÑнкÑии:
CREATE TYPE compfoo AS (f1 int, f2 text);
CREATE FUNCTION getfoo() RETURNS SETOF compfoo AS $$
SELECT fooid, fooname FROM foo
$$ LANGUAGE SQL;Ð ÑÑом пÑимеÑе ÑоздаÑÑÑÑ Ñип-пеÑеÑиÑление, а заÑем он иÑполÑзÑеÑÑÑ Ð² опÑеделении ÑаблиÑÑ:
CREATE TYPE bug_status AS ENUM ('new', 'open', 'closed');
CREATE TABLE bug (
id serial,
description text,
status bug_status
);Ð ÑÑом пÑимеÑе ÑоздаÑÑÑÑ Ñип-диапазон:
CREATE TYPE float8_range AS RANGE (subtype = float8, subtype_diff = float8mi);
Ð ÑледÑÑÑем пÑимеÑе ÑоздаÑÑÑÑ Ð±Ð°Ð·Ð¾Ð²Ñй Ñип даннÑÑ
box, а заÑем он иÑполÑзÑеÑÑÑ Ð² опÑеделении ÑаблиÑÑ:
CREATE TYPE box;
CREATE FUNCTION my_box_in_function(cstring) RETURNS box AS ... ;
CREATE FUNCTION my_box_out_function(box) RETURNS cstring AS ... ;
CREATE TYPE box (
INTERNALLENGTH = 16,
INPUT = my_box_in_function,
OUTPUT = my_box_out_function
);
CREATE TABLE myboxes (
id integer,
description box
);ÐÑли Ð±Ñ Ð²Ð½ÑÑÑенней ÑÑÑÑкÑÑÑой box бÑл маÑÑив из ÑеÑÑÑÑÑ
ÑлеменÑов float4, вмеÑÑо ÑÑого можно бÑло Ð±Ñ Ð¸ÑполÑзоваÑÑ Ð¾Ð¿Ñеделение:
CREATE TYPE box (
INTERNALLENGTH = 16,
INPUT = my_box_in_function,
OUTPUT = my_box_out_function,
ELEMENT = float4
);Ð Ñаком ÑлÑÑае к ÑиÑлам, ÑоÑÑавлÑÑÑим знаÑение ÑÑого Ñипа, можно бÑло Ð±Ñ Ð¾Ð±ÑаÑаÑÑÑÑ Ð¿Ð¾ индекÑÑ. РоÑÑалÑном поведение ÑÑого Ñипа бÑÐ´ÐµÑ Ñаким же.
Ð ÑÑом пÑимеÑе ÑоздаÑÑÑÑ Ñип болÑÑого обÑекÑа, а заÑем он иÑполÑзÑеÑÑÑ Ð² опÑеделении ÑаблиÑÑ:
CREATE TYPE bigobj (
INPUT = lo_filein, OUTPUT = lo_fileout,
INTERNALLENGTH = VARIABLE
);
CREATE TABLE big_objs (
id integer,
obj bigobj
);ÐÑÑгие пÑимеÑÑ, в Ñом ÑиÑле демонÑÑÑиÑÑÑÑие Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑие ÑÑнкÑии ввода-вÑвода, можно найÑи в Разделе 36.13.
СовмеÑÑимоÑÑÑ
ÐеÑÐ²Ð°Ñ ÑоÑма ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE TYPE, ÑоздаÑÑÐ°Ñ ÑоÑÑавной Ñип, ÑооÑвеÑÑÑвÑÐµÑ ÑÑандаÑÑÑ SQL. ÐÑÑгие ÑоÑÐ¼Ñ ÑвлÑÑÑÑÑ ÑаÑÑиÑениÑми PostgreSQL. ÐÐ»Ñ Ð¾Ð¿ÐµÑаÑоÑа CREATE TYPE в ÑÑандаÑÑе SQL Ñакже опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð´ÑÑгие ÑоÑмÑ, не ÑеализованнÑе в PostgreSQL.
ÐозможноÑÑÑ ÑоздаваÑÑ ÑоÑÑавной Ñип без аÑÑибÑÑов â ÑпеÑиÑиÑеÑкое оÑклонение PostgreSQL Ð¾Ñ ÑÑандаÑÑа (как и аналогиÑÐ½Ð°Ñ Ð¾ÑобенноÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE TABLE).