{"id":303778,"date":"2020-05-18T09:00:29","date_gmt":"2020-05-18T09:00:29","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=303778"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=303778","title":{"rendered":"PostgreSQL: \u0421\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u00ab\u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u043c\u00bb \u044f\u0437\u044b\u043a\u0435 (PL\/Perl, PL\/Python, PL\/v8)"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/502254\/\">Postgres \u0437\u043d\u0430\u043c\u0435\u043d\u0438\u0442 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u043e\u0441\u0442\u044c\u044e, \u0447\u0442\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0438 \u043a \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 (PL). \u041d\u0438\u043a\u0442\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0445\u0432\u0430\u0441\u0442\u0430\u0442\u044c\u0441\u044f <s>\u044f\u0437\u044b\u043a\u043e\u043c<\/s> \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u043e\u0432 \u0442\u0430\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u0430 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0438 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d: \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044f\u0437\u044b\u043a \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0432\u0435\u0440\u0445\u0443\u0441\u0438\u043b\u0438\u0439. \u041c\u043e\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c. \u041f\u0435\u0440\u0435\u0434\u0435\u043b\u043e\u043a \u0432 \u0421\u0423\u0411\u0414 \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442. \u041a\u0430\u043a \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435, \u0442\u0430\u043a\u0430\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u043e\u0441\u0442\u044c \u0431\u044b\u043b\u0430 \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u0430 \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u0432 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 Postgres.<\/p>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c PL-\u044f\u0437\u044b\u043a\u0438 \u043f\u043e\u0434 \u0437\u0430\u0434\u0430\u0447\u0438. \u0410 \u0435\u0449\u0435 \u043b\u0443\u0447\u0448\u0435, \u0435\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u043d\u0430\u043f\u0438\u0448\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435 \u043d\u0430 C, \u0430 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u044b\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u044f\u0437\u044b\u043a\u043e\u0432 \u044f\u0437\u044b\u043a. \u041a\u0430\u043a \u0441 FDW, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 <a href=\"https:\/\/multicorn.org\/\">\u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Python<\/a>.<\/p>\n<p>  \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u044f\u0434\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u0432 \u0438 \u043c\u0430\u0441\u0442\u0435\u0440-\u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u043e \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435, \u0434\u0435\u043b\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u043e\u043c \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f\u0445 <a href=\"https:\/\/pgconf.ru\/2019\/237648\">PgConf.Russia 2019<\/a>, <a href=\"https:\/\/pgconf.ru\/2018\/107044\">PgConf.Russia 2018<\/a> \u0438 <a href=\"https:\/\/devconf.ru\/ru\/archive\/devconf2017\/offer\/287\">DevConf 2017<\/a>.<\/p>\n<p>  \u0420\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043d\u0435 \u043e\u0431 \u044d\u043a\u0437\u043e\u0442\u0438\u043a\u0435, \u0430 \u043e \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 PL\/Perl, PL\/Python \u0438 PL\/V8 (\u0442\u043e \u0435\u0441\u0442\u044c JavaScript) \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0441 PL\/pgSQL.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u041a\u043e\u0433\u0434\u0430 \u0442\u0430\u043a\u0438\u0435 \u044f\u0437\u044b\u043a\u0438 \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c? \u041a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 SQL \u0438 PL\/pgSQL?<\/p>\n<ul>\n<li>\u0422\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438, \u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438: \u043e\u0431\u0445\u043e\u0434\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u043b\u0438 \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433 HTML \u0438\u043b\u0438 XML, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0438\u0445 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0430\u0440\u0445\u0438\u0432\u043e\u0432;<\/li>\n<li>\u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 SQL (\u043e\u0442\u0447\u0435\u0442\u044b, ORM). \u041d\u0430 PL\/pgSQL \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e, \u043d\u043e \u0438 \u0431\u0443\u0434\u0435\u0442 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c;<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u043c\u043d\u043e\u0433\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u043d\u0430 Perl \u0438\u043b\u0438 Python, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u043b\u0438 \u043d\u0430\u0434\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 C\/C++, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0435\u0441\u0442\u044c \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430 Perl \u0438\u043b\u0438 Python \u0438\u043b\u0438 \u0435\u0451 \u043b\u0435\u0433\u043a\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c. \u0427\u0435\u0440\u0435\u0437 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u0442\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0432\u044b \u043c\u0438\u0433\u0440\u0438\u0440\u0443\u0435\u0442\u0435 \u0441 Oracle. \u0422\u0430\u043c \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043f\u0438\u0441\u044c\u043c\u0430, \u0430 \u0432 \u0441\u0430\u043c\u043e\u043c Postgres \u0442\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u0442. \u041d\u043e \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u0445 Perl \u0438 Python \u0438\u0445 \u0441\u043e\u0442\u043d\u0438.<\/li>\n<li>\u0415\u0449\u0435 \u043e\u0434\u043d\u0430 \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u2014 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u041d\u043e \u044d\u0442\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u043a untrusted-\u044f\u0437\u044b\u043a\u0430\u043c (\u0447\u0442\u043e \u044d\u0442\u043e \u2014 \u0441\u043c. \u043d\u0438\u0436\u0435), \u0442\u043e \u0435\u0441\u0442\u044c \u043a Perlu \u0438 Python(3)u, \u0430 \u043d\u0435 \u043a PL\/V8. \u0412 \u043e\u0431\u044b\u0447\u043d\u043e\u043c Postgres \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u043c, \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 FDW, \u043d\u043e \u044d\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043e\u043d \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0434\u043e\u0431\u0435\u043d \u0438 \u043d\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u0433\u043e\u0434\u0438\u0442\u0441\u044f. \u0412 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0440\u0443\u043a\u0438 \u0443 \u0432\u0430\u0441 \u0440\u0430\u0437\u0432\u044f\u0437\u0430\u043d\u044b. \u041f\u043e\u043b\u043d\u0430\u044f \u0441\u0432\u043e\u0431\u043e\u0434\u0430!<\/li>\n<li>\u0418 \u0435\u0449\u0435: \u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0447\u0442\u043e \u043d\u0430 C, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u043d\u0430 \u044d\u0442\u0438\u0445, \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0441\u043f\u043e\u0441\u043e\u0431\u043b\u0435\u043d\u043d\u044b\u0445 \u043a \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435, \u044f\u0437\u044b\u043a\u0430\u0445.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3>\u041a\u0430\u043a \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u044f\u0437\u044b\u043a \u0432 Postgres<\/h3>\n<p>  \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044f\u0437\u044b\u043a\u0430 \u043d\u0430\u0434\u043e: \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 C \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 \u0434\u043e \u0442\u0440\u0451\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<ul>\n<li>HANDLER \u2014 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u044b\u0437\u043e\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 (\u044d\u0442\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c);<\/li>\n<li>INLINE \u2014 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 (\u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u044f\u0437\u044b\u043a \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438);<\/li>\n<li>VALIDATOR \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u043e\u0434\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0442\u0430\u043a\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u0435\u043b\u0430\u043b\u0430\u0441\u044c).<\/li>\n<\/ul>\n<p>  \u041e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/plhandler\">\u0437\u0434\u0435\u0441\u044c<\/a> \u0438 <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/sql-createlanguage\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<h3>\u00ab\u042f\u0437\u044b\u043a\u0438 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u044f\u0437\u044b\u043a\u0438<\/h3>\n<p>  \u042f\u0437\u044b\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb, \u0432\u0441\u0435\u0433\u043e \u0447\u0435\u0442\u044b\u0440\u0435: <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/plpgsql\">PL\/pgSQL<\/a>, <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/plperl\">PL\/Perl<\/a>, <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/plpython\">PL\/Python<\/a> \u0438 <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/pltcl\">PL\/Tcl<\/a>, \u043d\u043e \u0442\u0438\u043a\u043b\u044c \u044d\u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u0434\u0430\u043d\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u0438: \u0438\u043c \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u0430\u043b\u043e \u043a\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0431\u043e\u043b\u044c\u0448\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u043d\u0451\u043c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c.<br \/>  PL\/Perl, PL\/Python \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, PL\/pgSQL \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f Postgres-\u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e\u043c. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0434\u0440\u0443\u0433\u0438\u0445, \u0432\u043d\u0435\u043a\u043e\u0440\u043e\u0431\u043e\u0447\u043d\u044b\u0445, \u044f\u0437\u044b\u043a\u043e\u0432 \u043b\u043e\u0436\u0438\u0442\u0441\u044f \u043d\u0430 \u0438\u0445 <i>\u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432<\/i> \u2014 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430, \u0438\u043b\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u044f\u0437\u044b\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432\u043d\u0443\u0442\u0440\u0438 \u0421\u0423\u0411\u0414. <a href=\"https:\/\/github.com\/plv8\/plv8\">PL\/V8<\/a> \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0435\u0442 Google. \u041d\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 <a href=\"https:\/\/github.com\/plv8\/plv8\/issues\/364\">\u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044f<\/a> \u0441\u043e\u043c\u043d\u0435\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0431\u0435\u0437\u043e\u0431\u043b\u0430\u0447\u043d\u043e\u043c \u0431\u0443\u0434\u0443\u0449\u0435\u043c PL\/V8. \u041d\u044b\u043d\u0435\u0448\u043d\u0438\u0439 \u043c\u0435\u0439\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 PL\/V8 \u043e\u0442 Google, \u0414\u0436\u0435\u0440\u0440\u0438 \u0421\u0438\u0432\u0435\u0440\u0442 (Jerry Sievert) \u043f\u043e\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0433\u043e JS \u0432 Postgres \u0431\u0430\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, QuickJS), \u0442\u0430\u043a \u043a\u0430\u043a PL\/V8 \u0441\u043b\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c, \u043e\u043d \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u044b\u043a\u0430\u0447\u0430\u0442\u044c 3-5 \u0413\u0411 \u0432\u0441\u044f\u043a\u043e\u0439 \u0432\u0441\u044f\u0447\u0438\u043d\u044b \u043d\u0430 Linux \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435, \u0438 \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u041e\u0421. \u041d\u043e PL\/V8 \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438 \u043d\u0430\u0441\u043a\u0432\u043e\u0437\u044c \u043e\u0442\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d. \u041d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f PL\/JS \u043a\u0430\u043a \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u0434\u0432\u0438\u0436\u043a\u043e\u043c JS, \u0438\u043b\u0438 \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0430\u043a \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0438\u0432\u044b\u043a\u0430\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u0435\u0440\u0438\u043e\u0434.<\/p>\n<p>  <a href=\"https:\/\/tada.github.io\/pljava\/\">PL\/Java<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0440\u0435\u0434\u043a\u043e. \u0423 \u043c\u0435\u043d\u044f \u043b\u0438\u0447\u043d\u043e \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 PL\/Java \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0432 PL\/Perl \u0438 \u0432 PL\/V8 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0437\u0430\u0434\u0430\u0447. \u0414\u0430\u0436\u0435 Python \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0435 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439. <a href=\"https:\/\/github.com\/postgres-plr\/plr\">PL\/R<\/a> \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u043e\u0439 \u0438 \u043b\u044e\u0431\u0438\u0442 \u044d\u0442\u043e\u0442 \u044f\u0437\u044b\u043a. \u041e \u043d\u0435\u043c \u043c\u044b \u0437\u0434\u0435\u0441\u044c \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0442\u043e\u0436\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c. <\/p>\n<p>  \u041f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b \u0443 \u043f\u0438\u0448\u0443\u0449\u0438\u0445 \u0445\u0440\u0430\u043d\u0438\u043c\u043a\u0438: PL\/PHP \u0435\u0441\u0442\u044c, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0438\u043a\u0435\u043c \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u2014 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u043d\u0451\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0445 \u043c\u0430\u043b\u043e. \u0421 \u044f\u0437\u044b\u043a\u043e\u043c PL\/Ruby \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0442\u0430 \u0436\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u0430, \u0445\u043e\u0442\u044f \u044f\u0437\u044b\u043a, \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0431\u043e\u043b\u0435\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439.<\/p>\n<p>  \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u043d\u0430 \u0431\u0430\u0437\u0435 Go \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0441\u043c. <a href=\"https:\/\/gitlab.com\/microo8\/plgo\">PL\/Go<\/a>, \u0430 <a href=\"https:\/\/github.com\/pllua\/pllua\">PL\/Lua<\/a>, \u043f\u043e\u0445\u043e\u0436\u0435, \u043f\u043e\u0434\u0437\u0430\u0432\u044f\u043b \u2014 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 2018-\u0433\u043e \u0433\u043e\u0434\u0430. \u0414\u043b\u044f \u0443\u043f\u043e\u0440\u043e\u0442\u044b\u0445 \u0444\u0430\u043d\u0430\u0442\u043e\u0432 \u0448\u0435\u043b\u043b\u0430 \u0435\u0441\u0442\u044c \u0434\u0430\u0436\u0435 <a href=\"https:\/\/github.com\/petere\/plsh\">PL\/Sh<\/a>, \u0442\u0440\u0443\u0434\u043d\u043e \u0434\u0430\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f.<\/p>\n<p>  \u0415\u0441\u0442\u044c \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u0438\u043d \u0434\u043e\u043c\u0435\u043d\u043d\u043e-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0439 \u044f\u0437\u044b\u043a (DSL), \u0443\u0437\u043a\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434 \u0441\u0432\u043e\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u2014 <a href=\"https:\/\/wiki.postgresql.org\/wiki\/PL\/Proxy\">PL\/Proxy<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u043d\u044c\u0448\u0435 \u0431\u044b\u043b \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u0435\u043d \u0434\u043b\u044f \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u044b.<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0438. \u042d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, PL\/PgSQL, PL\/Perl, PL\/Python \u0438 PL\/V8, \u043d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0445 <b>PL\/*<\/b>.<\/p>\n<p>  \u042f\u0437\u044b\u043a\u0438 \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0447\u0442\u0438 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u2014 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0431\u0435\u0437\u0431\u043e\u043b\u0435\u0437\u043d\u0435\u043d\u043d\u043e. \u0410 \u0432\u043e\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c PL\/V8, \u0435\u0441\u043b\u0438 \u0412\u044b \u043d\u0435 \u043d\u0430\u0448\u043b\u0438 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0441\u0432\u043e\u0435\u0439 \u041e\u0421 \u043f\u0430\u043a\u0435\u0442\u0430 \u0441 \u043d\u0443\u0436\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439, \u044d\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u043f\u043e\u0434\u0432\u0438\u0433, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0435\u0441\u044c V8, \u0438\u043b\u0438, \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, Chromium. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441 \u0441\u0430\u0439\u0442\u0430 google.com \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0441\u0430\u043c\u0438\u043c V8 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043a\u0430\u0447\u0430\u043d\u0430 \u0432\u0441\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u2014 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0439\u0442\u0435 \u043d\u0430 \u043f\u0430\u0440\u0443 \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442 \u0442\u0440\u0430\u0444\u0438\u043a\u0430. \u0414\u043b\u044f Postgres 11 \u043f\u043e\u0434 Ubuntu \u043f\u0430\u043a\u0435\u0442 PL\/V8 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0435\u0449\u0451 \u043d\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f, \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043f\u043e\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e V8 \u0434\u043b\u044f PG 10. \u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435, \u0441\u043e\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u0440\u0443\u043a\u0430\u043c\u0438. <\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0441\u0430\u043c \u044f\u0437\u044b\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u043d\u0430\u0434\u043e \u0435\u0449\u0435 \u0438 \u00ab\u0441\u043e\u0437\u0434\u0430\u0442\u044c\u00bb \u044f\u0437\u044b\u043a \u2014 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435. \u042d\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439<\/p>\n<pre><code class=\"pgsql\">CREATE EXTENSION plperl;<\/code><\/pre>\n<p>  (\u0432\u043c\u0435\u0441\u0442\u043e plperl \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430, \u0435\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043d\u044e\u0430\u043d\u0441\u044b, \u0441\u043c. \u043d\u0438\u0436\u0435).<br \/>  \u0421\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<\/p>\n<pre><code class=\"plaintext\">test_langs=# \\x test_langs=# \\dL+ List of languages -[ RECORD 1 ]-----+--------------------------------- Name              | plperl Owner             | postgres Trusted           | t Internal language | f Call handler      | plperl_call_handler() Validator         | plperl_validator(oid) Inline handler    | plperl_inline_handler(internal) Access privileges | Description       | PL\/Perl procedural language -[ RECORD 2 ]-----+--------------------------------- Name              | plpgsql Owner             | postgres Trusted           | t Internal language | f Call handler      | plpgsql_call_handler() Validator         | plpgsql_validator(oid) Inline handler    | plpgsql_inline_handler(internal) Access privileges | Description       | PL\/pgSQL procedural language [ RECORD 3 ]-----+--------------------------------- Name              | plv8 Owner             | postgres Trusted           | t Internal language | f Call handler      | plv8_call_handler() Validator         | plv8_call_validator(oid) Inline handler    | plv8_inline_handler(internal) Access privileges | Description       |<\/code><\/pre>\n<p>  PL\/pgSQL \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0430\u0434\u043e, \u043e\u043d \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0436\u0435 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432 \u0431\u0430\u0437\u0435.<\/p>\n<p>  <b>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/b> PL\/pgSQL \u043d\u0435 \u043d\u0430\u0434\u043e \u043f\u0443\u0442\u0430\u0442\u044c \u0441 SQL. \u042d\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u044f\u0437\u044b\u043a. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e\u043c SQL \u0432 Postgres \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<h3>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b<\/h3>\n<p>  \u0412 \u043c\u0438\u0440\u0435 \u0421\u0423\u0411\u0414 \u0447\u0430\u0441\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u043c SQL. \u0412 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b, \u0445\u043e\u0442\u044f \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e \u043d\u0438\u0445 \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u0447\u0430\u0441\u0442\u043e. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443 <a href=\"https:\/\/en.wikipedia.org\/wiki\/SQL\/PSM\">SQL\/PSM<\/a> \u0432 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0439 \u044f\u0437\u044b\u043a DB2. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0435\u0433\u043e \u0434\u0430\u043b\u0435\u043a\u0430 \u043e\u0442 PL\/pgSQL, \u0445\u043e\u0442\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u043e\u043d\u0438 \u0431\u043b\u0438\u0437\u043a\u0438.<\/p>\n<p>  <a href=\"https:\/\/en.wikipedia.org\/wiki\/SQL\/JRT\">SQL\/JRT<\/a> \u2013 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0434\u043b\u044f Java-\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440, \u0438 PL\/Java \u0435\u043c\u0443 \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442.<\/p>\n<h3>\u0414\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u0438 \u043d\u0435\u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438<\/h3>\n<p>  \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u0432 Postgres \u0431\u044b\u0432\u0430\u044e\u0442 \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c\u0438 (TRUSTED) \u0438 \u043d\u0435\u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c\u0438 (UNTRUSTED).<br \/>  \u0412 TRUSTED-\u044f\u0437\u044b\u043a\u0430\u0445 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 I\/O, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0441 \u0441\u0435\u0442\u044c\u044e, \u0434\u0430 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043a\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0411\u0414, \u0438\u0441\u043f\u043e\u0440\u0442\u0438\u0442\u044c \u0447\u0442\u043e-\u043b\u0438\u0431\u043e \u0438 \u0443\u0437\u043d\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0435\u0435 \u043e\u043d \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 UNTRUSTED-\u044f\u0437\u044b\u043a\u0430\u0445 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0443\u043f\u0435\u0440\u044e\u0437\u0435\u0440.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u044f\u0437\u044b\u043a\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u043a\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f, \u0442\u043e \u043d\u0430 \u0435\u0433\u043e \u0431\u0430\u0437\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438 TRUSTED, \u0438 UNTRUSTED \u044f\u0437\u044b\u043a. \u0422\u0430\u043a \u0441 Perl, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 <code>plperl<\/code> \u0438 <code>plperlu<\/code>. \u0411\u0443\u043a\u0432\u0430 <i>u<\/i> \u043d\u0430 \u043a\u043e\u043d\u0446\u0435 \u0432\u044b\u0434\u0430\u0435\u0442 \u043d\u0435\u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440 \u044f\u0437\u044b\u043a\u0430. Python \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043d\u0435\u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435. PL\/v8 \u2014 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u043c. \u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435, PL\/v8 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0438\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0441 \u0434\u0438\u0441\u043a\u0430, \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u0411\u0414. <\/p>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430 UNTRUSTED-\u044f\u0437\u044b\u043a\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0451: \u043f\u043e\u0441\u043b\u0430\u0442\u044c \u043f\u0438\u0441\u044c\u043c\u043e, \u043f\u0438\u043d\u0433\u0430\u043d\u0443\u0442\u044c \u0441\u0430\u0439\u0442, \u0437\u0430\u0439\u0442\u0438 \u0432 \u0447\u0443\u0436\u0443\u044e \u0431\u0430\u0437\u0443, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c HTTP-\u0437\u0430\u043f\u0440\u043e\u0441. TRUSTED-\u044f\u0437\u044b\u043a\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0431\u0430\u0437\u044b.<\/p>\n<p>  \u041a TRUSTED \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f: <code>plpgsql, plperl, plv8, pljava<\/code>.<\/p>\n<p>  \u041a UNTRUSTED \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f: <code>plperlu, pljavau, plpython2u, plpython3u<\/code>.<\/p>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 PL\/Python \u043a\u0430\u043a TRUSTED (\u0442\u0430\u043a \u043a\u0430\u043a \u0442\u0430\u043c \u043d\u0435\u043b\u044c\u0437\u044f \u0437\u0430\u0434\u0430\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c), \u0430 PLpgSQL \u0438 PL\/V8 \u2014 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442: \u043d\u0435 \u0431\u044b\u0432\u0430\u044e\u0442 UNTRUSTED.<\/p>\n<p>  \u0410 \u0432\u043e\u0442 Perl \u0438 Java \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 \u043e\u0431\u043e\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445.<\/p>\n<h3>PL\/pgSQL vs PL\/*<\/h3>\n<p>  \u041a\u043e\u0434 \u043d\u0430 PL\/pgSQL \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0441\u0442\u044c \u0432 Postgres. \u0412 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043c\u043d\u043e\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 Postgres \u043d\u0435\u0442, \u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u044f\u0437\u044b\u043a\u0430 \u0437\u0430\u0431\u043e\u0442\u0438\u0442\u0441\u044f \u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044f\u0437\u044b\u043a\u0430, \u0437\u0430\u043c\u0435\u043d\u044f\u044f \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0442\u0435\u043a\u0441\u0442\u043e\u043c. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u043e\u0447\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e TRANSFORM, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0431\u043b\u0438\u0436\u0435 \u043a \u043a\u043e\u043d\u0446\u0443 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  \u0412\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0432 PL\/pgSQL \u0447\u0430\u0441\u0442\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043e\u0440\u043e\u0436\u0435. \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u0441\u0432\u043e\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c, \u043d\u0435 \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433. PL\/pgSQL \u0442\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 PL\/pgSQL \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0434\u043e\u043b\u0433\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u043e\u0432: \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0432\u0430 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u043b\u0430, \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0443 \u043d\u0430\u0434\u043e \u0441\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u043d \u0438\u043c\u0435\u0435\u0442 \u0434\u0435\u043b\u043e \u0441 \u0446\u0435\u043b\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438, \u0430 \u043d\u0435 \u0441 \u0435\u0449\u0435 \u043a\u0430\u043a\u0438\u043c\u0438-\u0442\u043e \u044d\u043a\u0437\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438, \u043f\u043e\u0442\u043e\u043c \u0440\u0435\u0448\u0438\u0442\u044c, \u043a\u0430\u043a \u0438\u0445 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043b\u043e\u0436\u0438\u0442\u044c.<\/p>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 PL\/pgSQL TRUSTED, \u0438\u0437 \u043d\u0435\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0441\u0435\u0442\u044c\u044e \u0438 \u0434\u0438\u0441\u043a\u0430\u043c\u0438.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432 \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 PL\/pgSQL \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b Postgres \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 JSON, \u0432\u0435\u0441\u044c\u043c\u0430 \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u0435 \u0438 \u043d\u0435\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435, \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0436\u0435 \u044f\u0437\u044b\u043a\u0430\u0445 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043f\u0440\u043e\u0449\u0435 \u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u043d\u0435\u0435.<\/p>\n<p>  \u0412 PL\/* \u0441\u0432\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u044c\u044e, \u0438 \u0437\u0430 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u043d\u0430\u0434\u043e \u0441\u043b\u0435\u0434\u0438\u0442\u044c, \u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0435\u0435. <\/p>\n<p>  \u041d\u0430\u0434\u043e \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443 \u0432\u0441\u0435\u0445 \u0442\u043e\u0436\u0435 \u0440\u0430\u0437\u043d\u0430\u044f.<\/p>\n<p>  \u0417\u0430\u0442\u043e \u0432 PL\/* \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430, \u0438 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043f\u043b\u0430\u043d\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0415\u0441\u043b\u0438 \u044f\u0437\u044b\u043a UNTRUSTED, \u0442\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0441\u0435\u0442\u044c \u0438 \u0434\u0438\u0441\u043a(\u0438). \u0421 \u0431\u0430\u0437\u043e\u0439 \u0432\u0441\u0435 \u044d\u0442\u0438 \u044f\u0437\u044b\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0447\u0435\u0440\u0435\u0437 SPI, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u044f\u0437\u044b\u043a\u043e\u0432 PL\/*.<\/p>\n<h3>PL\/Perl<\/h3>\n<p>  \u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 Perl \u2013 \u044d\u0442\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u0435\u043d\u043d\u044b\u0439 \u043a\u0443\u0441\u043e\u043a \u043a\u043e\u0434\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043d\u043e \u043e\u043d, \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0445\u0440\u0430\u043d\u0438\u043c\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430\/\u0444\u0443\u043d\u043a\u0446\u0438\u044f PL\/Perl. \u041f\u0440\u0438 \u0435\u0433\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0434, \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Postgres. \u041e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u0438 \u0438 \u0434\u0435\u043b\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>  <code>plperl.on_init= 'use Data::Dumper;'<br \/>  plperl.on_plperl_init= ' ... '<br \/>  plperl.on_plperlu_init= ' ... '<br \/>  plperl.use_strict= on<\/code><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u0434\u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0439 \u0431\u0430\u0437\u0435, \u0437\u0430\u0441\u0442\u0430\u0432\u044c\u0442\u0435 Postgres \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0443\u043b\u044c <code>Data::Dumper<\/code> \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  \u0415\u0441\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 TRUSTED \u0438 UNTRUSTED Perl \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>use_strict=on<\/code>. \u0422\u0435, \u043a\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u044e\u0442 \u043d\u0430 Perl, \u0437\u043d\u0430\u044e\u0442, \u0447\u0442\u043e \u0431\u0435\u0437 <code>strict<\/code> \u044d\u0442\u043e \u043d\u0435 \u044f\u0437\u044b\u043a, \u0430 \u043e\u0434\u043d\u043e \u043d\u0435\u0434\u043e\u0440\u0430\u0437\u0443\u043c\u0435\u043d\u0438\u0435.<\/p>\n<h3>PL\/Python<\/h3>\n<p>  \u0412 \u043d\u0451\u043c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438. \u0418 \u0442\u0443\u0442 \u0432\u0430\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f, \u043a\u0430\u043a\u043e\u0439 \u043f\u0438\u0442\u043e\u043d \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435: \u0432\u0442\u043e\u0440\u043e\u0439 \u0438\u043b\u0438 \u0442\u0440\u0435\u0442\u0438\u0439. \u041a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, Python \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0434\u0432\u0443\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 (Python 2 \u0438 Python 3), \u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0438\u0445 so-\u0448\u043a\u0438 \u043d\u0435 \u0443\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435: \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442 \u043f\u043e \u0438\u043c\u0435\u043d\u0430\u043c. \u0415\u0441\u043b\u0438 \u0432\u044b \u0432 \u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441 v2, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u0437\u0432\u0430\u043b\u0438 v3, \u0442\u043e Postgres \u0443\u043f\u0430\u0434\u0435\u0442, \u0438 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 (backend) \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0444\u0430\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u0427\u0442\u043e\u0431\u044b \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u043d\u0430\u0434\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0435\u0441\u0441\u0438\u044e.<\/p>\n<p>  \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Perl, \u043f\u0438\u0442\u043e\u043d\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0415\u0449\u0435 \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e: \u043e\u0434\u043d\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u0438\u043a\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e. <\/p>\n<p>  \u0412\u043e \u0432\u0441\u0435\u0445 \u043f\u0438\u0442\u043e\u043d\u043e\u0432\u0441\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u0434\u0432\u0430 \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u2013 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 <code>SD<\/code> \u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 <code>GD<\/code>. \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/plpython-using.html\">\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442<\/a> \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u0441\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u2014 \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438 \u043e\u043f\u0430\u0441\u043d\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u0432\u043e\u0439. <\/p>\n<p>  \u0412 PL\/Python \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0434\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043d\u0438\u0436\u0435.<\/p>\n<h3>PL\/V8<\/h3>\n<p>  \u041e\u043d \u0431\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e TRUSTED.<\/p>\n<p>  \u0423\u0434\u043e\u0431\u043d\u043e, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 JSON \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 JS. \u0412 PL\/V8, \u043a\u0430\u043a \u0438 \u0432 PL\/Python, \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0434\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438. \u0415\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u042d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c <a href=\"https:\/\/github.com\/plv8\/plv8u\/blob\/master\/doc\/plv8.md#window-function-api\">\u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043e\u043a\u043e\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/a>. \u041f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u0447\u0442\u043e \u0438\u0445 <a href=\"https:\/\/github.com\/postgres-plr\/plr\/blob\/master\/userguide.md#window-functions\">\u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0435\u0449\u0451 \u043d\u0430 PL\/R<\/a>, \u043d\u043e \u044d\u0442\u043e\u0442 \u044f\u0437\u044b\u043a \u0432\u043d\u0435 \u0440\u0430\u043c\u043e\u043a \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  \u0418 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 PL\/V8 \u0435\u0441\u0442\u044c execution timeout. \u041f\u0440\u0430\u0432\u0434\u0430, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u043d \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d, \u0438 \u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 PL\/V8 \u0440\u0443\u043a\u0430\u043c\u0438, \u0442\u043e \u043d\u0430\u0434\u043e \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0431\u044b\u043b \u0432\u043a\u043b\u044e\u0447\u0435\u043d, \u0438 \u0442\u043e\u0433\u0434\u0430 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u044b \u043d\u0430 \u0432\u044b\u0437\u043e\u0432\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>  \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443 PL\/V8 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e: \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d trusted, \u0442\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441 \u0434\u0438\u0441\u043a\u0430, \u043e\u043d \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0438\u043e\u0442\u043a\u0443\u0434\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u0433\u0440\u0443\u0437\u0438\u0442\u044c. \u0412\u0441\u0435 \u043d\u0443\u0436\u043d\u043e\u0435 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0432\u0437\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u0431\u0430\u0437\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0445\u0440\u0430\u043d\u0438\u043c\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 \u044f\u0437\u044b\u043a\u0430. \u0418\u043c\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"pgsql\">plv8.start_proc=my_init # (\u0438\u043c\u044f PL\/V8-\u0444\u0443\u043d\u043a\u0446\u0438\u0438)<\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c, \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u044f \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 this. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a:<\/p>\n<pre><code class=\"pgsql\">CREATE OR REPLACE FUNCTION my_init() RETURNS void LANGUAGE plv8 AS $$      this.get_57 = function() { return 57; }; \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e      this.pi_square = 9.8696044;  \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e $$; SET plv8.start_proc = 'my_init'; DO LANGUAGE plv8 $$      plv8.elog(NOTICE, pi_square, get_57() ); $$;<\/code><\/pre>\n<p>  <\/p>\n<h2>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 PL\/Perl vs PL\/Python vs PL\/V8 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435<\/h2>\n<p>  <\/p>\n<h3>Hello World!<\/h3>\n<p>  \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u043d\u0435\u0445\u0438\u0442\u0440\u043e\u0435 \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u0435 \u0441 \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u044d\u0442\u043e\u0439 \u0444\u0440\u0430\u0437\u044b \u043d\u0430 \u0432\u0441\u0435\u0445 \u0442\u0440\u0435\u0445 \u044f\u0437\u044b\u043a\u0430\u0445, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430 <b>PL\/Perl<\/b>:<\/p>\n<pre><code class=\"pgsql\">DO $$      elog(NOTICE,&quot;Hello World!&quot;); $$ LANGUAGE plperl;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">NOTICE:  Hello World! DO <\/code><\/pre>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0434\u043b\u044f Perl \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>warn<\/code> \u0438 <code>die<\/code>. <\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430 <b>PL\/Python<\/b>. \u0422\u043e\u0447\u043d\u0435\u0435 \u043d\u0430 PL\/Python3u (untrusted) \u2014 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438.<\/p>\n<pre><code class=\"pgsql\">DO $$      plpy.notice('Hello World!', hint=&quot;\u0411\u0443\u0434\u044c \u0437\u0434\u043e\u0440\u043e\u0432&quot;, detail=&quot;\u0412 \u0434\u0435\u0442\u0430\u043b\u044f\u0445&quot;) $$ LANGUAGE plpython3u;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">NOTICE:  Hello World! DETAIL:  \u0412 \u0434\u0435\u0442\u0430\u043b\u044f\u0445 HINT:  \u0411\u0443\u0434\u044c \u0437\u0434\u043e\u0440\u043e\u0432 DO<\/code><\/pre>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>throw 'Errmsg'<\/code>. \u0418\u0437 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 Postgres \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c: \u043e\u043d\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 Hint, Details, \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0412 PL\/Python \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c, \u0430 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u2014 \u043d\u0435\u0442: \u0438\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0440\u0443\u0433\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u043e\u0439.<\/p>\n<p>  \u0412 PL\/Python \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u0433\u0440\u0435\u0441\u0430 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f: NOTICE, WARNING, DEBUG, LOG, INFO, FATAL. \u0415\u0441\u043b\u0438 \u044d\u0442\u043e ERROR, \u0442\u043e \u0441\u0432\u0430\u043b\u0438\u043b\u0430\u0441\u044c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f, \u0435\u0441\u043b\u0438 FATAL, \u0441\u0432\u0430\u043b\u0438\u043b\u0441\u044f \u0432\u0435\u0441\u044c \u0431\u044d\u043a\u0435\u043d\u0434. \u0414\u043e PANIC \u0434\u0435\u043b\u043e, \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043d\u0435 \u0434\u043e\u0448\u043b\u043e. \u041f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/11\/runtime-config-logging\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  <b>PL\/V8<\/b><\/p>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u044f\u0437\u044b\u043a\u0435 Hello world \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043f\u0435\u0440\u043b\u043e\u0432\u044b\u0439. \u041c\u043e\u0436\u043d\u043e \u0431\u0440\u043e\u0441\u0438\u0442\u044c <code>exception<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>throw<\/code>, \u0438 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438, \u0445\u043e\u0442\u044f \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0438 \u043d\u0435 \u0441\u0442\u043e\u043b\u044c \u0440\u0430\u0437\u0432\u0438\u0442\u044b\u0435, \u043a\u0430\u043a \u0432 Python. \u0415\u0441\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c <code>plv8.elog(ERROR)<\/code>, \u044d\u0444\u0444\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u0442, \u043a\u0441\u0442\u0430\u0442\u0438, \u0442\u043e\u0442 \u0436\u0435.<\/p>\n<pre><code class=\"pgsql\">DO $$      plv8.elog(NOTICE, 'Hello World!'); $$ LANGUAGE plv8;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">NOTICE:  Hello World! DO <\/code><\/pre>\n<p>  <\/p>\n<h3>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0431\u0430\u0437\u043e\u0439<\/h3>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0435\u043f\u0435\u0440\u044c, \u043a\u0430\u043a \u0438\u0437 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 Postgres \u0435\u0441\u0442\u044c SPI (Server Programming Interface). \u042d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0430 C, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432\u0441\u0435\u043c \u0430\u0432\u0442\u043e\u0440\u0430\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439. \u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 PL-\u044f\u0437\u044b\u043a\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043a SPI \u0441\u0432\u043e\u0438 \u043e\u0431\u0435\u0440\u0442\u043a\u0438, \u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u044f\u0437\u044b\u043a \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443.<\/p>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u043d\u0430 C, \u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0430\u044f SPI, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0435 \u0434\u0430\u0441\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0438\u0433\u0440\u044b\u0448\u0430 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 PL\/PgSQL \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u043c\u0438 \u044f\u0437\u044b\u043a\u0430\u043c\u0438. \u041d\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430 C, \u043c\u0438\u043d\u0443\u044e\u0449\u0430\u044f SPI \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0430\u044f \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0431\u0435\u0437 \u043f\u043e\u0441\u0440\u0435\u0434\u043d\u0438\u043a\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>table_beginscan\/heap_getnext<\/code>), \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<p>  PL\/Java \u0442\u043e\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 SPI. \u041d\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u0442\u0438\u043b\u0435 JDBC \u0438 \u043f\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443 JDBC. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044f \u043a\u043e\u0434\u0430 \u0432 PL\/Java \u0432\u0441\u0451 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0438\u0437 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043d\u043e JNI (Java Native Interface) \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0431\u0430\u0437\u0435 \u0432 \u0442\u0435 \u0436\u0435 SPI-\u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u0438 \u043d\u0435\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0439 \u0432\u043e\u043f\u043b\u043e\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0432 PL\/Perl \u0438 PL\/Python, \u043d\u043e \u044d\u0442\u043e \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e, \u0438 \u0432 \u043f\u043b\u0430\u043d\u0430\u0445 \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u043e.<\/p>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043a \u0447\u0443\u0436\u0438\u043c \u0431\u0430\u0437\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u2013 \u0447\u0435\u0440\u0435\u0437 DBI \u0438\u043b\u0438 <a href=\"https:\/\/wiki.postgresql.org\/wiki\/Psycopg\">Psycopg<\/a>. \u041c\u043e\u0436\u043d\u043e \u0438 \u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0431\u0430\u0437\u0435, \u043d\u043e \u0437\u0430\u0447\u0435\u043c.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043d\u0435 \u0432\u043b\u0435\u0437\u0430\u0442\u044c \u0432 \u0445\u043e\u043b\u0438\u0432\u0430\u0440\u043d\u0443\u044e \u0442\u0435\u043c\u0443 \u00ab\u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0432 \u0431\u0430\u0437\u0435 vs \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435\u00bb, \u0438 \u0441\u0440\u0430\u0437\u0443 \u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0438\u0437 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u043b\u0438\u0436\u0435 \u043a \u0434\u0430\u043d\u043d\u044b\u043c (\u0445\u043e\u0442\u044f \u0431\u044b \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0433\u043e\u043d\u044f\u0442\u044c \u0433\u0438\u0433\u0430\u043d\u0442\u0441\u043a\u0438\u0435 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u043f\u043e \u0441\u0435\u0442\u0438), \u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e. <\/p>\n<p>  <b>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/b>: \u043d\u0430\u0434\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e SPI \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437\u0434\u0435\u0440\u0436\u043a\u0438, \u0438 \u0440\u0430\u0431\u043e\u0442\u0430 SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0447\u0435\u043c \u0431\u0435\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0412 13-\u0439 \u043f\u043e\u0441\u0442\u0433\u0440\u0435\u0441 \u0432\u043e\u0448\u0435\u043b <a href=\"https:\/\/commitfest.postgresql.org\/25\/2282\/\">\u043f\u0430\u0442\u0447 \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0438\u043d\u0430 \u041a\u043d\u0438\u0436\u043d\u0438\u043a\u0430<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u0442\u0438 \u0438\u0437\u0434\u0435\u0440\u0436\u043a\u0438. \u041d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u0433\u043e\u0434\u043d\u043e\u0439 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. <\/p>\n<p>  <b>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c<\/b>: \u043d\u0430\u0431\u043e\u0440 \u043e\u0442\u043b\u0430\u0436\u0435\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u0437\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043e\u0442 SQL-\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0439 \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u0437\u043b\u043e\u0434\u0435\u0439\u0441\u0442\u0432. \u0418\u043d\u0430\u0447\u0435 \u044d\u0442\u043e \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0431\u043e\u043b\u044c\u044e \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  <b>\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435<\/b> \u043a\u043e\u0434\u0430: \u0435\u0441\u043b\u0438 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0437\u0430\u043c\u044b\u0441\u043b\u043e\u0432\u0430\u0442\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0430 \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0445 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0437\u0430\u043d\u043e\u0432\u043e.<\/p>\n<h3>\u041a\u0430\u043a \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0431\u0430\u0437\u044b<\/h3>\n<p>  \u0412 <b>Perl<\/b> \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0412\u044b\u0437\u043e\u0432 <code>spi_exec_query<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a, \u0441\u0442\u0430\u0442\u0443\u0441 \u0438 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0442\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u044b SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c:<\/p>\n<pre><code class=\"pgsql\">DO $$       warn Data::Dumper::Dumper(           spi_exec_query('SELECT 57 AS x')      ) $$ LANGUAGE plperl;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">WARNING:  $VAR1 = {           'rows' =&gt; [                     {                       'x' =&gt; '57'                     }                   ],           'processed' =&gt; 1,           'status' =&gt; 'SPI_OK_SELECT'         }; <\/code><\/pre>\n<p>  \u0412 <b>Python<\/b> \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043d\u043e \u0437\u0434\u0435\u0441\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443. \u041e\u0431\u044b\u0447\u043d\u043e \u043e\u043d \u043f\u0440\u0438\u0442\u0432\u043e\u0440\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438\u0437 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<pre><code class=\"pgsql\">DO $$       plpy.notice(           plpy.execute('SELECT 57 AS x')      ) $$ LANGUAGE plpython3u;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">NOTICE:  &lt;PLyResult status=5 nrows=1 rows=[{'x': 57}]&gt; DO<\/code><\/pre>\n<p>  \u0410 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u043e\u0437\u044c\u043c\u0435\u043c 1-\u044e \u0441\u0442\u0440\u043e\u0447\u043a\u0443, \u0434\u043e\u0441\u0442\u0430\u043d\u0435\u043c \u043e\u0442\u0442\u0443\u0434\u0430 X \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2013 \u0447\u0438\u0441\u043b\u043e.<\/p>\n<pre><code class=\"pgsql\">DO $$       plpy.notice(           plpy.execute('SELECT 57 AS x')[0]['x']       ) $$ LANGUAGE plpython3u;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">NOTICE:  57 DO<\/code><\/pre>\n<p>  \u0412 <b>PL\/V8<\/b>:<\/p>\n<pre><code class=\"pgsql\">DO $$       plv8.elog(NOTICE, JSON.stringify(           plv8.execute('SELECT 57 as x'))      ); $$ LANGUAGE plv8;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">NOTICE:  [{&quot;x&quot;:57}] DO<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e JSON.stringify, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0435 \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e, \u043e\u043d\u0430 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u0430 \u043a \u0443\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044e \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 PL\/v8 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. <\/p>\n<h3>\u042d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u0437\u043b\u043e\u043a\u043e\u0437\u043d\u0435\u043d\u043d\u044b\u0445 SQL-\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0439, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u043d\u0430\u0434\u043e \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 SPI \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 C) \u0432 \u044f\u0437\u044b\u043a\u0430\u0445, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435, \u043a\u0430\u043a \u043e\u0431\u0435\u0440\u0442\u043a\u0438 SPI. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 PL\/Perl:<\/p>\n<p>  <code>quote_literal<\/code> \u2013 \u0431\u0435\u0440\u0435\u0442 \u0432 \u0430\u043f\u043e\u0441\u0442\u0440\u043e\u0444\u044b \u0438 \u0443\u0434\u0432\u0430\u0438\u0432\u0430\u0435\u0442 &#8216; \u0438 \\. \u041f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<br \/>  <code>quote_nullable<\/code> \u2013 \u0442\u043e \u0436\u0435, \u043d\u043e <code>undef<\/code> \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 NULL.<br \/>  <code>quote_ident<\/code> \u2013 \u0431\u0435\u0440\u0435\u0442 \u0432 \u043a\u0430\u0432\u044b\u0447\u043a\u0438 \u0438\u043c\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u043b\u0438 \u043f\u043e\u043b\u044f, \u0435\u0441\u043b\u0438 \u043d\u0430\u0434\u043e. \u041f\u043e\u043b\u0435\u0437\u043d\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u0443\u0435\u0442\u0435 SQL-\u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u0432 \u043d\u0435\u0433\u043e \u0438\u043c\u0435\u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0431\u0430\u0437\u044b.<\/p>\n<p>  <b>PL\/Perl<\/b><\/p>\n<pre><code class=\"pgsql\">DO $$      warn &quot;macy's&quot;;      warn quote_literal(&quot;macy's&quot;); $$ LANGUAGE plperl;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">WARNING:  macy's at line 2. WARNING:  'macy''s' at line 3. DO<\/code><\/pre>\n<p>  \u0418\u043c\u0435\u0439\u0442\u0435 \u0432 \u0432\u0438\u0434\u0443: \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430\u0434\u043e \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u0430\u043a, \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u0447\u043a\u0443. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>quote_ident<\/code>.<\/p>\n<p>  \u041d\u043e \u0432 PL\/Perl \u0435\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0441\u0442\u0433\u0440\u0435\u0441\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432:<\/p>\n<p>  <code>encode_bytea<br \/>  decode_bytea<br \/>  encode_array_literal<br \/>  encode_typed_literal<br \/>  encode_array_constructor<\/code><\/p>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>quote_typed_literal<\/code> \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0442\u0438\u043f \u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043d\u0435\u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u0441\u043e\u043c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432\u043e \u0447\u0442\u043e-\u0442\u043e \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435. \u041e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u0442\u0438\u043f\u043e\u0432, \u043d\u043e, \u0432\u0441\u0451 \u0436\u0435, \u043d\u0435 \u0441\u043e \u0432\u0441\u0435\u043c\u0438. \u041e\u043d\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435 \u043f\u043e\u0439\u043c\u0435\u0442 <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/rangetypes\">\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043d\u044b\u0435 \u0442\u0438\u043f\u044b<\/a> \u0438 \u0432\u043e\u0441\u043f\u0440\u0438\u043c\u0435\u0442 \u0438\u0445 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<pre><code class=\"pgsql\">DO $$      warn encode_typed_literal(           [&quot;\u043e\u0434\u0438\u043d&quot;, &quot;\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044c \u043e\u0434\u0438\u043d&quot;], &quot;text[]&quot;      ); $$ LANGUAGE plperl;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">WARNING:  {\u043e\u0434\u0438\u043d,&quot;\u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044c \u043e\u0434\u0438\u043d&quot;} at line 2. DO<\/code><\/pre>\n<p>  \u0412 <b>PL\/Python<\/b> \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043e\u043d\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u0436\u0435:<\/p>\n<p>  <code>plpy.quote_literal<br \/>  plpy.quote_nullable<br \/>  plpy.quote_ident<\/code><\/p>\n<pre><code class=\"pgsql\">DO $$ plpy.notice(      plpy.quote_literal(&quot;Macy's&quot;)); $$ LANGUAGE plpython3u;<\/code><\/pre>\n<pre><code class=\"plaintext\">NOTICE:  'Macy''s' DO<\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u043b\u0438 \u0442\u0430\u043a\u0438\u0435 \u0436\u0435 \u0444\u0443\u043a\u043d\u0446\u0438\u0438 \u0438 \u0432 <b>PL\/V8<\/b>?<\/p>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u043e! \u0412\u0441\u0451 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0441 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439.<\/p>\n<p>  <code>plv8.quote_literal<br \/>  plv8.quote_nullable<br \/>  plv8.quote_ident<\/code><\/p>\n<pre><code class=\"pgsql\">DO $$     plv8.elog(NOTICE, plv8.quote_nullable(&quot;Macy's&quot;)); $$ LANGUAGE plv8;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">NOTICE:  'Macy''s'<\/code><\/pre>\n<p>  <\/p>\n<h3>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/h3>\n<p>  \u041a\u0430\u043a\u043e\u0439 \u044f\u0437\u044b\u043a \u0441\u0430\u043c\u044b\u0439 \u0431\u044b\u0441\u0442\u0440\u044b\u0439? \u041e\u0431\u044b\u0447\u043d\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442: C. \u041d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u2014 C <i>\u0438\u043b\u0438<\/i> SQL. \u041f\u043e\u0447\u0435\u043c\u0443 SQL? \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430 \u044d\u0442\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u044f\u0432\u043d\u043e. \u041e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0438\u043d\u043b\u0430\u0439\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0437\u0430\u043f\u0440\u043e\u0441 (\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0432\u0441\u0442\u0440\u043e\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u0442\u0435\u043b\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430), \u0443\u0436\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u041d\u043e \u043f\u0440\u0438 \u043a\u0430\u043a\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0437\u0430\u043f\u0440\u043e\u0441? \u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c, \u0441\u043a\u0430\u0436\u0435\u043c,<a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/277335\/\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u0441\u044f \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 (\u0431\u044b\u0442\u044c SECURITY DEFINER). \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u043e\u0434\u043e\u0439\u0434\u0443\u0442 \u043f\u043e\u0434 \u044d\u0442\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f.<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u0435\u0440\u0438\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u00ab\u043d\u0430 \u043a\u043e\u043b\u0435\u043d\u043a\u0435\u00bb, \u043d\u0435 \u0432\u0441\u0435\u0440\u044c\u0451\u0437. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u0442\u0430\u0439\u043c\u0438\u043d\u0433:<\/p>\n<pre><code class=\"plaintext\">\\timing<\/code><\/pre>\n<p>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c <b>SQL<\/b> (\u0412\u0440\u0435\u043c\u0435\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0438\u0436\u0435 \u2014 \u044d\u0442\u043e \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u0432\u0442\u043e\u0440 \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u043d\u0430 \u043d\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u043c \u0448\u0435\u0441\u0442\u0438\u043b\u0435\u0442\u043d\u0435\u043c \u041f\u041a. \u0418\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439, \u043d\u043e \u043d\u0430 \u043d\u0430\u0443\u0447\u043d\u0443\u044e \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u043e\u043d\u0438 \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u044e\u0442):<\/p>\n<pre><code class=\"pgsql\">SELECT count(*) FROM pg_class; 0.5 ms <\/code><\/pre>\n<p>  \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e. \u0412 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u0437 \u044f\u0437\u044b\u043a\u0430. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437 \u0437\u0430\u043f\u0440\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0438\u0437-\u0437\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430. \u041f\u043e\u0442\u043e\u043c \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c <b>PL\/pgSQL<\/b>:<\/p>\n<pre><code class=\"pgsql\">DO $$      DECLARE a int;      BEGIN           SELECT count(*) INTO a FROM pg_class;      END; $$ LANGUAGE plpgsql; 0.7 ms<\/code><\/pre>\n<p>  <b>PL\/Perl<\/b>:<\/p>\n<pre><code class=\"pgsql\">DO $$      my $x = spi_exec_query('SELECT count(*) FROM pg_class'); $$ LANGUAGE plperl; 0.7 ms<\/code><\/pre>\n<p>  <b>PL\/Python:<\/b><\/p>\n<pre><code class=\"pgsql\">DO $$      x = plpy.execute('SELECT count(*) FROM pg_class'); $$ LANGUAGE plpythonu; 0.8 ms<\/code><\/pre>\n<p>  \u042d\u0442\u043e \u0431\u044b\u043b Python 2. \u0422\u0435\u043f\u0435\u0440\u044c <b>Python 3<\/b> (\u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e: Python2 \u0438 Python3 \u043d\u0435 \u0436\u0438\u0432\u0443\u0442 \u043c\u0438\u0440\u043d\u043e \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442 \u043f\u043e \u0438\u043c\u0435\u043d\u0430\u043c):<\/p>\n<pre><code class=\"pgsql\">DO $$      x = plpy.execute('SELECT count(*) FROM pg_class'); $$ LANGUAGE plpython3u; 0.9ms<\/code><\/pre>\n<p>  \u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, <b>PL\/V8<\/b>:<\/p>\n<pre><code class=\"pgsql\">DO $$      var x = plv8.execute('SELECT count(*) FROM pg_class'); $$ LANGUAGE plv8 ; 0.9 ms<\/code><\/pre>\n<p>  \u041d\u043e \u044d\u0442\u043e \u043a\u0430\u043a-\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 1000 \u0440\u0430\u0437 \u0438\u043b\u0438 1 \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u0440\u0430\u0437, \u0432\u0434\u0440\u0443\u0433 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u043d\u0435\u0439:<\/p>\n<p>  <b>PL\/pgSQL<\/b>:<\/p>\n<pre><code class=\"pgsql\">DO $$      DECLARE a int; i int;      BEGIN FOR i IN 0..999999 LOOP           SELECT count(*) INTO a FROM pg_class;     END LOOP; END; $$ LANGUAGE plpgsql; 53s<\/code><\/pre>\n<p>  <b>PL\/Perl<\/b>:<\/p>\n<pre><code class=\"pgsql\">DO $$      for (0..999999) {           spi_exec_query('SELECT count(*) FROM pg_class');      } $$ LANGUAGE plperl; 102s<\/code><\/pre>\n<p>  <b>PL\/Python 3<\/b>:<\/p>\n<pre><code class=\"pgsql\">DO $$      for i in range (0,1000000) :           plpy.execute('SELECT count(*) FROM pg_class') $$ LANGUAGE plpython3u; 98s<\/code><\/pre>\n<p>  <b>PL\/V8<\/b>:<\/p>\n<pre><code class=\"pgsql\">DO $$      for(var i=0;i&lt;1000;i++)           plv8.execute('SELECT count(*) FROM pg_class'); $$ LANGUAGE plv8; 100ms<\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0441 PL\/V8 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d \u0441 \u0442\u044b\u0441\u044f\u0447\u0435\u0439, \u0430 \u043d\u0435 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u043c \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439. \u041f\u0440\u0438 \u0443\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445 PL\/V8 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438\u0437 1\u043c\u043b\u043d \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u044a\u0435\u0441\u0442 \u0432\u0441\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u0432\u043e\u0432\u0441\u0435 \u043f\u043e\u0432\u0435\u0441\u0438\u0442 \u043c\u0430\u0448\u0438\u043d\u0443. \u0423\u0436\u0435 \u043d\u0430 \u0442\u044b\u0441\u044f\u0447\u0435 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 postgres \u043e\u0442\u0431\u0438\u0440\u0430\u0435\u0442 3.5\u0413\u0411 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 100% \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430 \u0434\u0438\u0441\u043a. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 postgres \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0440\u0435\u0434\u0443 V8, \u0438 \u043f\u0430\u043c\u044f\u0442\u044c \u0435\u0441\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043e\u043d\u0430. \u041f\u043e\u0441\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430\u0437\u0430\u0434 \u044d\u0442\u043e\u0442 \u0442\u0443\u0440\u0431\u043e-\u043c\u043e\u043d\u0441\u0442\u0440 \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f. \u0427\u0442\u043e\u0431\u044b \u0432\u044b\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e.<\/p>\n<p>  \u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e PL\/pgSQL \u0443\u0436\u0435 \u0440\u0430\u0437\u0430 \u0432 2 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 PL\/Perl \u0438 PL\/Python. PL\/V8 \u043f\u043e\u043a\u0430 \u0447\u0443\u0442\u044c \u043e\u0442\u0441\u0442\u0430\u0435\u0442 \u043e\u0442 \u043d\u0438\u0445, \u043d\u043e \u0431\u043b\u0438\u0436\u0435 \u043a \u043a\u043e\u043d\u0446\u0443 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e\u043d \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0440\u0435\u0430\u0431\u0438\u043b\u0438\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>  \u0412\u043e\u043e\u0431\u0449\u0435, Perl \u0441 Python&#8217;\u043e\u043c \u0432 \u044d\u0442\u0438\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u0445 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u0420\u0430\u043d\u044c\u0448\u0435 Perl \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0443\u043f\u0430\u043b Python&#8217;\u0443, \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u043e\u043d \u0447\u0443\u0442\u043e\u0447\u043a\u0443 \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u0422\u0440\u0435\u0442\u0438\u0439 \u043f\u0438\u0442\u043e\u043d \u0447\u0443\u0442\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0432\u0442\u043e\u0440\u043e\u0433\u043e. \u0412\u0441\u044f \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 15%.<\/p>\n<h3>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441 PREPARE<\/h3>\n<p>  \u041b\u044e\u0434\u0438 \u0437\u043d\u0430\u044e\u0449\u0438\u0435 \u043f\u043e\u0439\u043c\u0443\u0442: \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u0430\u043a. PL\/pgSQL \u0443\u043c\u0435\u0435\u0442 <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/plpgsql-implementation.html#PLPGSQL-PLAN-CACHING\">\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u043d\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/a>, \u0430 \u0432 PL\/* \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e. \u041f\u043e-\u0445\u043e\u0440\u043e\u0448\u0435\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c, \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043b\u0430\u043d \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0430 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u043b\u0430\u043d\u0443 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f. \u0412 PL\/* \u043c\u043e\u0436\u043d\u043e \u044f\u0432\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u043b\u0430\u043d\u0430\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0447\u0442\u043e \u043c\u044b \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 <b>PL\/Perl<\/b>:<\/p>\n<pre><code class=\"pgsql\">DO $$      my $h = spi_prepare('SELECT count(*) FROM pg_class');      for (0..999999) {           spi_exec_prepared($h);      }      spi_freeplan($h); $$ LANGUAGE plperl; 60s<\/code><\/pre>\n<p>  <b>PL\/Python 3<\/b>:<\/p>\n<pre><code class=\"pgsql\">DO $$      h = plpy.prepare('SELECT count(*) FROM pg_class')      for i in range (0,1000000): plpy.execute(h) $$ LANGUAGE plpython3u; 62s<\/code><\/pre>\n<p>  <b>PL\/V8<\/b>:<\/p>\n<pre><code class=\"pgsql\">DO $$      var h=plv8.prepare('SELECT count(*) FROM pg_class');      for(var i=0;i&lt;1000;i++) h.execute(); $$ LANGUAGE plv8; 53ms<\/code><\/pre>\n<p>  \u0421 <code>prepare<\/code> \u043d\u0430\u0448\u0438 \u0434\u0432\u0430 \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u0433\u043d\u0430\u043b\u0438 PL\/pgSQL, \u0430 \u0442\u0440\u0435\u0442\u0438\u0439 \u2014 \u0442\u043e\u0436\u0435 \u0445\u043e\u0442\u0435\u043b, \u043d\u043e \u043d\u0435 \u0434\u043e\u0448\u0435\u043b \u0434\u043e \u0444\u0438\u043d\u0438\u0448\u0430 \u0438\u0437-\u0437\u0430 \u0440\u0430\u0441\u0442\u0443\u0449\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>  \u041d\u043e \u0435\u0441\u043b\u0438 \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c, \u0442\u043e \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0432\u0441\u0435 \u044f\u0437\u044b\u043a\u0438 \u0438\u0434\u0443\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u043e\u0437\u0434\u0440\u044f \u0432 \u043d\u043e\u0437\u0434\u0440\u044e \u2013 \u0438 \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e. \u0423\u0437\u043a\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0443 \u043d\u0438\u0445 \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u0431\u0449\u0435\u0435 \u2013 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 SPI.<\/p>\n<h3>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439<\/h3>\n<p>  \u041c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u044f\u0437\u044b\u043a\u0430 \u0443\u043f\u0435\u0440\u043b\u0430\u0441\u044c \u0432 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0431\u0430\u0437\u043e\u0439. \u0427\u0442\u043e\u0431\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u044f\u0437\u044b\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e, \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043a \u0431\u0430\u0437\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0443\u043c\u043c\u0443 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432.<\/p>\n<p>  <b>PL\/pgSQL<\/b>:<\/p>\n<pre><code class=\"pgsql\">DO $$      DECLARE i bigint; a bigint;      BEGIN a=0;      FOR i IN 0..1000000 LOOP           a=a+i*i::bigint;      END LOOP; END; $$ LANGUAGE plpgsql; 280ms<\/code><\/pre>\n<p>  <b>PL\/Perl<\/b>:<\/p>\n<pre><code class=\"pgsql\">DO $$      my $a=0;      for my $i (0..1000000) { $a+=$i*$i; };      warn $a; $$ LANGUAGE plperl; 63ms<\/code><\/pre>\n<p>  <b>PL\/Python 3<\/b>:<\/p>\n<pre><code class=\"pgsql\">DO $$ a=0 for i in range(1,1000001): a=a+i*i $$ LANGUAGE plpython3u; 73ms<\/code><\/pre>\n<p>  <b>PL\/V8<\/b>:<\/p>\n<pre><code class=\"plaintext\">DO $$      var a=0;      for(var i=0;i&lt;=1000000;i++) a+=i*i;      plv8.elog(NOTICE, a); $$ language plv8; 7.5ms<\/code><\/pre>\n<p>  \u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e PL\/Perl \u0438 PL\/Python \u0434\u043e\u0433\u043d\u0430\u043b\u0438 \u0438 \u043f\u0435\u0440\u0435\u0433\u043d\u0430\u043b\u0438 PL\/pgSQL, \u043e\u043d\u0438 \u0440\u0430\u0437\u0430 \u0432 4 \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u0410 \u0432\u043e\u0441\u044c\u043c\u0435\u0440\u043a\u0430 \u0440\u0432\u0451\u0442 \u0432\u0441\u0435\u0445! \u041d\u043e \u043d\u0435\u0443\u0436\u0435\u043b\u0438 \u044d\u0442\u043e \u0437\u0430\u0434\u0430\u0440\u043e\u043c? \u0418\u043b\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0437\u0430 \u044d\u0442\u043e \u043f\u043e \u0433\u043e\u043b\u043e\u0432\u0435? \u0414\u0430, \u043f\u043e\u043b\u0443\u0447\u0438\u043c.<\/p>\n<p>  \u0427\u0438\u0441\u043b\u043e \u0432 JavaScript \u2013 \u044d\u0442\u043e float, \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u043e, \u043d\u043e \u043d\u0435 \u0442\u043e\u0447\u043d\u043e: 333333833333127550 \u0432\u043c\u0435\u0441\u0442\u043e 333333833333500000.<\/p>\n<p>  \u0412\u043e\u0442 \u0444\u043e\u0440\u043c\u0443\u043b\u0430, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code class=\"plaintext\">\u2211 = n*(n+1)*(2n+1)\/6 <\/code><\/pre>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0435\u0451 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438\u043d\u0434\u0443\u043a\u0446\u0438\u0438.<\/p>\n<p>  \u0412 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0441\u043c\u0435\u0445\u0430, <\/p>\n<pre><code class=\"pgsql\">DO LANGUAGE plv8 $$ plv8.elog(NOTICE, parseInt(33333383333312755033)) $$;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">NOTICE: 33333383333312754000<\/code><\/pre>\n<p>  \u0412 Javascript <code>parseInt<\/code> \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 float, \u0430 \u043d\u0435 Int.<\/p>\n<p>  \u0412\u0441\u0451 \u0436\u0435 \u0432 V8 \u0432 2018 \u0433. \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f <a href=\"https:\/\/v8.dev\/features\/bigint\">BigInt<\/a>, \u0438 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u0447\u043d\u043e, \u043d\u043e \u0441 \u0443\u0449\u0435\u0440\u0431\u043e\u043c \u0434\u043b\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e \u043d\u0435 64-\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0435 \u0446\u0435\u043b\u043e\u0435, \u0430 \u0446\u0435\u043b\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u0438. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0432 PL\/V8 \u044d\u0442\u043e \u043d\u043e\u0432\u0448\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043f\u0430\u043b\u043e. \u0412 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u0447\u0438\u0441\u043b\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u0438 (\u0430\u043d\u0430\u043b\u043e\u0433\u0438 SQL-\u043d\u043e\u0433\u043e <code>numeric<\/code>) \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. <\/p>\n<p>  \u0412 Perl \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c <a href=\"https:\/\/perldoc.perl.org\/Math\/BigFloat.html\">Math::BigFloat<\/a> \u0434\u043b\u044f \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0438 \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e, \u0430 \u0432 Python \u2013 \u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/pypi.org\/project\/bigfloat\/\">Bigfloat<\/a> \u2013 \u043e\u0431\u0435\u0440\u0442\u043a\u0430 <a href=\"https:\/\/cython.org\/\">Cython<\/a> \u0432\u043e\u043a\u0440\u0443\u0433 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/www.mpfr.org\/\">GNU MPFR<\/a>.<\/p>\n<h3>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438<\/h3>\n<p>  \u0412\u043e\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u0438\u0434\u043d\u0430 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0435\u0441\u043b\u0438 \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445. \u0417\u0430\u0434\u0430\u0447\u0430: \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044f, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u0432\u044b\u043f\u0443\u0441\u043a\u043e\u0432 \u0436\u0443\u0440\u043d\u0430\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0442\u0430\u043a\u0438\u043c\u0438:<\/p>\n<pre><code class=\"plaintext\">1 2 3 4-5 6 6A 6\u0411 11 12 <\/code><\/pre>\n<p>  \u0422.\u0435. \u0432\u043e\u043e\u0431\u0449\u0435-\u0442\u043e \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430, \u043d\u043e \u043e\u043d\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0447\u0438\u0441\u043b\u0430, \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0434\u043e \u043f\u043e \u044d\u0442\u0438\u043c \u0447\u0438\u0441\u043b\u0430\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u043a\u0438, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043d\u0443\u043b\u044f\u043c\u0438 \u0441\u043b\u0435\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<\/p>\n<pre><code class=\"plaintext\">0000000001 0000000002 0000000003 0000000004-5 0000000006 0000000006A 0000000006\u0411 0000000011 0000000012 <\/code><\/pre>\n<p>  \u0414\u0430, \u044f \u0437\u043d\u0430\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 (\u0438 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435). \u041d\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043e\u043d\u043e \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442.<\/p>\n<p>  \u0414\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0442\u0438\u043f\u0430 <code>SELECT ... ORDER BY nsort(n)<\/code> \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 PL\/Perl, SQL \u0438 PL\/Python, \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0449\u0438\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u0436\u0443\u0440\u043d\u0430\u043b\u043e\u0432 \u043a \u044d\u0442\u043e\u043c\u0443 \u0432\u0438\u0434\u0443:<\/p>\n<pre><code class=\"pgsql\">CREATE OR REPLACE FUNCTION nsort(text) RETURNS text     LANGUAGE PLPERL IMMUTABLE AS $$     my $x = shift;     return ($x =~ \/^\\s*(\\d+)(.*)$\/)         ? sprintf(&quot;%010d&quot;, $1).$2         : $x; $$;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">CREATE OR REPLACE FUNCTION _nsort(x text) RETURNS text      LANGUAGE SQL  IMMUTABLE  AS $$  WITH y AS (     SELECT regexp_match(x,'^\\s*(\\d*)(.*)$') as z  )  SELECT CASE WHEN z[1] = '' THEN x ELSE lpad(z[1],10,'0') || z[2] END FROM y; $$;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">CREATE OR REPLACE FUNCTION py_nsort(x text) RETURNS text     LANGUAGE plpython2u IMMUTABLE AS $$ import re r = re.match('^\\s*(\\d+)(.*)$', x) return x if r == None else ('%010d' % int(r.group(1))) + r.group(2) $$;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">CREATE OR REPLACE FUNCTION js_nsort(x text) RETURNS text     LANGUAGE plv8 IMMUTABLE AS $$ var m = x.match(\/^\\s*(\\d+)(.*)$\/); if(m) { var pad = ''; for(var i=0,l=10-m[1].length;i&lt;l;i++) pad+='0'; return pad + x; } else { return x; }  $$;<\/code><\/pre>\n<p>  \u041d\u0430 \u043c\u043e\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0438\u0437 15.5 \u0442\u044b\u0441\u044f\u0447 \u0436\u0443\u0440\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 PL\/Perl \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u043a\u043e\u043b\u043e 64\u043c\u0441 \u043f\u0440\u043e\u0442\u0438\u0432 120\u043c\u0441 \u043d\u0430 PL\/Python \u0438 200\u043c\u0441 \u043d\u0430 PL\/PgSQL. \u041d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432\u0441\u0435\u0445 \u2014 PL\/v8: 54\u043c\u0441. \u0415\u0441\u043b\u0438 \u0431\u044b \u0434\u0432\u0438\u0436\u043e\u043a JS \u0431\u044b\u043b \u043f\u043e\u043d\u043e\u0432\u0435\u0435 \u0438 \u0432 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0435 String \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0431\u044b \u0432\u0441\u044f\u043a\u0438\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u0440\u043e\u0434\u0435 <code>padStart<\/code> \u0438\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b <code>repeat<\/code>, \u043a\u043e\u0434 \u0431\u044b\u043b \u0431\u044b \u043f\u043e\u043b\u0435\u0433\u0447\u0435, \u0434\u0430 \u0438 \u043f\u043e\u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<p>  <b>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435:<\/b> \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044f \u0441 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u044c\u0442\u0435 \u043d\u0443\u0436\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043c \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0448\u043b\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 (EXPLAIN \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u043a\u0430\u0436\u0435\u0442 <code>Sort Method: quicksort<\/code>). \u041e\u0431\u044a\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <code>work_mem<\/code>:<\/p>\n<pre><code class=\"pgsql\">set work_mem = '20MB'; <\/code><\/pre>\n<p>  <\/p>\n<h3>\u041f\u0430\u043c\u044f\u0442\u044c<\/h3>\n<p>  Perl \u043d\u0435 \u043b\u044e\u0431\u0438\u0442 \u0437\u0430\u0446\u0438\u043a\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043e\u043d \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u0438\u0445 \u043e\u0447\u0438\u0449\u0430\u0442\u044c. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432 <code>a<\/code> \u0435\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <code>b<\/code>, \u0432 \u0432 <code>b<\/code> \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <code>a<\/code>, \u0442\u043e \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043d\u0443\u043b\u044f\u0442\u0441\u044f, \u0438 \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u0441\u044f.<\/p>\n<p>  \u0412 \u044f\u0437\u044b\u043a\u0430\u0445 \u0441\u043e \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u043c\u0443\u0441\u043e\u0440\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 \u043f\u0430\u043c\u044f\u0442\u044c \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u0441\u044f, \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435. \u0418\u043b\u0438 \u2014 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u043e\u0431 \u044d\u0442\u043e\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u2014 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043c\u0443\u0441\u043e\u0440 \u0432 \u0441\u0430\u043c\u044b\u0439 \u043d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. <\/p>\n<p>  \u041d\u043e \u0435\u0441\u0442\u044c \u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u044c\u044e, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441 Postgres. \u0415\u0441\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442 SPI, \u0430 Perl \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u0433\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0438\u0445 \u043d\u0430\u0434\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0442\u044c. <\/p>\n<p>  <b>PL\/Perl<\/b><\/p>\n<p>  \u0412\u043e\u0442 \u0442\u0430\u043a \u041d\u0415 \u0442\u0435\u0447\u0451\u0442:<\/p>\n<pre><code class=\"pgsql\">CREATE OR REPLACE function cr() RETURNS int LANGUAGE plperl AS $$      return spi_exec_query(            'SELECT count(*) FROM pg_class'      )-&gt;{rows}-&gt;[0]-&gt;{count}; $$;<\/code><\/pre>\n<p>  \u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u0442\u0435\u0447\u0451\u0442:<\/p>\n<pre><code class=\"pgsql\">CREATE OR REPLACE function cr() RETURNS int LANGUAGE plperl AS $$      my $h = spi_prepare(           'SELECT count(*) FROM pg_class'      );      return spi_exec_prepared($h)-&gt;{rows}-&gt;[0]-&gt;{count}; $$;<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0445\u0430\u043d\u0434\u043b\u0435\u0440 <code>$h<\/code> \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0436\u0438\u0442\u044c, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0436\u0438\u0432\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043d\u0435\u0433\u043e \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f.<\/p>\n<p>  \u041d\u0438\u0447\u0435\u0433\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0434\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044f\u0432\u043d\u043e\u0433\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>spi_freeplan($h)<\/code>:<\/p>\n<pre><code class=\"pgsql\">CREATE OR REPLACE function cr() RETURNS int LANGUAGE plperl AS $$      my $h = spi_prepare(           'select count(*) from pg_class'      );      my $res = spi_exec_prepared($h)-&gt;{rows}-&gt;[0]-&gt;{count};      spi_freeplan($h);      return $res; $$;<\/code><\/pre>\n<p>  <b>PL\/Python:<\/b><\/p>\n<p>  Python <b>\u043d\u0435 \u0442\u0435\u0447\u0451\u0442 \u043d\u0438\u043a\u043e\u0433\u0434\u0430<\/b>, \u043f\u043b\u0430\u043d \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438:<\/p>\n<pre><code class=\"pgsql\">CREATE OR REPLACE function cr3() RETURNS int LANGUAGE plpythonu as $$      return plpy.execute(            'select count(*) from pg_class'      )[0]['count'] $$;<\/code><\/pre>\n<p>  <b>PL\/V8<\/b><\/p>\n<p>  \u0422\u0430 \u0436\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u044f, \u0447\u0442\u043e \u0438 \u0441 Perl. \u0422\u0430\u043a \u043d\u0435 \u0442\u0435\u0447\u0451\u0442:<\/p>\n<pre><code class=\"pgsql\">CREATE OR REPLACE FUNCTION crq() RETURNS int LANGUAGE plv8 AS $$      return plv8.execute(           'select count(*) from pg_class\u2018      )[0].count; $$;<\/code><\/pre>\n<p>  \u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u0442\u0435\u0447\u0451\u0442:<\/p>\n<pre><code class=\"pgsql\">CREATE OR REPLACE FUNCTION crq() RETURNS int LANGUAGE plv8 AS $$      var h = plv8.prepare(           'select count(*) from pg_class'      );      return h.execute()[0].count; $$;<\/code><\/pre>\n<p>  \u041e\u043f\u044f\u0442\u044c \u0436\u0435: \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u043e\u0431 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. \u0417\u0434\u0435\u0441\u044c \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 <code>h.free();<\/code><\/p>\n<p>  \u0422\u0430\u043a \u043d\u0435 \u0442\u0435\u0447\u0451\u0442:<\/p>\n<pre><code class=\"pgsql\">CREATE OR REPLACE FUNCTION crq() RETURNS int LANGUAGE plv8 AS $$      var h = plv8.prepare(           'select count(*) from pg_class'      );      var r = h.execute()[0].count;      h.free();      return r; $$;<\/code><\/pre>\n<p>  <\/p>\n<h3>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b<\/h3>\n<p>  \u041f\u043e\u0440\u0430 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e 4 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0441 \u0442\u0438\u043f\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\u0446\u0435\u043b\u043e\u0435;<\/li>\n<li>\u043c\u0430\u0441\u0441\u0438\u0432;<\/li>\n<li>bytea \u0438<\/li>\n<li>jsonb<\/li>\n<\/ul>\n<p>  \u0412 \u043a\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u043e\u043d\u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 <b>PL\/Perl<\/b>?<\/p>\n<pre><code class=\"pgsql\">CREATE OR REPLACE FUNCTION crq(a int, b bytea, c int[], d jsonb ) RETURNS void LANGUAGE plperl AS $$     warn Dumper(@_); $$;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">SELECT crq(1,'abcd', ARRAY[1,2,3],'{&quot;a&quot;:2,&quot;b&quot;:3}');<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\"> WARNING:  $VAR1 = '1'; $VAR2 = '\\\\x61626364'; $VAR3 = bless( {                  'array' =&gt; [                               '1',                               '2',                               '3'                             ],                  'typeoid' =&gt; 1007                }, 'PostgreSQL::InServer::ARRAY' ); $VAR4 = '{&quot;a&quot;: 2, &quot;b&quot;: 3}';  crq  ----- (1 row)<\/code><\/pre>\n<p>  \u0411\u0443\u0434\u0435\u0442 \u044d\u0442\u043e JSON \u0438\u043b\u0438 JSONB \u2014 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u044b: \u043e\u043d\u0438 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0440\u043e\u043a\u0438. \u042d\u0442\u043e \u043f\u043b\u0430\u0442\u0430 \u0437\u0430 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c: \u0432 Postgres \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u043e\u0432, \u0440\u0430\u0437\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u00ab\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0441\u0442\u0438\u00bb. \u0422\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u0447\u0442\u043e\u0431\u044b \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u043e\u0432\u044b\u043c \u0442\u0438\u043f\u043e\u043c \u043e\u043d \u0441\u0440\u0430\u0437\u0443 \u0441\u043d\u0430\u0431\u0436\u0430\u043b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 PL\/* \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043e\u043c. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043c\u043d\u043e\u0433\u0438\u0435 \u0442\u0438\u043f\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u043a\u0438. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0434\u043e\u0431\u043d\u043e, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u044d\u0442\u0438 \u0441\u0440\u043e\u043a\u0438 \u043f\u0430\u0440\u0441\u0438\u0442\u044c. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u043d\u043d\u044b\u0435 Postgres \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0438\u0441\u044c \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Perl. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 9.6 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c TRANSFORM \u2013 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432: <a href=\"https:\/\/postgrespro.ru\/docs\/postgrespro\/12\/sql-createtransform\">CREATE TRANSFORM<\/a>.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c TRANSFORM, \u043d\u0430\u0434\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 C \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: \u043e\u0434\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u0443, \u0434\u0440\u0443\u0433\u0430\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, TRANSFORM \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u043c\u0435\u0441\u0442\u0430\u0445: <\/p>\n<ul>\n<li>\u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e;<\/li>\n<li>\u041f\u0440\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438;<\/li>\n<li>\u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 SPI-\u0432\u044b\u0437\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438;<\/li>\n<li>\u041f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 SPI-\u0432\u044b\u0437\u043e\u0432\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/li>\n<\/ul>\n<p>  \u0412 11-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 Postgres \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c TRANSFORM JSONB \u0434\u043b\u044f Perl \u0438 Python, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0410\u043d\u0442\u043e\u043d\u043e\u043c \u0411\u044b\u043a\u043e\u0432\u044b\u043c. \u0422\u0435\u043f\u0435\u0440\u044c JSONB \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u043e\u043d \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 Perl \u0441\u0440\u0430\u0437\u0443 \u043a\u0430\u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430. \u041d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 jsonb_plperl, \u0438 \u0442\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c TRANSFORM:<\/p>\n<pre><code class=\"pgsql\">CREATE EXTENSION jsonb_plperl; CREATE OR REPLACE FUNCTION crq2(d jsonb) RETURNS void LANGUAGE plperl TRANSFORM FOR TYPE jsonb AS $$      warn Dumper(@_); $$;<\/code><\/pre>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e JSONB \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0441\u044f \u0432 \u043f\u0435\u0440\u043b\u043e\u0432\u044b\u0439 \u0445\u044d\u0448:<\/p>\n<pre><code class=\"pgsql\">SELECT crq2( '{&quot;a&quot;:2,&quot;b&quot;:3}');<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\"> WARNING:  $VAR1 = {           'a' =&gt; '2',           'b' =&gt; '3'         };  crq2  ------ (1 row)<\/code><\/pre>\n<p>  \u0421\u043e\u0432\u0441\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u0435 \u0434\u0435\u043b\u043e!<\/p>\n<p>  \u0410\u0432\u0442\u043e\u0440 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0442\u043e\u0436\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0438\u043b \u0440\u0443\u043a\u0443 \u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 TRANSFORM&#8217;\u043e\u0432. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u0430\u043a <code>boolean<\/code> \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432 PL\/Perl \u0432 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435, \u0432 \u0432\u0438\u0434\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u043e\u043a <code>'t'<\/code> \u0438\u043b\u0438 <code>'f'<\/code>. \u041d\u043e \u0432 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0438 Perl \u0441\u0442\u0440\u043e\u043a\u0430 &#8216;f&#8217; \u044d\u0442\u043e true. \u0427\u0442\u043e\u0431\u044b \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e, \u0431\u044b\u043b \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d <a href=\"https:\/\/postgrespro.ru\/list\/thread-id\/1583013317.881182688@f390.i.mail.ru\">\u043f\u0430\u0442\u0447, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0431\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0442\u0438\u043f\u0430<\/a>. \u042d\u0442\u043e\u0442 \u043f\u0430\u0442\u0447 \u043f\u043e\u043f\u0430\u043b \u0432 PostgreSQL 13 \u0438 \u0441\u043a\u043e\u0440\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0412 \u0432\u0438\u0434\u0443 \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b, bool_plperl \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0443\u0436\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u043a\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 TRANSFORM \u0438 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 (bytea, \u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u0434\u0430\u0442\u044b, numeric).<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 <b>Python<\/b>.<\/p>\n<pre><code class=\"pgsql\">CREATE EXTENSION jsonb_plpython3u; CREATE OR REPLACE FUNCTION pdump(a int, b bytea, c int[], d jsonb ) RETURNS void LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$       plpy.warning(a,b,c,d) $$;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">SELECT pdump(1,'abcd', ARRAY[1,2,3],'{&quot;a&quot;:2,&quot;b&quot;:3}');<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\"> WARNING:  (1, b'abcd', [1, 2, 3], {'a': Decimal('2'), 'b': Decimal('3')})  pdump  ------- (1 row)<\/code><\/pre>\n<p>  \u041c\u0430\u0441\u0441\u0438\u0432 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u2014 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e (\u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 PG10 \u0432 \u043f\u0438\u0442\u043e\u043d \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0438 \u043c\u043d\u043e\u0433\u043e\u043c\u0435\u0440\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b). \u0412 Perl \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0441\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u041d\u0443 \u0438 <code>jsonb<\/code> \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f. \u0411\u0435\u0437 TRANSFORM jsonb \u043f\u0435\u0440\u0435\u0434\u0430\u0441\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0432 \u043a\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 <b>JS<\/b>.<\/p>\n<pre><code class=\"pgsql\">CREATE OR REPLACE FUNCTION jsdump(a int, b bytea, c int[], d jsonb) RETURNS void LANGUAGE plv8 AS $$      plv8.elog(WARNING,a,b,c,d) $$;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">SELECT jsdump(1,'abcd', ARRAY[1,2,3],'{&quot;a&quot;:2,&quot;b&quot;:3}');<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\"> WARNING:  1 97,98,99,100 1,2,3 [object Object] jsdump  ------- (1 row)<\/code><\/pre>\n<p>  JSONB \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442 JavaScript \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u043e\u0433\u043e TRANSFORM! \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u042b\u0435 \u0442\u0438\u043f\u044b Postgres \u0442\u043e\u0436\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0442\u0438\u043f Date JS. \u0422\u043e \u0436\u0435 \u0441 boolean. \u0412\u0441\u0435 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0443\u0436\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0432 PL\/V8. <\/p>\n<h3>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u044c\u044e<\/h3>\n<p>  \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 INFINITY \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u0447\u0430\u0441\u0442\u043e, \u043d\u043e \u043d\u0435\u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043d\u0435\u0439 \u043e\u043f\u0430\u0441\u043d\u0430. \u0412 PostgreSQL Infinity \u0438 -Infinity \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043a\u0430\u043a \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u042b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0438 \u0442\u0438\u043f\u0430 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439. \u041d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 Infinity \u0432 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430\u0434\u043e \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043d\u0438\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u044f\u0437\u044b\u043a\u0430, \u0430 \u0438 \u043e\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043e\u0442 \u041e\u0421 \u0438 \u0434\u0430\u0436\u0435 \u043e\u0442 \u0436\u0435\u043b\u0435\u0437\u0430.<\/p>\n<p>  \u0412 Python \u0435\u0441\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c Numpy, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439 \u0447\u0438\u0441\u043b\u043e\u0432\u0443\u044e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u044c:<\/p>\n<pre><code class=\"python\">import numpy as nm a = nm.inf b = -nm.inf print(a, b)<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">inf -inf<\/code><\/pre>\n<p>  \u0412 Perl \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u044c, \u0432 \u0435\u0451 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430 <code>&quot;infinity&quot;<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0434\u043e <code>&quot;inf&quot;<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c:<\/p>\n<pre><code class=\"perl\">perl -e 'print 1 * &quot;inf&quot;'<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">Inf<\/code><\/pre>\n<p>  \u0438\u043b\u0438<\/p>\n<pre><code class=\"perl\">perl -e 'print 1\/&quot;inf&quot;'<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">0<\/code><\/pre>\n<p>  \u0412 PL\/Perl, PL\/Python, PL\/v8 \u0447\u0438\u0441\u043b\u043e\u0432\u0430\u044f \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u044c \u0438\u0437 Postgres \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e, \u043d\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0434\u0430\u0442\u0430 \u2014 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c. \u0412\u0435\u0440\u043d\u0435\u0435, \u0432 PL\/Perl \u0438 PL\/Python \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0442\u0443\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u0442\u0440\u043e\u043a\u0430. \u0412 PL\/V8 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f Date \u0435\u0441\u0442\u044c, \u0438 \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u0434\u0430\u0442\u0430 \u0438\u0437 \u043f\u043e\u0441\u0442\u0433\u0440\u0435\u0441\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0435\u0433\u043e. \u041d\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e \u0434\u0430\u0442\u0443 V8 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0438 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u043e\u043d\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 <code>Invalid Date<\/code>.<\/p>\n<h3>\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 prepared-\u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/h3>\n<p>  \u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a <code>prepare<\/code>, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0442\u0430\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u041c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u044f\u0437\u044b\u043a\u0430\u043c\u0438 \u0442\u0443\u0442 \u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0449\u0435\u0433\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u0441\u0435 \u043e\u043d\u0438 \u0431\u0430\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430 SPI. <\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0435 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 <b>PL\/Perl<\/b>, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f, \u0430 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0443\u0436\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 (\u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u0432 PL\/pgSQL).<\/p>\n<pre><code class=\"pgsql\">DO LANGUAGE plperl $$      my $h= spi_prepare('SELECT * FROM pg_class WHERE           relname ~ $1', 'text' );                     # \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0442\u0438\u043f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430      warn Dumper(spi_exec_prepared($h, 'pg_language')); # \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430      spi_freeplan($h); $$;<\/code><\/pre>\n<p>  \u0412 <b>PL\/Python<\/b> \u0441\u0443\u0442\u044c \u0442\u0430 \u0436\u0435, \u043d\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f:<\/p>\n<pre><code class=\"pgsql\">DO LANGUAGE plpython3u $$      h= plpy.prepare('SELECT relname FROM pg_class WHERE relname ~ $1', ['text'] )      plpy.notice(\u0440.execute (['pg_language'])) $$;<\/code><\/pre>\n<p>  \u0412 <b>PL\/V8<\/b> \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b:<\/p>\n<pre><code class=\"pgsql\">DO LANGUAGE plv8 $$     var h= plv8.prepare('SELECT relname FROM pg_class WHERE relname ~ $1', ['text'] );     plv8.elog(NOTICE, h.execute (['pg_language']));     h.free(); $$;<\/code><\/pre>\n<p>  \u0412 <b>PL\/Java<\/b> \u0432\u0441\u0451 \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443. \u0422\u0430\u043c \u044f\u0432\u043d\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f SPI, \u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0441\u0435\u0432\u0434\u043e-JDBC \u043a\u043e\u043d\u043d\u0435\u043a\u0442 \u043a \u0431\u0430\u0437\u0435. \u0414\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 \u043d\u0430 PL\/Java \u0432\u0441\u0451 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u0431\u044b \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u043e\u0439\u0442\u0438 \u043a \u0434\u0438\u0437\u0430\u0439\u043d\u0443 PL\/Perl \u0438 PL\/Python, \u043d\u043e \u044d\u0442\u043e \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u043d\u0435 \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e (\u0432\u043f\u0440\u043e\u0447\u0435\u043c, \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0435\u0449\u0451 \u043f\u0430\u0440\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 PL\/Perl \u0438 PL\/Python).<\/p>\n<h3>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c<\/h3>\n<p>  \u0423 \u0432\u0441\u0435\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 SPI, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438, \u043a\u043e\u0433\u0434\u0430 \u0445\u043e\u0434\u0438\u043b\u0438 \u0432 \u0431\u0430\u0437\u0443 \u2014 <code>spi_exec_query()<\/code> \u0438 \u0434\u0440. \u2014 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445 \u0441\u0442\u0440\u043e\u043a. \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u044b\u0445 \u0432\u0430\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445 \u0441\u0442\u0440\u043e\u043a \u043c\u043d\u043e\u0433\u043e, \u0442\u043e \u0431\u0435\u0437 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u043d\u0435 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e\u043d\u0435\u043c\u043d\u043e\u0433\u0443.<\/p>\n<p>  \u041a\u0443\u0440\u0441\u043e\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432\u043e \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445. \u0412 <b>PL\/Perl<\/b> <br \/>  <code>spi_exec_query<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u0443\u0440\u0441\u043e\u0440, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e \u043e\u0434\u043d\u043e\u0439. \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043a\u0443\u0440\u0441\u043e\u0440 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u043d \u0441\u0430\u043c \u0437\u0430\u043a\u0440\u043e\u0435\u0442\u0441\u044f. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0437\u0430\u043d\u043e\u0432\u043e, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0435\u0433\u043e \u044f\u0432\u043d\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>close()<\/code>.<\/p>\n<pre><code class=\"pgsql\">DO LANGUAGE plperl $$     my $cursor = spi_query('SELECT * FROM pg_class');     my $row;     while(defined($row = spi_fetchrow($cursor))) {          warn $row-&gt;{relname};     } $$;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">WARNING:  pg_statistic at line 5. WARNING:  pg_toast_2604 at line 5. WARNING:  pg_toast_2604_index at line 5. WARNING:  pg_toast_2606 at line 5. WARNING:  pg_toast_2606_index at line 5. WARNING:  pg_toast_2609 at line 5. WARNING:  pg_toast_2609_index at line 5. ...<\/code><\/pre>\n<p>  \u0412 <b>PL\/Python<\/b> \u0432\u0441\u0451 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0435, \u043d\u043e \u043a\u0443\u0440\u0441\u043e\u0440 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u043a\u0442, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0445\u043e\u0434\u0438\u0442\u044c \u0446\u0438\u043a\u043b\u043e\u043c:<\/p>\n<pre><code class=\"pgsql\">h = plpy.prepare('SELECT ...'); cursor = plpy.cursor(h); for row in cursor: ... cursor.close() \/\/ \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e<\/code><\/pre>\n<p>  \u0412 <b>PL\/v8<\/b> \u0432\u0441\u0451 \u0442\u043e\u0436\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0435, \u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0442\u044c \u043f\u043b\u0430\u043d \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430:<\/p>\n<pre><code class=\"pgsql\">var h = plv.prepare('SELECT ...'); var cursor = h.cursor(); var row; while(row = cursor.fetch()) { ... } cursor.close(); h.free();<\/code><\/pre>\n<p>  <\/p>\n<h3>PL\/V8: \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c<\/h3>\n<p>  \u0412 PL\/V8 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0435 \u0438\u0437 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e SELECT, \u0430 \u043d\u0430\u0439\u0442\u0438 \u0435\u0451 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>plv8.find_function(name);<\/code>. \u041d\u043e \u043d\u0430\u0434\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0432 JS \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u043e\u0439, \u043a\u0430\u043a \u0432 PostgreSQL, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c, \u043d\u043e \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c. \u0412 PL\/v8 \u043c\u044b, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u043e \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <code>find_function<\/code> \u0431\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430.<\/p>\n<pre><code class=\"plaintext\">ERROR:  Error: more than one function named &quot;jsdump&quot;<\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e, \u0442\u043e \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c, \u043c\u0438\u043d\u0443\u044f SPI \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432, \u0442.\u0435. \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a:<\/p>\n<pre><code class=\"pgsql\">DO LANGUAGE plv8 $$ plv8.find_function('jsdump')(1, 'abc'); $$;<\/code><\/pre>\n<p>  <\/p>\n<h3>\u0422\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/h3>\n<p>  \u0412 Postgres 11 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0440\u0430\u0434\u043e\u0441\u0442\u044c: \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c <i>\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435<\/i> \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b. \u0420\u0430\u043d\u044c\u0448\u0435 \u0432 Postgres \u0431\u044b\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0420\u0430\u0434\u043e\u0441\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437-\u0437\u0430 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443 SQL, \u0430 \u0432\u043e\u0442 \u043e\u0442\u0447\u0435\u0433\u043e: \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c \u0438 \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438. <\/p>\n<p>  \u0412 PL\/Perl \u0438 PL\/Python \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u0446\u0438\u0438 SPI \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u043c\u0438, \u0430 \u0432 PL\/V8 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043a\u0430 \u043d\u0435\u0442. \u0412 PL\/Perl \u044d\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <code>spi_commit()<\/code> \u0438 <code>spi_rollback()<\/code>, \u0430 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0441\u0442\u044c <a href=\"https:\/\/postgrespro.ru\/docs\/postgrespro\/12\/plperl-builtins\">\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>. \u0412 PL\/Python \u044d\u0442\u043e <code>plpy.commit()<\/code> \u0438 <code>plpy.rollback()<\/code>.<\/p>\n<h3>\u041f\u043e\u0434\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/h3>\n<p>  \u041f\u043e\u0434\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0443\u0434\u043e\u0431\u043d\u044b \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0435.<\/p>\n<p>  \u0412 <b>PL\/pgSQL<\/b> \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u043b\u043e\u043a \u0441 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c EXCEPTION \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u043e\u0434\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e. \u041e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u044c\u044e, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/www.cybertec-postgresql.com\/en\/subtransactions-and-performance-in-postgresql\/\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  \u0412 <b>PL\/Perl<\/b> \u044f\u0432\u043d\u044b\u0445 \u043f\u043e\u0434\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u043d\u0435\u0442, \u043d\u043e \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 savaepoint&#8217;\u044b. \u041f\u043e-\u0432\u0438\u0434\u0438\u043c\u043e\u043c\u0443, \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u043b\u043e\u0432\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0434\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0432 \u044f\u0432\u043d\u043e\u043c \u0432\u0438\u0434\u0435.<\/p>\n<p>  \u0412 <b>PL\/Python<\/b> \u043f\u043e\u0434\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0434\u0430\u0432\u043d\u043e: \u0441 9.5 <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/9.5\/plpython-subtransaction\">\u044f\u0432\u043d\u044b\u0435<\/a>, \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0431\u044b\u043b\u0438 <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/9.4\/plpython-subtransaction\">\u043d\u0435\u044f\u0432\u043d\u044b\u0435<\/a>. \u041c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e, \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0435 \u0432 <code>try-\u0431\u043b\u043e\u043a<\/code> \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c. \u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u0441\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0442\u043e \u043c\u044b \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u043c \u0432 \u0431\u043b\u043e\u043a <code>except<\/code>, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0441\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0442\u043e \u0432 \u0431\u043b\u043e\u043a <code>else<\/code> \u0438 \u0438\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<pre><code class=\"pgsql\">try:      with plpy.subtransaction():           plpy.execute(&quot;...&quot;)           plpy.execute(&quot;...&quot;) except plpy.SPIError, e: . . . else: . . .<\/code><\/pre>\n<p>  \u041f\u043e\u0445\u043e\u0436\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0435\u0441\u0442\u044c \u0438 \u0432 <b>PL\/V8<\/b>, \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0435 JS.<\/p>\n<pre><code class=\"pgsql\">try { plv8.subtransaction(function() { plv8.execute('UPDATE...'); plv8.execute('UPDATE...'); }); } catch(e) { ... }<\/code><\/pre>\n<p>  <\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u041f\u0440\u043e\u0431\u0443\u0439\u0442\u0435, \u043d\u043e \u043d\u0435 \u0437\u043b\u043e\u0443\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0439\u0442\u0435 \ud83d\ude42 \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u043b\u044c\u0437\u0443 \u0437\u043d\u0430\u043d\u0438\u0435 PL\/* \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0435\u0441\u0442\u0438. \u041a\u0430\u043a \u0438 \u043b\u044e\u0431\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043e\u043d\u0438 \u043b\u044e\u0431\u044f\u0442, \u043a\u043e\u0433\u0434\u0430 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e.<\/p>\n<p>  PL\/v8 \u043e\u0447\u0435\u043d\u044c \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u0435\u043d, \u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u0432\u0435\u0434\u0435\u0442 \u0441\u0435\u0431\u044f \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e \u0438 \u0438\u043c\u0435\u0435\u0442 \u0440\u044f\u0434 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u0443\u0447\u0448\u0435 \u0431\u0440\u0430\u0442\u044c \u044f\u0437\u044b\u043a\u0438 \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<p>  \u0425\u043e\u0447\u0443 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0418\u0433\u043e\u0440\u044e \u041b\u0435\u0432\u0448\u0438\u043d\u0443 (<a href=\"https:\/\/habr.com\/ru\/users\/igor_le\/\" class=\"user_link\">Igor_Le<\/a>), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u043c\u043e\u0433 \u043c\u043d\u0435 \u0441 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u043e\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u044c\u0438, \u0438 \u043f\u043e\u0434\u043a\u0438\u043d\u0443\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0438\u0434\u0435\u0439.<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/502254\/\"> https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/502254\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/502254\/\">Postgres \u0437\u043d\u0430\u043c\u0435\u043d\u0438\u0442 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u043e\u0441\u0442\u044c\u044e, \u0447\u0442\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0438 \u043a \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 (PL). \u041d\u0438\u043a\u0442\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0445\u0432\u0430\u0441\u0442\u0430\u0442\u044c\u0441\u044f <s>\u044f\u0437\u044b\u043a\u043e\u043c<\/s> \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u043e\u0432 \u0442\u0430\u043a\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u0430 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0438 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d: \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044f\u0437\u044b\u043a \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0432\u0435\u0440\u0445\u0443\u0441\u0438\u043b\u0438\u0439. \u041c\u043e\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c. \u041f\u0435\u0440\u0435\u0434\u0435\u043b\u043e\u043a \u0432 \u0421\u0423\u0411\u0414 \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442. \u041a\u0430\u043a \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435, \u0442\u0430\u043a\u0430\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u043e\u0441\u0442\u044c \u0431\u044b\u043b\u0430 \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u0430 \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u0432 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 Postgres.<\/p>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c PL-\u044f\u0437\u044b\u043a\u0438 \u043f\u043e\u0434 \u0437\u0430\u0434\u0430\u0447\u0438. \u0410 \u0435\u0449\u0435 \u043b\u0443\u0447\u0448\u0435, \u0435\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u043d\u0430\u043f\u0438\u0448\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435 \u043d\u0430 C, \u0430 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u044b\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u044f\u0437\u044b\u043a\u043e\u0432 \u044f\u0437\u044b\u043a. \u041a\u0430\u043a \u0441 FDW, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 <a href=\"https:\/\/multicorn.org\/\">\u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Python<\/a>.<\/p>\n<p>  \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u044f\u0434\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u0432 \u0438 \u043c\u0430\u0441\u0442\u0435\u0440-\u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u043e \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435, \u0434\u0435\u043b\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u043e\u043c \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f\u0445 <a href=\"https:\/\/pgconf.ru\/2019\/237648\">PgConf.Russia 2019<\/a>, <a href=\"https:\/\/pgconf.ru\/2018\/107044\">PgConf.Russia 2018<\/a> \u0438 <a href=\"https:\/\/devconf.ru\/ru\/archive\/devconf2017\/offer\/287\">DevConf 2017<\/a>.<\/p>\n<p>  \u0420\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043d\u0435 \u043e\u0431 \u044d\u043a\u0437\u043e\u0442\u0438\u043a\u0435, \u0430 \u043e \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 PL\/Perl, PL\/Python \u0438 PL\/V8 (\u0442\u043e \u0435\u0441\u0442\u044c JavaScript) \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0438\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0441 PL\/pgSQL.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-303778","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/303778","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=303778"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/303778\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=303778"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=303778"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=303778"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}