PostgreSQL: рдорд╛рдирд╡ рднрд╛рд╖рд╛ рдореЗрдВ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (рдкреАрдПрд▓ / рдкрд░реНрд▓, рдкреАрдПрд▓ / рдкрд╛рдпрдерди, рдкреАрдПрд▓ / рд╡реА 8)

рдкреЛрд╕реНрдЯрдЧреНрд░реИрд╕ рдЕрдкрдиреА рд╡реНрдпрд╛рдкрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ (рдкреАрдПрд▓) рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд▓рдВрдмрд╛рдИ рдХреА рднрд╛рд╖рд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рднрд╛рд╖рд╛ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ , рдФрд░ рд╕рдВрднрд╡рддрдГ рдпрд╣ рд╕реВрдЪреА рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ: рднрд╛рд╖рд╛ рдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рддреБрдо рднреА рдЕрдкрдиреА рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╕рд░реНрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред DBMS рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреА рддрд░рд╣, рдЗрд╕ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЛ рд╢реБрд░реВ рд╕реЗ рд╣реА рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреАрдПрд▓ рднрд╛рд╖рд╛ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рдФрд░ рдХрднреА-рдХрднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдмреЗрд╣рддрд░ рдЕрднреА рддрдХ, рдЕрдЧрд░ рдХреЛрдИ рднрд╛рд╖рд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдврд╛рдВрдЪрд╛ рд▓рд┐рдЦрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рд╕реА рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХреЗрдВ, рд▓реЗрдХрд┐рди рдРрд╕реА рднрд╛рд╖рд╛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рднрд╛рд╖рд╛ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЖрд░рд╛рдорджрд╛рдпрдХ рд╣реЛред рдПрдлрдбреАрдбрдмреНрд▓реВ рдХреЗ рд╕рд╛рде рдЬреИрд╕рд╛ рдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдпрд╣ рд▓реЗрдЦ рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ PgConf.Russia 2019 , PgConf.Russia 2018 рдФрд░ DevConf 2017 рдХреЗ рд╕рдореНрдореЗрд▓рдиреЛрдВ рдореЗрдВ рдХрд┐рдП рдЧрдП рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХрдИ рд░рд┐рдкреЛрд░реНрдЯреЛрдВ рдФрд░ рдорд╛рд╕реНрдЯрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ ред

рдпрд╣ рд╡рд┐рджреЗрд╢реАрд╡рд╛рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рдмрд╕реЗ рдЖрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдкреАрдПрд▓ / рдкрд░реНрд▓, рдкреАрдПрд▓ / рдкрд╛рдпрдерди рдФрд░ рдкреАрдПрд▓ / рд╡реА 8 (рдпрд╛рдиреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдФрд░ рдкреАрдПрд▓ / рдкреАрдЬреАрдПрд╕рдХреНрдпреВрдПрд▓ рдХреЗ рд╕рд╛рде рдЙрдирдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рд╣реИред

рдпреЗ рднрд╛рд╖рд╛рдПрдВ рдХрдм рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИрдВ? SQL рдФрд░ PL / pgSQL рдХрдм рдЧрд╛рдпрдм рд╣реИ?

  • рдлрд┐рд░, рдЬрдм рдЖрдкрдХреЛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рдкреЗрдбрд╝реЛрдВ рдХреЛ рдкреАрдЫреЗ рд╣рдЯрд╛рдирд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╛ рдЬрдм HTML рдпрд╛ XML рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдЙрдиреНрд╣реЗрдВ рдЕрднрд┐рд▓реЗрдЦрд╛рдЧрд╛рд░ рд╕реЗ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ;
  • рдЬрдм рдЖрдкрдХреЛ рдЬрдЯрд┐рд▓ рдПрд╕рдХреНрдпреВрдПрд▓ (рд░рд┐рдкреЛрд░реНрдЯ, рдУрдЖрд░рдПрдо) рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкреАрдПрд▓ / рдкреАрдЬреАрд╕реАрдХреНрдпреВрдПрд▓ рдкрд░, рдпрд╣ рди рдХреЗрд╡рд▓ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдмрд▓реНрдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛;
  • Perl Python, C/C++, Perl Python . . , Oracle. , Postgres . Perl Python .
  • тАФ . , , untrusted- ( тАФ . ), Perlu Python(3)u, PL/V8. Postgres , , FDW, , . . !
  • рдФрд░ рдПрдХ рдФрд░ рдмрд╛рдд: рдпрджрд┐ рдЖрдк рд╕реА рдореЗрдВ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рддреЗрдЬреА рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИрдВред

Postgres рдореЗрдВ рдХрд┐рд╕реА рднрд╛рд╖рд╛ рдХреЛ рдПрдореНрдмреЗрдб рдХреИрд╕реЗ рдХрд░реЗрдВ


рдЖрдкрдХреЛ рдЬрд┐рд╕ рднрд╛рд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: C рдореЗрдВ рдПрдХ рд╕реЗ рддреАрди рддрдХ рд▓рд┐рдЦреЗрдВред

  • рд╣реИрдВрдбрд▓рд░ - рдПрдХ рдХреЙрд▓ рд╣реИрдВрдбрд▓рд░ рдЬреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ (рдпрд╣ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ);
  • рдСрдирд▓рд╛рдЗрди - рдЕрдирд╛рдо рдмреНрд▓реЙрдХ рд╣реИрдВрдбрд▓рд░ (рдпрджрд┐ рдЖрдк рдЕрдирд╛рдо рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ);
  • VALIDATOR - рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╕рдордп рдХреЛрдб рд╕рддреНрдпрд╛рдкрди рдлрд╝рдВрдХреНрд╢рди (рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рддреНрдпрд╛рдкрди рдХрд┐рдпрд╛ рдЬрд╛рдП)ред

рдпрд╣ рдпрд╣рд╛рдВ рдФрд░ рдпрд╣рд╛рдВ рдХреЗ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИ ред

"рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХреА рднрд╛рд╖рд╛рдПрдБ" рдФрд░ рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдБ


рдХреЗрд╡рд▓ рдЪрд╛рд░ рднрд╛рд╖рд╛рдПрдБ рд╣реИрдВ рдЬреЛ "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ: PL / pgSQL , PL / рдкрд░реНрд▓ , PL / рдкрд╛рдпрдерди рдФрд░ PL / Tcl , рд▓реЗрдХрд┐рди рдЧреБрджрдЧреБрджреА рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реНрд░рджреНрдзрд╛рдВрдЬрд▓рд┐ рд╣реИ: рдХреБрдЫ рд▓реЛрдЧ рдЕрдм рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдм рдФрд░ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
рдкреАрдПрд▓ / рдкрд░реНрд▓, рдкреАрдПрд▓ / рдкрд╛рдпрдерди рдФрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкреАрдПрд▓ / рдкреАрдЬреАрдХреНрдпреВрд╕реА рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рд╕рдореБрджрд╛рдп рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред рдЕрдиреНрдп рдЧреИрд░-рдмреЙрдХреНрд╕ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЙрдирдХреЗ рд░рдЦ - рд░рдЦрд╛рд╡рд┐рдпреЛрдВ - рдХрдВрдкрдирд┐рдпреЛрдВ, рд╕рдореБрджрд╛рдпреЛрдВ рдпрд╛ DBMS рдХреЗ рдЕрдВрджрд░ рднрд╛рд╖рд╛ рдХрд╛ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкрд░ рдкрдбрд╝рддрд╛ рд╣реИ ред PL / V8 Google рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдордп-рд╕рдордп рдкрд░ рдЗрд╕рдХреЗ рдХрд╛рд░рдг рд╣реИрдВрдкреАрдПрд▓ / рд╡реА 8 рдХреЗ рдХреНрд▓рд╛рдЙрдбрд▓реЗрд╕ рднрд╡рд┐рд╖реНрдп рдкрд░ рд╕рдВрджреЗрд╣ рдХрд░реЗрдВред Google рдХрд╛ рд╡рд░реНрддрдорд╛рди PL / V8 рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВрдЯреЗрдирд░, рдЬреИрд░реА рд╕рд┐рдПрд╡рд░реНрдЯ, рдПрдХ рдЕрд▓рдЧ рдЗрдВрдЬрди (рдЬреИрд╕реЗ QuickJS) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд░реНрд╡рд░-рдЖрдзрд╛рд░рд┐рдд JS рд╕рдорд░реНрдерди рдХреЛ рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ PL / V8 рдХреЛ рдмрдирд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП 3-5 GB рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рд▓рд┐рдирдХреНрд╕ рдкрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рдорд╛рди, рдФрд░ рдпрд╣ рдЕрдХреНрд╕рд░ рд╡рд┐рднрд┐рдиреНрди рдУрдПрд╕ рдкрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкреАрдПрд▓ / рд╡реА 8 рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдкреАрдПрд▓ / рдЬреЗрдПрд╕ рдПрдХ рдЕрдиреНрдп рдЬреЗрдПрд╕ рдЗрдВрдЬрди рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдпрд╛ рдЕрдм рдХреЗрд╡рд▓ рдПрдХ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЬрд┐рд╕реЗ рд╣рдо рд╕рдВрдХреНрд░рдордг рдХреА рдЕрд╡рдзрд┐ рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдкреАрдПрд▓ / рдЬрд╛рд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдкреАрдПрд▓ / рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА рдХреНрдпреЛрдВрдХрд┐ рдкреАрдПрд▓ / рдкрд░реНрд▓ рдФрд░ рдкреАрдПрд▓ / рд╡реА a рдореЗрдВ рд▓рдЧрднрдЧ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкрд╛рдпрдерди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдкреАрдПрд▓ / рдЖрд░рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬреЛ рдЖрдВрдХрдбрд╝реЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рднрд╛рд╖рд╛ рдХреЛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдпрд╣рд╛рдВ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рднрд╛рд╖рд╛рдПрдВ рд╕реНрдЯреЛрд░реЗрдЬ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рд╛рде рд▓реЛрдХрдкреНрд░рд┐рдп рдирд╣реАрдВ рд╣реИрдВ: рдкреАрдПрд▓ / рдкреАрдПрдЪрдкреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ - рдХреБрдЫ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдкрд░ рд╕рд░реНрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдкреАрдПрд▓ / рд░реВрдмреА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП, рддрд╕реНрд╡реАрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рди рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рднрд╛рд╖рд╛ рдЕрдзрд┐рдХ рдЖрдзреБрдирд┐рдХ рд▓рдЧрддреА рд╣реИред

рдЧреЛ-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рдкреАрдПрд▓ / рдЧреЛ рджреЗрдЦреЗрдВ , рдФрд░ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ, рдкреАрдПрд▓ / рд▓реБрдЖ ред рдЗрдирдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рд╢реЗрд▓ рдХреЗ рдЬрд┐рджреНрджреА рдкреНрд░рд╢рдВрд╕рдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ PL / Sh рднреА рд╣реИ , рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдХрдо рд╕реЗ рдХрдо рдПрдХ рдбреЛрдореЗрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ (рдбреАрдПрд╕рдПрд▓) рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╕рдВрдХреАрд░реНрдг рд░реВрдк рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ - рдкреАрдПрд▓ / рдкреНрд░реЙрдХреНрд╕реА, рдЬреЛ рд╕рд░реНрд╡рд░ рд▓реЛрдб рдХреЛ рд╕рдВрддреБрд▓рд┐рдд рдФрд░ рд╕рдВрддреБрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реБрдЖ рдХрд░рддрд╛ рдерд╛ред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдореБрдЦреНрдп, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдХрд╡рд░ рдХрд░реЗрдВрдЧреЗред рдпрд╣, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкреАрдПрд▓ / рдкреАрдЬреАрдПрд╕рдХреНрдпреВрдПрд▓, рдкреАрдПрд▓ / рдкрд░реНрд▓, рдкреАрдПрд▓ / рдкрд╛рдпрдерди рдФрд░ рдкреАрдПрд▓ / рд╡реА 8 рд╣реИ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдиреАрдЪреЗ рдкреАрдПрд▓ / * рдХрд╣реЗрдВрдЧреЗ ред

рднрд╛рд╖рд╛рдПрдБ "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрднрдЧ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИрдВ - рдЖрдорддреМрд░ рдкрд░ рд╕реНрдерд╛рдкрдирд╛ рджрд░реНрдж рд░рд╣рд┐рдд рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдкреАрдПрд▓ / рд╡реА 8 рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдУрдПрд╕ рдХреЗ рднрдВрдбрд╛рд░ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЬ рдирд╣реАрдВ рдорд┐рд▓рд╛, рддреЛ рдпрд╣ рд▓рдЧрднрдЧ рдПрдХ рдЙрдкрд▓рдмреНрдзрд┐ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рд╡реА 8, рдпрд╛, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХреНрд░реЛрдорд┐рдпрдо рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕реА рд╕рдордп, рд╕рдВрдкреВрд░реНрдг рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪрд╛ google.com рд╕реЗ V8 рдХреЗ рд╕рд╛рде рд╣реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рдХреБрдЫ рдЧреАрдЧрд╛рдмрд╛рдЗрдЯреНрд╕ рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред рдЙрдмрдВрдЯреВ рдХреЗ рддрд╣рдд рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ 11 рдХреЗ рд▓рд┐рдП, рдкреАрдПрд▓ / рд╡реА 8 рдкреИрдХреЗрдЬ рдЕрднреА рддрдХ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ, рдкреАрдЬреА 10 рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ V8 рдЕрдм рддрдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЗрд╕реЗ рд╣рд╛рде рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВред рдпрд╣ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЖрдкрдХреЛ рдЬреЛ рд╕рдВрд╕реНрдХрд░рдг рдорд┐рд▓реЗрдЧрд╛ рд╡рд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рд▓реЗрдЦ рдХреЗ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд╕рдордп, рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг 2.3.14 рд╣реИред

рднрд╛рд╖рд╛ рд╕реНрд╡рдпрдВ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рднрд╛рд╖рд╛ рдХреЛ "рдмрдирд╛рдирд╛" рднреА рдЪрд╛рд╣рд┐рдП - рдЗрд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВред рдпрд╣ рдЯреАрдо рдХреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

CREATE EXTENSION plperl;

(рдкреНрд▓рдкрд░ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдХрд╛ рдирд╛рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВ, рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)ред
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖ:

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       |

PL / pgSQL рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╣рдореЗрд╢рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реЛрддрд╛ рд╣реИред

рдзреНрдпрд╛рди! PL / pgSQL SQL рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдПрдХ рдЕрд▓рдЧ рднрд╛рд╖рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, Postgres рд╕рд╛рджреЗ SQL рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдорд╛рдирдХ


DBMS рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ, рд╡реЗ рдЕрдХреНрд╕рд░ SQL рдорд╛рдирдХреЛрдВ рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рднреА рдорд╛рдирдХ рд╣реЛрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрддрдиреА рдмрд╛рд░ рдмрд╛рдд рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред SQL / PSM рдорд╛рдирдХ DB2 рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд░реВрдк рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди PL / pgSQL рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╡реЗ рдХрд░реАрдм рд╣реИрдВред

SQL / JRT рдЬрд╛рд╡рд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╣реИ, рдФрд░ PL / Java рдПрдХ рдЕрдЪреНрдЫрд╛ рдореЗрд▓ рд╣реИред

рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдФрд░ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рднрд╛рд╖рд╛рдПрдБ


рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп (рдЯреНрд░рд╕реНрдЯреЗрдб) тАЛтАЛрдФрд░ рдЕрд╡рд┐рд╢реНрд╡рд╛рд╕реА (UNTRUSTED) рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
TRUSTED рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдиреЗрдЯрд╡рд░реНрдХ рд╕рд╣рд┐рдд I / O рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛рд░реНрдп рдХреА рдХреЛрдИ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рдеред рдЗрд╕рд▓рд┐рдП, рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛рдмреЗрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреБрдЫ рдЦрд░рд╛рдм рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╕реАрдЦ рдкрд╛рдПрдВрдЧреЗред UNTRUSTED рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ рдПрдХ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рднрд╛рд╖рд╛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдРрд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ TRUSTED рдФрд░ UNTRUSTED рджреЛрдиреЛрдВ рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдкрд░реНрд▓ рдХреЗ рд╕рд╛рде, рдЗрд╕рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рднрд╛рд╖рд╛рдПрдВ рд╣реИрдВ plperlрдФрд░ plperluред рдкрддреНрд░ рдпреВрдЕрдВрдд рдореЗрдВ рдпрд╣ рднрд╛рд╖рд╛ рдХреЗ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЪрд░рд┐рддреНрд░ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдкрд╛рдпрдерди рдХреЗрд╡рд▓ рдПрдХ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдореМрдЬреВрдж рд╣реИред рдкреАрдПрд▓ / рд╡реА 8 - рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХреЗрд╡рд▓ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдореЗрдВред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, PL / v8 рдбрд┐рд╕реНрдХ рд╕реЗ рдХрд┐рд╕реА рднреА рдореЙрдбреНрдпреВрд▓ рдпрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд▓реЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреЗрд╡рд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗред

UNTRUSTED рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рдПрдХ рдИрдореЗрд▓ рднреЗрдЬреЗрдВ, рдПрдХ рд╕рд╛рдЗрдЯ рдХреЛ рдкрд┐рдВрдЧ рдХрд░реЗрдВ, рдПрдХ рд╡рд┐рджреЗрд╢реА рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ, рдФрд░ рдПрдХ HTTP рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП TRUSTED рднрд╛рд╖рд╛рдПрдБ рд╕реАрдорд┐рдд рд╣реИрдВред

рджреНрд╡рд╛рд░рд╛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП plpgsql, plperl, plv8, pljava:ред

рджреНрд╡рд╛рд░рд╛ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ plperlu, pljavau, plpython2u, plpython3u:ред

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ: рдХреЛрдИ PL / Python рдирд╣реАрдВ рд╣реИ рдЬреИрд╕реЗ TRUSTED (рдЪреВрдВрдХрд┐ рдЖрдк рд╡рд╣рд╛рдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ), рдФрд░ PLpgSQL рдФрд░ PL / V8 рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЕрдиреНрдп рддрд░реАрдХреЗ рд╣реИрдВ: рд╡реЗ UNTRUSTED рдирд╣реАрдВ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдкрд░реНрд▓ рдФрд░ рдЬрд╛рд╡рд╛ рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

PL / pgSQL рдмрдирд╛рдо PL / *


PL / pgSQL рдХреЛрдб рдореВрд▓ рд░реВрдк рд╕реЗ рдЙрди рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ Postgres рд╣реИред рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрдИ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рднрд╛рд╖рд╛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдбреЗрдЯрд╛ рдХреЛ рднрд╛рд╖рд╛ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрддрд╛ рд╣реИ, рдкрд╛рда рдХреЗ рд╕рд╛рде рдЕрд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрд╕реЗ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдХреА рдорджрдж рд╕реЗ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдХреЗ рдХрд░реАрдм рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред

PL / pgSQL рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдЕрдХреНрд╕рд░ рдЕрдзрд┐рдХ рдорд╣рдВрдЧреЗ рд╣реЛрддреЗ рд╣реИрдВред рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрд╛рд░реНрдп рдкреНрд░рдгрд╛рд▓реА рдХреИрдЯрд▓реЙрдЧ рдХреЛ рджреЗрдЦреЗ рдмрд┐рдирд╛ рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВред PL / pgSQL рдЙрд╕ рддрд░рд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред PL / pgSQL рдореЗрдВ рдХреБрдЫ рдкреНрд░рд╢реНрди рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╣реБрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рджреЛ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рджреБрднрд╛рд╖рд┐рдП рдХреЛ рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд╣ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рд╡рд┐рджреЗрд╢реА рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдирд╣реАрдВ, рдлрд┐рд░ рдирд┐рд░реНрдгрдп рд▓реЗрдВ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдореЛрдбрд╝реЛ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдореЛрдбрд╝реЛред

рдЪреВрдВрдХрд┐ PL / pgSQL рдХреЛ TRUSTED рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдк рдиреЗрдЯрд╡рд░реНрдХ рдФрд░ рдбрд┐рд╕реНрдХ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдЬрдм рдпрд╣ рдиреЗрд╕реНрдЯреЗрдб рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ PL / pgSQL рдореЗрдВ JSON рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ Postgres рдЯреВрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдмрд╣реБрдд рдмреЛрдЭрд┐рд▓ рдФрд░ рдЕрдиреБрддреНрдкрд╛рджрдХ рд╣реЛрддреЗ рд╣реИрдВ, рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдиреЗрд╕реНрдЯреЗрдб рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рдХрд┐рдлрд╛рдпрддреА рд╣реИред

рдкреАрдПрд▓ / * рдХрд╛ рдЕрдкрдирд╛ рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрдореЗрдВрдЯ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛ рд╢рд╛рдпрдж рдЗрд╕реЗ рд╕реАрдорд┐рдд рдХрд░ рджреЗрдВред

рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреА рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдЬреЛ рд╕рднреА рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рднреА рд╣реИред

рд▓реЗрдХрд┐рди рдкреАрдПрд▓ / * рдореЗрдВ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╕рдВрджрд░реНрдн рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд╡реЗрд░реА рдкреНрд▓рд╛рди рд╕рд╣рд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдПред рдпрджрд┐ рднрд╛рд╖рд╛ UNTRUSTED рд╣реИ, рддреЛ рдиреЗрдЯрд╡рд░реНрдХ рдФрд░ рдбреНрд░рд╛рдЗрд╡ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдпреЗ рд╕рднреА рднрд╛рд╖рд╛рдПрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдПрд╕рдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдФрд░ рдЕрдзрд┐рдХред

рдЖрдЗрдП PL / * рднрд╛рд╖рд╛рдУрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред

рдкреАрдПрд▓ / рдкрд░реНрд▓


рдкрд░реНрд▓ рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдореЗрдореЛрд░реА рдореЗрдВ рдХреЛрдб рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдЯреБрдХрдбрд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рд╛ рдЬрд╛рдиреЗ рдкрд░ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рддрдм рдЬрдм рдкрд╣рд▓реА рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ / рдлрд╝рдВрдХреНрд╢рди PL / рдкрд░реНрд▓ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдЗрд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░реАрдХрдВрдкреНрдпреВрдЯреЗрд╢рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдпрд╛, Postgres рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝реЗрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред TRUSTED рдФрд░ UNTRUSTED Perl рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ ред рдкрд░реНрд▓ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЧрд▓рддрдлрд╣рдореА рд╣реИред

plperl.on_init= 'use Data::Dumper;'
plperl.on_plperl_init= ' ... '
plperl.on_plperlu_init= ' ... '
plperl.use_strict= on


Data::Dumper

use_strict=onstrict

рдкреАрдПрд▓ / рдкрд╛рдпрдерди


рдЗрд╕рдореЗрдВ, рджреБрднрд╛рд╖рд┐рдпрд╛ рдЙрд╕реА рддрд░рд╣ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рдпрд╣ рддреБрд░рдВрдд рддрдп рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕ рдЕрдЬрдЧрд░ рдХреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: рджреВрд╕рд░рд╛ рдпрд╛ рддреАрд╕рд░рд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдкрд╛рдпрдерди рджреЛ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕рдВрд╕реНрдХрд░рдгреЛрдВ (рдкрд╛рдпрдерди 2 рдФрд░ рдкрд╛рдпрдерди 3) рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рд╢рдХреА рдХреЛ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рд╕рд╛рде рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ: рдирд╛рдо рд╕реЗ рд╕рдВрдШрд░реНрд╖ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдиреЗ рдПрдХ рд╕рддреНрд░ рдореЗрдВ v2 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рдлрд┐рд░ v3 рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ Postgres рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╕рд░реНрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рдмреИрдХрдПрдВрдб) рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдШрд╛рддрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред рдПрдХ рдЕрд▓рдЧ рд╕рдВрд╕реНрдХрд░рдг рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдФрд░ рд╕рддреНрд░ рдЦреЛрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдкрд░реНрд▓ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЕрдЬрдЧрд░ рдХреЛ рдмрддрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рдХрд┐ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдПрдХ рдФрд░ рдЕрд╕реБрд╡рд┐рдзрд╛: рдПрдХрд▓-рд▓рд╛рдЗрдирд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВред

рд╕рднреА рдкрд╛рдпрдерди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ, рджреЛ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рд╕реНрдерд┐рд░ SDрдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ GDред рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИрдПрдХ рдмреИрдХреЗрдВрдб рдХреЗ рднреАрддрд░ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди - рдЬреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЖрдХрд░реНрд╖рдХ рдФрд░ рдЦрддрд░рдирд╛рдХ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд╢рдмреНрджрдХреЛрд╢ рд╣реЛрддрд╛ рд╣реИред

рдкреАрдПрд▓ / рдкрд╛рдпрдерди рдореЗрдВ, рдЖрдк рд╕рдмрдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред

рдкреАрдПрд▓ / рд╡реА 8


рдпрд╣ рдХреЗрд╡рд▓ TRUSTED рд╣реИред

рдЖрд╕рд╛рдиреА рд╕реЗ, JSON рдбреЗрдЯрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ JS рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдкреАрдПрд▓ / рд╡реА 8 рдореЗрдВ, рдкреАрдПрд▓ / рдкрд╛рдпрдерди рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рд╕рдмрдЯреНрд░рд╛рдВрд╕рдкреЛрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд░рд▓реАрдХреГрдд рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред рдпрд╣ рдкреНрд░рд╢реНрди рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЦрд┐рдбрд╝рдХреА рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рд╡реЗ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкреАрдПрд▓ / рдЖрд░ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рдпрд╣ рднрд╛рд╖рд╛ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред

рдФрд░ рдХреЗрд╡рд▓ PL / V8 рдореЗрдВ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдЯрд╛рдЗрдордЖрдЙрдЯ рд╣реИред рд╕рдЪ рд╣реИ, рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЪрд╛рд▓реВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рд╣рд╛рде рд╕реЗ рдкреАрдПрд▓ / рд╡реА 8 рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рдХрд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рджреМрд░рд╛рди рдЪрд╛рд▓реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдлрд┐рд░ рдЖрдк рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

PL / V8 рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд░реБрдЪрд┐рдХрд░ рд▓рдЧрддрд╛ рд╣реИ: рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ, рдпрд╣ рдбрд┐рд╕реНрдХ рд╕реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдирд╣реАрдВ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдХрд╣реАрдВ рд╕реЗ рднреА рдХреБрдЫ рднреА рд▓реЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡рд╣ рдХреЗрд╡рд▓ рдЖрдзрд╛рд░ рд╕реЗ рд╣реА рдЕрдкрдиреА рдЬрд░реВрд░рдд рдХреА рд╣рд░ рдЪреАрдЬ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдЖрд░рдВрднреАрдХреГрдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рднрд╛рд╖рд╛ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ:

plv8.start_proc=my_init # ( PL/V8-)

рдкреНрд░рд╛рд░рдВрдн рдХреЗ рджреМрд░рд╛рди, рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рдЪрд░ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЙрдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:

CREATE OR REPLACE FUNCTION my_init()
RETURNS void LANGUAGE plv8 AS $$
     this.get_57 = function() { return 57; }; //   
     this.pi_square = 9.8696044;  //   
$$;
SET plv8.start_proc = 'my_init';
DO LANGUAGE plv8 $$
     plv8.elog(NOTICE, pi_square, get_57() );
$$;

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ PL / рдкрд░реНрд▓ рдмрдирд╛рдо PL / рдкрд╛рдпрдерди рдмрдирд╛рдо PL / V8 рдХреА рддреБрд▓рдирд╛


рдирдорд╕реНрддреЗ рджреБрдирд┐рдпрд╛!


рдЖрдЗрдП рдкреАрдПрд▓ / рдкрд░реНрд▓ рдореЗрдВ, рдкрд╣рд▓реЗ рддреАрдиреЛрдВ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЗрд╕ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ ред рдФрд░ рдЙрд╕реЗ рдХреБрдЫ рдФрд░ рдЙрдкрдпреЛрдЧреА рдХрд░рдиреЗ рджреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрд╕рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрддрд╛рддрд╛ рд╣реИ:

DO $$
     elog(NOTICE,"Hello World! $]");
$$ LANGUAGE plperl;

NOTICE:  Hello World!
DO

рддреБрдо рднреА рд╕рд╛рдорд╛рдиреНрдп рдкрд░реНрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ warnрдФрд░ dieред

рдЕрдм рдкреАрдПрд▓ / рдкрд╛рдпрдерди рдореЗрдВ ред PL / Python3u (рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп) рдкрд░ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ - рдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдХреЗ рд▓рд┐рдПред

DO $$
     import sys
     plpy.notice('Hello World! ' , hint=" ", detail=sys.version_info)
$$ LANGUAGE plpython3u;


NOTICE:  Hello World! 
DETAIL:  sys.version_info(major=3, minor=6, micro=9, releaselevel='final', serial=0)
HINT:   
DO

рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ throw 'Errmsg'ред рдХрдИ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдЖрдк рдкреЛрд╕реНрдЯрдЧреНрд░реИрдЬ рд╕рдВрджреЗрд╢реЛрдВ рд╕реЗ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ: рдЙрдирдореЗрдВ рд╕рдВрдХреЗрдд, рд╡рд┐рд╡рд░рдг, рдкрдВрдХреНрддрд┐ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдХрдИ рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдкреАрдПрд▓ / рдкрд╛рдпрдерди рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдЪрд╛рд░рд╛рдзреАрди рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдирд╣реАрдВ: рдЙрдирдХреЗ рд╕рд╛рдзрдиреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рджреЗ рд░реЗрдЦрд╛ рд░реЗрдЦрд╛ рдХреЗ рд╕рд╛рде рд╢рд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

PL / Python рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЧ рд▓реЙрдЧрд┐рдВрдЧ рд╕реНрддрд░ рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдп рд╣реЛрддрд╛ рд╣реИ: NOTICE, WARNING, DEBUG, LOG, INFO, FATALред рдпрджрд┐ рдпрд╣ ERROR рд╣реИ, рддреЛ рд▓реЗрдирджреЗрди рдЧрд┐рд░ рдЧрдпрд╛ рд╣реИ, рдпрджрд┐ FATAL, рд╕рдВрдкреВрд░реНрдг рдмреИрдХреЗрдВрдб рдЧрд┐рд░ рдЧрдпрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдорд╛рдорд▓рд╛ PANIC рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛ред рдЖрдк рдпрд╣рд╛рдБ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ ред

PL / V8

рдЗрд╕ рднрд╛рд╖рд╛ рдореЗрдВ, рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб рдореЛрддреА рдХреЗ рд╕рдорд╛рди рд╣реИред рдЖрдк рдЫреЛрдбрд╝ рд╕рдХрддреЗ exceptionрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ throw, рдФрд░ рдпрд╣ рднреА рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдкрдХрд░рдг рдЕрдЬрдЧрд░ рдореЗрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдиреНрдирдд рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЕрдЧрд░ рдЖрдк рд▓рд┐рдЦреЗрдВрдЧреЗplv8.elog(ERROR), рдкреНрд░рднрд╛рд╡, рд╡реИрд╕реЗ рд╣реА рд╣реЛрдЧрд╛ред

DO $$
     plv8.elog(NOTICE, 'Hello World!', plv8.version);
$$ LANGUAGE plv8;

NOTICE:  Hello World! 2.3.14
DO

рдЖрдзрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдЧреНрд░рд╣реАрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПред Postgres рдореЗрдВ SPI (рд╕рд░реНрд╡рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕) рд╣реЛрддрд╛ рд╣реИред рдпрд╣ C рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬреЛ рд╕рднреА рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓реЗрдЦрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред рд▓рдЧрднрдЧ рд╕рднреА рдкреАрдПрд▓ рднрд╛рд╖рд╛рдПрдВ рдПрд╕рдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЖрд╡рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рднрд╛рд╖рд╛ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдХрд░рддреА рд╣реИред

C рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдлрд╝рдВрдХреНрд╢рди рд▓реЗрдХрд┐рди SPI рдХрд╛ рдЙрдкрдпреЛрдЧ PL / PgSQL рдФрд░ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рджреЗрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рд╕реА рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдПрд╕рдкреАрдЖрдИ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд┐рдЪреМрд▓рд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП table_beginscan/heap_getnext) рддреЗрдЬреА рд╕реЗ рдкрд░рд┐рдорд╛рдг рдХреЗ рдПрдХ рдЖрджреЗрд╢ рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

PL / Java SPI рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЕрднреА рднреА рдЬреЗрдбреАрдмреАрд╕реА рдФрд░ рдЬреЗрдбреАрдмреАрд╕реА рдорд╛рдирдХ рдХреА рд╢реИрд▓реА рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдкреАрдПрд▓ / рдЬрд╛рд╡рд╛ рдореЗрдВ рдХреЛрдб рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд▓рд┐рдП, рд╕рдм рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдЖрдк рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдереЗ, рд▓реЗрдХрд┐рди рдЬреЗрдПрдирдЖрдИ (рдЬрд╛рд╡рд╛ рдиреЗрдЯрд┐рд╡ рдЗрдВрдЯрд░рдлрд╝реЗрд╕) рдЙрд╕реА рдПрд╕рдкреАрдЖрдИ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреЙрд▓ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдФрд░ рдкреАрдПрд▓ / рдкрд░реНрд▓ рдФрд░ рдкреАрдПрд▓ / рдкрд╛рдпрдерди рдореЗрдВ рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдореМрд▓рд┐рдХ рдмрд╛рдзрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЕрднреА рддрдХ рдпрд╣ рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИред

рдмреЗрд╢рдХ, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╡рд┐рджреЗрд╢реА рдард┐рдХрд╛рдиреЛрдВ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдбреАрдмреАрдЖрдИ рдпрд╛ рд╕рд╛рдЗрдХреЛрдкрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ ред рдпрд╣ рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВред

рдпрджрд┐ рдЖрдк рдЧреНрд░рд╛рд╣рдХ рдХреЗ рдЖрдзрд╛рд░ рдмрдирд╛рдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рдордЧреНрд░ рд╡рд┐рд╖рдп рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ, рдФрд░ рддреБрд░рдВрдд рдбреЗрдЯрд╛ рдХреЗ рдХрд░реАрдм рдЕрдзрд┐рдХрддрдо рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ (рдХрдо рд╕реЗ рдХрдо рдЖрджреЗрд╢ рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╡рд┐рд╢рд╛рд▓ рдирдореВрдиреЗ рдирд╣реАрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП), рддреЛ рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд╛рдзрд╛рди рджрд┐рдЦрддрд╛ рд╣реИ рд╕рд╣рдЬ рд░реВрдк рдореЗрдВред

рдкреНрд░рджрд░реНрд╢рди : рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ SPI рдореЗрдВ рдХреБрдЫ рдУрд╡рд░рд╣реЗрдб рд╣реИрдВ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ SQL рдХреНрд╡реЗрд░реА рдмрд┐рдирд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдзреАрдореА рд╣реЛ рд╕рдХрддреА рд╣реИред 13 рд╡реЗрдВ рдкреЛрд╕реНрдЯрдЧреНрд░рд╛рд╕ рдореЗрдВ рдХреЛрдВрд╕реНрдЯреЗрдВрдЯрд┐рди рдирд╛рдЗрдЬрд╝рд╛рдирд┐рдХ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдкреИрдЪ рд╢рд╛рдорд┐рд▓ рдерд╛ , рдЬреЛ рдЗрди рд▓рд╛рдЧрддреЛрдВ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдПрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд╛рд░реНрдп рдореЗрдВ рдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдлрд╛рдпрджреЗрдордВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╕реБрд░рдХреНрд╖рд╛: рдбреАрдмрдЧ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕реЗрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ, SQL рдЗрдВрдЬреЗрдХреНрд╢рди рдФрд░ рдЕрдиреНрдп рд╢рд░рд╛рд░рддреЛрдВ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдпрд╣ рд╣рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░рджрд░реНрдж рдмрдирд╛ рд░рд╣реЗрдЧрд╛ред

рдХреЛрдб рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ: рдпрджрд┐ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЬрдЯрд┐рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдмрдЬрд╛рдп рдкреНрд░рддреНрдпреЗрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗред

рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рдФрд░ рдХрд┐рд╕ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ


рдореЗрдВ рдкрд░реНрд▓ , рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдХреЙрд▓ spi_exec_queryрд╕рдВрд╕рд╛рдзрд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рд╕реНрдерд┐рддрд┐ рдФрд░ SQL рдХреНрд╡реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреА рдЧрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рд░рдгреА рд▓реМрдЯрд╛рддреА рд╣реИ:

DO $$ 
     warn Data::Dumper::Dumper(
          spi_exec_query('SELECT 57 AS x')
     )
$$ LANGUAGE plperl;

WARNING:  $VAR1 = {
          'rows' => [
                    {
                      'x' => '57'
                    }
                  ],
          'processed' => 1,
          'status' => 'SPI_OK_SELECT'
        };

рдореЗрдВ рдЕрдЬрдЧрд░, рдХреНрд╡реЗрд░реА рдФрд░ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рдгрд╛рдо рдирдЬрд╝рд░ рдХреБрдЫ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╕рдорд╛рд░реЛрд╣ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд╕реНрддреБ рдЖрдк рдЕрд▓рдЧ рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдПрдХ рд╕рд░рдгреА рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдЖрдк рдЗрд╕рдореЗрдВ рд╕реЗ рддрд╛рд░ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

DO $$ 
     plpy.notice(
          plpy.execute('SELECT 57 AS x')
     )
$$ LANGUAGE plpython3u;

NOTICE:  <PLyResult status=5 nrows=1 rows=[{'x': 57}]>
DO

рдФрд░ рдЕрдм рд╣рдо 1 рдкрдВрдХреНрддрд┐ рд▓реЗрддреЗ рд╣реИрдВ, рд╡рд╣рд╛рдВ рдПрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ рдФрд░ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ - рд╕рдВрдЦреНрдпрд╛ред

DO $$ 
     plpy.notice(
          plpy.execute('SELECT 57 AS x')[0]['x']
      )
$$ LANGUAGE plpython3u;

NOTICE:  57
DO

рдореЗрдВ рдкреА рдПрд▓ / рд╡реА 8 :

DO $$ 
     plv8.elog(NOTICE, JSON.stringify(
          plv8.execute('SELECT 57 as x'))
     );
$$ LANGUAGE plv8;

NOTICE:  [{"x":57}]
DO

рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рдВрдХреНрд╢рди JSON.stringify рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ PL / v8 рдХреЗ рдПрдХ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреИрдпрд╛рд░ рд╣реИред

рдкрд░рд┐рд░рдХреНрд╖рдг


рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг SQL рдЗрдВрдЬреЗрдХреНрд╢рди рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдХреБрдЫ рд╡рд░реНрдгреЛрдВ рд╕реЗ рдмрдЪ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, SPI рдлрд╝рдВрдХреНрд╢рди рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реИрдВ (C рдореЗрдВ рд▓рд┐рдЦрд┐рдд) рдЬреЛ SPI рдЖрд╡рд░рдг рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреАрдПрд▓ / рдкрд░реНрд▓ рдореЗрдВ:

quote_literal- рдПрдкреЛрд╕реНрдЯреНрд░реЛрдл рдФрд░ рдпреБрдЧрд▓ 'рдФрд░ \ рдореЗрдВ рд▓реЗрддрд╛ рд╣реИред рдкрд╛рда рдбреЗрдЯрд╛ рдХреА рд╕реНрдХреНрд░реАрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ред
quote_nullable- рд╡рд╣реА, рд▓реЗрдХрд┐рди undefNULL рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рддред
quote_ident- рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рддрд╛рд▓рд┐рдХрд╛ рдпрд╛ рдлрд╝реАрд▓реНрдб рдХрд╛ рдирд╛рдо рдЙрджреНрдзреГрдд рдХрд░реЗрдВред рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдЬрдм рдЖрдк рдПрдХ SQL рдХреНрд╡реЗрд░реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдирд╛рдо рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдкреАрдПрд▓ / рдкрд░реНрд▓

DO $$
     warn "macy's";
     warn quote_literal("macy's");
$$ LANGUAGE plperl;

WARNING:  macy's at line 2.
WARNING:  'macy''s' at line 3.
DO

рдзреНрдпрд╛рди рд░рдЦреЗрдВ: рдЯреЗрдмрд▓ рдХрд╛ рдирд╛рдо рдЯреЗрдХреНрд╕реНрдЯ рд▓рд╛рдЗрди рдХреА рддрд░рд╣ рдирд╣реАрдВ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд╣реИ quote_identред

рд▓реЗрдХрд┐рди рдкреАрдПрд▓ / рдкрд░реНрд▓ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреЛрд╕реНрдЯ-рдЧреНрд░реЗрдЬ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдбреЗрдЯрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдХрд╛рд░реНрдп рд╣реИрдВ: рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдПрдЯрд┐рдкрд┐рдХрд▓ рд╕рдВрджрд┐рдЧреНрдз рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдРрд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдпрд╣ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рдлрд┐рд░ рднреА, рд╕рднреА рдХреЗ рд╕рд╛рде рдирд╣реАрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╣ рд╢реНрд░реЗрдгреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд╣реАрдВ рд╕рдордЭреЗрдЧреА рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдЯреЗрдХреНрд╕реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрднрд╡ рдХрд░реЗрдЧреА ред

encode_bytea
decode_bytea
encode_array_literal
encode_typed_literal
encode_array_constructor


quote_typed_literal

DO $$
     warn encode_typed_literal(
          ["", " "], "text[]"
     );
$$ LANGUAGE plperl;

WARNING:  {," "} at line 2.
DO

рдкреАрдПрд▓ / рдкрд╛рдпрдерди рдореЗрдВ рддреАрди рд╕рдорд╛рди рдХрд╛рд░реНрдп рд╣реИрдВ, рдФрд░ рд╡реЗ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:

plpy.quote_literal
plpy.quote_nullable
plpy.quote_ident


DO $$ plpy.notice(
     plpy.quote_literal("Macy's"));
$$ LANGUAGE plpython3u;
NOTICE:  'Macy''s'
DO

рдХреНрдпрд╛ PL / V8 рдореЗрдВ рдХрд╛рд░реНрдп рд╕рдорд╛рди рд╣реИрдВ ?

рдмреЗрд╢рдХ! рд╕рдм рдХреБрдЫ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рдорд╛рди рд╣реИред

plv8.quote_literal
plv8.quote_nullable
plv8.quote_ident


DO $$
    plv8.elog(NOTICE, plv8.quote_nullable("Macy's"));
$$ LANGUAGE plv8;

NOTICE:  'Macy''s'

рдкреНрд░рджрд░реНрд╢рди


рдХреМрди рд╕реА рднрд╛рд╖рд╛ рд╕рдмрд╕реЗ рддреЗрдЬ рд╣реИ? рдЖрдорддреМрд░ рдкрд░ рд╡реЗ рдЙрддреНрддрд░ рджреЗрддреЗ рд╣реИрдВ: C. рд▓реЗрдХрд┐рди рд╕рд╣реА рдЙрддреНрддрд░ C рдпрд╛ SQL рд╣реИред рдПрд╕рдХреНрдпреВрдПрд▓ рдХреНрдпреЛрдВ? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЕрдиреБрд╕реВрдЪрдХ рдореБрдЦреНрдп рдЕрдиреБрд░реЛрдз рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдореНрдмреЗрдб рдХрд░реЗрдЧрд╛), рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рди рдХрд░реЗрдЧрд╛, рдФрд░ рдкрд░рд┐рдгрд╛рдо рддреЗрдЬреА рд╕реЗ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдХрд┐рди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХреЛрдб рдХреЛ рдПрдХ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдХреБрдЫ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдерд┐рддрд┐ рд╣реИ рдХрд┐ рдЖрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд╣рддреЗ рд╣реИрдВ, рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╣рд╛рдБ ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡рд╛рдореА рдХреЗ рдЕрдзрд┐рдХрд╛рд░реЛрдВ (рд╕реБрд░рдХреНрд╖рд╛ DEFINER рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░реНрдп рдЗрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдВрдЧреЗред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо "рдШреБрдЯрдиреЗ рдкрд░" рдХреЛ рдорд╛рдкреЗрдВрдЧреЗ, рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдирд╣реАрдВред рд╣рдореЗрдВ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддреБрд▓рдирд╛ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдкрд╣рд▓реЗ рдЯрд╛рдЗрдорд┐рдВрдЧ рдЪрд╛рд▓реВ рдХрд░реЗрдВ:

\timing

рдЖрдЗрдП SQL рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ (рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдЧреЛрд▓ рдФрд╕рдд рдорд╛рди рд╣реИрдВ рдЬреЛ рд▓реЗрдЦрдХ рдХреЛ рдПрдХ рдЕрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдЫрд╣ рд╡рд░реНрд╖реАрдп рдкреАрд╕реА рдкрд░ рдкреНрд░рд╛рдкреНрдд рд╣реБрдП рд╣реИрдВред рдЙрдирдХреА рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ):

SELECT count(*) FROM pg_class;
0.5 ms

рдпрд╣ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рднрд╛рд╖рд╛ рд╕реЗ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдкрд╣рд▓реА рдмрд╛рд░ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдХрд╛рд░рдг рдЕрдиреБрд░реЛрдз рдзреАрдорд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рддрдм рдпрд╣ рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдЗрдП PL / pgSQL рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ :

DO $$
     DECLARE a int;
     BEGIN
          SELECT count(*) INTO a FROM pg_class;
     END;
$$ LANGUAGE plpgsql;
0.7 ms

рдкреАрдПрд▓ / рдкрд░реНрд▓ :

DO $$
     my $x = spi_exec_query('SELECT count(*) FROM pg_class');
$$ LANGUAGE plperl;
0.7 ms

рдкреАрдПрд▓ / рдкрд╛рдпрдерди:

DO $$
     x = plpy.execute('SELECT count(*) FROM pg_class');
$$ LANGUAGE plpythonu;
0.8 ms

рдпрд╣ рдкрд╛рдпрдерди 2 рдерд╛ред рдЕрдм рдкрд╛рдпрдерди 3 (рдпрд╛рдж рдХрд░реЗрдВ: рдкрд╛рдпрдерди 2 рдФрд░ рдкрд╛рдпрдерди 3 рдПрдХ рд╣реА рд╕рддреНрд░ рдореЗрдВ рд╢рд╛рдВрддрд┐ рд╕реЗ рдирд╣реАрдВ рд░рд╣рддреЗ рд╣реИрдВ, рдирд╛рдореЛрдВ рдХрд╛ рд╕рдВрдШрд░реНрд╖ рд╕рдВрднрд╡ рд╣реИ):

DO $$
     x = plpy.execute('SELECT count(*) FROM pg_class');
$$ LANGUAGE plpython3u;
0.9ms

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдкреАрдПрд▓ / рд╡реА 8 :

DO $$
     var x = plv8.execute('SELECT count(*) FROM pg_class');
$$ LANGUAGE plv8 ;
0.9 ms

рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐рд╕реА рддрд░рд╣ рдмрд╣реБрдд рддреЗрдЬ рд╣реИред рдЖрдЗрдП рдХреНрд╡реЗрд░реА рдХреЛ 1000 рдмрд╛рд░ рдпрд╛ 1 рдорд┐рд▓рд┐рдпрди рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЕрдЪрд╛рдирдХ рдЕрдВрддрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛:

PL / 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

рдкреАрдПрд▓ / рдкрд░реНрд▓ :

DO $$
     for (0..999999) {
          spi_exec_query('SELECT count(*) FROM pg_class');
     }
$$ LANGUAGE plperl;
102s

рдкреАрдПрд▓ / рдкрд╛рдпрдерди 3 :

DO $$
     for i in range (0,1000000) :
          plpy.execute('SELECT count(*) FROM pg_class')
$$ LANGUAGE plpython3u;
98s

PL / V8 :

DO $$
     for(var i=0;i<1000;i++)
          plv8.execute('SELECT count(*) FROM pg_class');
$$ LANGUAGE plv8;
100ms

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ PL / V8 рдХреЗ рд╕рд╛рде, рдкреНрд░рдпреЛрдЧ рдПрдХ рд╣рдЬрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рди рдХрд┐ рдПрдХ рд▓рд╛рдЦ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рдеред рдордзреНрдпрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде, 1 рдорд┐рд▓рд┐рдпрди рдСрдкрд░реЗрд╢рди рдХреЗ рдПрдХ рдЪрдХреНрд░ рдореЗрдВ PL / V8 рд╕рднреА рдореЗрдореЛрд░реА рдЦрд╛рдПрдВрдЧреЗ рдФрд░ рдХрд╛рд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рдЯрдХрд╛рдПрдВрдЧреЗред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╣рдЬрд╛рд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдкрд░, рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдкреНрд░рдХреНрд░рд┐рдпрд╛ 3.5GB рдореЗрдореЛрд░реА рдФрд░ 100% рдбрд┐рд╕реНрдХ рдкрд░ рд▓рд┐рдЦрддреА рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рд╡реА 8 рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рд╕реНрдореГрддрд┐ рдХреЛ рдЦрд╛рддрд╛ рд╣реИред рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдЯрд░реНрдмреЛ рд░рд╛рдХреНрд╖рд╕ рд╡рд╛рдкрд╕ рд╕реНрдореГрддрд┐ рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИред рдореЗрдореЛрд░реА рдХреЛ рдЦрд╛рд▓реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рддреНрд░ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ PL / pgSQL PL / Perl рдФрд░ PL / рдкрд╛рдпрдерди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ 2 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИред рдкреАрдПрд▓ / рд╡реА 8 рдЕрднреА рднреА рдЙрдирд╕реЗ рдереЛрдбрд╝рд╛ рдкреАрдЫреЗ рд╣реИ, рд▓реЗрдХрд┐рди рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╡рд╣ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдкреБрдирд░реНрд╡рд╛рд╕рд┐рдд рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрди рдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдкрд╛рдпрд▓ рдХреЗ рд╕рд╛рде рдкрд░реНрд▓ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред рдкрд░реНрд▓ рдкрд╛рдпрдерди рд╕реЗ рдереЛрдбрд╝рд╛ рдиреАрдЪрд╛ рд╣реБрдЖ рдХрд░рддрд╛ рдерд╛, рдЖрдзреБрдирд┐рдХ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рдпрд╣ рдереЛрдбрд╝рд╛ рддреЗрдЬ рд╣реИред рддреАрд╕рд░рд╛ рдкрд╛рдпрдерди рджреВрд╕рд░реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рд╣реИред рдкреВрд░рд╛ рдЕрдВрддрд░ 15% рдХреЗ рднреАрддрд░ рд╣реИред

PREPARE рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди


рдЬреЛ рд▓реЛрдЧ рдЬрд╛рдирддреЗ рд╣реИрдВ рд╡реЗ рд╕рдордЭреЗрдВрдЧреЗ: рдХреБрдЫ рдЧрд▓рдд рд╣реИред PL / pgSQL рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреНрд╡реЗрд░реА рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдХреИрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИ , рдФрд░ PL / * рдореЗрдВ, рд╣рд░ рдмрд╛рд░ рдХреНрд╡реЗрд░реА рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЧрдИ рдереАред рдПрдХ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ, рдЖрдкрдХреЛ рдЕрдиреБрд░реЛрдз рддреИрдпрд╛рд░ рдХрд░рдиреЗ, рдЕрдиреБрд░реЛрдз рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдФрд░ рдлрд┐рд░ рдЗрд╕ рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдиреНрд╣реЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдХрдИ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреАрдПрд▓ / * рдореЗрдВ, рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреНрд╡реЗрд░реА рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдкреАрдПрд▓ / рдкрд░реНрд▓ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ :

DO $$
     my $h = spi_prepare('SELECT count(*) FROM pg_class');
     for (0..999999) {
          spi_exec_prepared($h);
     }
     spi_freeplan($h);
$$ LANGUAGE plperl;
60s

рдкреАрдПрд▓ / рдкрд╛рдпрдерди 3 :

DO $$
     h = plpy.prepare('SELECT count(*) FROM pg_class')
     for i in range (0,1000000): plpy.execute(h)
$$ LANGUAGE plpython3u;
62s

PL / V8 :

DO $$
     var h=plv8.prepare('SELECT count(*) FROM pg_class');
     for(var i=0;i<1000;i++) h.execute();
$$ LANGUAGE plv8;
53ms

рд╕рд╛рде prepareрд╣рдорд╛рд░реЗ рджреЛ рднрд╛рд╖рд╛рдУрдВ, рд╣рдо рд▓рдЧрднрдЧ PL / pgSQL рд╕рд╛рде рдкрдХрдбрд╝рд╛, рдЬрдмрдХрд┐ рддреАрд╕рд░реЗ рдПрдХ рднреА рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╕реНрдореГрддрд┐ рдХреА рдмрдврд╝рддреА рдорд╛рдВрдЧ рдХреА рд╡рдЬрд╣ рд╕реЗ рдЦрддреНрдо рд▓рд╛рдЗрди рдкрд░ рдирд╣реА рдкрдВрд╣реБрдЪреЗред

рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рд╕реНрдореГрддрд┐ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╕рднреА рднрд╛рд╖рд╛рдПрдБ рд▓рдЧрднрдЧ рд╕рд┐рд░ рд╕реЗ рд╕рд┐рд░ рддрдХ рдЬрд╛рддреА рд╣реИрдВ - рдФрд░ рд╕рдВрдпреЛрдЧ рд╕реЗ рдирд╣реАрдВред рдЙрдирдХреА рдЕрдбрд╝рдЪрди рдЕрдм рдЖрдо рд╣реИ - рдПрд╕рдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ред

рдХрдореНрдкреНрдпреВрдЯрд┐рдВрдЧ рдкреНрд░рджрд░реНрд╢рди


рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рднрд╛рд╖рд╛ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдЖрд░рд╛рдо рдХрд┐рдпрд╛ рд╣реИред рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рднрд╛рд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рдХреБрдЫ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдпреЛрдЧред

PL / 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

рдкреАрдПрд▓ / рдкрд░реНрд▓ :

DO $$
     my $a=0;
     for my $i (0..1000000) { $a+=$i*$i; };
     warn $a;
$$ LANGUAGE plperl;
63ms

рдкреАрдПрд▓ / рдкрд╛рдпрдерди 3 :

DO $$
a=0
for i in range(1,1000001): a=a+i*i
$$ LANGUAGE plpython3u;
73ms

PL / V8 :

DO $$
     var a=0;
     for(var i=0;i<=1000000;i++) a+=i*i;
     plv8.elog(NOTICE, a);
$$ language plv8;
7.5ms

рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдкреАрдПрд▓ / рдкрд░реНрд▓ рдФрд░ рдкреАрдПрд▓ / рдкрд╛рдпрдерди рдЖрдЧреЗ рдирд┐рдХрд▓ рдЧрдП рдФрд░ рдкреАрдПрд▓ / рдкреАрдЬреАрд╕реАрдХреНрдпреВ рд╕реЗ рдЖрдЧреЗ рдирд┐рдХрд▓ рдЧрдП, рд╡реЗ 4 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИрдВред рдФрд░ рдЖрда рд╕рдмрдХреЛ рдлрд╛рдбрд╝ рд░рд╣рд╛ рд╣реИ! рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ? рдпрд╛ рд╣рдо рдЗрд╕реЗ рд╕рд┐рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ? рд╣рд╛рдБ рд╣рдо рдХрд░реЗрдВрдЧреЗред

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ рдПрдХ рдлрд╝реНрд▓реЛрдЯ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рддреЗрдЬрд╝ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдЯреАрдХ рдирд╣реАрдВ рд╣реИ: 333333833333127550 рдХреЗ рдмрдЬрд╛рдп 333333833333500000ред

рдпрд╣рд╛рдВ рд╡рд╣ рд╕реВрддреНрд░ рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рдЯреАрдХ рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ :

тИС = n*(n+1)*(2n+1)/6

рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдЧрдгрд┐рддреАрдп рдкреНрд░реЗрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╕рд╛рдмрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдБрд╕реА рдХреЗ рдХреНрд░рдо рдореЗрдВ

DO LANGUAGE plv8 $$
plv8.elog(NOTICE, parseInt(33333383333312755033)) $$;

NOTICE:
33333383333312754000

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, parseIntрдпрд╣ рдЕрднреА рднреА рдПрдХ рдлреНрд▓реЛрдЯ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдЗрдВрдЯ рдирд╣реАрдВред

рдлрд┐рд░ рднреА, 2018 рдореЗрдВ BigInt V8 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ , рдФрд░ рдЕрдм рдЗрд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд┐рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╡рд░реЛрдз рдХреЗ рд╕рд╛рде, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ 64-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдордирдорд╛рдирд╛ рдмрд┐рдЯ рдЧрд╣рд░рд╛рдИ рдХрд╛ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, PL / V8 рдореЗрдВ рдпрд╣ рдирд╡рд╛рдЪрд╛рд░ рдЕрднреА рддрдХ рд╣рд┐рдЯ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, numericрд╡рд┐рд╢реЗрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ (рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЗ рдПрдирд╛рд▓реЙрдЧ ) рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкрд░реНрд▓ рдореЗрдВ, рд╡рд╣рд╛рдБ рдПрдХ рд╣реИ рдЧрдгрд┐рдд :: BigFloat рдореЙрдбреНрдпреВрд▓ рдордирдорд╛рдирд╛ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЗ рд╕рд╛рде рдЧрдгрд┐рдд рдХреЗ рд▓рд┐рдП, рдФрд░ рдЕрдЬрдЧрд░ рдореЗрдВ, Bigfloat рдкреИрдХреЗрдЬ рдПрдХ рд╣реИ Cython рдЖрд╡рд░рдг рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЬреАрдПрдирдпреВ MPFR рдкреБрд╕реНрддрдХрд╛рд▓рдп ред

рдЫрдБрдЯрд╛рдИ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░реНрдп


рдпрд╣рд╛рдВ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЫрдВрдЯрдиреА рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЕрдВрддрд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдХрд╛рд░реНрдп: рдкрддреНрд░рд┐рдХрд╛ рдХреЗ рдореБрджреНрджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рд▓реЗ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝реАрд▓реНрдб рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

1
2
3
4-5
6
6A
6
11
12

рдЙрдиред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдирдВрдмрд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдЗрди рдирдВрдмрд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЫрд╛рдБрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдИрдВ рдУрд░ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рднрд╛рдЧ рдХреЛ рдкреВрд░рдХ рдХрд░рддреЗ рд╣реИрдВ:

0000000001
0000000002
0000000003
0000000004-5
0000000006
0000000006A
0000000006
0000000011
0000000012

рд╣рд╛рдВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ (рдФрд░ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рднреА рдирд╣реАрдВ)ред рд▓реЗрдХрд┐рди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд░реЗрдЧрд╛ред

рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, SELECT ... ORDER BY nsort(n)рд╣рдо PL / Perl, SQL, PL / Python рдФрд░ PL / V8 рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдЬрд░реНрдирд▓ рдирдВрдмрд░ рдХреЛ рдЗрд╕ рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

CREATE OR REPLACE FUNCTION nsort(text) RETURNS text 
   LANGUAGE PLPERL IMMUTABLE AS $$
    my $x = shift;
    return ($x =~ /^\s*(\d+)(.*)$/)
        ? sprintf("%010d", $1).$2
        : $x;
$$;

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;
$$;

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)
$$;

CREATE OR REPLACE FUNCTION js_nsort(x text) RETURNS text 
   LANGUAGE plv8 IMMUTABLE AS $$
var m = x.match(/^\s*(\d+)(.*)$/);
if(m) { return m[1].padStart(10-m[1].length,'0') + m[2]; }
else { return x; } 
$$;

15.5 рд╣рдЬрд╛рд░ рдЬрд░реНрдирд▓ рд▓реЗрдЦреЛрдВ рдХреА рдореЗрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ, PL / Perl рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХреНрд╡реЗрд░реА PL / Python рдореЗрдВ 120ms рдФрд░ PL / PgSQL рдореЗрдВ 200ms рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ 64ms рд▓реЗрддреА рд╣реИред рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рддреЗрдЬрд╝ - PL / v8: 54msред

рдиреЛрдЯ: рдЫрдВрдЯрд╛рдИ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрд╡рд╢реНрдпрдХ рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╢реАрд▓ рдореЗрдореЛрд░реА рдкреНрд░рджрд╛рди рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЫрдВрдЯрд╛рдИ рд╕реНрдореГрддрд┐ рдореЗрдВ рдЪрд▓реА рдЬрд╛рдП (рдЙрджрд╛рд╣рд░рдг рддрдм рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ Sort Method: quicksort)ред рд╕реНрдореГрддрд┐ рдХреА рдорд╛рддреНрд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИ work_mem:

set work_mem = '20MB';

рдпрд╛рдж


рдкрд░реНрд▓ рдХреЛ рд▓реВрдкреНрдб рд╕рдВрд░рдЪрдирд╛рдПрдВ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИрдВ, рд╡рд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд╕рд╛рдл рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрджрд┐ рдЖрдкрдХреЗ aрдкрд╛рд╕ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдЯреВ bрдФрд░ рдПрдХ bрдкреЙрдЗрдВрдЯрд░ рд╣реИ a, рддреЛ рд░реЗрдлрд░реЗрдВрд╕ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдХрднреА рднреА рд░реАрд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдг рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реНрдореГрддрд┐ рдХреЛ рдХрдм рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╛ рдХреНрдпрд╛ рдЗрд╕реЗ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╛ - рдпрджрд┐ рдЖрдк рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ - рдХрд▓реЗрдХреНрдЯрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреНрд╖рдг рдореЗрдВ рдХрдЪрд░рд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдПрдВрдЧреЗред

рд▓реЗрдХрд┐рди рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рд╕реЗ рд╕реАрдзреЗ рд╕рдВрдмрдВрдзрд┐рдд рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрдореЗрдВрдЯ рдлреАрдЪрд░реНрд╕ рднреА рд╣реИрдВред рдРрд╕реА рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдПрд╕рдкреАрдЖрдИ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреА рд╣реИрдВ, рдФрд░ рдкрд░реНрд▓ рдХреЛ рд╣рдореЗрд╢рд╛ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

PL / Perl

рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЬрд╛рддрд╛ рд╣реИ:

CREATE OR REPLACE function cr()
RETURNS int LANGUAGE plperl AS
$$
     return spi_exec_query(
           'SELECT count(*) FROM pg_class'
     )->{rows}->[0]->{count};
$$;

рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ:

CREATE OR REPLACE function cr()
RETURNS int LANGUAGE plperl AS
$$
     my $h = spi_prepare(
          'SELECT count(*) FROM pg_class'
     );
     return spi_exec_prepared($h)->{rows}->[0]->{count};
$$;

рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рдж, рд╣реИрдВрдбрд▓рд░ $hрдЬреАрд╡рд┐рдд рд░рд╣реЗрдЧрд╛, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рднреА рдЬреАрд╡рд┐рдд рд▓рд┐рдВрдХ рдирд╣реАрдВ рд░рд╣рддрд╛ рд╣реИред

рдпрд╣ рдареАрдХ рд╣реИ, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ spi_freeplan($h):

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)->{rows}->[0]->{count};
     spi_freeplan($h);
     return $res;
$$;

рдкреАрдПрд▓ / рдЕрдЬрдЧрд░:

рдЕрдЬрдЧрд░ рдХрднреА рдирд╣реАрдВ рдмрд╣рддрд╛ рд╣реИ , рдпреЛрдЬрдирд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рд░реА рдХреА рдЬрд╛рддреА рд╣реИ:

CREATE OR REPLACE function cr3() RETURNS int
LANGUAGE plpythonu as
$$
     return plpy.execute(
           'select count(*) from pg_class'
     )[0]['count']
$$;

рдкреАрдПрд▓ / рд╡реА 8

рдкрд░реНрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдХрд╣рд╛рдиреАред рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рд╡рд╛рд╣рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ:

CREATE OR REPLACE FUNCTION crq() RETURNS int
LANGUAGE plv8 AS
$$
     return plv8.execute(
          'select count(*) from pg_classтАШ
     )[0].count;
$$;

рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ:

CREATE OR REPLACE FUNCTION crq() RETURNS int
LANGUAGE plv8 AS
$$
     var h = plv8.prepare(
          'select count(*) from pg_class'
     );
     return h.execute()[0].count;
$$;

рдлрд┐рд░ рд╕реЗ: рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред рдпрд╣ рдпрд╣рд╛рдБ рд╣реИред h.free();

рдпрд╣ рдкреНрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

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;
$$;

рдкреИрд░рд╛рдореАрдЯрд░


рдпрд╣ рд╕рдордЭрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХреИрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде 4 рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ:

  • рдкреВрд░рд╛ рдХрд╛ рдкреВрд░рд╛;
  • рдПрдХ рд╕рд░рдгреА;
  • рдмрд╛рдЗрдЯрд╛ рдФрд░
  • jsonb

рд╡реЗ рдкреАрдПрд▓ / рдкрд░реНрд▓ рдореЗрдВ рдХреИрд╕реЗ рдЖрддреЗ рд╣реИрдВ ?

CREATE OR REPLACE FUNCTION crq(a int, b
bytea, c int[], d jsonb ) RETURNS void
LANGUAGE plperl AS
$$
    warn Dumper(@_);
$$;

SELECT crq(1,'abcd', ARRAY[1,2,3],'{"a":2,"b":3}');


WARNING:  $VAR1 = '1';
$VAR2 = '\\x61626364';
$VAR3 = bless( {
                 'array' => [
                              '1',
                              '2',
                              '3'
                            ],
                 'typeoid' => 1007
               }, 'PostgreSQL::InServer::ARRAY' );
$VAR4 = '{"a": 2, "b": 3}';
 crq 
-----
(1 row)

рдХреНрдпрд╛ рдпрд╣ JSON рдпрд╛ JSONB рд╣реЛрдЧрд╛ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛: рд╡реЗ рдЕрднреА рднреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдореБрдЦреА рдкреНрд░рддрд┐рднрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реБрд▓реНрдХ рд╣реИ: рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХреЗ рдХрдИ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ "рднрд┐рдиреНрдирддрд╛" рдХреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбрд┐рдЧреНрд░реА рд╣реИред рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдорд╛рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╡рд╣ рддреБрд░рдВрдд рд╕рднреА рдкреАрдПрд▓ / * рдХреЗ рд▓рд┐рдП рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЗрди рд╢рд░реНрддреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдмреЗрд╢рдХ, рдореИрдВ рдбреЗрдЯрд╛ рдХреЛ рддреБрд░рдВрдд рдЙрдЪрд┐рдд рдкрд░реНрд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди 9.6 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рддрдВрддреНрд░ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ - рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛: рдХреНрд░рд┐рдПрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо ред

TRANSFORM рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ C рдореЗрдВ рджреЛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рддрд░рдл, рджреВрд╕рд░реЗ рдмреИрдХ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░реЗрдЧрд╛ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ, рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдЪрд╛рд░ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

  • рдЬрдм рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛;
  • рдЬрдм рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ;
  • рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдПрдХ рдПрд╕рдкреАрдЖрдИ рдХреЙрд▓ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рддреЗ рд╕рдордп;
  • рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдПрд╕рдкреАрдЖрдИ рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ред

рдПрдВрдЯреАрд▓ рдмрд╛рдпрдХреЛрд╡ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдкрд░реНрд▓ рдПрдВрдб рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо JSONB, рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬрд╝ рдХреЗ 11 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдЕрдм рдЖрдкрдХреЛ JSONB рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЗрд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рддреБрд░рдВрдд рдкрд░реНрд▓ рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИред рдЖрдкрдХреЛ jsonb_plperl рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЖрдк рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

CREATE EXTENSION jsonb_plperl;
CREATE OR REPLACE FUNCTION crq2(d jsonb)
RETURNS void LANGUAGE plperl
TRANSFORM FOR TYPE jsonb AS $$
     warn Dumper(@_);
$$;

рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ JSONB рдПрдХ рдореЛрддреА рд╣реИрд╢ рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ:

SELECT crq2( '{"a":2,"b":3}');


WARNING:  $VAR1 = {
          'a' => '2',
          'b' => '3'
        };
 crq2 
------
(1 row)

рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдорд╛рдорд▓рд╛!

рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рдХрд╛ рднреА TRANSFORMs рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╣рд╛рде рдерд╛ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░, рдЬреИрд╕рд╛ booleanрдХрд┐ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░реВрдк рдореЗрдВ рдкреАрдПрд▓ / рдкрд░реНрд▓ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд╛рда рдХреЗ рддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ 't'рдпрд╛ 'f'ред рд▓реЗрдХрд┐рди рдкрд░реНрд▓ рдХреА рд╕рдордЭ рдореЗрдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧ 'рдПрдл' рд╕рдЪ рд╣реИред рдЕрд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреИрдЪ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдмреВрд▓рд┐рдпрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ ред рдпрд╣ рдкреИрдЪ PostgreSQL 13 рдорд╛рд░рд╛ рдФрд░ рдЬрд▓реНрдж рд╣реА рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред рдЕрдкрдиреА рд╕рд░рд▓рддрд╛ рдХреЗ рдХрд╛рд░рдг, bool_plperl рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреНрдпреВрдирддрдо рд╢реБрд░реБрдЖрддреА рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЕрдиреНрдп рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ (рдмрд╛рдЗрдЯрд╛, рд╕рд░рдгрд┐рдпреЛрдВ, рджрд┐рдирд╛рдВрдХ, рд╕рдВрдЦреНрдпрд╛рддреНрдордХ) рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдЧрд╛ред

рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреИрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ ред

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)
$$;

SELECT pdump(1,'abcd', ARRAY[1,2,3],'{"a":2,"b":3}');


WARNING:  (1, b'abcd', [1, 2, 3], {'a': Decimal('2'), 'b': Decimal('3')})
 pdump 
-------
(1 row)

рдПрдХ рд╕рд░рдгреА рдХреЛ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ (рдЪреВрдВрдХрд┐ рд╕рдВрд╕реНрдХрд░рдг PG10 рдмрд╣реБрдЖрдпрд╛рдореА рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рднреА рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЕрдЬрдЧрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдкрд░реНрд▓ рдореЗрдВ, рдПрдХ рд╕рд░рдгреА рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдЪреНрдЫрд╛, jsonbрд░реВрдкрд╛рдВрддрд░рд┐рддред рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдХреЗ рдмрд┐рдирд╛, jsonb рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЬреЗрдПрд╕ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рд╕ рд░реВрдк рдореЗрдВ рдЖрддреЗ рд╣реИрдВ ред

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)
$$;

SELECT jsdump(1,'abcd', ARRAY[1,2,3],'{"a":2,"b":3}');


WARNING:  1 97,98,99,100 1,2,3 [object Object]
jsdump 
-------
(1 row)

JSONB рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЧрдпрд╛! рдЕрд╕реНрдерд╛рдИ рдкреЛрд╕реНрдЯрдЧреНрд░реИрдЬ рдкреНрд░рдХрд╛рд░ рднреА рдЬреЗрдПрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдмрджрд▓ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдмреВрд▓рд┐рдпрди рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдмрд╛рддред рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреАрдПрд▓ / рд╡реА 8 рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдирдВрдд рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


рдЗрдиреНрдлрд┐рдирд┐рдЯреА рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рд╛рде рдореИрд▓рд╛ рдХрд╛рдо рдЦрддрд░рдирд╛рдХ рд╣реИред PostgreSQL рдореЗрдВ, рдЗрдиреНрдлрд┐рдирд┐рдЯреА рдФрд░ -рдЗрдирдлрд┐рдирд┐рдЯреА рдХреБрдЫ рдЕрд╕реНрдерд╛рдпреА рдФрд░ рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрдиреНрдлрд┐рдирд┐рдЯреА рдХреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рди рдХреЗрд╡рд▓ рднрд╛рд╖рд╛ рдкрд░, рдмрд▓реНрдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░, рдУрдПрд╕ рдкрд░ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рднреА рдирд┐рд░реНрднрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ Numpy рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬреЛ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЕрдирдВрддрддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:

import numpy as nm
a = nm.inf
b = -nm.inf
print(a, b)

inf -inf

рдкрд░реНрд▓ рдореЗрдВ рднреА рдЕрдирдВрдд рд╣реИ, рдпрд╣ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ "infinity"рдЬрд┐рд╕реЗ рдЫреЛрдЯрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ "inf"ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ:

perl -e 'print 1 * "inf"'

Inf

рдпрд╛

perl -e 'print 1/"inf"'

0

рдкреАрдПрд▓ / рдкрд░реНрд▓, рдкреАрдПрд▓ / рдкрд╛рдпрдерди, рдкреАрдПрд▓ / рд╡реА 8 рдореЗрдВ, рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рд╕реЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЕрдирдВрддрддрд╛ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрдирдВрдд рддрд╛рд░реАрдЦ рдХрд╛рдлреА рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рдмрд▓реНрдХрд┐, рдкреАрдПрд▓ / рдкрд░реНрд▓ рдФрд░ рдкреАрдПрд▓ / рдкрд╛рдпрдерди рдореЗрдВ рд╕рдордп рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд╣рд╛рдВ рдЖрддреА рд╣реИред рдкреАрдПрд▓ / рд╡реА 8 рдореЗрдВ, рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рддрд╛рд░реАрдЦ рд╣реЛрддреА рд╣реИ, рдФрд░ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рддрд┐рдерд┐ рдЗрд╕рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред рд▓реЗрдХрд┐рди V8 рдЕрдВрддрд╣реАрди рддрд╛рд░реАрдЦ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рдФрд░ рдЬрдм рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ Invalid Dateред

рддреИрдпрд╛рд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛


рд╡рд╛рдкрд╕ prepare, рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдХреИрд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╣рд╛рдВ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рднреА SPI рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВред

рдЬрдм рдЖрдк рдкреАрдПрд▓ / рдкрд░реНрд▓ рдореЗрдВ рдПрдХ рдХреНрд╡реЗрд░реА рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ , рддреЛ рдЖрдкрдХреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдкрд╛рд░рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рдЖрдк рдХреНрд╡реЗрд░реА рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреЗрд╡рд▓ рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ (рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЙрд╕реА рддрд░рд╣ рдкреАрдПрд▓ / рдкреАрдЬреАрд╕реАрдХреНрдпреВрдПрд▓ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

DO LANGUAGE plperl $$
     my $h= spi_prepare('SELECT * FROM pg_class WHERE
          relname ~ $1', 'text' );                     #   
     warn Dumper(spi_exec_prepared($h, 'pg_language')); #   
     spi_freeplan($h);
$$;

рдореЗрдВ рдкреА рдПрд▓ / рдЕрдЬрдЧрд░, рд╕рд╛рд░ рдПрдХ рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИ:

DO LANGUAGE plpython3u $$
     h= plpy.prepare('SELECT relname FROM pg_class WHERE relname ~ $1', ['text'] )
     plpy.notice(.execute (['pg_language']))
$$;

рдореЗрдВ рдкреА рдПрд▓ / рд╡реА 8, рдорддрднреЗрдж рдХрдо рд╕реЗ рдХрдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

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();
$$;

рдореЗрдВ рдкреА рдПрд▓ / рдЬрд╛рд╡рд╛, рд╕рдм рдХреБрдЫ рдЕрд▓рдЧ рд╣реИред рд╡рд╣рд╛рдВ, рдПрд╕рдкреАрдЖрдИ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдЫрджреНрдо-рдЬреЗрдбрдбреАрдмреАрд╕реА рдХрдиреЗрдХреНрд╢рди рдмрдирддрд╛ рд╣реИред рдПрдХ рдкреАрдПрд▓ / рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП, рд╕рдм рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╡рд╣ рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛ рд░рд╣рд╛ рдерд╛ред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдФрд░ рдкреАрдПрд▓ / рдкрд░реНрд▓ рдФрд░ рдкреАрдПрд▓ / рдкрд╛рдпрдерди рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рднреА рд╕рдВрдкрд░реНрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреАрдПрд▓ / рдкрд░реНрд▓ рдФрд░ рдкреАрдПрд▓ / рдкрд╛рдпрдерди рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдиреЗ рд╕реЗ рдХреЛрдИ рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред

рдХрд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


рд╕рднреА SPI рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬреЛ рд╣рдордиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЬрд╛рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдереЗ - spi_exec_query()рдФрд░ рдЕрдиреНрдп - рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ рдЬреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рд▓реМрдЯреА рд╣реБрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдмрд╣реБрдд рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд░реНрд╕рд░ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдЗрди рд╕рднреА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрд░реНрд╕рд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдореЗрдВ рдкреА рдПрд▓ / рдкрд░реНрд▓,
spi_exec_query рдПрдХ рдХрд░реНрд╕рд░ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЖрдк рддрд╛рд░ рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рджреЗрддрд╛ рд╣реИред рдХрд░реНрд╕рд░ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЦреБрдж рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ close()ред

DO LANGUAGE plperl $$
    my $cursor = spi_query('SELECT * FROM pg_class');
    my $row;
    while(defined($row = spi_fetchrow($cursor))) {
         warn $row->{relname};
    }
$$;

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.
...

рдореЗрдВ рдкреА рдПрд▓ / рдЕрдЬрдЧрд░, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдХрд░реНрд╕рд░ рдПрдХ рд╡рд╕реНрддреБ рд╣реИ рдХрд┐ рдЖрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрдХреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

h = plpy.prepare('SELECT ...');
cursor = plpy.cursor(h);
for row in cursor:
...
cursor.close() //  

рдореЗрдВ рдкреА рдПрд▓ / v8, рд╕рдм рдХреБрдЫ рднреА рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рддреИрдпрд╛рд░ рдХреНрд╡реЗрд░реА рдпреЛрдЬрдирд╛ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛:

var h = plv.prepare('SELECT ...');
var cursor = h.cursor();
var row;
while(row = cursor.fetch()) {
...
}
cursor.close();
h.free();

рдкреАрдПрд▓ / рд╡реА 8: рд╕реБрд╡рд┐рдзрд╛рдУрдВ рддрдХ рддреНрд╡рд░рд┐рдд рдкрд╣реБрдВрдЪ


PL / V8 рдореЗрдВ, рдЖрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдирд┐рдпрдорд┐рдд рдЪрдпрди рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдирд╛рдо рд╕реЗ рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рддреБрд░рдВрдд рдЗрд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ plv8.find_function(name);ред рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ JS рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ PostgreSQL рдореЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреАрдПрд▓ / рд╡реА 8 рдореЗрдВ, рдмреЗрд╢рдХ, рд╣рдо рдмрд╣реБрд░реВрдкрд┐рдХ рдХрд╛рд░реНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди find_functionрдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред

ERROR:  Error: more than one function named "jsdump"

рдпрджрд┐ рдирд╛рдо рд╕реЗ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдЕрд╕рдВрджрд┐рдЧреНрдз рд╣реИ, рддреЛ рдЗрд╕реЗ рдПрд╕рдкреАрдЖрдИ рдФрд░ рдЯрд╛рдЗрдк рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдмрд┐рдирд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдХрд╛рдлреА рддреЗрдЬред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:

DO LANGUAGE plv8 $$
plv8.find_function('jsdump')(1, 'abc');
$$;

рд▓реЗрди-рджреЗрди


рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ 11 рдореЗрдВ рдмрд╣реБрдд рдордЬрд╝рд╛ рд╣реИ: рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рджрд┐рдЦрд╛рдИ рджреА рд╣реИрдВ ред Postgres рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣реБрдЖ рдХрд░рддреА рдереАрдВред рдЖрдирдВрдж рдХреЗрд╡рд▓ SQL рдорд╛рдирдХ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдФрд░ рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВ: рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рднреАрддрд░ рдЖрдк рд▓реЗрдирджреЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рдкрд╕ рд▓реЗрди-рджреЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкреАрдПрд▓ / рдкрд░реНрд▓ рдФрд░ рдкреАрдПрд▓ / рдкрд╛рдпрдерди рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓реЗрдирджреЗрди рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрд╕рдкреАрдЖрдИ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ, рдЬрдмрдХрд┐ рдкреАрдПрд▓ / рд╡реА 8 рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реИред рдкреАрдПрд▓ / рдкрд░реНрд▓ рдореЗрдВ, рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ spi_commit()рдФрд░ spi_rollback(), рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ ред рдкреАрдПрд▓ / рдкрд╛рдпрдерди рдореЗрдВ, рдпрд╣ рд╣реИ plpy.commit()рдФрд░ plpy.rollback()ред

Subtransaction


рдЬрдЯрд┐рд▓ рдмрд╣реБ-рд╕реНрддрд░реАрдп рддрд░реНрдХ рдореЗрдВ рд╕рд╣реА рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд╢реАрд░реНрд╖рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВред

рдореЗрдВ PL / pgSQL рдПрдХ рд╕реМрджреЗ рдХреЗ рдЕрдВрджрд░, рдЕрдкрд╡рд╛рдж рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдПрдХ subtransaction рд╣реИред рдЖрдк рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ ред рдкреАрдПрд▓ / рдкрд░реНрд▓

рдореЗрдВ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдЙрдкрд╢реАрд░реНрд╖рдХ рдирд╣реАрдВ рд╣реИрдВ , рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рд╕рд╛рд╡рд╛рдкреЙрдЗрдВрдЯреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдПрдХ рдореЛрддреА рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдЬреЛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рдореЗрдВ рд╕рдмрдЯреНрд░рд╛рдВрд╕рдкреЛрд░реЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдореЗрдВ рдкреА рдПрд▓ / рдЕрдЬрдЧрд░, 9.5 рд╕реЗ: рдЙрдк рд▓реЗрдирджреЗрди рдмрд╣реБрдд рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╡рд╣рд╛рдБ рдереЗ рдирд┐рд╣рд┐рдд рд╡рд╛рд▓реЗ ред рдЖрдк рд▓реЗрди-рджреЗрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрд╕рдореЗрдВ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ

try-рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред рдпрджрд┐ рдШрдЯрд╛рд╡ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдмреНрд▓реЙрдХ рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рддреЗ рд╣реИрдВ except; рдпрджрд┐ рдпрд╣ рдирд╣реАрдВ рдЧрд┐рд░рддрд╛ рд╣реИ, рддреЛ рдмреНрд▓реЙрдХ рдореЗрдВ elseрдФрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВред

try:
     with plpy.subtransaction():
          plpy.execute("...")
          plpy.execute("...")
except plpy.SPIError, e:
. . .
else:
. . .

рдПрдХ рд╕рдорд╛рди рдбрд┐рдЬрд╛рдЗрди рдкреАрдПрд▓ / рд╡реА 8 рдореЗрдВ рдореМрдЬреВрдж рд╣реИ , рдХреЗрд╡рд▓ рдЬреЗрдПрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВред

try {
plv8.subtransaction(function() {
plv8.execute('UPDATE...');
plv8.execute('UPDATE...');
});
}
catch(e) {
...
}

рдирд┐рд╖реНрдХрд░реНрд╖


рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рджреБрд░реБрдкрдпреЛрдЧ рди рдХрд░реЗрдВ :) рдкреАрдПрд▓ / * рдХрд╛ рдЬреНрдЮрд╛рди рдХреБрдЫ рд▓рд╛рдн рд▓рд╛ рд╕рдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдЙрдкрдХрд░рдг рдХреА рддрд░рд╣, рд╡реЗ рдЕрдкрдиреЗ рдЗрдЪреНрдЫрд┐рдд рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред

рдкреАрдПрд▓ / рд╡реА 8 рдмрд╣реБрдд рдЖрд╢рд╛рдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдпрд╣ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╡реЗ рдЖрдкрдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред

рдореИрдВ рдЗрдЧреЛрд░ рд▓реЗрд╡рд╢рд┐рди рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (Igor_Le), рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдорджрдж рдХреА, рдФрд░ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрд╡рдЧреЗрдиреА рд╕рд░реНрдЧреЗрд╡ рдФрд░ рдПрд▓реЗрдХреНрд╕реА рдлрдбреЗрд╡ рдиреЗ рдЙрдирдХреЗ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ред

All Articles