CREATE LANGUAGE
CREATE LANGUAGE â ÑоздаÑÑ Ð¿ÑоÑедÑÑнÑй ÑзÑк
СинÑакÑиÑ
CREATE [ OR REPLACE ] [ PROCEDURAL ] LANGUAGEимÑCREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEимÑHANDLERобÑабоÑÑик_вÑзова[ INLINEобÑабоÑÑик_внедÑÑнного_кода] [ VALIDATORÑÑнкÑиÑ_пÑовеÑки]
ÐпиÑание
CREATE LANGUAGE ÑегиÑÑÑиÑÑÐµÑ Ð² базе даннÑÑ
PostgreSQL новÑй пÑоÑедÑÑнÑй ÑзÑк. ÐпоÑледÑÑвии на ÑÑом ÑзÑке можно бÑÐ´ÐµÑ Ð¾Ð¿ÑеделÑÑÑ Ð½Ð¾Ð²Ñе ÑÑнкÑии и ÑÑиггеÑнÑе пÑоÑедÑÑÑ.
ÐÑимеÑание
ÐаÑÐ¸Ð½Ð°Ñ Ñ PostgreSQL 9.1, болÑÑинÑÑво пÑоÑедÑÑнÑÑ
ÑзÑков бÑли пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ñ Ð² «ÑаÑÑиÑениÑ», Ñак ÑÑо они ÑепеÑÑ ÑÑÑанавливаÑÑÑÑ Ð¿Ð¾ÑÑедÑÑвом CREATE EXTENSION, а не CREATE LANGUAGE. ÐÑÑмое иÑполÑзование CREATE LANGUAGE ÑепеÑÑ ÑледÑÐµÑ Ð¾Ð³ÑаниÑиÑÑ ÑкÑипÑами ÑÑÑановки ÑаÑÑиÑений. ÐÑли в ваÑей базе даннÑÑ
еÑÑÑ Â«ÑиÑÑое» опÑеделение ÑзÑка, возможно, полÑÑенное в ÑезÑлÑÑаÑе обновлениÑ, его можно пÑеобÑазоваÑÑ Ð² ÑаÑÑиÑение, вÑполнив CREATE EXTENSION .имÑ_ÑзÑка FROM unpackaged
CREATE LANGUAGE по ÑÑÑи ÑвÑзÑÐ²Ð°ÐµÑ Ð¸Ð¼Ñ ÑзÑка Ñ ÑÑнкÑиÑми-обÑабоÑÑиками, иÑполнÑÑÑими код, напиÑаннÑй на ÑÑом ÑзÑке. Ðа дополниÑелÑнÑми ÑведениÑми о ÑзÑковÑÑ
обÑабоÑÑикаÑ
обÑаÑиÑеÑÑ Ðº Ðлаве 55.
Ðоманда CREATE LANGUAGE Ð¸Ð¼ÐµÐµÑ Ð´Ð²Ðµ ÑоÑмÑ. РпеÑвой ÑоÑме полÑзоваÑÐµÐ»Ñ Ð·Ð°Ð´Ð°ÑÑ ÑолÑко Ð¸Ð¼Ñ Ñоздаваемого ÑзÑка, и ÑеÑÐ²ÐµÑ PostgreSQL полÑÑÐ°ÐµÑ Ð¿Ð¾Ð´Ñ
одÑÑие паÑамеÑÑÑ, обÑаÑаÑÑÑ Ðº ÑиÑÑÐµÐ¼Ð½Ð¾Ð¼Ñ ÐºÐ°ÑÐ°Ð»Ð¾Ð³Ñ pg_pltemplate. Ðо вÑоÑой ÑоÑме полÑзоваÑÐµÐ»Ñ ÑказÑÐ²Ð°ÐµÑ Ð¿Ð°ÑамеÑÑÑ ÑзÑка вмеÑÑе Ñ ÐµÐ³Ð¾ именем. ÐÑоÑÐ°Ñ ÑоÑма позволÑÐµÑ ÑоздаÑÑ ÑзÑк, не опÑеделÑннÑй заÑанее в pg_pltemplate, но ÑÑÐ¾Ñ Ð¿Ð¾Ð´Ñ
од ÑÑиÑаеÑÑÑ ÑÑÑаÑевÑим.
Ðогда ÑеÑÐ²ÐµÑ Ð½Ð°Ñ
Ð¾Ð´Ð¸Ñ Ð² каÑалоге pg_pltemplate запиÑÑ Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ имени ÑзÑка, он бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ Ð´Ð°Ð½Ð½Ñе из каÑалога, даже еÑли паÑамеÑÑÑ ÑзÑка ÑÐºÐ°Ð·Ð°Ð½Ñ Ð² команде. ÐÑо поведение ÑпÑоÑÐ°ÐµÑ Ð·Ð°Ð³ÑÑÐ·ÐºÑ ÑкÑпоÑÑиÑованнÑÑ
Ñанее Ñайлов, коÑоÑÑе, ÑкоÑее вÑего, бÑдÑÑ ÑодеÑжаÑÑ ÑÑÑаÑевÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑÑнкÑиÑÑ
поддеÑжки ÑзÑка.
ÐбÑÑно, Ð´Ð»Ñ Ñого ÑÑÐ¾Ð±Ñ Ð·Ð°ÑегиÑÑÑиÑоваÑÑ Ð½Ð¾Ð²Ñй ÑзÑк, необÑ
одимо имеÑÑ Ð¿Ñаво ÑÑпеÑполÑзоваÑÐµÐ»Ñ PostgreSQL. Ðднако Ð²Ð»Ð°Ð´ÐµÐ»ÐµÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°ÑегиÑÑÑиÑоваÑÑ Ð½Ð¾Ð²Ñй ÑзÑк в ÑÑой базе даннÑÑ
, еÑли ÑзÑк опÑеделÑн в каÑалоге pg_pltemplate и помеÑен как допÑÑкаÑÑий Ñоздание владелÑÑами ÐÐ (tmpldbacreate ÑодеÑÐ¶Ð¸Ñ true). Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð¾Ð²ÐµÑеннÑе ÑзÑки могÑÑ ÑоздаваÑÑÑÑ Ð²Ð»Ð°Ð´ÐµÐ»ÑÑами Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, но ÑÑо можно измениÑÑ, внеÑÑ ÐºÐ¾ÑÑекÑÐ¸Ð²Ñ Ð² pg_pltemplate. СоздаÑÐµÐ»Ñ ÑзÑка ÑÑановиÑÑÑ ÐµÐ³Ð¾ владелÑÑем и Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¿Ð¾ÑледÑÑвии ÑдалиÑÑ Ð¸Ð»Ð¸ пеÑеименоваÑÑ ÐµÐ³Ð¾, либо назнаÑиÑÑ Ð´ÑÑгого владелÑÑа.
CREATE OR REPLACE LANGUAGE ÑоздаÑÑ Ð½Ð¾Ð²Ñй ÑзÑк, либо Ð·Ð°Ð¼ÐµÐ½Ð¸Ñ ÑÑÑеÑÑвÑÑÑее опÑеделение. ÐÑли ÑзÑк Ñже ÑÑÑеÑÑвÑеÑ, его паÑамеÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑÑÑ Ð² ÑооÑвеÑÑÑвии Ñо знаÑениÑми, ÑказаннÑми в команде или полÑÑеннÑми из pg_pltemplate, пÑи ÑÑом Ð²Ð»Ð°Ð´ÐµÐ»ÐµÑ ÑзÑка и пÑава доÑÑÑпа к Ð½ÐµÐ¼Ñ Ð½Ðµ менÑÑÑÑÑ, и вÑе ÑÑÑеÑÑвÑÑÑие ÑÑнкÑии, напиÑаннÑе на ÑÑом ÑзÑке, по-пÑÐµÐ¶Ð½ÐµÐ¼Ñ ÑÑиÑаÑÑÑÑ ÑабоÑими. Ðомимо Ð¾Ð±Ð»Ð°Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑнÑми пÑавами, ÑÑебÑÑÑимиÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑзÑка, полÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ ÑÑпеÑполÑзоваÑелем или владелÑÑем ÑÑÑеÑÑвÑÑÑего ÑзÑка. ÐаÑÐ¸Ð°Ð½Ñ Ñ REPLACE в оÑновном пÑедназнаÑен Ð´Ð»Ñ ÑлÑÑаев, когда ÑзÑк Ñже ÑÑÑеÑÑвÑеÑ. ÐÑли Ð´Ð»Ñ ÑзÑка еÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² pg_pltemplate, Ñо REPLACE ÑакÑиÑеÑки ниÑего не менÑÐµÑ Ð² ÑÑÑеÑÑвÑÑÑем опÑеделении, кÑоме иÑклÑÑиÑелÑного ÑлÑÑаÑ, когда запиÑÑ Ð² pg_pltemplate бÑла изменена поÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑзÑка.
ÐаÑамеÑÑÑ
TRUSTEDУказание
TRUSTED(довеÑеннÑй) ознаÑаеÑ, ÑÑо ÑзÑк не даÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð´Ð¾ÑÑÑп к даннÑм, к коÑоÑÑм он не имел Ð±Ñ Ð´Ð¾ÑÑÑпа без него. ÐÑли пÑи ÑегиÑÑÑаÑии ÑзÑка ÑÑо клÑÑевое Ñлово опÑÑено, иÑполÑзоваÑÑ ÑÑÐ¾Ñ ÑзÑк Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²ÑÑ ÑÑнкÑий ÑмогÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели PostgreSQL.PROCEDURALÐÑо Ñлово не неÑÑÑ ÑмÑÑловой нагÑÑзки.
имÑÐÐ¼Ñ Ð¿ÑоÑедÑÑного ÑзÑка. Ðно должно бÑÑÑ ÑникалÑнÑм ÑÑеди вÑÐµÑ ÑзÑков в базе даннÑÑ .
Ð ÑелÑÑ Ð¾Ð±ÑаÑной ÑовмеÑÑимоÑÑи Ð¸Ð¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ заклÑÑиÑÑ Ð² апоÑÑÑоÑÑ.
HANDLERобÑабоÑÑик_вÑзоваÐдеÑÑ
обÑабоÑÑик_вÑзоваâ Ð¸Ð¼Ñ Ñанее заÑегиÑÑÑиÑованной ÑÑнкÑии, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑоÑедÑÑ (ÑÑнкÑий) на ÑÑом ÑзÑке. ÐбÑабоÑÑик вÑзова Ð´Ð»Ñ Ð¿ÑоÑедÑÑного ÑзÑка должен бÑÑÑ Ð½Ð°Ð¿Ð¸Ñан на компилиÑÑемом ÑзÑке, напÑимеÑ, на C, Ñ ÑоглаÑениÑми о вÑÐ·Ð¾Ð²Ð°Ñ Ð²ÐµÑÑии 1 и заÑегиÑÑÑиÑован в PostgreSQL как ÑÑнкÑÐ¸Ñ Ð±ÐµÐ· аÑгÑменÑов, возвÑаÑаÑÑÐ°Ñ ÑикÑивнÑй Ñипlanguage_handler, коÑоÑÑй пÑоÑÑо показÑваеÑ, ÑÑо ÑÑа ÑÑнкÑÐ¸Ñ â обÑабоÑÑик вÑзова.INLINEобÑабоÑÑик_внедÑÑнного_кодаÐдеÑÑ
обÑабоÑÑик_внедÑÑнного_кодаâ Ð¸Ð¼Ñ Ñанее заÑегиÑÑÑиÑованной ÑÑнкÑии, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð¾Ð³Ð¾ блока кода (ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ DO) на ÑÑом ÑзÑке. ÐÑлиобÑабоÑÑик_внедÑÑнного_кодане опÑеделÑн, даннÑй ÑзÑк не бÑÐ´ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ñе блоки кода. ÐÑÐ¾Ñ Ð¾Ð±ÑабоÑÑик должен пÑинимаÑÑ Ð¾Ð´Ð¸Ð½ аÑгÑÐ¼ÐµÐ½Ñ Ñипаinternal, ÑодеÑжаÑий внÑÑÑеннее пÑедÑÑавление командÑDO, и обÑÑно возвÑаÑÐ°ÐµÑ Ñипvoid. ÐнаÑение, возвÑаÑаемое ÑÑим обÑабоÑÑиком, игноÑиÑÑеÑÑÑ.VALIDATORÑÑнкÑиÑ_пÑовеÑкиÐдеÑÑ
ÑÑнкÑиÑ_пÑовеÑкиâ Ð¸Ð¼Ñ Ñанее заÑегиÑÑÑиÑованной ÑÑнкÑии, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð¿Ñи Ñоздании новой ÑÑнкÑии на ÑÑом ÑзÑке и пÑовеÑÑÑÑ ÐµÑ. ÐÑли ÑÑнкÑÐ¸Ñ Ð¿ÑовеÑки не задана, ÑÑнкÑии на ÑÑом ÑзÑке пÑи Ñоздании пÑовеÑÑÑÑÑÑ Ð½Ðµ бÑдÑÑ. ФÑнкÑÐ¸Ñ Ð¿ÑовеÑки должна пÑинимаÑÑ Ð¾Ð´Ð¸Ð½ аÑгÑÐ¼ÐµÐ½Ñ ÑипаoidÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑом Ñоздаваемой ÑÑнкÑии и обÑÑно возвÑаÑаеÑvoid.ФÑнкÑÐ¸Ñ Ð¿ÑовеÑки обÑÑно пÑовеÑÑÐµÑ Ñело Ñоздаваемой ÑÑнкÑии на ÑинÑакÑиÑеÑкие оÑибки, но Ð¼Ð¾Ð¶ÐµÑ Ñакже пÑоанализиÑоваÑÑ Ð¸ дÑÑгие Ñ Ð°ÑакÑеÑиÑÑики ÑÑнкÑии, напÑимеÑ, поддеÑÐ¶ÐºÑ Ð¾Ð¿ÑеделÑннÑÑ Ñипов аÑгÑменÑов ÑÑим ÑзÑком. ÐнаÑение, возвÑаÑаемое ÑÑой ÑÑнкÑией, игноÑиÑÑеÑÑÑ, об оÑÐ¸Ð±ÐºÐ°Ñ Ð¾Ð½Ð° должна ÑигнализиÑоваÑÑ, вÑзÑваÑ
ereport().
ÐаÑамеÑÑ TRUSTED и имена вÑпомогаÑелÑнÑÑ
ÑÑнкÑий игноÑиÑÑÑÑÑÑ, еÑли на ÑеÑвеÑе Ð´Ð»Ñ Ñказанного ÑзÑка имееÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² pg_pltemplate.
ÐамеÑаниÑ
ÐÐ»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿ÑоÑедÑÑнÑÑ ÑзÑков ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ DROP LANGUAGE.
Ð ÑиÑÑемном каÑалоге pg_language (Ñм. Раздел 51.29) запиÑÑваеÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑзÑкаÑ
, ÑÑÑановленнÑÑ
в даннÑй моменÑ. СпиÑок ÑÑÑановленнÑÑ
ÑзÑков Ñакже показÑÐ²Ð°ÐµÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° \dL в psql.
ЧÑÐ¾Ð±Ñ ÑоздаваÑÑ ÑÑнкÑии на пÑоÑедÑÑном ÑзÑке, полÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ имеÑÑ Ð¿Ñаво USAGE Ð´Ð»Ñ ÑÑого ÑзÑка. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð´Ð¾Ð²ÐµÑеннÑÑ
ÑзÑков пÑаво USAGE даÑÑÑÑ Ñоли PUBLIC (Ñ. е. вÑем), однако пÑи желании его можно оÑозваÑÑ.
ÐÑоÑедÑÑнÑе ÑзÑки ÑвлÑÑÑÑÑ Ð»Ð¾ÐºÐ°Ð»ÑнÑми по оÑноÑÐµÐ½Ð¸Ñ Ðº базам даннÑÑ
. Тем не менее, ÑзÑк можно ÑÑÑановиÑÑ Ð² Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
template1, в ÑезÑлÑÑаÑе Ñего он бÑÐ´ÐµÑ Ð°Ð²ÑомаÑиÑеÑки доÑÑÑпен во вÑеÑ
базаÑ
даннÑÑ
, ÑоздаваемÑÑ
из Ð½ÐµÑ Ð²Ð¿Ð¾ÑледÑÑвии.
ÐбÑабоÑÑик вÑзова, обÑабоÑÑик вÑÑÑоенного кода (пÑи налиÑии) и ÑÑнкÑÐ¸Ñ Ð¿ÑовеÑки (пÑи налиÑии) Ð´Ð¾Ð»Ð¶Ð½Ñ Ñже ÑÑÑеÑÑвоваÑÑ, еÑли на ÑеÑвеÑе Ð½ÐµÑ Ð·Ð°Ð¿Ð¸Ñи Ð´Ð»Ñ ÑÑого ÑзÑка в pg_pltemplate. Ðо еÑли ÑÐ°ÐºÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ñже еÑÑÑ, ÑÑнкÑии могÑÑ Ð½Ðµ ÑÑÑеÑÑвоваÑÑ â в ÑлÑÑае оÑÑÑÑÑÑÐ²Ð¸Ñ Ð² базе даннÑÑ
они бÑдÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð°Ð²ÑомаÑиÑеÑки. (ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к ÑÐ±Ð¾Ñ Ð² CREATE LANGUAGE, еÑли в ÑÑÑановленной ÑиÑÑеме не найдÑÑÑÑ ÑазделÑÐµÐ¼Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñека, ÑеализÑÑÑÐ°Ñ ÑÑÐ¾Ñ ÑзÑк.)
Ð PostgreSQL до веÑÑии 7.3 обÑзаÑелÑно ÑÑебовалоÑÑ Ð¾Ð±ÑÑвиÑÑ ÑÑнкÑии-обÑабоÑÑики, как возвÑаÑаÑÑие ÑикÑивнÑй Ñип opaque, а не language_handler. ÐÐ»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки загÑÑзки ÑÑаÑÑÑ
Ñайлов ÑкÑпоÑÑа ÐÐ, команда CREATE LANGUAGE пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑÑнкÑии Ñ Ð¾Ð±ÑÑвленнÑм Ñипом ÑезÑлÑÑаÑа opaque, но пÑи ÑÑом вÑдаÑÑÑÑ Ð¿ÑедÑпÑеждение и Ñип ÑезÑлÑÑаÑа менÑеÑÑÑ Ð½Ð° language_handler.
ÐÑимеÑÑ
ÐÑедпоÑиÑаемÑй ÑпоÑоб ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð»ÑбÑÑ Ð¿ÑоÑедÑÑнÑÑ ÑзÑков доволÑно пÑоÑÑ:
CREATE LANGUAGE plperl;
ÐÐ»Ñ ÑзÑка, не пÑедÑÑавленного в каÑалоге pg_pltemplate, ÑÑебÑеÑÑÑ Ð²ÑполниÑÑ ÑледÑÑÑие дейÑÑвиÑ:
CREATE FUNCTION plsample_call_handler() RETURNS language_handler
AS '$libdir/plsample'
LANGUAGE C;
CREATE LANGUAGE plsample
HANDLER plsample_call_handler;СовмеÑÑимоÑÑÑ
CREATE LANGUAGE ÑвлÑеÑÑÑ ÑаÑÑиÑением PostgreSQL.