SlideShare ist ein Scribd-Unternehmen logo
1 von 16
Downloaden Sie, um offline zu lesen
Perl Stored Procedures for MySQL
Using the Perl plugin for the External
Language Stored Procedure framework.
Antony T Curtis <atcurtis@google.com>
Why Perl?
CPAN
"Multiplicity" / Thread-friendly
Lots of code already written
Clean APIs - example: DBI
MySQL UDFs have no access control
MySQL UDFs cannot execute dynamic SQL
Faster than MySQL's SQL Stored Procedures
Complex code uses less memory than MySQL's SQL SP
Server Overview
Use the source,
Download the source tarball from
https://launchpad.net/mysql-wl820/trunk/5.1.33-wl820
# configure and build
BUILD/compile-pentium-debug-max-no-ndb --no-tune-cpu 
--prefix=<install path>
# install
make install
# initialize db
cd <install path> ; bin/mysql_install_db
Preparing for the first time
Three ways to prepare the mysqld for Perl:
1. INSTALL PLUGIN Perl SONAME "psm_perl.so";
2. command line mysqld parameters
$
libexec/mysqld 
--pluginload=perl=psm_perl.so
3. within the my.cnf config file
[mysqld]
plugin-load=perl=psm_perl.so
"Hello World"
mysql> CREATE PROCEDURE PerlHello()
->
DYNAMIC RESULT SETS 1
->
NO SQL
->
LANGUAGE Perl
->
EXTERNAL NAME "HelloWorld::test";
Query OK, 0 rows affected (0.00 sec)
mysql> CALL PerlHello;
+-----------------------+
| message
|
+-----------------------+
| Hello World from Perl |
+-----------------------+
1 row in set (0.02 sec)
Query OK, 0 rows affected (0.03 sec)

package HelloWorld;
# put this file in <prefix>/lib/mysql/perl
use 5.008008;
use strict;
use warnings;
use Symbol qw(delete_package);
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw( );
our @EXPORT = qw( test );
our $VERSION = '0.01';
 
 
sub test()
{
  return {
    'message' => 'Hello World from Perl',
  };
}
 
1;
Features
Uses Perl prototypes for simplicity
threads don't block each other
pass by value (IN) parameters
pass-by-reference (INOUT/OUT) parameters
simple auto-casting of values
functions have simple single value result
procedure may return single result set
array of hash
array of array
hash result (single row)
array result (single row)
Features, part 2
detects if Perl module has changed and reloads
dynamic SQL support using DBI and DBD::mysql
READS SQL DATA attribute forces read-only mode
NO SQL attribute blocks inline dynamic SQL.
executes dynamic SQL in same thread/transaction
die returns error message up to the client
routines may be used in triggers and events
procedures may be used as table functions
NOTE: Unmodified MySQL does not have table functions, yet!
No dynamic SQL support from triggers, table funcs or events.
Table Functions (example)
mysql> CREATE FUNCTION HelloFunc()
->
RETURNS TABLE (
->
message VARCHAR(64)
->
)
->
NO SQL
->
LANGUAGE Perl
->
EXTERNAL NAME "HelloWorld::test";
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM TABLE(HelloFunc) AS HelloFunc;
+-----------------------+
| message
|
+-----------------------+
| Hello World from Perl |
+-----------------------+
1 row in set (0.01 sec)

Note: Correlation name is mandatory for table functions.
Demonstration
Limitations and gotchas
routines must not fork or create new threads
bad things happen - usually crashes.
functions cannot access tables with dynamic SQL
limitation of MySQL's open_and_lock internals
cannot detect changes in dependent modules
force reload by touching module time-stamp
currently,no way to flush MySQL procedure/function cache
client connection must disconnect to 'forget'
Runs "in-process" with mysqld
can cause mysqld to die from OOM error
can potentially corrupt mysqld internal data
Future Directions
Inline declaration of Perl code
Store code in database
"Fenced" mode
Perl modules would load in separate process
likely to use "process per user or security context"
"Atomic" routines
create SAVEPOINT before entering routine
ROLLBACK SAVEPOINT on error.
Fix/modify MySQL's table opening code (unlikely)
allow routines to open additional tables in read mode
would allow routines to query database without nonstandard SQL syntax hacks
Resources...
LaunchPad project
https://launchpad.net/sakila-server/wl820
Source tarballs
https://launchpad.net/mysql-wl820/trunk/5.1.33-wl820
Perl sources used in demo will be uploaded.
Modified PIE LaunchPad project
https://code.launchpad.net/~atcurtis/pie/devel
Questions?

Antony T Curtis <atcurtis@google.com>
More Perl Examples
#
#
#
#
#
#
#

CREATE FUNCTION error_check(
error_code INT,
error_message VARCHAR(512)
) RETURNS INT
NO SQL
LANGUAGE Perl
EXTERNAL NAME "...::error_check"

sub error_check($$)
{
my ($errcode, $errmsg) = @_;
die "[$errcode] $errmsg"
if $errcode;
return $errcode;
}

#
#
#
#

CREATE PROCEDURE check_data()
READS SQL DATA
LANGUAGE Perl
EXTERNAL NAME "...::check_data"

sub check_data()
{
my $dbh = DBI->connect(
"dbi:mysql:test", undef, undef)
or die "Failed to connect";
# attempts to update/write data
# using this connection will fail.
...
}
More Perl Examples, part 2
#
#
#
#
#
#
#

CREATE FUNCTION my_reverse(
string TEXT
) RETURNS TEXT
NO SQL
LANGUAGE Perl
EXTERNAL NAME
"MyUDFExample::my_reverse";

sub my_reverse($)
{
my($string)= @_;
# print "foon";
return reverse $string;
}

#
#
#
#
#
#
#

CREATE PROCEDURE my_reverseproc(
INOUT string TEXT
)
NO SQL
LANGUAGE Perl
EXTERNAL NAME
"MyUDFExample::my_reverseproc";

sub my_reverseproc($)
{
my($stringref)= @_;
$$stringref= reverse $$stringref;
# no resultsets
return undef;
}

Weitere ähnliche Inhalte

Was ist angesagt?

MySQL Performance schema missing_manual_flossuk
MySQL Performance schema missing_manual_flossukMySQL Performance schema missing_manual_flossuk
MySQL Performance schema missing_manual_flossuk
Valeriy Kravchuk
 

Was ist angesagt? (20)

More on gdb for my sql db as (fosdem 2016)
More on gdb for my sql db as (fosdem 2016)More on gdb for my sql db as (fosdem 2016)
More on gdb for my sql db as (fosdem 2016)
 
MySQL Performance schema missing_manual_flossuk
MySQL Performance schema missing_manual_flossukMySQL Performance schema missing_manual_flossuk
MySQL Performance schema missing_manual_flossuk
 
Introduction to MySQL InnoDB Cluster
Introduction to MySQL InnoDB ClusterIntroduction to MySQL InnoDB Cluster
Introduction to MySQL InnoDB Cluster
 
Flame Graphs for MySQL DBAs - FOSDEM 2022 MySQL Devroom
Flame Graphs for MySQL DBAs - FOSDEM 2022 MySQL DevroomFlame Graphs for MySQL DBAs - FOSDEM 2022 MySQL Devroom
Flame Graphs for MySQL DBAs - FOSDEM 2022 MySQL Devroom
 
New features in Performance Schema 5.7 in action
New features in Performance Schema 5.7 in actionNew features in Performance Schema 5.7 in action
New features in Performance Schema 5.7 in action
 
Mysql all
Mysql allMysql all
Mysql all
 
MariaDB for developers
MariaDB for developersMariaDB for developers
MariaDB for developers
 
HandlerSocket - A NoSQL plugin for MySQL
HandlerSocket - A NoSQL plugin for MySQLHandlerSocket - A NoSQL plugin for MySQL
HandlerSocket - A NoSQL plugin for MySQL
 
Summary tables with flexviews
Summary tables with flexviewsSummary tables with flexviews
Summary tables with flexviews
 
Mysql 56-experiences-bugs-solutions-50mins
Mysql 56-experiences-bugs-solutions-50minsMysql 56-experiences-bugs-solutions-50mins
Mysql 56-experiences-bugs-solutions-50mins
 
HandlerSocket plugin for MySQL (English)
HandlerSocket plugin for MySQL (English)HandlerSocket plugin for MySQL (English)
HandlerSocket plugin for MySQL (English)
 
Gdb basics for my sql db as (openfest 2017) final
Gdb basics for my sql db as (openfest 2017) finalGdb basics for my sql db as (openfest 2017) final
Gdb basics for my sql db as (openfest 2017) final
 
MySQL Performance Schema in Action
MySQL Performance Schema in ActionMySQL Performance Schema in Action
MySQL Performance Schema in Action
 
MySQL JSON Functions
MySQL JSON FunctionsMySQL JSON Functions
MySQL JSON Functions
 
PostgreSQL Database Slides
PostgreSQL Database SlidesPostgreSQL Database Slides
PostgreSQL Database Slides
 
Instant add column for inno db in mariadb 10.3+ (fosdem 2018, second draft)
Instant add column for inno db in mariadb 10.3+ (fosdem 2018, second draft)Instant add column for inno db in mariadb 10.3+ (fosdem 2018, second draft)
Instant add column for inno db in mariadb 10.3+ (fosdem 2018, second draft)
 
PPT
PPTPPT
PPT
 
Introduction to MySQL Query Tuning for Dev[Op]s
Introduction to MySQL Query Tuning for Dev[Op]sIntroduction to MySQL Query Tuning for Dev[Op]s
Introduction to MySQL Query Tuning for Dev[Op]s
 
FOSDEM 2015: gdb tips and tricks for MySQL DBAs
FOSDEM 2015: gdb tips and tricks for MySQL DBAsFOSDEM 2015: gdb tips and tricks for MySQL DBAs
FOSDEM 2015: gdb tips and tricks for MySQL DBAs
 
PostgreSQL- An Introduction
PostgreSQL- An IntroductionPostgreSQL- An Introduction
PostgreSQL- An Introduction
 

Ähnlich wie Perl Stored Procedures for MySQL (2009)

Introduction to Threading in .Net
Introduction to Threading in .NetIntroduction to Threading in .Net
Introduction to Threading in .Net
webhostingguy
 
Data Handning with Sqlite for Android
Data Handning with Sqlite for AndroidData Handning with Sqlite for Android
Data Handning with Sqlite for Android
Jakir Hossain
 
Bypass dbms assert
Bypass dbms assertBypass dbms assert
Bypass dbms assert
fangjiafu
 
android sqlite
android sqliteandroid sqlite
android sqlite
Deepa Rani
 

Ähnlich wie Perl Stored Procedures for MySQL (2009) (20)

MySQL Day Roma - MySQL Shell and Visual Studio Code Extension
MySQL Day Roma - MySQL Shell and Visual Studio Code ExtensionMySQL Day Roma - MySQL Shell and Visual Studio Code Extension
MySQL Day Roma - MySQL Shell and Visual Studio Code Extension
 
Watch Re-runs on your SQL Server with RML Utilities
Watch Re-runs on your SQL Server with RML UtilitiesWatch Re-runs on your SQL Server with RML Utilities
Watch Re-runs on your SQL Server with RML Utilities
 
Introduction to Threading in .Net
Introduction to Threading in .NetIntroduction to Threading in .Net
Introduction to Threading in .Net
 
Data Handning with Sqlite for Android
Data Handning with Sqlite for AndroidData Handning with Sqlite for Android
Data Handning with Sqlite for Android
 
Confoo 2021 -- MySQL New Features
Confoo 2021 -- MySQL New FeaturesConfoo 2021 -- MySQL New Features
Confoo 2021 -- MySQL New Features
 
Bypass dbms assert
Bypass dbms assertBypass dbms assert
Bypass dbms assert
 
Built-in query caching for all PHP MySQL extensions/APIs
Built-in query caching for all PHP MySQL extensions/APIsBuilt-in query caching for all PHP MySQL extensions/APIs
Built-in query caching for all PHP MySQL extensions/APIs
 
Php classes in mumbai
Php classes in mumbaiPhp classes in mumbai
Php classes in mumbai
 
android sqlite
android sqliteandroid sqlite
android sqlite
 
Raj mysql
Raj mysqlRaj mysql
Raj mysql
 
Writing & Sharing Great Modules - Puppet Camp Boston
Writing & Sharing Great Modules - Puppet Camp BostonWriting & Sharing Great Modules - Puppet Camp Boston
Writing & Sharing Great Modules - Puppet Camp Boston
 
Pluggable Databases: What they will break and why you should use them anyway!
Pluggable Databases: What they will break and why you should use them anyway!Pluggable Databases: What they will break and why you should use them anyway!
Pluggable Databases: What they will break and why you should use them anyway!
 
common_schema, DBA's framework for MySQL
common_schema, DBA's framework for MySQLcommon_schema, DBA's framework for MySQL
common_schema, DBA's framework for MySQL
 
Cordova training - Day 9 - SQLITE
Cordova training - Day 9 - SQLITECordova training - Day 9 - SQLITE
Cordova training - Day 9 - SQLITE
 
Sah
SahSah
Sah
 
Mysql ppt
Mysql pptMysql ppt
Mysql ppt
 
Mysqlnd, an unknown powerful PHP extension
Mysqlnd, an unknown powerful PHP extensionMysqlnd, an unknown powerful PHP extension
Mysqlnd, an unknown powerful PHP extension
 
HTTP, JSON, JavaScript, Map&Reduce built-in to MySQL
HTTP, JSON, JavaScript, Map&Reduce built-in to MySQLHTTP, JSON, JavaScript, Map&Reduce built-in to MySQL
HTTP, JSON, JavaScript, Map&Reduce built-in to MySQL
 
Database design i_-_1_dl300
Database design i_-_1_dl300Database design i_-_1_dl300
Database design i_-_1_dl300
 
PHP - Intriduction to MySQL And PHP
PHP - Intriduction to MySQL And PHPPHP - Intriduction to MySQL And PHP
PHP - Intriduction to MySQL And PHP
 

Kürzlich hochgeladen

Kürzlich hochgeladen (20)

GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 

Perl Stored Procedures for MySQL (2009)

  • 1. Perl Stored Procedures for MySQL Using the Perl plugin for the External Language Stored Procedure framework. Antony T Curtis <atcurtis@google.com>
  • 2. Why Perl? CPAN "Multiplicity" / Thread-friendly Lots of code already written Clean APIs - example: DBI MySQL UDFs have no access control MySQL UDFs cannot execute dynamic SQL Faster than MySQL's SQL Stored Procedures Complex code uses less memory than MySQL's SQL SP
  • 4. Use the source, Download the source tarball from https://launchpad.net/mysql-wl820/trunk/5.1.33-wl820 # configure and build BUILD/compile-pentium-debug-max-no-ndb --no-tune-cpu --prefix=<install path> # install make install # initialize db cd <install path> ; bin/mysql_install_db
  • 5. Preparing for the first time Three ways to prepare the mysqld for Perl: 1. INSTALL PLUGIN Perl SONAME "psm_perl.so"; 2. command line mysqld parameters $ libexec/mysqld --pluginload=perl=psm_perl.so 3. within the my.cnf config file [mysqld] plugin-load=perl=psm_perl.so
  • 6. "Hello World" mysql> CREATE PROCEDURE PerlHello() -> DYNAMIC RESULT SETS 1 -> NO SQL -> LANGUAGE Perl -> EXTERNAL NAME "HelloWorld::test"; Query OK, 0 rows affected (0.00 sec) mysql> CALL PerlHello; +-----------------------+ | message | +-----------------------+ | Hello World from Perl | +-----------------------+ 1 row in set (0.02 sec) Query OK, 0 rows affected (0.03 sec) package HelloWorld; # put this file in <prefix>/lib/mysql/perl use 5.008008; use strict; use warnings; use Symbol qw(delete_package); require Exporter; our @ISA = qw(Exporter); our @EXPORT_OK = qw( ); our @EXPORT = qw( test ); our $VERSION = '0.01';     sub test() {   return {     'message' => 'Hello World from Perl',   }; }   1;
  • 7. Features Uses Perl prototypes for simplicity threads don't block each other pass by value (IN) parameters pass-by-reference (INOUT/OUT) parameters simple auto-casting of values functions have simple single value result procedure may return single result set array of hash array of array hash result (single row) array result (single row)
  • 8. Features, part 2 detects if Perl module has changed and reloads dynamic SQL support using DBI and DBD::mysql READS SQL DATA attribute forces read-only mode NO SQL attribute blocks inline dynamic SQL. executes dynamic SQL in same thread/transaction die returns error message up to the client routines may be used in triggers and events procedures may be used as table functions NOTE: Unmodified MySQL does not have table functions, yet! No dynamic SQL support from triggers, table funcs or events.
  • 9. Table Functions (example) mysql> CREATE FUNCTION HelloFunc() -> RETURNS TABLE ( -> message VARCHAR(64) -> ) -> NO SQL -> LANGUAGE Perl -> EXTERNAL NAME "HelloWorld::test"; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM TABLE(HelloFunc) AS HelloFunc; +-----------------------+ | message | +-----------------------+ | Hello World from Perl | +-----------------------+ 1 row in set (0.01 sec) Note: Correlation name is mandatory for table functions.
  • 11. Limitations and gotchas routines must not fork or create new threads bad things happen - usually crashes. functions cannot access tables with dynamic SQL limitation of MySQL's open_and_lock internals cannot detect changes in dependent modules force reload by touching module time-stamp currently,no way to flush MySQL procedure/function cache client connection must disconnect to 'forget' Runs "in-process" with mysqld can cause mysqld to die from OOM error can potentially corrupt mysqld internal data
  • 12. Future Directions Inline declaration of Perl code Store code in database "Fenced" mode Perl modules would load in separate process likely to use "process per user or security context" "Atomic" routines create SAVEPOINT before entering routine ROLLBACK SAVEPOINT on error. Fix/modify MySQL's table opening code (unlikely) allow routines to open additional tables in read mode would allow routines to query database without nonstandard SQL syntax hacks
  • 13. Resources... LaunchPad project https://launchpad.net/sakila-server/wl820 Source tarballs https://launchpad.net/mysql-wl820/trunk/5.1.33-wl820 Perl sources used in demo will be uploaded. Modified PIE LaunchPad project https://code.launchpad.net/~atcurtis/pie/devel
  • 14. Questions? Antony T Curtis <atcurtis@google.com>
  • 15. More Perl Examples # # # # # # # CREATE FUNCTION error_check( error_code INT, error_message VARCHAR(512) ) RETURNS INT NO SQL LANGUAGE Perl EXTERNAL NAME "...::error_check" sub error_check($$) { my ($errcode, $errmsg) = @_; die "[$errcode] $errmsg" if $errcode; return $errcode; } # # # # CREATE PROCEDURE check_data() READS SQL DATA LANGUAGE Perl EXTERNAL NAME "...::check_data" sub check_data() { my $dbh = DBI->connect( "dbi:mysql:test", undef, undef) or die "Failed to connect"; # attempts to update/write data # using this connection will fail. ... }
  • 16. More Perl Examples, part 2 # # # # # # # CREATE FUNCTION my_reverse( string TEXT ) RETURNS TEXT NO SQL LANGUAGE Perl EXTERNAL NAME "MyUDFExample::my_reverse"; sub my_reverse($) { my($string)= @_; # print "foon"; return reverse $string; } # # # # # # # CREATE PROCEDURE my_reverseproc( INOUT string TEXT ) NO SQL LANGUAGE Perl EXTERNAL NAME "MyUDFExample::my_reverseproc"; sub my_reverseproc($) { my($stringref)= @_; $$stringref= reverse $$stringref; # no resultsets return undef; }