Sie sind auf Seite 1von 37

Reverse of Cover

ii
The Firebird Book (Second Edition): A Reference for Database Developers

Copyright 2011, 2012 by Helen Borrie and IBPhoenix


All rights reserved. Except where content is indicated explicitly as copied from documents
licensed under open document licensing, no part of this work may be reproduced in any
form or by any means, electronic or mechanical, without the prior written permission of
the copyright owners and the publisher, IBPhoenix Publications.
Reviewers were Aage Johansen, Dimitry Sibiryakov, Thomas Steinmaurer, Calin Pirtea
Design of the cover and Part headers is by Stella Damaschin.
Body text is 10pt Garamond.

iii

AUTHORS FOREWORD
This, the second edition of The Firebird Book, has been gestating for more than seven
years, since the first edition in August, 2004. The first books milestone was Firebird 1.5. Its
objective was to to provide an up-to-date working reference for developers, whether
coming to Firebird from another database management system or moving into it with past
experience in its closed source cousin, InterBase.
In the intervening years, Firebird has evolved through three further major versions: 2.0, 2.1
and 2.5. At the time of this writing, all three are still under maintenance and the rearchitected version 3.0 is in alpha development. Maintenance of version 1.5 ceased in 2009.
The energy and dedication of Firebirds development team continue to be a source of
wonder and inspiration to me and, Im sure, to anyone else who works with Firebird. The
polyglot Core teamDmitry Yemanov, Vlad Khorsun, Alex Peshkov and Adriano dos
Santos Fernandesworks closely and tirelessly under Dmitrys chieftainship. Pavel Cisar
and Philippe Makowski perform quality assurance testing and Claudio Valderrama is
responsible for scrutinising incoming code changes. Claudios hand is often seen in
improvements to the command-line tools, as well.
Because Firebird is distributed free, in all senses of the word, it produces no revenue to pay
salaries to the code workers. Except for the QA people, these volunteers depend on
Firebird Foundation grants to supplement their incomes to make space for their Firebird
work.
The Firebird Foundation is funded by donations, cash sponsorships and membership
subscriptions from individuals and companies that perceive and acknowledge the benefits
of using Firebird and keeping it under active development. You can view the current list of
sponsors at http://www.firebirdsql.org/en/sponsors/. Bless em all!
Some sponsors contribute much more than cash. IBPhoenix, for example, contributes the
manpower for QA, binary builds and basic documentation. Neither this book nor its
predecessor would have come to fruition without IBPhoenix funding. Broadview Software
hosts the issue tracker, pre-release and build servers while IBSurgeon funds the hosting and
development of the Firebird web site at www.firebirdsql.org.
Amongst the volunteers who contribute their time and expertise to the Firebird Project
without grants I must name Paul Vinkenoog, who has been almost single-handedly
responsible for filling the free documentation gap between the legacy InterBase manuals
and the release notes that are distributed with the binary kits. It is a vast and ongoing task
that is often thankless. At the time of writing this, Paul is working with Dmitry Yemanov to
produce comprehensive on-line SQL documentation that will not be inhibited by the
copyright issues that prohibit reuse of the legacy InterBase material.
Under the Firebird Project umbrella, volunteers also develop and maintain several of the
drivers and language interfaces for FirebirdJaybird (for Java), the Firebird .NET
providers, the ODBC driver and the interfaces for PHP and Python.
If you are coming to Firebird as a newcomer, welcome! I wish you a long and happy
experience with our software. To you and to those devotees who are freshening up your
Firebird experience, I wish you great satisfaction from your use of this Second Edition of
The Firebird Book.
Helen Borrie, author
December 2011

iv
This page is intentionally left blank.

ABOUT THE AUTHOR


Helen Borrie is a contracting software engineer who doubles as a writer and technical
editor. She has been involved with database development for 30 years and with Firebird
and its ancestors since 1996.
Helen is an active member of the Firebird online support community and a founding
member of the Firebird Foundation, incorporated as a non-profit organisation in New
South Wales, Australia, in 2002.

vi

Table of Contents

Contents

Authors Foreword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii


About the Author. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v

Part I Firing Up with Firebird. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1


1 Firebird Servers and Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
The Role of the Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Operating System Platforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Server-side Programming. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Multi-database Applications. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Server Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Database Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
The Firebird Server Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Resource Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Comparing Superserver, Superclassic and Classic Architectures . . . . . . . . . 8
Embedded Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Introduction to Client/Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Servers and Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Client/Server vs File-Served Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Characteristics of a Client/Server DBMS . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Typical Deployment Topologies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Firebird Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
What is a Firebird Client?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
The Firebird Client Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

Contents vii

2 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
System Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Server Memory (All Platforms) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Installation Drives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Minimum Machine Specifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Operating System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
How to Get an Installation Kit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Kit Contents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Installing a Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The FIREBIRD Variable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Finalise your Server Choice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Linux and Many Other POSIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MacOSX/Darwin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Other Host Platforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Testing Your Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Network Protocol. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Checking That the Firebird Server Is Running. . . . . . . . . . . . . . . . . . . . . .
The Client Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Performing a Client-Only Install . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Installing an Embedded Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Uninstalling Firebird. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MacOSX/Darwin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Other Things You Need to Know . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Default User Name and Password . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23
23
23
24
24
25
27
27
29
29
29
30
33
36
37
37
37
38
40
41
45
46
46
47
48
48
48

3 Network Setup and Initial Configuration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Network Protocols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TCP/IP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Named Pipes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Local Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mixed Platforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A Network Address for the Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Hosts File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

51
51
51
52
52
53
54
54

viii Contents

Server Name and Database Path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Connection string syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Inconsistent connection strings for Windows connections . . . . . . . . . . . .
Testing Connections. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
If ping fails . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Initial Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Firebird Configuration File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Environment Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

55
56
57
57
58
59
59
62

4 Operating Basics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Looking for a User Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Running Firebird on POSIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Superserver and Superclassic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Classic server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Running Firebird on Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Servers and the Guardian. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Running as a service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Running as an application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Running Firebird on MacOSX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Super* Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Classic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mixed Platforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Database aliasing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

63
63
63
64
66
67
67
67
68
70
70
70
70
71

The SYSDBA User and Password. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Administering Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The employee.fdb Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Starting isql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Summary of Command-line Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

73
73
73
74
74
76

5 Migration Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Version Lineage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Firebird 1.0
Firebird 1.5
Firebird 2.0
Firebird 2.1

...................................................
...................................................
...................................................
...................................................

79
80
80
81

Contents ix

Firebird 2.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

Backward Compatibility. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Preparing to Migrate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Major Releases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sub-releases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dialect 1 Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Back Up! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Migration Tasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Get the Latest Sub-release! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The FIREBIRD Variable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Platform Issues. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Security Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Metadata Repair . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Application Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Migration Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

82
83
83
83
85
87
88
88
88
89
89
90
93
95

Part II Firebird Data Types & Domains. . . . . . . . . . . . . . . . . . . . . . . . . . . . 97


6 About Firebird Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
The Basics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Where to Specify Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Supported Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
SQL Dialects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Optional SQL-92 Delimited Identifiers . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Context Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Pre-defined Date Literals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Domains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Converting Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Changing column and domain definitions . . . . . . . . . . . . . . . . . . . . . . . . 105
Keywords Used for Specifying Data Type . . . . . . . . . . . . . . . . . . . . . . . . 106
Demystifying NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
NULL in expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
NULL in calculations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Gotchas with True and False. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Setting a value to NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

x Contents

7 Number Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Numerical Limits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Points About Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Operations on Number Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Integer Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Integer/integer division . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Fixed Decimal (Scaled) Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Internal Storage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Special restrictions in static SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Behaviour of fixed types in operations . . . . . . . . . . . . . . . . . . . . . . . . . . .
Floating Point Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Supported Float Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Arithmetic mixing fixed and floating-point types. . . . . . . . . . . . . . . . . . .

111
111
112
112
112
112
113
114
115
116
117
117
120
121
121

8 Date and Time Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Choices for Date and Time Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TIMESTAMP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TIME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Date/Time Literals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Recognised Date/Time Literal Formats . . . . . . . . . . . . . . . . . . . . . . . . . .
Pre-defined Date Literals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Type-casting of Date/Time Literals . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Date and Time Context Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Specifying Sub-seconds Precision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Operations Using Date and Time Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
General rules for operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using CAST( ) with Date/Time Types . . . . . . . . . . . . . . . . . . . . . . . . . . .
Quick Date/Time Casts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The EXTRACT( ) Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Other Date/Time Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A sample date/time type conversion task . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

123
123
123
124
124
125
125
128
129
130
130
131
132
133
136
136
138
138

Contents xi

9 Character Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
String Essentials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
String Delimiter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Concatenation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Escape Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
String Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Limitations with Character Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Fixed-length Character Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Variable-length Character Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Character Sets and Collation Sequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Character Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Client Character Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Firebird character sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Special Character Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Transliteration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Collation Sequence. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Adding an Alias for a Character Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Custom character sets and collations . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Metadata Text Conversion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

141
141
142
142
142
143
144
145
145
146
147
148
149
152
154
155
159
160
164

10 BLOBS and Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


BLOBs and Subtypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Supported User Subtypes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Custom Subtypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Declaration Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
BLOB Segments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
When to Use BLOB Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Operations on BLOBs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Array Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ARRAY Types and SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
When to Use an Array Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Eligible Element Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Defining Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Storage of ARRAY Columns. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Accessing Array Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Limited DSQL Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

167
167
168
168
169
169
170
171
173
173
173
173
174
175
175
176

xii Contents

11 Domains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Benefits of Using Domains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a Domain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using a Domain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Domains in Column Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Domains in PSQL Variable Declarations . . . . . . . . . . . . . . . . . . . . . . . . .
Using Domains with CAST(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Where domains won't work. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Defining a BOOLEAN Domain. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Changing a Domain Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dropping a Domain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

177
177
178
182
182
184
184
185
185
185
187

Part III A Database & Its Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189


12 Designing and Defining a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Designing a Database. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Description and analysis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Physical Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Referential integrity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Indexes and query plans. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Views. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Stored procedures and triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Generators (Sequences) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Object Naming Conventions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optional SQL-92 delimited identifiers . . . . . . . . . . . . . . . . . . . . . . . . . . .
File-naming Conventions for Databases. . . . . . . . . . . . . . . . . . . . . . . . . .
Metadata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The system tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Firebirds SQL Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SQL Dialects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Firebird and the ISO Standards. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Data Definition Language (DDL) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Data Manipulation Language (DML) . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Procedural language (PSQL) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interactive SQL (ISQL) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Schemas and Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

191
191
192
193
197
197
198
198
198
200
201
201
202
202
202
203
204
204
204
205
205
205
Contents xiii

Using isql to run scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206


Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
13 Data Definition LanguageDDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
SQL Data Definition Statements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
CREATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
RECREATE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
ALTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
DECLARE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
DROP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Storing Descriptive Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Object Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Using DDL to Manage User Accounts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Reference Material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
14 Creating and Maintaining a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Physical Storage for a Database. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
About Security Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
ISC_USER and ISC_PASSWORD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Creating a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Dialect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
CREATE DATABASE Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Getting information about the database . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Single and Multi-file Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
The Database Cache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Read-only Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Keeping a Clean Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Background garbage collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Sweeping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Garbage collection during backup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Objects and counters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Validation and repair . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Backup and Stand-by . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Dropping a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232

xiv Contents

15 Tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
About Firebird Physical Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Structural descriptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating Tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table ownership and privileges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
CREATE TABLE statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Constraints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Scope of Constraints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Integrity Constraints. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The referential constraint. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Named constraints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The NOT NULL Constraint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The PRIMARY KEY constraint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The UNIQUE constraint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
CHECK constraints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using External Files as Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Restrictions and recommendations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Converting external tables to internal tables. . . . . . . . . . . . . . . . . . . . . . .
Dropped database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Altering Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Preparing to use ALTER TABLE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Altering Columns in a Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Removing (Dropping) a Table. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The RECREATE TABLE statement . . . . . . . . . . . . . . . . . . . . . . . . . . .
Temporary Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Global Temporary Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Temporary Storage for Older Versions. . . . . . . . . . . . . . . . . . . . . . . . . . .
Tree Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

235
235
235
236
236
236
241
241
241
241
242
242
243
248
249
251
252
253
255
256
256
256
256
261
261
261
262
263
264

16 Indexes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Limits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Automatic vs User-defined Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Importing legacy indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Directional indexes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

265
265
266
266
266

Contents xv

Query plans. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
How Indexes Can Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sorting and grouping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Joins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Comparisons. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
What to Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
When to index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using CREATE INDEX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mandatory elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optional elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Multi-column Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
OR predicates in queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Search criteria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Inspecting Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Making an Index Inactive. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Housekeeping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Index is in use error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Altering the structure of an index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dropping an Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

267
267
267
268
268
268
269
269
269
270
272
272
273
273
273
273
274
274
274

17 Referential Integrity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terminology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The FOREIGN KEY Constraint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Implementing the constraint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Action triggers to vary integrity rules . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interaction of Constraints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Custom Action Triggers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Lookup Tables and Your Data Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The REFERENCES Privilege. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Handling Other Forms of Relationship . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
One-to-one relationship. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Many-to-many relationship . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Self-Referencing Relationship . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mandatory relationships. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

275
275
276
276
278
279
280
280
282
282
282
283
286
287

xvi Contents

Object is in Use Error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287

Part IV Working With Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289


18 Data Manipulation LanguageDML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Concept of Sets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Cardinality and degree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A table is a set. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Output sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Input sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Output sets as input sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Cursor sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Nested Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SQL Privileges and DML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

291
291
292
292
292
293
294
294
295
296

19 DML Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The SELECT Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Clauses in a SELECT statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
INSERT and UPDATE Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
INSERT INTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
UPDATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
UPDATE OR INSERT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MERGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The DELETE Statement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
EXECUTE Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Batch operations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Queries That Execute Server-side Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Executable procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Selectable procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DML operations and state-changing events . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Referential integrity action clauses. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Custom triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Query Plans and the Optimizer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Plans and the Firebird query optimizer . . . . . . . . . . . . . . . . . . . . . . . . . . .

297
297
298
307
307
311
315
316
318
318
318
320
321
321
321
322
322
322
323
323

Contents xvii

Understanding the optimizer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Examples of plans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Specifying your own plan. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Optimal Indexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Housekeeping indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Index toolkit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

325
327
332
333
335
337

20 Expressions and Predicates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Expressions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Predicates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Truth Testers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Assertions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Deciding What is True . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Elements Used in Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SQL Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Precedence of Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Concatenation Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Arithmetic Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Comparison Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Logical Operators. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The IS [NOT] NULL Predicate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Existential Predicates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Considering NULL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
NULL in Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
NULL in Calculations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Gotchas with True and False. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
NULL and External Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Setting a Value to NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Computed Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Search Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ordering and Grouping Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Expression Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
CHECK expressions in DDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Expressions in PSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Function Calls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Conversion Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

339
339
340
341
341
342
342
344
344
345
345
345
350
351
351
354
354
355
355
356
356
357
357
363
365
366
366
367
367
368

xviii Contents

String Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Function for Getting a Generator (Sequence) Value . . . . . . . . . . . . . . . .
Aggregating Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Functions for Setting and Getting Contextual Data. . . . . . . . . . . . . . . . .
External Functions (UDFs) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

369
371
372
373
376

21 Querying Multiple Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Kinds of Multi-table Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Joining. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Subqueries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
UNION queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using Relation Aliases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The internal cursor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Joining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The INNER join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
OUTER joins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Equi-joins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Re-entrant joins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Subqueries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

381
381
382
382
382
382
383
384
384
387
390
391
393

Specifying a column using a subquery. . . . . . . . . . . . . . . . . . . . . . . . . . . .


Searching using a subquery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Inserting using a subquery with joins . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Derived Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
UNION Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Union compatible sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
UNION ALL | DISTINCT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using run-time columns in unions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Search and ordering conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Re-entrant UNION queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Recursive Queries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

393
395
395
396
396
396
397
398
399
399
400

22 Ordered and Aggregated Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Considerations for Sorting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Presentation order of sorting clauses . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Indexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The ORDER BY Clause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sorting items. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

401
401
401
403
403
403

Contents xix

Sort direction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
NULLS placement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The GROUP BY Clause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The groupable field list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Aggregating expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The grouping item . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The HAVING sub-clause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The COLLATE sub-clause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using ORDER BY in a grouped query . . . . . . . . . . . . . . . . . . . . . . . . . .
Advanced grouping conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Aggregating Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
AVG( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SUM( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MAX( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MIN( ). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using COUNT( ) as an aggregating function . . . . . . . . . . . . . . . . . . . . .
The LIST( ) function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

406
406
407
407
408
409
411
412
412
412
415
415
415
416
416
416
417

23 Views and Other Run-time Set Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Forms and Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Views. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
What is a view? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
How views can be useful . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Some simple view specifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Read-only and updatable views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Modifying a view . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dropping a view . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Privileges for Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using views in SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using query plans for views. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Derived Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Rules for Derived Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
When to Use a Derived Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Common Table Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Syntax for a CTE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Other Virtual Set Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

419
419
420
420
421
425
425
426
429
430
430
431
432
433
434
435
435
436
440

xx Contents

Global temporary tables (GTTs) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440


Selectable stored procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
External virtual tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
24 Interactive SQL Utility (isql) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interactive Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Default text editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Starting isql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Connecting to a database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using the Interface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interactive Commands. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
General isql Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SHOW Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SET Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exiting an interactive isql session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Command Mode isql. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Operating isql in command mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Command-line switches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating and Running Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

443
443
443
444
445
446
450
451
454
463
470
470
470
471
474

About Firebird scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474


Basic steps. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
Managing your schema scripts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480

Part V Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483


25 Overview of Firebird Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The ACID Properties. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Atomicity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Consistency. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Isolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Durability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Context of a Transaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
One transaction, many requests. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Transactions and the MGA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Post vs COMMIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Rollback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Row locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

485
486
486
486
486
486
487
487
488
488
489
489

Contents xxi

Table-level locks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Inserts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Transaction Aging and Statistics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Transaction ID and age . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interesting transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Background garbage collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Keeping the OIT and the OAT moving . . . . . . . . . . . . . . . . . . . . . . . . .
Transaction statistics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

490
491
491
491
492
492
494
496

26 Configuring Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Anatomy of a Transaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Default Transaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Default settings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
About Concurrency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Factors affecting concurrency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Isolation level . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Standard levels of isolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Locking Policy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

499
499
499
500
500
501
501
501
503

Access Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table Reservation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Uses for Table Reservation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Parameters for table reservation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Other Optional Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Record Versions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dependent rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Locking and Lock Conflicts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Timing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Pessimistic locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Lock conflicts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

504
505
505
506
507
507
508
508
508
508
509

27 Programming with Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


The Language of Transactions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Starting a Transaction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The transaction handle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

511
511
512
512
512

xxii Contents

The transaction parameter buffer (TPB). . . . . . . . . . . . . . . . . . . . . . . . . .


Accessing the Transaction ID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using the TID in applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Progress of a Transaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Nested Transactions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
User savepoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exception handling extensions in PSQL . . . . . . . . . . . . . . . . . . . . . . . . .
The Logical Context. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ending transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Diagnosing exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Receiving exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Multi-database Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Limbo transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Restricting databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Pessimistic Locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table-level locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Statement-level locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The dummy update hack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Explicit locking. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Stored Procedures, Triggers and Transactions . . . . . . . . . . . . . . . . . . . . . . . . . .
Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Savepoints in PSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Autonomous Transactions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Tips for Optimizing Transaction Behaviour. . . . . . . . . . . . . . . . . . . . . . . . . . . .

513
514
514
515
515
515
517
517
518
520
521
522
522
523
523
524
524
524
525
528
528
528
529
529
529

Part VI Programming on the Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531


28 Procedural SQLPSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Overview of Server Code Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
About Stored Procedures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
About Relation Triggers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
About Database Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
About Executable Blocks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
PSQL Language Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

533
533
534
535
536
536
536

Contents xxiii

Restrictions on PSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537


Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538
Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538
Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538
Elements of procedures and triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
Statement terminator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
The CREATE statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540
Header elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
Body elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
Language elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542
Programming constructs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
BEGIN...END blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
Conditional blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
Variables and Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
SELECT...INTO statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552
Flow of control statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
Execute Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558
Using Cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562
The Undeclared Named Cursor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
The Explicit Named Cursor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
Developing Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
Adding comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
Case-sensitivity, white space and size . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568
Managing your code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
Compiling stored procedures and triggers . . . . . . . . . . . . . . . . . . . . . . . 569
Altering and dropping modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
Deleting source from modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
Internals of the Technology. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572
Effects of changes to modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572
29 Stored Procedures and Executable Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Styles of Stored Procedure. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a Stored Procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Header elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Body elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Executable Procedures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

xxiv Contents

573
573
574
574
575
577

Complex processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578


Support for live client sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
Operations in executable procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
A multi-table procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
Using (calling) executable procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
Outputs and exits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
Recursive Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
Selectable Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Uses for selectable procedures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
The Technique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
A simple procedure with nested SELECTs . . . . . . . . . . . . . . . . . . . . . . . 587
Calling a selectable procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
Nested procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589
A procedure with running totals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
Viewing an array through a stored procedure . . . . . . . . . . . . . . . . . . . . . 595
Testing procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
Procedures for combined use . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
Using the Internal RDB$DB_KEY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
About RDB$DB_KEY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Benefits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Inserting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
Duration of validity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
RDB$DB_KEY with multi-table sets . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
Changing a Stored Procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
Effect on applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Syntax for changing procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dropping a Stored Procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Run-time PSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Coding EXECUTE BLOCK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using EXECUTE BLOCK in applications . . . . . . . . . . . . . . . . . . . . . . .

601
601
604
604
605
605
607

30 Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Classes of Trigger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Table-level Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Database Triggers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DDL Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

609
609
609
610
610
Contents xxv

About Table-level Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610


Phase and event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610
Sequence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611
Status Active/Inactive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Creating Table-level Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
An alternative syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613
Header elements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613
The trigger body . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614
Special PSQL for Table-level Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . 614
Table-level triggers at work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615
Updating Other Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618
Referential Integrity Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
Updating rows in the same table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624
Implementing Auto-Incrementing Keys . . . . . . . . . . . . . . . . . . . . . . . . . . 625
Changing Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
ALTER TRIGGER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628
CREATE OR ALTER TRIGGER. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
RECREATE TRIGGER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
Higher-level Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
Trigger Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
Creating and Changing the Higher-level Triggers . . . . . . . . . . . . . . . . . . 631
Dropping Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631
31 Accessing Other Databases from PSQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
Extensions to EXECUTE STATEMENT. . . . . . . . . . . . . . . . . . . . . . . . . . 633
Autonomous Transaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
The Optional Extension Clauses. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634
Transaction Behaviour . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
External Queries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637
Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637
32 Error Handling and Events. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exceptions in PSQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Types of Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
What is an exception?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exceptions in Action . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

xxvi Contents

639
639
639
640
640

Trapping and Handling Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


The WHEN statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Nested exceptions as savepoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exceptions in triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Run-time Exception Messaging. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Error Codes Listings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Uses for Events Notification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Elements of the Events Mechanism . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Synchronous listening . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Asynchronous signalling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using POST_EVENT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

642
642
644
647
648
649
649
649
650
651
652
653

Part VII Configuring Firebird . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655


33 Configuring Firebird and Its Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Default Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Finding the Firebird Root Directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Environment Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
POSIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Firebird Configuration File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Parameter Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Editing Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Version Differences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Parameters in Detail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Configuring the TCP/IP Port Service. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
How the server sets the listening port. . . . . . . . . . . . . . . . . . . . . . . . . . . .
Setting up a client to find the service port . . . . . . . . . . . . . . . . . . . . . . . .
Configuring the services file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Embedded Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

657
657
657
658
658
659
660
662
663
664
664
665
665
665
667
669
669

34 Configuration Parameters in Detail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671


Settings for All Platforms and Servers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671
AuditTraceConfigFile. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671
Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672

Contents xxvii

CompleteBooleanEvaluation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ConnectionTimeout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DatabaseAccess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DatabaseGrowthIncrement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DeadlockTimeout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DefaultDbCachePages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DummyPacketInterval . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
FileSystemCacheThreshold . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
FileSystemCacheSize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
GCPolicy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LegacyHash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LockAcquireSpins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LockHashSlots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LockGrantOrder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LockMemSize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LockSemCount . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LockSignal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MaxUserTraceLogSize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
OldColumnNaming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
OldSetClauseSemantics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Redirection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
RelaxedAliasChecking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
RemoteAuxPort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
RemoteBindAddress . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
RemoteFileOpenAbility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
RemoteServicePort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
RemoteServiceName . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
RootDirectory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TcpRemoteBufferSize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TcpNoNagle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TempBlockSize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TempCacheLimit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
TempDirectories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

672
673
673
673
674
674
674
675
675
676
676
676
676
677
677
677
678
678
678
678
679
679
679
680
680
680
680
681
681
681
681
681
682

Settings Applicable to Microsoft Windows. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683


CpuAffinityMask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
GuardianOption. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IpcName . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MaxUnflushedWrites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
MaxUnflushedWriteTime. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ProcessPriorityLevel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
RemotePipeName. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
UsePriorityScheduler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

683
683
684
684
684
684
685
685

Settings Applicable to POSIX Platforms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685


BugCheckAbort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685

xxviii Contents

Configuring external locations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685


UdfAccess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686
ExternalFileAccess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687

Deprecated Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687


OldParameterOrdering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
server_working_size_max. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
server_working_size_min . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
CreateInternalWindow. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DeadThreadsCollection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

687
688
688
688
688

35 Configuring and Managing Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689


The gfix Tool Set. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Using the Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
Shutting Down a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
Configuration Options. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
Default Cache Size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
Forced Writes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
Access Mode. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
Page Fill Capacity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696
Sweep Interval . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696
SQL Dialect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697
Page Size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698
Management Tools. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698
Garbage collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699
Sweeping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699
Analysing and Repairing Logical Corruption . . . . . . . . . . . . . . . . . . . 700
Transaction recovery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 701
Managing Database Shadows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703
Summary of gfix switches and options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704
gfix error messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706

Part VIII Administering & Securing Firebird . . . . . . . . . . . . . . . . . . . . . . 707


36 Protecting the Server and its Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Securing the Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Physical Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Use Securable Filesystems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

709
709
709
710

Contents xxix

Protect Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Platform-based protection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Wire Security. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Web and Other n-Tier Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Use Dedicated Hosts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Establish Trustworthiness . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Firewalls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Server Multi-hop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Denial-of-Service Attacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Managing User Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The Security Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Firebird Native Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Platform Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Privileged Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Entering User Credentials via SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The gsec Utility. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

710
710
714
714
714
714
715
715
715
716
716
717
717
719
720
722

37 Database-Level Security. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Default Security and Access. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Planning an Access Scheme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Metadata Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SQL Privileges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

729
729
730
730
730
731
731

Native Firebird users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


POSIX users and groups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Windows trusted users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Users with escalated privileges. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Database objects as users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Privilege Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Granting Privileges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
UPDATE rights on columns. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
REFERENCES rights on columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Privileges needed by objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Granting the EXECUTE privilege . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Privileges on Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

732
732
732
733
733
733
734
734
735
736
736
737

xxx Contents

Bundling Multiple Privileges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


Lists of privileges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The ALL privilege . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Roles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Privileges for Multiple Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Granting the Right to Grant Privileges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Granting Privileges on Behalf of Another . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The GRANTED BY clause. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The System Role RDB$ADMIN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Extending RDB$ADMIN power for Windows Administrators . . . . . . .
Unintended Effects with Privileges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

737
737
738
738
739
740
741
742
742
742
743

Revoking Privileges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using REVOKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Security Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Creating a script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Installing perms directly from a procedure . . . . . . . . . . . . . . . . . . . . . . .
A Trick to Beat Idiot Users and Bad Guys . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

744
744
747
748
750
752

38 Monitoring and Logging Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753


Monitoring Database Activity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753
How Monitoring Works. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753
Using MON$ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754
The MON$ Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 757
Trace and Audit Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 757
Modes of Use . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 757
Trace Sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758
Trace Plug-in Facilities. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763
Collecting Database Statisticsgstat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763
gstat command-line tool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763
Monitoring Locks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 774
Locking in Firebird. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 774
The Lock Manager Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 774
The Lock Print Utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 777
Lock configuration settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 796

Contents xxxi

39 Backing Up Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
gbak or nBackup? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
The gbak Utility. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
About gbak Backup Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
gbaks other talents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Database backup & restore rights . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Running a Backup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Running a Restore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Restore switches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using gbak with the Firebird Services Manager . . . . . . . . . . . . . . . . . . . .
gbak Error Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Incremental Backup Tool (nBackup) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
About nBackup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Making Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Restoring from nBackup Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using the Freeze Utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SQL Support for nBackup. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
nBackup command-line options summary . . . . . . . . . . . . . . . . . . . . . . . .
Database Shadowing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Benefits and limitations of shadowing . . . . . . . . . . . . . . . . . . . . . . . . . . .
Implementing shadowing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Replication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Warm Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

799
799
800
800
801
802
803
807
809
813
815
818
819
820
824
825
826
828
828
828
829
833
833

40 The Services Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835


About the Services Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835
Accessing the Services Manager API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835
Services Manager Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 836
The fbsvcmgr Utility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 836
Using fbsvcmgr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 836
fbsvcmgr specifics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 838
Services API Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 839

Part IX Appendices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 841


I Internal and External Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843
Internal Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843

xxxii Contents

Conditional Logic Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 843


Date and Time Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 844
String and Character Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 846
BLOB Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 851
Mathematical Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 852
Trigonometrical Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 854
Binary Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855
Miscellaneous Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 856
External Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857
Conditional Logic Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857
Mathematical Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 858
Date and Time Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 863
String and Character Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 866
BLOB Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 871
Trigonometrical Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 872
Building regular expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876
Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 876
Quantifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 878
OR-ing terms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 879
Sub-expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 879
Escaping special characters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 879
II Reserved and Non-Reserved Keywords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 881
Keywords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 881
III Context Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 893
About Context Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 893
IV Firebird Limits. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 895
V System Tables and Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 899
Metadata Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 899
System Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 922
Monitoring Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 924
VI Character Sets and Collations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933
Implemented and Activated Character Sets . . . . . . . . . . . . . . . . . . . . . . . 933
VII Firebird Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 939
VIII SQLSTATE Codes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 961
IX Database Repair How-To . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 969
Indications of Possible Corruption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 969
Preparing for Analysis and Repair . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 970
Contents xxxiii

Steps for Recovery Using Command-line Tools . . . . . . . . . . . . . . . . . . . . . . . . 971


Step 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 971
Step 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 972
Step 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 972
Step 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 972
Step 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 973
Step 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 973
Failed Repair . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 973
X Default Disk Locations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 975
XI Healthcare for Databases. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 983
Considerations for a Maintenance Regime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 983
1 Backups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 983
2 Garbage Collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 984
3 Index Statistics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 986
4 Page Size . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 990
5 Disk Usage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 990
Other Considerations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 991
Usage Monitoring. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 991
Data Access and Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 991
XII Upgrade Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 993
Security Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 993
Metadata Repair . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 996
XIII Application Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1001
Application Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1001
Dynamic client/server applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1001
The Firebird Core API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1002
Application interfaces using the API. . . . . . . . . . . . . . . . . . . . . . . . . . . . 1002
Designing Databases for Client/Server Systems . . . . . . . . . . . . . . . . . . . . . . . 1004
XIV Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
Free Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
Books . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
Free help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1010
SQL and Firebird server support. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1010
Client interface support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1010
Third-Party Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1011

xxxiv Contents

Commercial Help and Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1012

Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i
GLOSSARY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii

Contents xxxv

Das könnte Ihnen auch gefallen