51.1. ÐбзоÑ
РпÑоÑоколе вÑÐ´ÐµÐ»ÐµÐ½Ñ Ð¾ÑделÑнÑе ÑÐ°Ð·Ñ Ð´Ð»Ñ Ð·Ð°Ð¿ÑÑка и обÑÑной ÑабоÑÑ. Ðа ÑÑадии запÑÑка ÐºÐ»Ð¸ÐµÐ½Ñ ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑение к ÑеÑвеÑÑ Ð¸ должен ÑдовлеÑвоÑиÑÑ ÑеÑвеÑ, подÑвеÑдив ÑÐ²Ð¾Ñ Ð¿Ð¾Ð´Ð»Ð¸Ð½Ð½Ð¾ÑÑÑ. (ÐÐ»Ñ ÑÑого Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð¾Ð´Ð½Ð¾ или неÑколÑко ÑообÑений, в завиÑимоÑÑи Ð¾Ñ Ð¿ÑименÑемого меÑода пÑовеÑки подлинноÑÑи.) ÐÑли вÑÑ Ð¿ÑÐ¾Ñ Ð¾Ð´Ð¸Ñ ÑÑпеÑно, ÑеÑÐ²ÐµÑ ÑообÑÐ°ÐµÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ð¾ ÑекÑÑем ÑоÑÑоÑнии, а заÑем пеÑÐµÑ Ð¾Ð´Ð¸Ñ Ðº обÑÑной ÑабоÑе. Ðе ÑÑиÑÐ°Ñ Ð½Ð°ÑалÑного ÑÑаÑÑового ÑообÑениÑ, в ÑÑой Ñазе пÑоÑокола ведÑÑÑÑ ÑÐ¾Ð»Ñ Ð¸Ð³ÑÐ°ÐµÑ ÑеÑвеÑ.
Ð Ñ
оде обÑÑной ÑабоÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ Ð¿ÐµÑедаÑÑ Ð·Ð°Ð¿ÑоÑÑ Ð¸ дÑÑгие ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ÑеÑвеÑÑ, а ÑеÑÐ²ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ ÑезÑлÑÑаÑÑ Ð·Ð°Ð¿ÑоÑов и дÑÑгие оÑвеÑÑ. РнекоÑоÑÑÑ
ÑлÑÑаÑÑ
(напÑимеÑ, Ñ NOTIFY) ÑеÑÐ²ÐµÑ Ð¿ÐµÑедаÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ ÑообÑÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñвоей иниÑиаÑиве, но по болÑÑей ÑаÑÑи ÑÑа Ñаза ÑеанÑа ÑпÑавлÑеÑÑÑ Ð·Ð°Ð¿ÑоÑами клиенÑа.
ÐавеÑÑение ÑеанÑа обÑÑно пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¿Ð¾ Ð¶ÐµÐ»Ð°Ð½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñа, но в некоÑоÑÑÑ ÑлÑÑаÑÑ Ð¸ ÑеÑÐ²ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинÑдиÑелÑно завеÑÑиÑÑ ÑеанÑ. РлÑбом ÑлÑÑае, когда ÑеÑÐ²ÐµÑ Ð·Ð°ÐºÑÑÐ²Ð°ÐµÑ Ñоединение, он пÑедваÑиÑелÑно оÑкаÑÑÐ²Ð°ÐµÑ Ð»ÑбÑÑ Ð¾ÑкÑÑÑÑÑ (незавеÑÑÑннÑÑ) ÑÑанзакÑиÑ.
РпÑоÑеÑÑе обÑÑной ÑабоÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SQL могÑÑ Ð²ÑполнÑÑÑÑÑ Ð¿Ð¾ Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¸Ð· двÑÑ Ñазделов пÑоÑокола. ÐÑи «пÑоÑÑом» вÑполнении запÑоÑов ÐºÐ»Ð¸ÐµÐ½Ñ Ð¿Ð¾ÑÑÐ»Ð°ÐµÑ ÑекÑÑовÑÑ ÑÑÑÐ¾ÐºÑ Ð·Ð°Ð¿ÑоÑа, коÑоÑÑÑ ÑеÑÐ²ÐµÑ ÑÑÐ°Ð·Ñ Ð¶Ðµ ÑазбиÑÐ°ÐµÑ Ð¸ вÑполнÑеÑ. ÐÑи «ÑаÑÑиÑенном» вÑполнении запÑоÑов обÑабоÑка ÑазделÑеÑÑÑ Ð½Ð° неÑколÑко ÑÑапов: ÑазбоÑ, пÑивÑзÑвание знаÑений паÑамеÑÑов и иÑполнение. ÐÑо даÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð³Ð¸Ð±ÐºÐ¾ÑÑÑ Ð¸ Ð¼Ð¾Ð¶ÐµÑ ÑвелиÑиÑÑ Ð±ÑÑÑÑодейÑÑвие Ñеной болÑÑей ÑложноÑÑи.
ÐÑи обÑÑной ÑабоÑе Ñакже поддеÑживаÑÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑÐ°Ð·Ð´ÐµÐ»Ñ Ð¿ÑоÑокола Ð´Ð»Ñ ÑпеÑиалÑнÑÑ
опеÑаÑий, напÑÐ¸Ð¼ÐµÑ COPY.
51.1.1. ÐÐ±Ð·Ð¾Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° ÑообÑениÑми
ÐÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑвие пÑедÑÑавлÑÐµÑ Ñобой поÑок ÑообÑений. ÐеÑвÑй Ð±Ð°Ð¹Ñ ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð¿ÑеделÑÐµÑ Ñип ÑообÑениÑ, а ÑледÑÑÑие ÑеÑÑÑе байÑа задаÑÑ Ð´Ð»Ð¸Ð½Ñ Ð¾ÑÑалÑного ÑообÑÐµÐ½Ð¸Ñ (ÑÑа длина вклÑÑÐ°ÐµÑ ÑÐ°Ð·Ð¼ÐµÑ Ñамого Ð¿Ð¾Ð»Ñ Ð´Ð»Ð¸Ð½Ñ, но не Ð±Ð°Ð¹Ñ Ñ Ñипом ÑообÑениÑ). ÐÑÑалÑное ÑодеÑжимое ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð¿ÑеделÑеÑÑÑ ÐµÐ³Ð¾ Ñипом. Ðо иÑÑоÑиÑеÑким пÑиÑинам в Ñамом пеÑвом ÑообÑении, пеÑедаваемом клиенÑом, (ÑÑаÑÑовом ÑообÑении) пеÑвÑй Ð±Ð°Ð¹Ñ Ñ Ñипом ÑообÑÐµÐ½Ð¸Ñ Ð¾ÑÑÑÑÑÑвÑеÑ.
ЧÑÐ¾Ð±Ñ Ð½Ðµ поÑеÑÑÑÑ ÑÐ¸Ð½Ñ ÑонизаÑÐ¸Ñ Ð² поÑоке ÑообÑений, и ÑеÑвеÑÑ, и клиенÑÑ Ð¾Ð±ÑÑно ÑÑиÑÑваÑÑ Ð²ÑÑ ÑообÑение в бÑÑÐµÑ (его ÑÐ°Ð·Ð¼ÐµÑ Ð¾Ð¿ÑеделÑеÑÑÑ ÑÑÑÑÑиком байÑ), пÑежде Ñем обÑабаÑÑваÑÑ ÐµÐ³Ð¾ ÑодеÑжимое. ÐÑо позволÑÐµÑ Ð±ÐµÐ· ÑÑÑда пÑодолжиÑÑ ÑабоÑÑ, еÑли Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¾Ñибка пÑи ÑазбоÑе ÑообÑениÑ. РиÑклÑÑиÑелÑнÑÑ ÑлÑÑаÑÑ (напÑимеÑ, пÑи Ð½ÐµÑ Ð²Ð°Ñке памÑÑи Ð´Ð»Ñ Ð¿Ð¾Ð¼ÐµÑÐµÐ½Ð¸Ñ ÑообÑÐµÐ½Ð¸Ñ Ð² бÑÑеÑ), ÑÑÑÑÑик Ð±Ð°Ð¹Ñ Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ Ð¿Ð¾Ð»ÑÑаÑÐµÐ»Ñ Ð¾Ð¿ÑеделиÑÑ, ÑколÑко поÑÑÑпаÑÑÐ¸Ñ Ð±Ð°Ð¹Ñ Ð½Ñжно пÑопÑÑÑиÑÑ, пÑежде Ñем пÑодолжаÑÑ Ð¿Ð¾Ð»ÑÑаÑÑ ÑообÑениÑ.
С дÑÑгой ÑÑоÑонÑ, и клиенÑÑ, и ÑеÑвеÑÑ, ни пÑи ÐºÐ°ÐºÐ¸Ñ ÑÑловиÑÑ Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÐµÑедаваÑÑ Ð½ÐµÐ¿Ð¾Ð»Ð½Ñе ÑообÑениÑ. ЧÑÐ¾Ð±Ñ ÑÑого не допÑÑÑиÑÑ, обÑÑно вÑÑ ÑообÑение ÑнаÑала ÑазмеÑаеÑÑÑ Ð² бÑÑеÑе, и ÑолÑко поÑом пеÑедаÑÑÑÑ. ÐÑли в пÑоÑеÑÑе оÑпÑавки или полÑÑÐµÐ½Ð¸Ñ ÑообÑÐµÐ½Ð¸Ñ Ð¿ÑоиÑÑ Ð¾Ð´Ð¸Ñ Ñбой пеÑедаÑи, единÑÑвеннÑм ÑазÑмнÑм ваÑианÑом пÑÐ¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð¿ÑеÑÑвание ÑоединениÑ, Ñак как веÑоÑÑноÑÑÑ Ð²Ð¾ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑÐ¸Ð½Ñ ÑонизаÑии по гÑаниÑам ÑообÑений в ÑÑой ÑиÑÑаÑии минималÑна.
51.1.2. ÐÐ±Ð·Ð¾Ñ ÑаÑÑиÑенного вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов
Ð ÑаÑÑиÑенном пÑоÑоколе запÑоÑов иÑполнение команд SQL ÑазделÑеÑÑÑ Ð½Ð° неÑколÑко ÑÑапов. СоÑÑоÑние Ð¼ÐµÐ¶Ð´Ñ ÑÑапами пÑедÑÑавлÑеÑÑÑ Ð¾Ð±ÑекÑами двÑÑ
Ñипов: подгоÑовленнÑе опеÑаÑоÑÑ Ð¸ поÑÑалÑ. ÐодгоÑовленнÑй опеÑаÑÐ¾Ñ Ð¿ÑедÑÑавлÑÐµÑ Ñобой ÑезÑлÑÑÐ°Ñ ÑазбоÑа и ÑеманÑиÑеÑкого анализа ÑекÑÑовой ÑÑÑоки запÑоÑа. ÐодгоÑовленнÑй опеÑаÑÐ¾Ñ Ñам по Ñебе не гоÑов Ð´Ð»Ñ Ð¸ÑполнениÑ, Ñак как он Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ имеÑÑ ÐºÐ¾Ð½ÐºÑеÑнÑÑ
знаÑений Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑов. ÐоÑÑал пÑедÑÑавлÑÐµÑ Ñобой гоÑовÑй к иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ñже ÑаÑÑиÑно вÑполненнÑй опеÑаÑоÑ, в коÑоÑом Ð·Ð°Ð´Ð°Ð½Ñ Ð²Ñе недоÑÑаÑÑие знаÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑов. (ÐÐ»Ñ Ð¾Ð¿ÐµÑаÑоÑов SELECT поÑÑал ÑавнознаÑен оÑкÑÑÑÐ¾Ð¼Ñ ÐºÑÑÑоÑÑ, но Ð¼Ñ Ð²ÑбÑали дÑÑгой ÑеÑмин, Ñак как кÑÑÑоÑÑ Ð½ÐµÐ¿ÑÐ¸Ð¼ÐµÐ½Ð¸Ð¼Ñ Ðº опеÑаÑоÑам, оÑлиÑнÑм Ð¾Ñ SELECT.)
ÐбÑий Ñикл вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· ÑÑапа ÑазбоÑа, на коÑоÑом из ÑекÑÑовой ÑÑÑоки запÑоÑа ÑоздаÑÑÑÑ Ð¿Ð¾Ð´Ð³Ð¾ÑовленнÑй опеÑаÑоÑ; ÑÑапа пÑивÑзки, на коÑоÑом из подгоÑовленного опеÑаÑоÑа и знаÑений Ð´Ð»Ñ Ð½ÐµÐ¾Ð±Ñ
одимÑÑ
паÑамеÑÑов ÑоздаÑÑÑÑ Ð¿Ð¾ÑÑал; и ÑÑапа вÑполнениÑ, на коÑоÑом иÑполнÑеÑÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð¿Ð¾ÑÑала. Ð ÑлÑÑае запÑоÑа, возвÑаÑаÑÑего ÑÑÑоки (SELECT, SHOW и Ñ. д.), можно ÑказаÑÑ, ÑÑÐ¾Ð±Ñ Ð·Ð° один Ñаг вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð²ÑаÑалоÑÑ ÑолÑко огÑаниÑенное ÑиÑло ÑÑÑок, Ñак ÑÑо Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑии понадобÑÑÑÑ Ð½ÐµÑколÑко Ñагов вÑполнениÑ.
СеÑÐ²ÐµÑ Ð¼Ð¾Ð¶ÐµÑ ÐºÐ¾Ð½ÑÑолиÑоваÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно неÑколÑко подгоÑовленнÑÑ Ð¾Ð¿ÐµÑаÑоÑов и поÑÑалов (но ÑÑÑиÑе, ÑÑо они ÑÑÑеÑÑвÑÑÑ ÑолÑко в ÑÐ°Ð¼ÐºÐ°Ñ ÑеанÑа и никогда не ÑазделÑÑÑÑÑ Ð¼ÐµÐ¶Ð´Ñ ÑеанÑами). ÐбÑаÑаÑÑÑÑ Ðº подгоÑовленнÑм опеÑаÑоÑам и поÑÑалам можно по именам, коÑоÑÑе назнаÑаÑÑÑÑ Ð¸Ð¼ пÑи Ñоздании. ÐÑоме Ñого, ÑÑÑеÑÑвÑÑÑ Ð¸ «безÑмÑннÑе» подгоÑовленнÑе опеÑаÑоÑÑ Ð¸ поÑÑалÑ. ХоÑÑ Ð¾Ð½Ð¸ пÑакÑиÑеÑки не оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½ÑÑ Ð¾Ð±ÑекÑов, опеÑаÑии Ñ Ð½Ð¸Ð¼Ð¸ опÑимизиÑÐ¾Ð²Ð°Ð½Ñ Ð´Ð»Ñ Ñазового вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа Ñ Ð¿Ð¾ÑледÑÑÑим оÑвобождением обÑекÑа, Ñогда как опеÑаÑии Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ñми обÑекÑами опÑимизиÑÑÑÑÑÑ Ð² ÑаÑÑÑÑе на многоÑазовое иÑполÑзование.
51.1.3. ФоÑмаÑÑ Ð¸ ÐºÐ¾Ð´Ñ ÑоÑмаÑов
ÐаннÑе опÑеделÑнного Ñипа могÑÑ Ð¿ÐµÑедаваÑÑÑÑ Ð² одном из неÑколÑÐºÐ¸Ñ ÑазлиÑнÑÑ ÑоÑмаÑов. С веÑÑии 7.4 PostgreSQL поддеÑживаÑÑÑÑ ÑолÑко ÑекÑÑовÑй («text») и двоиÑнÑй («binary») ÑоÑмаÑÑ, но в пÑоÑоколе пÑедÑÑмоÑÑÐµÐ½Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи Ð´Ð»Ñ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð² бÑдÑÑем. ÐжидаемÑй ÑоÑÐ¼Ð°Ñ Ð´Ð»Ñ Ð»Ñбого знаÑÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°ÑÑÑÑ ÐºÐ¾Ð´Ð¾Ð¼ ÑоÑмаÑа. ÐлиенÑÑ Ð¼Ð¾Ð³ÑÑ ÑказÑваÑÑ ÐºÐ¾Ð´ ÑоÑмаÑа Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ пеÑедаваемого знаÑÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑа и Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÑолбÑа ÑезÑлÑÑаÑа запÑоÑа. ТекÑÑовÑй ÑоÑÐ¼Ð°Ñ Ð¸Ð¼ÐµÐµÑ ÐºÐ¾Ð´ нолÑ, двоиÑнÑй â код один, а дÑÑгие ÐºÐ¾Ð´Ñ Ð¾ÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð² бÑдÑÑем.
ТекÑÑовÑм пÑедÑÑавлением знаÑений бÑдÑÑ ÑÑÑоки, коÑоÑÑе вÑдаÑÑÑÑ Ð¸ пÑинимаÑÑÑÑ ÑÑнкÑиÑми ввода/вÑвода опÑеделÑнного Ñипа даннÑÑ . РпеÑедаваемом пÑедÑÑавлении завеÑÑаÑÑий нÑлевой Ñимвол оÑÑÑÑÑÑвÑеÑ, ÐºÐ»Ð¸ÐµÐ½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ добавиÑÑ ÐµÐ³Ð¾ Ñам, еÑли Ñ Ð¾ÑÐµÑ Ð¾Ð±ÑабаÑÑваÑÑ Ñакое пÑедÑÑавление в виде ÑÑÑоки C. (СобÑÑвенно, даннÑе в ÑекÑÑовом ÑоÑмаÑе не могÑÑ ÑодеÑжаÑÑ Ð½ÑлевÑе ÑимволÑ.)
РдвоиÑном пÑедÑÑавлении ÑелÑÑ ÑиÑел пÑименÑеÑÑÑ ÑеÑевой поÑÑдок байÑов (ÑÑаÑÑий Ð±Ð°Ð¹Ñ Ð¸Ð´ÑÑ Ð¿ÐµÑвÑм). Ðакое именно двоиÑное пÑедÑÑавление имеÑÑ Ð´ÑÑгие ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ , можно ÑзнаÑÑ Ð¸Ð· докÑменÑаÑии. Ðо ÑÑÑиÑе, ÑÑо двоиÑное пÑедÑÑавление ÑложнÑÑ Ñипов даннÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¼ÐµÐ½ÑÑÑÑÑ Ð¾Ñ Ð²ÐµÑÑии к веÑÑии ÑеÑвеÑа; Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ Ð¿Ð¾ÑÑиÑÑемоÑÑи обÑÑно лÑÑÑе ÑекÑÑовÑй ÑоÑмаÑ.