SlideShare a Scribd company logo
1 of 29
Download to read offline
PL/Perl New Features
    in PostgreSQL 9.0


     Tim Bunce - June 2010
     Creative Commons BY-NC-SA 3.0
PL/Perl Changes

   ‣ USER
   ‣ INTERNAL
   ‣ DBA
   ‣ NYTPROF
PL/Perl Changes

   ‣ USER
   ‣ INTERNAL
   ‣ DBA
   ‣ NYTPROF
New Builtins
quote_...

 quote_literal( "foo"            ) ==> "'foo'"
 quote_literal( "don't "carp"" ) ==> "'don''t "carp"'"
 quote_literal( ""               ) ==> "''"


quote_nullable( "foo"            ) ==> "'foo'"
quote_nullable( "don't "carp"" ) ==> "'don''t "carp"'"
quote_nullable( ""               ) ==> "''"


quote_ident( "foo"            ) ==> "foo"
quote_ident( "don't "carp"" ) ==> ""don't ""carp""""
quote_ident( ""               ) ==> """"
quote_...(undef)


 quote_literal( undef   ) ==> undef


quote_nullable( undef   ) ==> "NULL"


   quote_ident( undef   ) ==> """"   (warn)
{en,de}code_bytea
encode_bytea( "foo"            ) ==> "x666f6f"
decode_bytea( "x666f6f"      ) ==> "foo"
decode_bytea( "146157157") ==> "foo"


encode_bytea( "x{263a}"       ) ==> "xe298ba"         UTF8
decode_bytea( "xe298ba"      ) ==> "342230272"      Not UTF8


encode_bytea( ""               ) ==> "x"
decode_bytea( "x"            ) ==> ""
decode_bytea( ""               ) ==> ""


encode_bytea( undef            ) ==> "x"      (warn)
decode_bytea( undef            ) ==> ""      (warn)
looks_like_number

looks_like_number( 1           ) ==> 1
looks_like_number( 0           ) ==> 1
looks_like_number( "+7.2e-9"   ) ==> 1


looks_like_number( "foo"       ) ==> 0
looks_like_number( ""          ) ==> 0
looks_like_number( undef       ) ==> undef


looks_like_number( " 4 "       ) ==> 1


looks_like_number( "5plus"     ) ==> 0   (but '5plus'+0=5)
encode_array_*

encode_array_literal( ["foo","bar"] )
   ==> "{"foo", "bar"}"


encode_array_constructor( ["foo","bar"] )
   ==> "ARRAY['foo', 'bar']"



encode_array_literal( [1,[2,[undef]]]   )
   ==> "{"1", {"2", {NULL}}}"


encode_array_constructor( [1,[2,[undef]]]   )
   ==> "ARRAY['1', ARRAY['2', ARRAY[NULL]]]"
encode_array_*


encode_array_literal(       "foo"   ) ==> "foo"
encode_array_constructor(   "foo"   ) ==> "'foo'"


encode_array_literal(       undef   ) ==> undef
encode_array_constructor(   undef   ) ==> "NULL"
Trusted require/use
• require/use work for already loaded modules
use strict;            # old way: BEGIN { strict->import(); }



• extra pre-loaded modules
use warnings;
use Carp;
use feature qw(say);   # for perl 5.10 or later
use utf8;              # if server_encoding is utf8
CONTEXT: ...

• PL/Perl tracks the context of log messages
  - before:
    WARNING: ...some warning from perl code...


  - now:
    WARNING: ...some warning from perl code...
    CONTEXT: PL/Perl function "..."
DO '...' LANGUAGE plperl;

• Arbitrary chunks of perl code can be executed
    directly from psql, or client apps, via DO
•   No need to create and run a stored procedure
    each time.

    DO $$
        spi_exec("... $_ ...") for 'a'..'z';
    $$ language plperl;
Other Changes
• Using $a and $b in sort blocks now works!
• eval { ... } and eval "..."
  - can now be used in plperl
• END blocks are now run at end of session
  - they can't (currently) access the database
• Warnings from perl are now WARNINGs
  - they used to be NOTICE
PL/Perl Changes

   ‣ USER
   ‣ INTERNAL
   ‣ DBA
   ‣ NYTPROF
INTERNAL

• The Safe module is no longer used for plperl
  - Improved security and reduced call overheads
  - Upgrade to latest security patch!
• Validates return values are in server encoding
  - ERROR: invalid byte sequence for encoding
• Internal code refactoring and cleanup
PL/Perl Changes

   ‣ USER
   ‣ INTERNAL
   ‣ DBA
   ‣ NYTPROF
New plperl.* Config
• Specify perl code to run during initialization:

  plperl.on_init            = '...perl...'
  plperl.on_plperlu_init = '...perl...'
  plperl.on_plperl_init     = '...perl...'


• Can only be set by superuser or postgres.conf
• Code can't access the database
~ Timeline ~
▾   Perl interpreter created on demand
    ▿ Options from PERL5OPT env var are processed
    ▿ PL/Perl support code bootstraps
    ▿ plperl.on_init code runs
      Above may happen in postmaster at startup if
      plperl is loaded via shared_preload_libraries
▾ Interpreter is specialised for plperl (or plperlu)
    ▿ Modules loaded: strict, warnings, features, Carp
    ▿ Perl operators are restricted (require, open etc.)
    ▿ DynaLoader package is deleted
    ▿ plperl.on_plperl_init code runs
    ▿ Database access is enabled
plperl.on_init

• Handy to set global perl configuation
  plperl.on_init='use lib qw(/myapp); use ...;'
  plperl.on_init='require "plperloninit.pl";'


• SECURITY RISK!
  Only load modules you're happy for plperl code to use!
  Also check any other modules loaded as dependencies!
  Use Devel::TraceLoad to see what's actually loaded:
  PERL5OPT='-MDevel::Trace=summary' pg_ctl ...
PL/Perl Best Practice

•   Include explicit use statements in functions
•   Don't assume modules have been pre-loaded
•   For plperlu that'll actually load if needed
•   For plperl it'll check that module was loaded
    - so you'll get an immediate clear failure if not
    - for example on a replica with old postgres.conf file
plperl.on_plperl_init

• Originally intended for things like
  -   PGOPTIONS="-c plperl.on_plperl_init='...'"

  - to enable debug or profiling for a session
• But...
• Can only be set by superuser or postgres.conf
  - sadly, due to SECURITY DEFINER risks.
  - You shouldn't write SECURITY DEFINER
    functions in plperl if untrusted users can use plperl!
PL/Perl Changes

   ‣ USER
   ‣ INTERNAL
   ‣ DBA
   ‣ NYTPROF
Devel::NYTProf
Perl Source Code Profiler


PostgreSQL::PLPerl::NYTProf
Enabling NYTProf
• Via postgres.conf:
  plperl.on_init='use PostgreSQL::PLPerl::NYTProf'



• Via environment variable:
  PERL5OPT='-MPostgreSQL::PLPerl::NYTProf' pg_ctl ...



• Immediately active. To enable on demand:
  NYTPROF=start=no PERL5OPT=... pg_ctl ...
  DO 'DB::enable_profile' LANGUAGE plperl;
Reporting from NYTProf

• Writes per-backend data files:
  $PGDATA/nytprof.out.$pid



• To generate a report:
  nytprofhtml --file=$PGDATA/nytprof.out.4321 --open
~ Demo ~
                Screencast: http://timbunce.blip.tv
Video: http://www.fosslc.org/drupal/content/plperl-new-features-90
Questions?

Tim.Bunce@pobox.com
http://blog.timbunce.org
 @timbunce on twitter
http://xkcd.com/519/

More Related Content

What's hot

Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011
CodeIgniter Conference
 
AnyMQ, Hippie, and the real-time web
AnyMQ, Hippie, and the real-time webAnyMQ, Hippie, and the real-time web
AnyMQ, Hippie, and the real-time web
clkao
 
Devinsampa nginx-scripting
Devinsampa nginx-scriptingDevinsampa nginx-scripting
Devinsampa nginx-scripting
Tony Fabeen
 
Understanding PHP objects
Understanding PHP objectsUnderstanding PHP objects
Understanding PHP objects
julien pauli
 
Lightweight wrapper for Hive on Amazon EMR
Lightweight wrapper for Hive on Amazon EMRLightweight wrapper for Hive on Amazon EMR
Lightweight wrapper for Hive on Amazon EMR
Shinji Tanaka
 

What's hot (20)

On UnQLite
On UnQLiteOn UnQLite
On UnQLite
 
RestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message QueueRestMQ - HTTP/Redis based Message Queue
RestMQ - HTTP/Redis based Message Queue
 
Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011
 
Php in 2013 (Web-5 2013 conference)
Php in 2013 (Web-5 2013 conference)Php in 2013 (Web-5 2013 conference)
Php in 2013 (Web-5 2013 conference)
 
typemap in Perl/XS
typemap in Perl/XS  typemap in Perl/XS
typemap in Perl/XS
 
Redis as a message queue
Redis as a message queueRedis as a message queue
Redis as a message queue
 
AnyMQ, Hippie, and the real-time web
AnyMQ, Hippie, and the real-time webAnyMQ, Hippie, and the real-time web
AnyMQ, Hippie, and the real-time web
 
What you need to remember when you upload to CPAN
What you need to remember when you upload to CPANWhat you need to remember when you upload to CPAN
What you need to remember when you upload to CPAN
 
High Performance tDiary
High Performance tDiaryHigh Performance tDiary
High Performance tDiary
 
Profiling php5 to php7
Profiling php5 to php7Profiling php5 to php7
Profiling php5 to php7
 
How to Develop Puppet Modules: From Source to the Forge With Zero Clicks
How to Develop Puppet Modules: From Source to the Forge With Zero ClicksHow to Develop Puppet Modules: From Source to the Forge With Zero Clicks
How to Develop Puppet Modules: From Source to the Forge With Zero Clicks
 
Mysqlnd, an unknown powerful PHP extension
Mysqlnd, an unknown powerful PHP extensionMysqlnd, an unknown powerful PHP extension
Mysqlnd, an unknown powerful PHP extension
 
Devinsampa nginx-scripting
Devinsampa nginx-scriptingDevinsampa nginx-scripting
Devinsampa nginx-scripting
 
Memory Manglement in Raku
Memory Manglement in RakuMemory Manglement in Raku
Memory Manglement in Raku
 
Using ngx_lua in UPYUN
Using ngx_lua in UPYUNUsing ngx_lua in UPYUN
Using ngx_lua in UPYUN
 
Doing It Wrong with Puppet -
Doing It Wrong with Puppet - Doing It Wrong with Puppet -
Doing It Wrong with Puppet -
 
Understanding PHP objects
Understanding PHP objectsUnderstanding PHP objects
Understanding PHP objects
 
Redis & ZeroMQ: How to scale your application
Redis & ZeroMQ: How to scale your applicationRedis & ZeroMQ: How to scale your application
Redis & ZeroMQ: How to scale your application
 
PHP5.5 is Here
PHP5.5 is HerePHP5.5 is Here
PHP5.5 is Here
 
Lightweight wrapper for Hive on Amazon EMR
Lightweight wrapper for Hive on Amazon EMRLightweight wrapper for Hive on Amazon EMR
Lightweight wrapper for Hive on Amazon EMR
 

Similar to PL/Perl - New Features in PostgreSQL 9.0

Yapcasia2011 - Hello Embed Perl
Yapcasia2011 - Hello Embed PerlYapcasia2011 - Hello Embed Perl
Yapcasia2011 - Hello Embed Perl
Hideaki Ohno
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)
Kang-min Liu
 
various tricks for remote linux exploits  by Seok-Ha Lee (wh1ant)
various tricks for remote linux exploits  by Seok-Ha Lee (wh1ant)various tricks for remote linux exploits  by Seok-Ha Lee (wh1ant)
various tricks for remote linux exploits  by Seok-Ha Lee (wh1ant)
CODE BLUE
 
Good Evils In Perl
Good Evils In PerlGood Evils In Perl
Good Evils In Perl
Kang-min Liu
 
Barely Legal Xxx Perl Presentation
Barely Legal Xxx Perl PresentationBarely Legal Xxx Perl Presentation
Barely Legal Xxx Perl Presentation
Attila Balazs
 
Marrow: A Meta-Framework for Python 2.6+ and 3.1+
Marrow: A Meta-Framework for Python 2.6+ and 3.1+Marrow: A Meta-Framework for Python 2.6+ and 3.1+
Marrow: A Meta-Framework for Python 2.6+ and 3.1+
ConFoo
 

Similar to PL/Perl - New Features in PostgreSQL 9.0 (20)

Yapcasia2011 - Hello Embed Perl
Yapcasia2011 - Hello Embed PerlYapcasia2011 - Hello Embed Perl
Yapcasia2011 - Hello Embed Perl
 
Perl basics for Pentesters
Perl basics for PentestersPerl basics for Pentesters
Perl basics for Pentesters
 
Perl - laziness, impatience, hubris, and one liners
Perl - laziness, impatience, hubris, and one linersPerl - laziness, impatience, hubris, and one liners
Perl - laziness, impatience, hubris, and one liners
 
SPL, not a bridge too far
SPL, not a bridge too farSPL, not a bridge too far
SPL, not a bridge too far
 
Perl one-liners
Perl one-linersPerl one-liners
Perl one-liners
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)
 
various tricks for remote linux exploits  by Seok-Ha Lee (wh1ant)
various tricks for remote linux exploits  by Seok-Ha Lee (wh1ant)various tricks for remote linux exploits  by Seok-Ha Lee (wh1ant)
various tricks for remote linux exploits  by Seok-Ha Lee (wh1ant)
 
Good Evils In Perl
Good Evils In PerlGood Evils In Perl
Good Evils In Perl
 
Performance Profiling in Rust
Performance Profiling in RustPerformance Profiling in Rust
Performance Profiling in Rust
 
Barely Legal Xxx Perl Presentation
Barely Legal Xxx Perl PresentationBarely Legal Xxx Perl Presentation
Barely Legal Xxx Perl Presentation
 
Internationalizing CakePHP Applications
Internationalizing CakePHP ApplicationsInternationalizing CakePHP Applications
Internationalizing CakePHP Applications
 
Integrating icinga2 and the HashiCorp suite
Integrating icinga2 and the HashiCorp suiteIntegrating icinga2 and the HashiCorp suite
Integrating icinga2 and the HashiCorp suite
 
Introduction to Perl
Introduction to PerlIntroduction to Perl
Introduction to Perl
 
Learning Puppet basic thing
Learning Puppet basic thing Learning Puppet basic thing
Learning Puppet basic thing
 
Apache Hadoop Shell Rewrite
Apache Hadoop Shell RewriteApache Hadoop Shell Rewrite
Apache Hadoop Shell Rewrite
 
Marrow: A Meta-Framework for Python 2.6+ and 3.1+
Marrow: A Meta-Framework for Python 2.6+ and 3.1+Marrow: A Meta-Framework for Python 2.6+ and 3.1+
Marrow: A Meta-Framework for Python 2.6+ and 3.1+
 
Puppet @ Seat
Puppet @ SeatPuppet @ Seat
Puppet @ Seat
 
Os Treat
Os TreatOs Treat
Os Treat
 
Perl Moderno
Perl ModernoPerl Moderno
Perl Moderno
 
What's new in Perl 5.10?
What's new in Perl 5.10?What's new in Perl 5.10?
What's new in Perl 5.10?
 

More from Tim Bunce

More from Tim Bunce (12)

Devel::NYTProf v5 at YAPC::NA 201406
Devel::NYTProf v5 at YAPC::NA 201406Devel::NYTProf v5 at YAPC::NA 201406
Devel::NYTProf v5 at YAPC::NA 201406
 
Perl Memory Use 201207 (OUTDATED, see 201209 )
Perl Memory Use 201207 (OUTDATED, see 201209 )Perl Memory Use 201207 (OUTDATED, see 201209 )
Perl Memory Use 201207 (OUTDATED, see 201209 )
 
Perl Dist::Surveyor 2011
Perl Dist::Surveyor 2011Perl Dist::Surveyor 2011
Perl Dist::Surveyor 2011
 
Perl6 DBDI YAPC::EU 201008
Perl6 DBDI YAPC::EU 201008Perl6 DBDI YAPC::EU 201008
Perl6 DBDI YAPC::EU 201008
 
Perl 6 DBDI 201007 (OUTDATED, see 201008)
Perl 6 DBDI 201007 (OUTDATED, see 201008)Perl 6 DBDI 201007 (OUTDATED, see 201008)
Perl 6 DBDI 201007 (OUTDATED, see 201008)
 
DBI Advanced Tutorial 2007
DBI Advanced Tutorial 2007DBI Advanced Tutorial 2007
DBI Advanced Tutorial 2007
 
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)
Devel::NYTProf v3 - 200908 (OUTDATED, see 201008)
 
Perl Myths 200909
Perl Myths 200909Perl Myths 200909
Perl Myths 200909
 
DashProfiler 200807
DashProfiler 200807DashProfiler 200807
DashProfiler 200807
 
DBI for Parrot and Perl 6 Lightning Talk 2007
DBI for Parrot and Perl 6 Lightning Talk 2007DBI for Parrot and Perl 6 Lightning Talk 2007
DBI for Parrot and Perl 6 Lightning Talk 2007
 
Devel::NYTProf 2009-07 (OUTDATED, see 201008)
Devel::NYTProf 2009-07 (OUTDATED, see 201008)Devel::NYTProf 2009-07 (OUTDATED, see 201008)
Devel::NYTProf 2009-07 (OUTDATED, see 201008)
 
Perl Myths 200802 with notes (OUTDATED, see 200909)
Perl Myths 200802 with notes (OUTDATED, see 200909)Perl Myths 200802 with notes (OUTDATED, see 200909)
Perl Myths 200802 with notes (OUTDATED, see 200909)
 

Recently uploaded

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Recently uploaded (20)

Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 

PL/Perl - New Features in PostgreSQL 9.0

  • 1. PL/Perl New Features in PostgreSQL 9.0 Tim Bunce - June 2010 Creative Commons BY-NC-SA 3.0
  • 2. PL/Perl Changes ‣ USER ‣ INTERNAL ‣ DBA ‣ NYTPROF
  • 3. PL/Perl Changes ‣ USER ‣ INTERNAL ‣ DBA ‣ NYTPROF
  • 5. quote_... quote_literal( "foo" ) ==> "'foo'" quote_literal( "don't "carp"" ) ==> "'don''t "carp"'" quote_literal( "" ) ==> "''" quote_nullable( "foo" ) ==> "'foo'" quote_nullable( "don't "carp"" ) ==> "'don''t "carp"'" quote_nullable( "" ) ==> "''" quote_ident( "foo" ) ==> "foo" quote_ident( "don't "carp"" ) ==> ""don't ""carp"""" quote_ident( "" ) ==> """"
  • 6. quote_...(undef) quote_literal( undef ) ==> undef quote_nullable( undef ) ==> "NULL" quote_ident( undef ) ==> """" (warn)
  • 7. {en,de}code_bytea encode_bytea( "foo" ) ==> "x666f6f" decode_bytea( "x666f6f" ) ==> "foo" decode_bytea( "146157157") ==> "foo" encode_bytea( "x{263a}" ) ==> "xe298ba" UTF8 decode_bytea( "xe298ba" ) ==> "342230272" Not UTF8 encode_bytea( "" ) ==> "x" decode_bytea( "x" ) ==> "" decode_bytea( "" ) ==> "" encode_bytea( undef ) ==> "x" (warn) decode_bytea( undef ) ==> "" (warn)
  • 8. looks_like_number looks_like_number( 1 ) ==> 1 looks_like_number( 0 ) ==> 1 looks_like_number( "+7.2e-9" ) ==> 1 looks_like_number( "foo" ) ==> 0 looks_like_number( "" ) ==> 0 looks_like_number( undef ) ==> undef looks_like_number( " 4 " ) ==> 1 looks_like_number( "5plus" ) ==> 0 (but '5plus'+0=5)
  • 9. encode_array_* encode_array_literal( ["foo","bar"] ) ==> "{"foo", "bar"}" encode_array_constructor( ["foo","bar"] ) ==> "ARRAY['foo', 'bar']" encode_array_literal( [1,[2,[undef]]] ) ==> "{"1", {"2", {NULL}}}" encode_array_constructor( [1,[2,[undef]]] ) ==> "ARRAY['1', ARRAY['2', ARRAY[NULL]]]"
  • 10. encode_array_* encode_array_literal( "foo" ) ==> "foo" encode_array_constructor( "foo" ) ==> "'foo'" encode_array_literal( undef ) ==> undef encode_array_constructor( undef ) ==> "NULL"
  • 11. Trusted require/use • require/use work for already loaded modules use strict; # old way: BEGIN { strict->import(); } • extra pre-loaded modules use warnings; use Carp; use feature qw(say); # for perl 5.10 or later use utf8; # if server_encoding is utf8
  • 12. CONTEXT: ... • PL/Perl tracks the context of log messages - before: WARNING: ...some warning from perl code... - now: WARNING: ...some warning from perl code... CONTEXT: PL/Perl function "..."
  • 13. DO '...' LANGUAGE plperl; • Arbitrary chunks of perl code can be executed directly from psql, or client apps, via DO • No need to create and run a stored procedure each time. DO $$ spi_exec("... $_ ...") for 'a'..'z'; $$ language plperl;
  • 14. Other Changes • Using $a and $b in sort blocks now works! • eval { ... } and eval "..." - can now be used in plperl • END blocks are now run at end of session - they can't (currently) access the database • Warnings from perl are now WARNINGs - they used to be NOTICE
  • 15. PL/Perl Changes ‣ USER ‣ INTERNAL ‣ DBA ‣ NYTPROF
  • 16. INTERNAL • The Safe module is no longer used for plperl - Improved security and reduced call overheads - Upgrade to latest security patch! • Validates return values are in server encoding - ERROR: invalid byte sequence for encoding • Internal code refactoring and cleanup
  • 17. PL/Perl Changes ‣ USER ‣ INTERNAL ‣ DBA ‣ NYTPROF
  • 18. New plperl.* Config • Specify perl code to run during initialization: plperl.on_init = '...perl...' plperl.on_plperlu_init = '...perl...' plperl.on_plperl_init = '...perl...' • Can only be set by superuser or postgres.conf • Code can't access the database
  • 19. ~ Timeline ~ ▾ Perl interpreter created on demand ▿ Options from PERL5OPT env var are processed ▿ PL/Perl support code bootstraps ▿ plperl.on_init code runs Above may happen in postmaster at startup if plperl is loaded via shared_preload_libraries ▾ Interpreter is specialised for plperl (or plperlu) ▿ Modules loaded: strict, warnings, features, Carp ▿ Perl operators are restricted (require, open etc.) ▿ DynaLoader package is deleted ▿ plperl.on_plperl_init code runs ▿ Database access is enabled
  • 20. plperl.on_init • Handy to set global perl configuation plperl.on_init='use lib qw(/myapp); use ...;' plperl.on_init='require "plperloninit.pl";' • SECURITY RISK! Only load modules you're happy for plperl code to use! Also check any other modules loaded as dependencies! Use Devel::TraceLoad to see what's actually loaded: PERL5OPT='-MDevel::Trace=summary' pg_ctl ...
  • 21. PL/Perl Best Practice • Include explicit use statements in functions • Don't assume modules have been pre-loaded • For plperlu that'll actually load if needed • For plperl it'll check that module was loaded - so you'll get an immediate clear failure if not - for example on a replica with old postgres.conf file
  • 22. plperl.on_plperl_init • Originally intended for things like - PGOPTIONS="-c plperl.on_plperl_init='...'" - to enable debug or profiling for a session • But... • Can only be set by superuser or postgres.conf - sadly, due to SECURITY DEFINER risks. - You shouldn't write SECURITY DEFINER functions in plperl if untrusted users can use plperl!
  • 23. PL/Perl Changes ‣ USER ‣ INTERNAL ‣ DBA ‣ NYTPROF
  • 24. Devel::NYTProf Perl Source Code Profiler PostgreSQL::PLPerl::NYTProf
  • 25. Enabling NYTProf • Via postgres.conf: plperl.on_init='use PostgreSQL::PLPerl::NYTProf' • Via environment variable: PERL5OPT='-MPostgreSQL::PLPerl::NYTProf' pg_ctl ... • Immediately active. To enable on demand: NYTPROF=start=no PERL5OPT=... pg_ctl ... DO 'DB::enable_profile' LANGUAGE plperl;
  • 26. Reporting from NYTProf • Writes per-backend data files: $PGDATA/nytprof.out.$pid • To generate a report: nytprofhtml --file=$PGDATA/nytprof.out.4321 --open
  • 27. ~ Demo ~ Screencast: http://timbunce.blip.tv Video: http://www.fosslc.org/drupal/content/plperl-new-features-90