Part V. Server Programming This part is about extending the server functionality with user-defined functions, data types, triggers, etc. These are advanced topics which should be approached only after all the other user documentation about PostgreSQL has been understood. Later chapters in this part describe the server-side programming languages available in the PostgreSQL distribution as well as general issues concerning server-side programming. It is essential to read at least the earlier sections of Chapter 36 (covering functions) before diving into the material about server-side programming. Table of Contents 36. Extending SQL 36.1. How Extensibility Works 36.2. The PostgreSQL Type System 36.3. User-Defined Functions 36.4. User-Defined Procedures 36.5. Query Language (SQL) Functions 36.6. Function Overloading 36.7. Function Volatility Categories 36.8. Procedural Language Functions 36.9. Internal Functions 36.10. C-Language Functions 36.11. Function Optimization Information 36.12. User-Defined Aggregates 36.13. User-Defined Types 36.14. User-Defined Operators 36.15. Operator Optimization Information 36.16. Interfacing Extensions to Indexes 36.17. Packaging Related Objects into an Extension 36.18. Extension Building Infrastructure 37. Triggers 37.1. Overview of Trigger Behavior 37.2. Visibility of Data Changes 37.3. Writing Trigger Functions in C 37.4. A Complete Trigger Example 38. Event Triggers 38.1. Overview of Event Trigger Behavior 38.2. Writing Event Trigger Functions in C 38.3. A Complete Event Trigger Example 38.4. A Table Rewrite Event Trigger Example 38.5. A Database Login Event Trigger Example 39. The Rule System 39.1. The Query Tree 39.2. Views and the Rule System 39.3. Materialized Views 39.4. Rules on INSERT, UPDATE, and DELETE 39.5. Rules and Privileges 39.6. Rules and Command Status 39.7. Rules Versus Triggers 40. Procedural Languages 40.1. Installing Procedural Languages 41. PL/pgSQL — SQL Procedural Language 41.1. Overview 41.2. Structure of PL/pgSQL 41.3. Declarations 41.4. Expressions 41.5. Basic Statements 41.6. Control Structures 41.7. Cursors 41.8. Transaction Management 41.9. Errors and Messages 41.10. Trigger Functions 41.11. PL/pgSQL under the Hood 41.12. Tips for Developing in PL/pgSQL 41.13. Porting from Oracle PL/SQL 42. PL/Tcl — Tcl Procedural Language 42.1. Overview 42.2. PL/Tcl Functions and Arguments 42.3. Data Values in PL/Tcl 42.4. Global Data in PL/Tcl 42.5. Database Access from PL/Tcl 42.6. Trigger Functions in PL/Tcl 42.7. Event Trigger Functions in PL/Tcl 42.8. Error Handling in PL/Tcl 42.9. Explicit Subtransactions in PL/Tcl 42.10. Transaction Management 42.11. PL/Tcl Configuration 42.12. Tcl Procedure Names 43. PL/Perl — Perl Procedural Language 43.1. PL/Perl Functions and Arguments 43.2. Data Values in PL/Perl 43.3. Built-in Functions 43.4. Global Values in PL/Perl 43.5. Trusted and Untrusted PL/Perl 43.6. PL/Perl Triggers 43.7. PL/Perl Event Triggers 43.8. PL/Perl Under the Hood 44. PL/Python — Python Procedural Language 44.1. PL/Python Functions 44.2. Data Values 44.3. Sharing Data 44.4. Anonymous Code Blocks 44.5. Trigger Functions 44.6. Database Access 44.7. Explicit Subtransactions 44.8. Transaction Management 44.9. Utility Functions 44.10. Python 2 vs. Python 3 44.11. Environment Variables 45. Server Programming Interface 45.1. Interface Functions 45.2. Interface Support Functions 45.3. Memory Management 45.4. Transaction Management 45.5. Visibility of Data Changes 45.6. Examples 46. Background Worker Processes 47. Logical Decoding 47.1. Logical Decoding Examples 47.2. Logical Decoding Concepts 47.3. Streaming Replication Protocol Interface 47.4. Logical Decoding SQL Interface 47.5. System Catalogs Related to Logical Decoding 47.6. Logical Decoding Output Plugins 47.7. Logical Decoding Output Writers 47.8. Synchronous Replication Support for Logical Decoding 47.9. Streaming of Large Transactions for Logical Decoding 47.10. Two-phase Commit Support for Logical Decoding 48. Replication Progress Tracking 49. Archive Modules 49.1. Initialization Functions 49.2. Archive Module Callbacks 50. OAuth Validator Modules 50.1. Safely Designing a Validator Module 50.2. Initialization Functions 50.3. OAuth Validator Callbacks