SlideShare a Scribd company logo
1 of 33
Download to read offline
PostgreSQL and PL/Java

     Server-Side Functions in Java

                 Peter Eisentraut
           petere@postgresql.org
Agenda
•   Functions in PostgreSQL
•   Enter PL/Java
•   Features of PL/Java
•   Support and Compatibility
•   Outlook and Wrap-Up




                                2
Defining a Function
Example of an SQL function:

CREATE FUNCTION add(int, int) RETURNS int
 LANGUAGE SQL
 AS 'SELECT $1 + $2;';


SELECT add(4, 5);
add
-----
   9



                                            3
Defining a Function
Example of a C function:

PG_FUNCTION_INFO_V1(funcname);
Datum add(PG_FUNCTION_ARGS)
{
    int32 a = PG_GETARG_INT32(0);
    int32 b = PG_GETARG_INT32(1);


    PG_RETURN_INT32(a + b);
}


                                    4
Defining a Function
Example of a C function, continued:

gcc -fPIC -c file.c
gcc -shared -o file.so file.o


CREATE FUNCTION add(int, int) RETURNS int
 LANGUAGE C
 AS 'file.so', 'add';




                                            5
Features of Functions
• Overloading
• Processing sets/tables
• Caching options
  (deterministic/nondeterministic)
• Execution privileges




                                     6
Advantages of Server-Side
             Functions
•   Encapsulation
•   Faster database access
•   Plan caching, inlining
•   Data validation through triggers
•   Side effects through triggers




                                       7
Functions as Building Blocks
•   Operators
•   Data types
•   Aggregate functions
•   Index access methods
•   Type casts
•   Character set conversions



                                    8
Procedural Languages
• Choice of SQL vs. C quite limited
• Solution: pluggable language handlers

• Available languages:
  Tcl, PL/pgSQL, Perl, Ruby, Python, Shell,
  R, Java, PHP



                                              9
Procedural Language Example:
          PL/pgSQL
CREATE FUNCTION logfunc(logtxt text)
 RETURNS timestamp
AS '
 DECLARE
       curtime timestamp;
 BEGIN
       curtime := ''now'';
       INSERT INTO logtable VALUES (logtxt, curtime);
       RETURN curtime;
 END;
' LANGUAGE plpgsql;

                                                        10
Procedural Language Example:
            PL/Perl
CREATE OR REPLACE FUNCTION valid_id()
 RETURNS trigger
AS '
 if (($_TD->{new}{i} >= 100) || ($_TD->{new}{i} <= 0)) {
     return "SKIP";     # skip INSERT/UPDATE command
 } elsif ($_TD->{new}{v} ne "immortal") {
     $_TD->{new}{v} .= "(modified by trigger)";
     return "MODIFY";   # modify row and run INSERT/UPDATE
 } else {
     return;            # execute INSERT/UPDATE command
 }
' LANGUAGE plperl;

                                                             11
Enter PL/Java
• Developed by Thomas Hallgren

• Stored procedures written in the Java
  language
• Java the most popular (client) language for
  PostgreSQL



                                            12
Standardization
SQL standard: ISO/IEC 9075-13:2003
SQL Routines and Types for the Java
  Programming Language ("SQL/JRT")
(210 pages)
driven by Oracle and IBM




                                      13
Timeline of PL/Java
•   Nov. 2000: first attempt with Kaffe 1.0.6
•   Dec. 2003: PL/Java project launched
•   Jan. 2004: first alpha release
•   Jan. 2005: release 1.0.0 (for PG 7.4)
•   Apr. 2005: release 1.1.0 (for PG 8.0)
•   currently “stable”



                                                14
Concept
•   Write a Java class
•   Designate static method as entry point
•   Pack into JAR
•   Load JAR into database
•   Adjust classpath
•   Create function in PostgreSQL



                                             15
Simple Example: Code
package com.example;


public class Foo
{
    static int add(int a, int b)
    {
        return a + b;
    }
}




                                   16
Simple Example: Deployment
javac com/example/Foo.java
jar cf foo.jar com/example/Foo.class


SELECT
  sqlj.install_jar('file:/home/peter/tmp/foo.jar',
  'foo', false);


SELECT sqlj.set_classpath('public', 'foo:bar:etc');


CREATE FUNCTION add(int, int) RETURNS int
 LANGUAGE java
 AS 'com.example.Foo.add';
                                                      17
Deployment Descriptor
Optional way to integrate install/uninstall SQL
 statements into the JAR file:
SQLActions[] = {
    "BEGIN INSTALL
      CREATE FUNCTION add(int, int) RETURNS int
        LANGUAGE java
        AS 'com.example.Foo.add';
    END INSTALL",
    "BEGIN REMOVE
      DROP FUNCTION add(int, int);
    END REMOVE"
}


                                                  18
Configuration
New parameters for postgresql.conf:

custom_variable_classes = 'pljava'


pljava.classpath = '/some/where/pljava.jar'
pljava.statement_cache_size = 10
pljava.release_lingering_savepoints = true
pljava.vmoptions = '-Xmx64M'
pljava.debug = false




                                              19
Parameter Type Mapping
Parameter types are mapped automatically:
  PostgreSQL         Java
  boolean            boolean
  shortint           short
  int                int
  bigint             long
  real               float
  double precision   double
  varchar, text      java.lang.String
  bytea              byte[]
  date               java.sql.Date
  time               java.sql.Time
  timestamp          java.sql.Timestamp
  other              java.lang.String


                                            20
Composite Types
CREATE TYPE compositeTest AS (
     base    integer,
     incbase integer,
     ctime   timestamp
);


CREATE FUNCTION useCompositeTest (compositeTest)
     RETURNS varchar
     AS 'foo.fee.Fum.useCompositeTest'
     LANGUAGE java;



                                                   21
Composite Types
Represented as java.sql.ResultSet with one
 row.
public static String useCompositeTest(ResultSet
   compositeTest) throws SQLException
{
    int base = compositeTest.getInt(1);
    int incbase = compositeTest.getInt(2);
    Timestamp ctime = compositeTest.getTimestamp(3);
    return "Base = "" + base +
     "", incbase = "" + incbase +
     "", ctime = "" + ctime + """;
}

                                                       22
Returning Sets
CREATE FUNCTION getNames() RETURNS SETOF varchar
   AS 'Bar.getNames'
   LANGUAGE java;


import java.util.Iterator;
public class Bar {
    public static Iterator getNames() {
        ArrayList names = new ArrayList();
        names.add("Lisa");
        names.add("Bob");
        names.add("Bill");
        return names.iterator();
    }
}

                                                   23
Built-in JDBC Driver
• Prepare/execute queries
• Query metadata
• No transaction management (can use
  savepoints)

Connection conn =
  DriverManager.getConnection("jdbc:default:connectio
  n");




                                                   24
Triggers
static void moddatetime(TriggerData td) throws SQLException
{
    if(td.isFiredForStatement())
     throw new TriggerException(td, "can't process STATEMENT events");
    if(td.isFiredAfter())
     throw new TriggerException(td, "must be fired before event");
    if(!td.isFiredByUpdate())
     throw new TriggerException(td, "can only process UPDATE events");


    ResultSet _new = td.getNew();
    String[] args = td.getArguments();
    if (args.length != 1)
     throw new TriggerException(td, "one argument was expected");
    _new.updateTimestamp(args[0], new Timestamp(System.currentTimeMillis()));
}

                                                                            25
Other Features
•   Exception handling
•   Logging
•   DatabaseMetaData
•   Multithreading
•   IN/OUT parameters (PostgreSQL 8.1)
•   Security



                                         26
Problem Areas
• Memory usage
• Performance?
• Stack handling




                           27
Build Options
• Builds with:
  • Sun JDK ≥ 1.4 (shared library + JAR)
  • GCJ ≥ 4.0 (shared library)
• Does not work with:
  • Kaffe
  • SableVM




                                           28
GCJ Issues
• Missing java.security implementation
• GCJ-based PL/Java installations are
  untrusted.




                                         29
Supported Platforms
• Linux (most architectures)
• Cygwin
• Windows (PostgreSQL 8.1/recent)

• More reports welcome!




                                    30
Compatibility
• vs. Oracle:
  • data type system not as good
  • trigger procedures not compatible (wrappers
    possible)
• vs. DB/2, Firebird, ...:
  • unknown




                                                  31
The Future
• Dynamic type system (SQL:2003)
• Work on SQL conformance and
  compatibility
• More work on J4SQL
• Cooperation with PL/J project




                                   32
Conclusion
•   PL/Java is stable today.
•   It is being used.
•   It is almost feature complete.
•   Get it now!




http://gborg.postgresql.org/project/pljava/projdisplay.php

                                                       33

More Related Content

What's hot

7. the elizabethan theatre
7. the elizabethan theatre7. the elizabethan theatre
7. the elizabethan theatre
micheleleoni
 
Div Tag Tutorial
Div Tag TutorialDiv Tag Tutorial
Div Tag Tutorial
bav123
 
Bowling Game Kata
Bowling Game KataBowling Game Kata
Bowling Game Kata
guest958d7
 

What's hot (16)

Collections Framework
Collections FrameworkCollections Framework
Collections Framework
 
CSS
CSS CSS
CSS
 
Three.js basics
Three.js basicsThree.js basics
Three.js basics
 
Keep your code clean
Keep your code cleanKeep your code clean
Keep your code clean
 
Java Course 8: I/O, Files and Streams
Java Course 8: I/O, Files and StreamsJava Course 8: I/O, Files and Streams
Java Course 8: I/O, Files and Streams
 
Java Swing JFC
Java Swing JFCJava Swing JFC
Java Swing JFC
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
 
ReactJS presentation.pptx
ReactJS presentation.pptxReactJS presentation.pptx
ReactJS presentation.pptx
 
7. the elizabethan theatre
7. the elizabethan theatre7. the elizabethan theatre
7. the elizabethan theatre
 
OOP V3.1
OOP V3.1OOP V3.1
OOP V3.1
 
Java programming-examples
Java programming-examplesJava programming-examples
Java programming-examples
 
Div Tag Tutorial
Div Tag TutorialDiv Tag Tutorial
Div Tag Tutorial
 
Log4 J
Log4 JLog4 J
Log4 J
 
Bowling Game Kata
Bowling Game KataBowling Game Kata
Bowling Game Kata
 
Cobol Web com Net Express 5.1 - Parte 3
Cobol Web com Net Express 5.1 - Parte 3Cobol Web com Net Express 5.1 - Parte 3
Cobol Web com Net Express 5.1 - Parte 3
 
Spring Data JPA from 0-100 in 60 minutes
Spring Data JPA from 0-100 in 60 minutesSpring Data JPA from 0-100 in 60 minutes
Spring Data JPA from 0-100 in 60 minutes
 

Similar to PostgreSQL and PL/Java

Terence Barr - jdk7+8 - 24mai2011
Terence Barr - jdk7+8 - 24mai2011Terence Barr - jdk7+8 - 24mai2011
Terence Barr - jdk7+8 - 24mai2011
Agora Group
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing Up
David Padbury
 

Similar to PostgreSQL and PL/Java (20)

New Features Of JDK 7
New Features Of JDK 7New Features Of JDK 7
New Features Of JDK 7
 
Java 7 Whats New(), Whats Next() from Oredev
Java 7 Whats New(), Whats Next() from OredevJava 7 Whats New(), Whats Next() from Oredev
Java 7 Whats New(), Whats Next() from Oredev
 
What to expect from Java 9
What to expect from Java 9What to expect from Java 9
What to expect from Java 9
 
JDK1.7 features
JDK1.7 featuresJDK1.7 features
JDK1.7 features
 
Java Future S Ritter
Java Future S RitterJava Future S Ritter
Java Future S Ritter
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Java 9-10 What's New
Java 9-10 What's NewJava 9-10 What's New
Java 9-10 What's New
 
Terence Barr - jdk7+8 - 24mai2011
Terence Barr - jdk7+8 - 24mai2011Terence Barr - jdk7+8 - 24mai2011
Terence Barr - jdk7+8 - 24mai2011
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing Up
 
Spock
SpockSpock
Spock
 
Meetup cassandra sfo_jdbc
Meetup cassandra sfo_jdbcMeetup cassandra sfo_jdbc
Meetup cassandra sfo_jdbc
 
Gradle
GradleGradle
Gradle
 
Jdbc
JdbcJdbc
Jdbc
 
Slickdemo
SlickdemoSlickdemo
Slickdemo
 
A New Chapter of Data Processing with CDK
A New Chapter of Data Processing with CDKA New Chapter of Data Processing with CDK
A New Chapter of Data Processing with CDK
 
Spring data requery
Spring data requerySpring data requery
Spring data requery
 
De Java 8 a Java 11 y 14
De Java 8 a Java 11 y 14De Java 8 a Java 11 y 14
De Java 8 a Java 11 y 14
 
Angularjs Test Driven Development (TDD)
Angularjs Test Driven Development (TDD)Angularjs Test Driven Development (TDD)
Angularjs Test Driven Development (TDD)
 
Test-Driven Development of AngularJS Applications
Test-Driven Development of AngularJS ApplicationsTest-Driven Development of AngularJS Applications
Test-Driven Development of AngularJS Applications
 
JUnit5 and TestContainers
JUnit5 and TestContainersJUnit5 and TestContainers
JUnit5 and TestContainers
 

More from Peter Eisentraut

Replication Solutions for PostgreSQL
Replication Solutions for PostgreSQLReplication Solutions for PostgreSQL
Replication Solutions for PostgreSQL
Peter Eisentraut
 
The Common Debian Build System (CDBS)
The Common Debian Build System (CDBS)The Common Debian Build System (CDBS)
The Common Debian Build System (CDBS)
Peter Eisentraut
 

More from Peter Eisentraut (20)

Programming with Python and PostgreSQL
Programming with Python and PostgreSQLProgramming with Python and PostgreSQL
Programming with Python and PostgreSQL
 
Getting Started with PL/Proxy
Getting Started with PL/ProxyGetting Started with PL/Proxy
Getting Started with PL/Proxy
 
Linux distribution for the cloud
Linux distribution for the cloudLinux distribution for the cloud
Linux distribution for the cloud
 
Most Wanted: Future PostgreSQL Features
Most Wanted: Future PostgreSQL FeaturesMost Wanted: Future PostgreSQL Features
Most Wanted: Future PostgreSQL Features
 
Porting Applications From Oracle To PostgreSQL
Porting Applications From Oracle To PostgreSQLPorting Applications From Oracle To PostgreSQL
Porting Applications From Oracle To PostgreSQL
 
Porting Oracle Applications to PostgreSQL
Porting Oracle Applications to PostgreSQLPorting Oracle Applications to PostgreSQL
Porting Oracle Applications to PostgreSQL
 
PostgreSQL and XML
PostgreSQL and XMLPostgreSQL and XML
PostgreSQL and XML
 
XML Support: Specifications and Development
XML Support: Specifications and DevelopmentXML Support: Specifications and Development
XML Support: Specifications and Development
 
PostgreSQL: Die Freie Datenbankalternative
PostgreSQL: Die Freie DatenbankalternativePostgreSQL: Die Freie Datenbankalternative
PostgreSQL: Die Freie Datenbankalternative
 
The Road to the XML Type: Current and Future Developments
The Road to the XML Type: Current and Future DevelopmentsThe Road to the XML Type: Current and Future Developments
The Road to the XML Type: Current and Future Developments
 
Access ohne Access: Freie Datenbank-Frontends
Access ohne Access: Freie Datenbank-FrontendsAccess ohne Access: Freie Datenbank-Frontends
Access ohne Access: Freie Datenbank-Frontends
 
Replication Solutions for PostgreSQL
Replication Solutions for PostgreSQLReplication Solutions for PostgreSQL
Replication Solutions for PostgreSQL
 
PostgreSQL News
PostgreSQL NewsPostgreSQL News
PostgreSQL News
 
PostgreSQL News
PostgreSQL NewsPostgreSQL News
PostgreSQL News
 
Access ohne Access: Freie Datenbank-Frontends
Access ohne Access: Freie Datenbank-FrontendsAccess ohne Access: Freie Datenbank-Frontends
Access ohne Access: Freie Datenbank-Frontends
 
Docbook: Textverarbeitung mit XML
Docbook: Textverarbeitung mit XMLDocbook: Textverarbeitung mit XML
Docbook: Textverarbeitung mit XML
 
Collateral Damage: Consequences of Spam and Virus Filtering for the E-Mail Sy...
Collateral Damage: Consequences of Spam and Virus Filtering for the E-Mail Sy...Collateral Damage: Consequences of Spam and Virus Filtering for the E-Mail Sy...
Collateral Damage: Consequences of Spam and Virus Filtering for the E-Mail Sy...
 
Collateral Damage: Consequences of Spam and Virus Filtering for the E-Mail S...
Collateral Damage:
Consequences of Spam and Virus Filtering for the E-Mail S...Collateral Damage:
Consequences of Spam and Virus Filtering for the E-Mail S...
Collateral Damage: Consequences of Spam and Virus Filtering for the E-Mail S...
 
Spaß mit PostgreSQL
Spaß mit PostgreSQLSpaß mit PostgreSQL
Spaß mit PostgreSQL
 
The Common Debian Build System (CDBS)
The Common Debian Build System (CDBS)The Common Debian Build System (CDBS)
The Common Debian Build System (CDBS)
 

Recently uploaded

“Iamnobody89757” Understanding the Mysterious of Digital Identity.pdf
“Iamnobody89757” Understanding the Mysterious of Digital Identity.pdf“Iamnobody89757” Understanding the Mysterious of Digital Identity.pdf
“Iamnobody89757” Understanding the Mysterious of Digital Identity.pdf
Muhammad Subhan
 
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptxHarnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
FIDO Alliance
 

Recently uploaded (20)

Observability Concepts EVERY Developer Should Know (DevOpsDays Seattle)
Observability Concepts EVERY Developer Should Know (DevOpsDays Seattle)Observability Concepts EVERY Developer Should Know (DevOpsDays Seattle)
Observability Concepts EVERY Developer Should Know (DevOpsDays Seattle)
 
JavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate GuideJavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate Guide
 
Generative AI Use Cases and Applications.pdf
Generative AI Use Cases and Applications.pdfGenerative AI Use Cases and Applications.pdf
Generative AI Use Cases and Applications.pdf
 
الأمن السيبراني - ما لا يسع للمستخدم جهله
الأمن السيبراني - ما لا يسع للمستخدم جهلهالأمن السيبراني - ما لا يسع للمستخدم جهله
الأمن السيبراني - ما لا يسع للمستخدم جهله
 
Working together SRE & Platform Engineering
Working together SRE & Platform EngineeringWorking together SRE & Platform Engineering
Working together SRE & Platform Engineering
 
ChatGPT and Beyond - Elevating DevOps Productivity
ChatGPT and Beyond - Elevating DevOps ProductivityChatGPT and Beyond - Elevating DevOps Productivity
ChatGPT and Beyond - Elevating DevOps Productivity
 
Human Expert Website Manual WCAG 2.0 2.1 2.2 Audit - Digital Accessibility Au...
Human Expert Website Manual WCAG 2.0 2.1 2.2 Audit - Digital Accessibility Au...Human Expert Website Manual WCAG 2.0 2.1 2.2 Audit - Digital Accessibility Au...
Human Expert Website Manual WCAG 2.0 2.1 2.2 Audit - Digital Accessibility Au...
 
Overview of Hyperledger Foundation
Overview of Hyperledger FoundationOverview of Hyperledger Foundation
Overview of Hyperledger Foundation
 
Event-Driven Architecture Masterclass: Integrating Distributed Data Stores Ac...
Event-Driven Architecture Masterclass: Integrating Distributed Data Stores Ac...Event-Driven Architecture Masterclass: Integrating Distributed Data Stores Ac...
Event-Driven Architecture Masterclass: Integrating Distributed Data Stores Ac...
 
JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptx
 
“Iamnobody89757” Understanding the Mysterious of Digital Identity.pdf
“Iamnobody89757” Understanding the Mysterious of Digital Identity.pdf“Iamnobody89757” Understanding the Mysterious of Digital Identity.pdf
“Iamnobody89757” Understanding the Mysterious of Digital Identity.pdf
 
Portal Kombat : extension du réseau de propagande russe
Portal Kombat : extension du réseau de propagande russePortal Kombat : extension du réseau de propagande russe
Portal Kombat : extension du réseau de propagande russe
 
Cyber Insurance - RalphGilot - Embry-Riddle Aeronautical University.pptx
Cyber Insurance - RalphGilot - Embry-Riddle Aeronautical University.pptxCyber Insurance - RalphGilot - Embry-Riddle Aeronautical University.pptx
Cyber Insurance - RalphGilot - Embry-Riddle Aeronautical University.pptx
 
Design Guidelines for Passkeys 2024.pptx
Design Guidelines for Passkeys 2024.pptxDesign Guidelines for Passkeys 2024.pptx
Design Guidelines for Passkeys 2024.pptx
 
WebRTC and SIP not just audio and video @ OpenSIPS 2024
WebRTC and SIP not just audio and video @ OpenSIPS 2024WebRTC and SIP not just audio and video @ OpenSIPS 2024
WebRTC and SIP not just audio and video @ OpenSIPS 2024
 
Microsoft CSP Briefing Pre-Engagement - Questionnaire
Microsoft CSP Briefing Pre-Engagement - QuestionnaireMicrosoft CSP Briefing Pre-Engagement - Questionnaire
Microsoft CSP Briefing Pre-Engagement - Questionnaire
 
Design and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data ScienceDesign and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data Science
 
Oauth 2.0 Introduction and Flows with MuleSoft
Oauth 2.0 Introduction and Flows with MuleSoftOauth 2.0 Introduction and Flows with MuleSoft
Oauth 2.0 Introduction and Flows with MuleSoft
 
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptxHarnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
Harnessing Passkeys in the Battle Against AI-Powered Cyber Threats.pptx
 
Easier, Faster, and More Powerful – Notes Document Properties Reimagined
Easier, Faster, and More Powerful – Notes Document Properties ReimaginedEasier, Faster, and More Powerful – Notes Document Properties Reimagined
Easier, Faster, and More Powerful – Notes Document Properties Reimagined
 

PostgreSQL and PL/Java

  • 1. PostgreSQL and PL/Java Server-Side Functions in Java Peter Eisentraut petere@postgresql.org
  • 2. Agenda • Functions in PostgreSQL • Enter PL/Java • Features of PL/Java • Support and Compatibility • Outlook and Wrap-Up 2
  • 3. Defining a Function Example of an SQL function: CREATE FUNCTION add(int, int) RETURNS int LANGUAGE SQL AS 'SELECT $1 + $2;'; SELECT add(4, 5); add ----- 9 3
  • 4. Defining a Function Example of a C function: PG_FUNCTION_INFO_V1(funcname); Datum add(PG_FUNCTION_ARGS) { int32 a = PG_GETARG_INT32(0); int32 b = PG_GETARG_INT32(1); PG_RETURN_INT32(a + b); } 4
  • 5. Defining a Function Example of a C function, continued: gcc -fPIC -c file.c gcc -shared -o file.so file.o CREATE FUNCTION add(int, int) RETURNS int LANGUAGE C AS 'file.so', 'add'; 5
  • 6. Features of Functions • Overloading • Processing sets/tables • Caching options (deterministic/nondeterministic) • Execution privileges 6
  • 7. Advantages of Server-Side Functions • Encapsulation • Faster database access • Plan caching, inlining • Data validation through triggers • Side effects through triggers 7
  • 8. Functions as Building Blocks • Operators • Data types • Aggregate functions • Index access methods • Type casts • Character set conversions 8
  • 9. Procedural Languages • Choice of SQL vs. C quite limited • Solution: pluggable language handlers • Available languages: Tcl, PL/pgSQL, Perl, Ruby, Python, Shell, R, Java, PHP 9
  • 10. Procedural Language Example: PL/pgSQL CREATE FUNCTION logfunc(logtxt text) RETURNS timestamp AS ' DECLARE curtime timestamp; BEGIN curtime := ''now''; INSERT INTO logtable VALUES (logtxt, curtime); RETURN curtime; END; ' LANGUAGE plpgsql; 10
  • 11. Procedural Language Example: PL/Perl CREATE OR REPLACE FUNCTION valid_id() RETURNS trigger AS ' if (($_TD->{new}{i} >= 100) || ($_TD->{new}{i} <= 0)) { return "SKIP"; # skip INSERT/UPDATE command } elsif ($_TD->{new}{v} ne "immortal") { $_TD->{new}{v} .= "(modified by trigger)"; return "MODIFY"; # modify row and run INSERT/UPDATE } else { return; # execute INSERT/UPDATE command } ' LANGUAGE plperl; 11
  • 12. Enter PL/Java • Developed by Thomas Hallgren • Stored procedures written in the Java language • Java the most popular (client) language for PostgreSQL 12
  • 13. Standardization SQL standard: ISO/IEC 9075-13:2003 SQL Routines and Types for the Java Programming Language ("SQL/JRT") (210 pages) driven by Oracle and IBM 13
  • 14. Timeline of PL/Java • Nov. 2000: first attempt with Kaffe 1.0.6 • Dec. 2003: PL/Java project launched • Jan. 2004: first alpha release • Jan. 2005: release 1.0.0 (for PG 7.4) • Apr. 2005: release 1.1.0 (for PG 8.0) • currently “stable” 14
  • 15. Concept • Write a Java class • Designate static method as entry point • Pack into JAR • Load JAR into database • Adjust classpath • Create function in PostgreSQL 15
  • 16. Simple Example: Code package com.example; public class Foo { static int add(int a, int b) { return a + b; } } 16
  • 17. Simple Example: Deployment javac com/example/Foo.java jar cf foo.jar com/example/Foo.class SELECT sqlj.install_jar('file:/home/peter/tmp/foo.jar', 'foo', false); SELECT sqlj.set_classpath('public', 'foo:bar:etc'); CREATE FUNCTION add(int, int) RETURNS int LANGUAGE java AS 'com.example.Foo.add'; 17
  • 18. Deployment Descriptor Optional way to integrate install/uninstall SQL statements into the JAR file: SQLActions[] = { "BEGIN INSTALL CREATE FUNCTION add(int, int) RETURNS int LANGUAGE java AS 'com.example.Foo.add'; END INSTALL", "BEGIN REMOVE DROP FUNCTION add(int, int); END REMOVE" } 18
  • 19. Configuration New parameters for postgresql.conf: custom_variable_classes = 'pljava' pljava.classpath = '/some/where/pljava.jar' pljava.statement_cache_size = 10 pljava.release_lingering_savepoints = true pljava.vmoptions = '-Xmx64M' pljava.debug = false 19
  • 20. Parameter Type Mapping Parameter types are mapped automatically: PostgreSQL Java boolean boolean shortint short int int bigint long real float double precision double varchar, text java.lang.String bytea byte[] date java.sql.Date time java.sql.Time timestamp java.sql.Timestamp other java.lang.String 20
  • 21. Composite Types CREATE TYPE compositeTest AS ( base integer, incbase integer, ctime timestamp ); CREATE FUNCTION useCompositeTest (compositeTest) RETURNS varchar AS 'foo.fee.Fum.useCompositeTest' LANGUAGE java; 21
  • 22. Composite Types Represented as java.sql.ResultSet with one row. public static String useCompositeTest(ResultSet compositeTest) throws SQLException { int base = compositeTest.getInt(1); int incbase = compositeTest.getInt(2); Timestamp ctime = compositeTest.getTimestamp(3); return "Base = "" + base + "", incbase = "" + incbase + "", ctime = "" + ctime + """; } 22
  • 23. Returning Sets CREATE FUNCTION getNames() RETURNS SETOF varchar AS 'Bar.getNames' LANGUAGE java; import java.util.Iterator; public class Bar { public static Iterator getNames() { ArrayList names = new ArrayList(); names.add("Lisa"); names.add("Bob"); names.add("Bill"); return names.iterator(); } } 23
  • 24. Built-in JDBC Driver • Prepare/execute queries • Query metadata • No transaction management (can use savepoints) Connection conn = DriverManager.getConnection("jdbc:default:connectio n"); 24
  • 25. Triggers static void moddatetime(TriggerData td) throws SQLException { if(td.isFiredForStatement()) throw new TriggerException(td, "can't process STATEMENT events"); if(td.isFiredAfter()) throw new TriggerException(td, "must be fired before event"); if(!td.isFiredByUpdate()) throw new TriggerException(td, "can only process UPDATE events"); ResultSet _new = td.getNew(); String[] args = td.getArguments(); if (args.length != 1) throw new TriggerException(td, "one argument was expected"); _new.updateTimestamp(args[0], new Timestamp(System.currentTimeMillis())); } 25
  • 26. Other Features • Exception handling • Logging • DatabaseMetaData • Multithreading • IN/OUT parameters (PostgreSQL 8.1) • Security 26
  • 27. Problem Areas • Memory usage • Performance? • Stack handling 27
  • 28. Build Options • Builds with: • Sun JDK ≥ 1.4 (shared library + JAR) • GCJ ≥ 4.0 (shared library) • Does not work with: • Kaffe • SableVM 28
  • 29. GCJ Issues • Missing java.security implementation • GCJ-based PL/Java installations are untrusted. 29
  • 30. Supported Platforms • Linux (most architectures) • Cygwin • Windows (PostgreSQL 8.1/recent) • More reports welcome! 30
  • 31. Compatibility • vs. Oracle: • data type system not as good • trigger procedures not compatible (wrappers possible) • vs. DB/2, Firebird, ...: • unknown 31
  • 32. The Future • Dynamic type system (SQL:2003) • Work on SQL conformance and compatibility • More work on J4SQL • Cooperation with PL/J project 32
  • 33. Conclusion • PL/Java is stable today. • It is being used. • It is almost feature complete. • Get it now! http://gborg.postgresql.org/project/pljava/projdisplay.php 33