Firebird 3.0.0 ReleaseNotes
Firebird 3.0.0 ReleaseNotes
Firebird 3.0.0 ReleaseNotes
0 Release Notes
Helen Borrie (Collator/Editor)
14 April 2016 - Document v.0300-36 - for Firebird 3.0.0 Release
Table of Contents
1. General Notes .................................................................................................................................... 1
Bug Reporting ............................................................................................................................... 1
Documentation ............................................................................................................................... 1
2. New In Firebird 3.0 ........................................................................................................................... 2
Summary of Features ..................................................................................................................... 2
Compatibility with Older Versions .................................................................................................. 4
3. Changes in the Firebird Engine ........................................................................................................... 5
Remodelled Architecture ................................................................................................................ 5
Server Modes ......................................................................................................................... 6
Providers ............................................................................................................................... 6
Connection String and Protocols ............................................................................................. 9
Plug-Ins ............................................................................................................................... 12
External Engines .................................................................................................................. 17
Optimizer Improvements .............................................................................................................. 20
Other Optimizations ..................................................................................................................... 20
Remote Interface/Network Protocol ............................................................................................... 20
Miscellaneous Improvements ........................................................................................................ 21
Connections Limit Raised ..................................................................................................... 21
Better Error Diagnosis .......................................................................................................... 21
ICU Version Upgraded ......................................................................................................... 21
Internal Debug Info Made Human-readable ........................................................................... 21
A Silly Message is Replaced ................................................................................................ 21
New Pseudocolumn RDB$RECORD_VERSION ................................................................... 21
systemd init Scripts .............................................................................................................. 22
4. Changes to the Firebird API and ODS .............................................................................................. 23
ODS (On-Disk Structure) Changes ................................................................................................ 23
New ODS Number ............................................................................................................... 23
Implementation ID is Deprecated .......................................................................................... 23
Maximum Database Size ...................................................................................................... 24
Maximum Page Size ............................................................................................................ 24
Maximum Number of Page Buffers in Cache ......................................................................... 24
Extension of Transaction ID Space Limit .............................................................................. 24
Limits Raised for Attachment and Statement IDs ................................................................... 24
System Tables ...................................................................................................................... 24
Application Programming Interfaces ............................................................................................. 26
Interfaces and the New Object-oriented API .......................................................................... 27
Other New APIs .................................................................................................................. 29
API Improvements ............................................................................................................... 29
5. Reserved Words and Changes ........................................................................................................... 36
New Keywords in Firebird 3.0 ...................................................................................................... 36
6. Configuration Additions and Changes ............................................................................................... 37
Scope of Parameters ..................................................................................................................... 37
Macro Substitution ....................................................................................................................... 37
Includes ....................................................................................................................................... 38
Wildcards ............................................................................................................................. 38
Expression of Parameter Values .................................................................................................... 39
Per-database Configuration ........................................................................................................ 39
Format of Configuration Entries ............................................................................................ 39
iv
39
40
40
40
41
41
41
41
42
42
42
42
42
43
44
44
44
44
44
45
45
45
45
46
46
46
47
47
47
48
49
49
49
50
51
51
51
52
53
55
55
56
57
57
59
61
61
62
63
63
63
64
vi
65
65
65
65
68
69
69
69
70
70
71
73
73
73
75
75
76
77
77
79
80
80
80
80
81
84
84
84
85
85
85
86
87
87
88
88
88
89
89
90
90
91
91
91
92
93
94
94
95
96
98
98
vii
viii
121
121
122
122
122
123
123
124
124
124
126
126
127
128
129
132
133
134
134
135
136
137
141
142
142
142
143
144
151
152
153
154
156
156
162
163
163
165
165
168
168
169
169
170
170
171
173
173
173
173
178
178
ix
179
180
182
183
184
186
List of Tables
3.1. Matrix of Server Modes .................................................................................................................. 6
6.1. Parameters available in databases.conf ............................................................................................ 40
11.1. Arguments for gbak STATISTICS Output ................................................................................... 110
14.1. Firebird Development Teams ...................................................................................................... 184
Chapter 1
General Notes
Thank you for choosing Firebird 3.0. We cordially invite you to test it hard against your expectations and engage
with us in identifying and fixing any bugs you might encounter.
If you are upgrading from a previous major release version, be sure to study Chapter 12, Compatibility Issues
before you attempt to do anything to your existing databases!
Bug Reporting
If you think you have discovered a new bug in this release, please make a point of reading the instructions
for bug reporting in the article How to Report Bugs Effectively, at the Firebird Project website.
If you think a bug fix hasn't worked, or has caused a regression, please locate the original bug report in the
Tracker, reopen it if necessary, and follow the instructions below.
Follow these guidelines as you attempt to analyse your bug:
1.
Write detailed bug reports, supplying the exact build number of your Firebird kit. Also provide details of
the OS platform. Include reproducible test data in your report and post it to our Tracker.
2.
You are warmly encouraged to make yourself known as a field-tester of this pre-release by subscribing to
the field-testers' list and posting the best possible bug description you can.
3.
If you want to start a discussion thread about a bug or an implementation, please do so by subscribing to the
firebird-devel list. In that forum you might also see feedback about any tracker ticket you post regarding
this Beta.
Documentation
You will find all of the README documents referred to in these notesas well as many others not referred to
in the doc sub-directory of your Firebird 3.0 installation.
--The Firebird Project
Chapter 2
Summary of Features
The following list summarises the features and changes, with links to the chapters and topics where more detailed
information can be found.
Unification of the Firebird executable is complete
With the completion of true SMP support for Superserver, the Firebird core is now a unified library that
supports a single ODS, loadable either as an embedded engine or by the network listener executable.
Choice of server model is determined by settings for a new configuration parameter ServerMode, defining
the locking and cache modes. It is specified at global level in firebird.conf.
By default, ServerMode = Super (alias ThreadedDedicated), i.e., SuperServer.
Note
The previous aliases.conf is replaced by databases.conf, now including not just aliases for
databases but also (optionally) configuration parameters to enable configuration of databases and/or alternative security databases individually.
The changes are described in more detail in the chapter Changes in the Firebird Engine.
True SMP support for SuperServer
In Superserver mode, the engine now makes use of multiple CPUs and cores when spawning connections.
Tracker: CORE-775
Implemented by V. Khorsun
New, object-oriented C++ APIs
Object-oriented C++ APIs enable external code routines to plug in and run safely inside Firebird engine
space, including (but not limited to):
Encryption schemes for data
User authentication schemes, including secure key exchange
Chapter 3
Changes in the
Firebird Engine
In Firebird 3, the remodelling of the architecture that was begun in v.2.5 was completed with the implementation
of full SMP support for the Superserver model. In the new scheme, it is possible to configure the execution
model individually per database.
Remodelled Architecture
Dmitry Yemanov
The remodelled architecture integrates the core engine for Classic/Superclassic, Superserver and embedded
models in a common binary. The cache and lock behaviours that distinguish the execution models are now
determined externally by the settings in the new configuration parameter ServerMode. The connection method
is determined by the order and content of another parameter, Providers and the connection protocol that is
deduced at run-time from the connection string supplied when a client requests an attachment.
The parameters for configuring the architecture are specified globally (in firebird.conf). Providers can
be overridden specifically for a database (in databases.conf).
Note
databases.conf is the old aliases.conf from previous versions, with a new name. In Firebird 3, the role
of this file involves (potentially) much more than being just a lookup for database file paths. For more details
about what can be configured at database level, refer to the chapter Configuration Additions and Changes.
Server Modes
Table 3.1. Matrix of Server Modes
ServerMode
Super
Superclassic
Classic
Synonym
Resource Model
Provider[s]
ThreadedDedicated
ThreadedShared
MultiProcess
Providers
The providers are more or less what we traditionally thought of as the methods used to connect a client to a
server, that is to say, across a network, host-locally, via the local loopback (localhost) or by a more direct
local connection (the old libfbembed.so on POSIX, now implemented as the plug-in library libEngine1
2.so; on Windows, engine12.dll; on MacOSX, engine12.dylib).
In firebird.conf, all are available by default, as follows:
#Providers = Remote,Engine12,Loopback
In databases.conf, one or more providers can be blocked by pasting the line from firebird.conf,
uncommenting it, and deleting the unwanted provider[s].
The Components
The main element of the Providers architecture is the y-valve. On the initial attach or create database
call y-valve scans the list of known providers and calls them one by one until one of them completes the requested
operation successfully. For a connection that is already established, the appropriate provider is called at once
with almost zero overhead.
Let's take a look at some samples of y-valve operation when it selects the appropriate provider at the attach
stage. These use the default configuration, which contains three providers:
Remote (establish network connection)
Engine12 (main database engine)
Loopback (force network connection to the local server for <database name> without an explicit network
protocol being supplied).
The typical client configuration works this way: when one attaches to a database called RemoteHost:dbname
(TCP/IP syntax) or \\RemoteHost\dbname (NetBios) the Remote provider detects explicit network protocol
syntax and, finding it first in the Provider list, redirects the call to RemoteHost.
When <database name> does not contain a network protocol but just the database name, the Remote provider
rejects it and the Engine12 provider comes to the fore and tries to open the named database file. If it succeeds,
we get an embedded connection to the database.
Note
A special embedded library is no longer required. To make the embedded connection, the standard client
loads the appropriate provider and becomes an embedded server.
Failure Response
But what happens if the engine returns an error on an attempt to attach to a database?
If the database file to be attached to does not exist there is no interest at all.
An embedded connection may fail if the user attaching to it does not have enough rights to open the database
file. That would be the normal case if the database was not created by that user in embedded mode or if he
was not explicitly given OS rights for embedded access to databases on that box.
7
Note
Setting access rights in such a manner is a requirement for correct Superserver operation.
After a failure of Engine12 to access the database, the Loopback provider is attempted for an attach. It is
not very different to Remote except that it tries to access the named database <dbname> on a server running
a TCP/IP local loopback.
On Windows, XNET is tried first, then TCP/IP loopback (with localhost: prepended to <dbname>), then
Named Pipes (NetBEUI) loopback (with \\.\ prepended). The server may be started with XNET (or any other
protocol) disabled, so we try all the options. On POSIX only TCP/IP protocol is supported, other options
are not available
If the attachment succeeds, a remote-like connection is established with the database even though it is located
on the local machine.
Other Providers
Use of providers is not limited to the three standard ones. Firebird 3 does not support pre-ODS 12 databases.
Removing support for old formats from the engine helps to simplify its code and gain a little speed. Taking into
account that this speed gain sometimes takes place in performance-critical places, like searching a key in an
index block, avoiding old code and related branches really does make Firebird fly faster.
Nevertheless, the Providers architecture does make it possible to access old databases when changing to a higher
version of Firebird. A suitable provider may be considered for inclusion in a later sub-release.
Custom Providers
A strong feature of the Providers architecture is ability for the deployer to add his own providers to the server,
the client, or both.
So what else might be wanted on a client, other than a remote connection? Recall Provider chaining that was
mentioned earlier. Imagine a case where a database is accessed via very slow network connection, say something
like 3G or, worse, GPRS. What comes to mind as a way to speed it up is to cache on the client some big tables that
rarely change. Such systems were actually implemented but, to do it, one had to rename fbclient to something
arbitrary and load it into its own library called fbclient, thus making it possible to use standard tools to access
the database at the same time as caching required tables. It works but, as a solution, it is clearly not ideal.
With the Providers architecture, instead of renaming libraries, one just adds a local caching provider which can
use any method to detect connections to it (something like a cache@ prefix at the beginning of the database
name, or whatever else you choose).
In this example, when the database name cache@RemoteHost:dbname is used, the caching provider accepts
the connection and invokes the y-valve once more with the traditional database name RemoteHost:dbname.
When the user later performs any call to his database, the caching provider gets control of it before Remote
does and, for a locally cached table, can forestall calls to the remote server.
Use of chaining allows a lot of other useful things to be implemented. An example might be MySQL-style
replication at statement level without the need for triggers: just repeat the same calls for the replication host,
perhaps whena transaction is committed. In this case, the chaining provider would be installed on the server, not
the client, and no modification of the command line would be needed.
8
Note
That said, statement-level replication is very questionable feature.
To avoid cycling when performing a callback to y-valve at attach time, such a provider can modify the list of
providers using the isc_dpb_config parameter in the DPB. The same technique may be used at the
client, too.
For details, see the Configuration Additions and Changes chapter.
The ability to access foreign database engines using providers should not be overlooked, either. It might seem
strange to consider this, given the number of tools available for this sort of task. Think about the ability to
access other Firebird databases using EXECUTE STATEMENT, that became available in Firebird 2.5. With
a provider to ODBC or other common tool to access various data sources it is within reach to use EXECUTE
STATEMENT to get direct access from procedures and triggers, to data from any database having a driver for
the chosen access tool. It is even possible to have a provider to access some particular type of foreign database
engine if there is some reason to want to avoid the ODBC layer.
Providers Q & A
Q. Interfaces and providers are probably very good, but I have an old task written using plain API functions and
for a lot of reasons I can't rewrite it in the near future. Does it mean I will have problems migrating to Firebird 3?
A. Definitely no problems. The old API is supported for backward compatibility in Firebird 3 and will be
supported in future versions as long as people need it.
And what about performance when using the old API?
A. The functional API is implemented as a very thin layer over interfaces. Code in most cases is trivial:
convert passed handles to pointers to interfaceshitherto referred to as handle validationand invoke the
appropriate function from the interface.
Functions that execute an SQL operation and fetch data from it are one place where coding is a little more
complex, involving the SQLDA construct. The data moves related to the SQLDA have always created an
overhead. The logic between the new and old APIs does not add significantly to that old overhead.
Local connection is implied if <host> is omitted. Depending on settings, platform and Firebird version, it
could be performed via either the embedded engine, XNET (shared memory) protocol or TCP/IP localhost
loopback.
Examples
Connect via TCP/IP using database name:
192.168.0.11:/db/mydb.fdb
192.168.0.11:C:\db\mydb.fdb
myserver:C:\db\mydb.fdb
localhost:/db/mydb.fdb
Local connection:
/db/mydb.fdb
C:\db\mydb.fdb
mydb
10
INET resolves to TCP/IP, WNET to Named Pipes, while XNET surfaces the old Windows local protocol (shared memory).
Examples
Connect via TCP/IP using database name:
inet://192.168.0.11//db/mydb.fdb
inet://192.168.0.11/C:\db\mydb.fdb
inet://myserver/C:\db\mydb.fdb
inet://localhost//db/mydb.fdb
11
Local connection is implied if <host> is omitted. Depending on settings, platform and Firebird version, it could
be performed via either the embedded engine, XNET (shared memory) protocol or TCP/IP localhost loopback.
On the server side, the provider configuration is in the default order Remote, Engine12, Loopback. If the Remote
provider fails to match the connection string because the protocol or host parts are missing, then Engine12, the
embedded engine, handles it as a hostless connection. To connect locally using a specific transport protocol, it
is necessary to specify that protocol:
inet://<database file path or alias>
or
wnet://<database file path or alias>
or
xnet://<database file path or alias>
Note
WNET (named pipes) and XNET (shared memory) protocols are available only on Windows.
Plug-Ins
Alex Peshkov
From version 3 onward, Firebird's architecture supports plug-ins. For a number of predefined points in the
Firebird code, a developer can write his own fragment of code for execution when needed.
A plug-in is not necessarily one written by a third party: Firebird has a number of intrinsic plug-ins. Even some
core parts of Firebird are implemented as plug-ins.
What is a Plug-In?
The term plug-in is used to name related but different things:
12
Plug-In Types
Firebird's plug-in architecture makes it possible to create plug-ins of predefined types. Each version of Firebird
will have a fixed set of supported plug-in types. To add a further type, the first requirement is to modify the
Firebird code. Our plug-in architecture facilitates both adding new types of plug-ins and simplifying the coding
of the plug-in along generic lines.
To be able to implement a plug-in, say, for encrypting a database on the disk, the Firebird code has to be prepared
for it: it must have a point from which the plug-in is called.
The set of plug-in types implemented in Firebird 3 comprises:
user authentication related:
AuthServer (validates user's credentials on server when logins are used)
AuthClient (prepares credentials to be passed over the wire)
AuthUserManagement (maintains a list of users on a server in a format known to AuthServer)
ExternalEngine
Controls the use of various engines, see External Engines.
Trace
The Trace plug-in was introduced in Firebird 2.5, but the way it interacts with the engine was changed in
Firebird 3 to accord with the new generic rules.
Encryption
encrypting plug-ins are for
network (WireCrypt)
disk (DbCrypt)
a helper plug-in (KeyHolder), used to help maintain the secret key(s) for DbCrypt
Provider
Firebird 3 supports providers as a plug-in type.
Technical Details
Plug-ins use a set of special Firebird interfaces. All plug-in-specific interfaces are reference counted, thus putting
their lifetime under specific control. Interfaces are declared in the include file plug-in.h. A simple example
for writing a plug-in module can be found in DbCrypt_example.
13
Note
The example does not perform any actual encryption, it is just a sample of how to write a plug-in. Complete
instructions for writing plug-ins are not in scope for this document.
Features of a Plug-In
A short list of plug-in features:
You can write a plug-in in any language that supports pure virtual interfaces. Interface declarations will need
to be written for your language if they are missing.
As with UDFs, you are free to add any reasonable code to your plug-inwith emphasis on reasonable. For
example, prompting for user input at the server's console from a plug-in is hardly reasonable!
Calling the Firebird API from your plug-in is OK, if needed. For example, the default authentication server
and user manager use a Firebird database to store accounts.
Firebird provides a set of interfaces to help with configuring your plug-ins. It is not obligatory to use them,
since the plug-in code is generic and can employ any useful method for capturing configuration information.
However, using the standard tools provides commonality with the established configuration style and should
save the additional effort of rolling your own and documenting it separately.
Configuring Plug-ins
Configuration of plug-ins has two parts:
1.
2.
The plug-ins to be loaded for each plug-in type are defined in the main configuration file, firebird.conf,
usually with defaults. The ones defined in Firebird 3 are discussed in the chapter entitled Configuration Additions and Changes. In summary, the set that provides normal operation in the server, client and embedded
cases consists of:
AuthServer = Srp, Win_Sspi
AuthClient = Srp, Win_Sspi, Legacy_Auth
UserManager = Srp
TracePlugin = fbtrace
Providers = Remote,Engine12,Loopback
WireCryptPlugin = Arc4
Note
If you want to add other plug-ins, they must be cited in firebird.conf. Apart from other considerations, this
requirement acts as a security measure to avoid loading unknown code.
14
plugins.conf
The file $(root)/plugins.conf has two types of records: config and plugin.
the plugin record is a set of rules for loading land activating the plug-in. Its format is:
Plugin = PlugName ## this is the name to be referenced in firebird.conf
{
Module = LibName ## name of dynamic library
RegisterName = RegName ## name given to plug-in by its developer
Config = ConfName ## name of config record to be used
ConfigFile = ConfFile ## name of a file that contains plug-in's configuration
}
When plug-in PlugName is needed, Firebird loads the library LibName and locates the plug-in registered with
the name RegName. The configuration values from the config record ConfName or the config file ConfFile are
passed to the library.
Note
If both ConfName and ConfFile are given, then the config record will be used.
If both parameters are missing, the default PlugName is used; except that if the ConfigFile is present and its
name is the same as the module's dynamic library but with a .conf extension, it will be used.
The ConfigFile is expected to use the format Key=Value, in line with other Firebird configuration files.
For the plug-in configuration record the same format is used:
Config = ConfName
{
Key1 = Value1
15
A Sample Setup
Suppose you have a server for which some clients trust the wire encryption from one vendor and others prefer a
different one. They have different licences for the appropriate client components but both vendors use the name
BestCrypt for their products.
The situation would require renaming the libraries to, say, WC1 and WC2, since there cannot be two files in
the same directory with the same name. Now, the modules stop loading automatically because neither is called
BestCrypt any longer.
To fix the problem, plug-ins.conf should contain something like this:
Plugin = WC1
{
RegisterName = BestCrypt
}
Plugin = WC2
{
RegisterName = BestCrypt
}
The module names will be automatically set to WC1 and WC2 and found. You can add any configuration info
that the plug-ins need.
Remember to modify firebird.conf to enable both plug-ins for the WireCryptPlugin parameter:
WireCryptPlugin = WC1, WC2
The server will now select appropriate plug-in automatically to talk to the client.
Another sample is distributed with Firebird, in $(root)/plugins.conf, configuring one of the standard
plug-ins, UDR. Because it was written to a use non-default configuration, the module name and one configuration parameter are supplied explicitly.
Plug-Ins Q & A
Q. There are plug-ins named Remote, Loopback, Arc4 in the default configuration, but no libraries with such
names. How do they work?
A. They are built-in plug-ins, built into the fbclient library, and thus always present. Their existence is due
to the old ability to distribute the Firebird client for Windows as a single dll. The feature is retained for cases
where the standard set of plug-ins is used.
Q. What do the names of Srp and Arc4 plug-ins mean?
A. Srp implements the Secure Remote Passwords protocol, the default way of authenticating users in Firebird
3. Its effective password length is 20 bytes, resistant to most attacks (including man in the middle) and
works without requiring any key exchange between client and server to work.
16
or
WireCrypt = Disabled
Q. How can I find out what the standard Authentication and User Manager plug-ins are?
They are listed in firebird.conf.
External Engines
Adriano dos Santos Fernandes
The UDR (User Defined Routines) engine adds a layer on top of the FirebirdExternal engine interface with the
purpose of
establishing a way to hook external modules into the server and make them available for use
creating an API so that external modules can register their available routines
making instances of routines per attachment, rather than dependent on the internal implementation details
of the engine
External Names
An external name for the UDR engine is defined as
'<module name>!<routine name>!<misc info>'
17
Module Availability
Modules available to the UDR engine should be in a directory listed by way of the path attribute of the corresponding plugin_config tag. By default, a UDR module should be on <fbroot>/plugins/udr, in accordance with
its path attribute in <fbroot>/plugins/udr_engine.conf.
The user library should include FirebirdUdr.h (or FirebirdUdrCpp.h) and link with the udr_engine library. Routines are easily defined and registered, using some macros, but nothing prevents you from doing things manually.
Note
A sample routine library is implemented in examples/udr, showing how to write functions, selectable procedures and triggers. It also shows how to interact with the current attachment through the legacy API.
Scope
The state of a UDR routine (i.e., its member variables) is shared among multiple invocations of the same routine
until it is unloaded from the metadata cache. However, it should be noted that the instances are isolated per
session.
Character Set
By default, UDR routines use the character set that was specified by the client.
Note
In future, routines will be able to modify the character set by overriding the getCharSet method. The chosen
character set will be valid for communication with the old Firebird client library as well as the communications
passed through the FirebirdExternal API.
18
Examples
create procedure gen_rows (
start_n integer not null,
end_n integer not null
) returns (
n integer not null
) external name 'udrcpp_example!gen_rows'
engine udr;
create function wait_event (
event_name varchar(31) character set ascii
) returns integer
external name 'udrcpp_example!wait_event'
engine udr;
create trigger persons_replicate
after insert on persons
external name 'udrcpp_example!replicate!ds1'
engine udr;
How it Works
The external names are opaque strings to Firebird. They are recognized by specific external engines. External
engines are declared in configuration files, possibly in the same file as a plug-in, as in the sample UDR library
that is implemented in $(root)/plugins.
external_engine = UDR {
plugin_module = UDR_engine
}
plugin_module = UDR_engine {
filename = $(this)/udr_engine
plugin_config = UDR_config
}
plugin_config = UDR_config {
path = $(this)/udr
}
When Firebird wants to load an external routine (function, procedure or trigger) into its metadata cache, it gets
the external engine through the plug-in external engine factory and asks it for the routine. The plug-in used is
the one referenced by the attribute plugin_module of the external engine.
Note
Depending on the server architecture (Superserver, Classic, etc) and implementation details, Firebird may get
external engine instances per database or per connection. Currently, it always gets instances per database.
19
Optimizer Improvements
Dmitry Yemanov
See Tracker item CORE-4528.
Hash/merge joins for non-field (DBKEY or derived expression) equalities are now allowed.
See Tracker item CORE-1482.
The optimizer now considers the ORDER BY optimization when making its decision about join order.
Other Optimizations
Vlad Khorsun
See Tracker item CORE-4556.
Data pages are now allocated as a group of sequential ordered pages (extents).
See Tracker item CORE-4445.
The main database file extends faster when physical backup state changes from stalled to merge.
See Tracker item CORE-4443.
Linux systems that support fast file growth can now use it.
See Tracker item CORE-4432.
Attachments no longer block others when the allocation table is read for the first time.
See Tracker item CORE-4431.
Contention has been reduced for the allocation table lock while database is in stalled physical backup state.
The full length of a field whose value is NULL is no longer sent over the wire. (Tracker item CORE-2897).
NULL flags (4 bytes per field) are replaced with a bitmap and only these flags are transmitted, in the bitmap.
This improvement is available for the DSQL API only, so gbak does not benefit from this improvement,
as it uses a lower level BLR API.
20
The prefetch (batch receive) algorithm is now aware of variable-length messages, so that VARCHARs and
NULLs may reduce the transmitted message size, allowing more rows to be transmitted in each batch.
Acknowledgement
This work was sponsored by donations collected at the 9th Firebird Developers' Day conference in Brazil.
Miscellaneous Improvements
Miscellaneous engine improvements include.-
22
Chapter 4
Changes to the
Firebird API and ODS
ODS (On-Disk Structure) Changes
New ODS Number
Firebird 3.0 creates databases with an ODS (On-Disk Structure) version of 12. In the initial release, a database
with an older ODS cannot be opened by Firebird 3.0. In order to work with a database with an older ODS it will
be necessary to make a backup using gbak under the older server and restore it with gbak on Firebird 3.
Note
A legacy provider for databases with ODS 8 to 11.2 is planned for a future sub-release.
Implementation ID is Deprecated
Alex Peshkov
The Implementation ID in the ODS of a database is deprecated in favour of a new field in database headers
describing hardware details that need to match in order for the database to be assumed to have been created by
a compatible implementation.
The old Implementation ID is replaced with a 4-byte structure consisting of hardware ID, operating system ID,
compiler ID and compatibility flags. The three ID fields are just for information: the ODS does not depend upon
them directly and they are not checked when opening the database.
The compatibility flags are checked for a match between the database and the engine opening it. Currently we
have only one flag, for endianness. As previously, Firebird will not open a database on little-endian that was
created on big-endian, nor vice versa.
Sample gstat Output
# ./gstat -h employee
Database /usr/home/firebird/trunk/gen/Debug/firebird/examples/empbuild/employee.fdb
Database header page information:
..............
Implementation
HW=AMD/Intel/x64 little-endian OS=Linux CC=gcc
..............
23
System Tables
New System Tables
RDB$AUTH_MAPPING
(table RDB$PROCEDURE_PARAMETERS)
(table RDB$INDICES)
(table RDB$INDICES)
(table RDB$TRIGGERS)
(table RDB$USER_PRIVILEGES)
(table RDB$PAGES)
(tables RdB$PROCEDURES and RDB$FUNCTIONS)
(table RDB$FUNCTIONS)
(table RDB$FUNCTIONS)
Monitoring Tables
Dmitry Yemanov
Changes to Client Address Reporting
Prior to Firebird 3.0, the network address of remote clients were reported in MON$ATTACHMENTS.MON
$REMOTE_ADDRESS and RDB$GET_CONTEXT('SYSTEM', 'CLIENT_ADDRESS'). For TCP/IP protocol
(a.k.a. INET), it contained a TCPv4 dot-separated address. For Named Pipes (a.k.a. WNET, NetBeui) protocol,
it was always NULL. For shared memory (aka XNET) protocol, it contained the local host name.
Starting with Firebird 3.0, the network address of a remote client contains the TCP/IP port number of the remote
client, separated with a slash:
25
<IP address>/<port>
The port number is also retrieved via the new built-in context variable RDB$GET_CONTEXT('SYSTEM',
'CLIENT_PORT').
The host name is also reported now, in the new column MON$REMOTE_HOST.
Alert
The WNET (Named Pipes/Netbeui) protocol should be considered as deprecated. It is likely to be abandoned
in a future version.
Per-table performance counters have been added to all of the monitoring tables. See Tracker CORE-4564.
MON$ATTACHMENTS
New information is now available:
Operating system user name. See Tracker CORE-3779.
Protocol and client library version. See Tracker CORE-2780.
Client host name. See Tracker CORE-2187.
authentication method used for connection (MON$AUTH_METHOD). See Tracker CORE-4222.
MON$REMOTE_ADDRESS now contains the <IP>/<port> string. See Tracker CORE-5028.
MON$DATABASE
Database owner (MON$OWNER) added. See Tracker CORE-4218.
Security database type (MON$SEC_DATABASE) flag added. Value will be one of Default/Self/Other. See
Tracker CORE-4729.
MON$STATEMENTS
The PLAN is now included. See Tracker CORE-2303.
26
Interfaces Q & A
Q. We access new API using IMaster. But how to get access to IMaster itself?
A. This is done using just the one new API function fb_get_master_interface(). It is exported by the fbclient library. Also IMaster is passed as a parameter to each plug-in during its registration in the system.
Q. The non-use of COM-based interfaces was said to be to avoid working with IUnknown methods and that
this is done due to performance issues. Instead you have to check the interface version. Why is that faster than
using IUnknown?
A. As was already mentioned we do not need to execute virtual calls when checking the interface version.
Taking into an account that each virtual call means a reset of the CPU cache, it is an important difference,
especially for the very small calls like getting specific metadata properties from IMetadata.
28
API Improvements
Improvements to the legacy API include.-
Moves the cursor's current position to the next row and returns it. If the cursor is empty or already positioned
at the last row, the condition NO_DATA is returned.
int fetchPrior(IStatus* status, void* message);
// equivalent to FETCH PRIOR FROM <cursor name>
Moves the cursor's current position to the prior row and returns it. If the cursor is empty or already positioned
at the first row, the condition NO_DATA is returned.
int fetchFirst(IStatus* status, void* message);
// equivalent to FETCH FIRST FROM <cursor name>
29
Moves the cursor's current position to the last row and returns it. If the cursor is empty, the condition NO_DATA
is returned.
int fetchAbsolute(IStatus* status, int position, void* message);
// equivalent to FETCH ABSOLUTE <position> FROM <cursor name>
Moves the cursor's current position to the specified <position> and returns the located row. If <position> is
beyond the cursor's boundaries, the condition NO_DATA is returned.
int fetchRelative(IStatus* status, int offset, void* message);
// equivalent to FETCH RELATIVE <offset> FROM <cursor name>
Moves the cursor's current position backward or forward by the specified <offset> and returna the located row.
If the calculated position is beyond the cursor's boundaries, the condition NO_DATA is returned.
Notes
1.
When a scrolling option is omitted, NO SCROLL is implied (i.e., the cursor is opened as forward-only).
This means that only the fetchNext() API call can be used. Other fetch methods will return an error.
2.
Scrollable cursors are internally materialized as a temporary record set, thus consuming memory/disk
resources, so this feature should be used only when really necessary.
Usage
isc_spb_bkp_stat, <len>, <string>
isc_spb_res_stat, <len>, <string>
where <len> (2 bytes) indicates the length of the following string parameter, and <string> (1-4 bytes) is a
string consisting of one character per statistics item.
30
For information regarding LINGER, see the write-up in the DDL chapter.
Under the new unified server, that form of connection attempts to load an embedded server. It is no longer valid
for a serverless client connection to Superserver. If you try, you will get a refusal message to the effect File is in
use by another process. This is not a bug. Since Superserver clients share resources, another server (in this case,
an embedded server) cannot attach a client to the same database that Superserver has any clients attached to.
However, all is not lost. The XNET subsystem can still do local client sessions for Superserver. You just need
a more elaborate connection string now. You have a few choices:
this one is the former Windows local, using the XNET subsystem and shared memory for a (nominally)
serverless connection:
31
xnet://alias-or-path-to-database
or using an alias:
xnet://employee
33
where
val_tab_incl
val_tab_excl
val_idx_incl
val_idx_excl
val_lock_timeout
Usage Notes
Patterns are regular expressions, processed by the same rules as SIMILAR TO expressions.
All patterns are case-sensitive, regardless of database dialect.
If the pattern for tables is omitted then all user tables will be validated.
If the pattern for indexes is omitted then all indexes of the appointed tables will be validated.
System tables are not validated.
To specify a list of tables or indexes:
1.
2.
3.
Enclose the whole list in double quotes to avoid confusing the command interpreter
Examples
1.
Validate all tables in database 'c:\db.fdb' with names starting with 'A'. Indexes are not validated. Lock wait
is not performed.
fbsvcmgr.exe service_mgr user SYSDBA password masterkey
action_validate dbname c:\db.fdb
val_tab_incl A%
val_idx_excl %
val_lock_timeout 0
34
2.
Validate tables TAB1 and TAB2 and all their indexes. Lock wait timeout is 10 seconds (the default):
fbsvcmgr.exe service_mgr user SYSDBA password masterkey
action_validate dbname c:\db.fdb
val_tab_incl "TAB1|TAB2"
3.
Default behavior of val_XXX options: validate all user tables and their indexes in database 'c:\db.fdb', lock
wait is the default 10 seconds:
fbsvcmgr.exe service_mgr user SYSDBA password masterkey
action_validate dbname c:\db.fdb
Code Improvement
Alex Peshkov
(CORE-4387) The functions IStatement::execute() and IAttachment::execute() now return
an error pointer to the old transaction interface.
35
Chapter 5
REGR_AVGX
REGR_AVGY
REGR_COUNT
REGR_INTERCEPT
REGR_R2
REGR_SLOPE
REGR_SXX
REGR_SXY
REGR_SYY
RETURN
ROW
SCROLL
SQLSTATE
STDDEV_POP
STDDEV_SAMP
TRUE
UNKNOWN
UPDATING *
VAR_POP
VAR_SAMP
FIRST_VALUE
IDENTITY
INCREMENT
LAST_VALUE
LAG
LEAD
LINGER
NAME
NTH_VALUE
PACKAGE
PARTITION
PLUGIN
PRIOR
RANK
RELATIVE
ROW_NUMBER
SERVERWIDE
TAGS
TRUSTED
USAGE
Non-reserved
ABSOLUTE
ACOSH
ASINH
ATANH
BODY
CONTINUE
DDL
DECRYPT
DENSE_RANK
ENCRYPT
ENGINE
36
Chapter 6
Configuration
Additions and Changes
The file aliases.conf is renamed to databases.conf. An old aliases.conf from a previous version
can simply be renamed and the new engine will just continue to use it as before. However, databases.conf
can now include some configuration information for individual databases.
Scope of Parameters
Some parameters are marked as configurable per-database or per-connection.
Per-database configuration is done in databases.conf.
Per-connection configuration is primarily for client tool use and is done using the DPB parameter
isc_dpb_config or, for Services, the SPB parameter isc_spb_config.
In the case of Embedded, the DPB can be used to tune per-database entries on first attaching to a database.
Macro Substitution
A number of predefined macros (syntax $(name)) is available for use in the configuration files to substitute for
a directory name:
$(root)
Root directory of Firebird instance
$(install)
Directory where Firebird is installed. $(root) and $(install) are initially the same. $(root) can be overridden
by setting or altering the environment variable FIREBIRD, in which case it becomes different from $(install).
$(this)
Directory where current configuration file is located
$(dir_conf)
Directory where firebird.conf and databases.conf are located
$(dir_secdb)
Directory where the default security database is located
$(dir_plugins)
Directory where plugins are located
37
Notes
In our pre-built binaries, $(dir_conf) and $(dir_secdb) would normally be the same as $(root) and $(install).
$(dir_plugins), $(dir_udf), $(dir_sample), $(dir_sampledb) and $(dir_intl) are predefined sub-directories inside
$(root).
The build conventions are not rules that could be expected to apply in every distribution of Firebird. Distro-specific Linux packages, for example, each prefer to fit the Firebird components into standard layouts that
comply with their own conventions. As an illustration, user binaries, such as isql might be located in /usr/
bin, server binaries in /usr/sbin, configuration files in /etc/firebird.d and so on. Obviously, $(root)
would then make no sense, even if the $(dir_something) macros still pointed to actual directories.
Includes
One configuration file can be included in another by using an include directive, e.g.,
include some_file.conf
A relative path is treated as relative to the enclosing configuration file. So, if our example above is inside /opt/
config/master.conf then our include refers to the file /opt/config/some_file.conf.
Wildcards
The standard wildcards * and ? may be used in an include directive, to include all matching files in undefined
order. For example,
include $(dir_plugins)/config/*.conf
38
Per-database Configuration
Custom configuration at database level is achieved with formal entries in databases.conf.
If you are not adding any database-specific configuration directives for an alias, the format is just as it was
before, e.g.,
emp =
** or
emp =
** or
emp =
c:\Program Files\examples\empbuild\employee.fdb
**
/opt/firebird/examples/empbuild/employee.fdb
**
$(dir_sampleDb)/employee.fdb
A slightly more complex format is used for cases where certain non-global parameters are to be targeted at an
indvidual databases. The entry for the database is defined by the alias declaration, as previously. The databasespecific directives are listed below it, within curly brackets.
#
# Directives for MYBIGDB
MYBIGDB = opt/databases/mybigdb.fdb
{
LockMemSize = 32M
# We know that MYBIGDB needs a lot of locks
LockHashSlots = 19927
# and a hash table large enough for them
}
Parameters Available
The following parameters can be copy/pasted to databases.conf and used as overrides for specific databases.
39
DeadlockTimeout
DefaultDbCachePages
EventMemSize
FileSystemCacheThreshold
ExternalFileAccess
GCPolicy
LockAcquireSpins
LockHashSlots
LockMemSize
MaxUnflushedWrites
MaxUnflushedWriteTime
SecurityDatabase
UserManager
WireCompression
WireCrypt
Client-related
AuthClient
Providers
WireCryptPlugin
DummyPacketInterval
IpcName
RemoteAuxPort
RemotePipeName
RemoteServiceName
RemoteServicePort
TCPNoNagle
New Parameters
New parameters added to firebird.conf are:
SecurityDatabase
Defines the name and location of the security database that stores login user names and passwords used by the
server to validate remote connections. By default, in firebird.conf, it is $(root)/security3.fdb. It
can be overridden for a specific database by a configuration in databases.conf.
40
WireCrypt
Sets whether the network connection should be encrypted. It has three possible values: Required | Enabled |
Disabled. The default is set such that encryption is Required for connections coming in to the server and Enabled
for connections outgoing to a server.
To access a server using an older client library and, thus, no encryption, WireCrypt in the server configuration
file should be set to Enabled or Disabled to avert the default Required.
The rules are simple: if one side has WireCrypt = Required and the other sets the parameter to Disabled,
side with WireCrypt=Required rejects the connection and it is not established.
A missing WireCrypt plug-in or encryption key in cases where the channel must be encrypted also thwarts a
connection.
In all other cases, connection is established without encryption if at least one side has WireCrypt = Disabled. In other cases, the encrypted connection is established.
UserManager
Sets the plug-in that will operate on the security database. It can be a list with blanks, commas or semicolons
as separators: the first plug-in from the list is used.
The default plug-in is Srp (libSrp.s0 | Srp.dll | Srp.dylib).
The UserManager parameter can be used in databases.conf for a database-specific override.
TracePlugin
Specifies the plug-in used by Firebird's Trace facility to send trace data to the client app or audit data to the
log file.
The default plug-in is fbtrace (libfbtrace.s0 | fbtrace.dll | fbtrace.dylib).
WireCryptPlugin
A wire-crypt plug-in is used to encrypt and decrypt data transferred over the network.
41
KeyHolderPlugin
This parameter would represent some form of temporary storage for database encryption keys. Nothing is implemented as a default plug-in but a sample Linux plug-in named libCryptKeyHolder_example.so can
be found in /plugins/.
Providers
List of allowed transports for accessing databases, discussed in the Engine chapter.
ServerMode
Determines the execution mode of the server (server model). Discussed in the Engine chapter.
RemoteAccess
Parameter in firebird.conf and databases.conf provides an efficient, configurable replacement for
hard-coded rules limiting access to security3.fdb. It can also be used to configure limited remote access
to any other database, including non-default security databases.
By default RemoteAccess is enabled for all databases except the security database. If you intend using more
than one dedicated security database, then disabling remote access to it (or them) via databases.conf is
recommended.
For stricter security, server-wide, you can set RemoteAccess to false in firebird.conf and use entries in
database.conf to re-enable it for specific databases.
RemoteAccess is a Boolean. It can be expressed with either true/false, 1/0 or Yes/No.
WireCompression
Alex Peshkov
Parameter in firebird.conf or databases.conf, enabling or disabling compression of data over the
wire at global or individual database level.
The default setting is disabled (= False). Settings and environment must be correct at both server and client for
WireCompression to take effect:
To enable it at the server side, in firebird.conf and/or databases.conf, change the setting to True
42
To activate Wirecompression from the client side, pass the appropriate tag in the config item of the DPB
or SPB call:
isc_dbp_config/isc_sbp_config <string-length> "WireCompression=true"
Both server and client versions must be Firebird 3 or greater (protocol >=13)
See Tracker item CORE-733.
IPv6V6Only
Michael Kubecek
Parameter in firebird.conf only. (TCP ports are created before any connection is established.)
Firebird 3 supports IPv6 connections, on both client and server sides.
Server
By default, the Firebird server listens on the zero IPv6 address (::) and accepts all incoming connections, whether
IPv4 or IPv6, and IPv6V6Only is set to false (=0). If it is set to true, the server, still listening implicitly or
explicitly on the zero IPv6 address, will accept only IPv6 connections.
Note
A different listening address, either IPv4 or IPv6, can be set using the RemoteBindAddress parameter. If an
IPv4 address or a non-zero IPv6 address is used, the IPv6V6Only directive has no effect.
On POSIX platforms, in Classic mode, the parameters RemoteBindAddress, RemoteServicePort and RemoteServiceName are ignored by fbserver, since the listening socket is set up by (x)inetd. The listening address and/or port need to be set in the (x)inetd.
Client
The standard text form of an IPv6 address uses the colon character to separate the four groups of digits. In the
connection string, the IPv6 address must be enclosed in square brackets, to resolve the ambiguity with the use
of the colon as the separator between the host IP address and the database path. For example:
connect '[2014:1234::5]:test';
connect '[2014:1234::5]/3049:/srv/firebird/test.fdb';
Notes
For consistency, square brackets can be optionally used around an IPv4 address or a domain name.
If a domain name is used in connection string, all addresses (IPv4 and IPv6) are tried in the order returned by
resolver until a connection is established. If all attempts fail, the client fails to connect.
43
ExternalFileAccess
Entries in the Restrict list of the ExternalFileAccess parameter can be used to mangle file names with relative
paths.
Entries in the Restrict list were already used to mangle file names with no path component. For example, with
ExternalFileAccess = /opt/extern
RootDirectory
In older version, this parameter provided a superfluous option for recording the file system path to Firebird's
root files (firebird.conf, the security database and so on).
LegacyHash
This parameter used to make it possible to use the old security.fdb from Firebird 1.X installations after it
had been subjected to an upgrade script and thence to enable or disable use of the obsolete DES hash encrypting
algorithm. It is no longer supported.
44
OldSetClauseSemantics
This parameter enabled temporary support for an implementation fault in certain sequences of SET clauses in
versions of Firebird prior to v.2.5. It is no longer available.
OldColumnNaming
This parameter temporarily enabled legacy code support for an old InterBase/Firebird 1.0 bug that generated
unnamed columns for computed output which was not explicitly aliased in the SELECT specification. It is no
longer available.
LockGrantOrder
This parameter used to allow the option to have Firebird's Lock Manager emulate InterBase v3.3 lock allocation
behaviour, whereby locks would be granted in no particular order, as soon as soon as they were available, rather
than by the normal order (first-come, first-served). The legacy option is no longer supported.
45
Chapter 7
Security
Security improvements in Firebird 3 include:
Note
The value of the SecurityDatabase parameter can be a database alias or the actual database path.
46
Security
SQL> create database '/mnt/storage/private.security.fdb';
Now connect to any database which will be served by the security database you are currently preparing, in order
to create its SYSDBA user:
SQL>
SQL>
SQL>
SQL>
connect first;
create user sysdba password 'sysdba-in-private-security-password';
commit;
exit;
Database Encryption
Alex Peshkov
CORE-657
With Firebird 3 comes the ability to encrypt data stored in database. Not all of the database file is encrypted:
just data, index and blob pages.
To make it possible to encrypt a database you need to obtain or write a database crypt plug-in.
Note
The sample crypt plug-in in examples/dbcrypt does not perform real encryption, it is merely a sample
of how to go about it.
Secret Key
The main problem with database encryption is how to store the secret key. Firebird provides a helper to transfer
that key from the client but that does not imply that storing the key on a client is the best way: it is no more than
a possible alternative. A very bad option is to keep the key on the same disk as the database.
Encryption Tasks
To separate encryption and key access efficiently, a database crypt plug-in is split into two parts: encryption
itself and the secret key holder. This may be an efficient approach for third-party plug-ins when you want to use
some good encryption algorithm but you have your own secret way to store a key.
Encrypting a Database
Once you have decided on a crypt plug-in and a key, you can encrypt the database with:
ALTER DATABASE ENCRYPT WITH <PLUGIN_NAME> [ KEY <key-name> ]
The optional KEY argument allows the key name to be passed in the command, if the plug-in requires it.
47
Security
Encryption will start right after this statement commits and will be performed in background. Normal database
activity is not disturbed during encryption.
Monitoring Encryption
During encryption, progress can be monitored using the field MON$CRYPT_PAGE in the pseudo-table MON
$DATABASE. For example:
select MON$CRYPT_PAGE * 100 / MON$PAGES
from MON$DATABASE
The example query will output the percentage of encryption completed so far.
You can also watch the database header page using repeated calls to gstat -e.If the database has been encrypted, gstat -h can also provide limited information about encryption state.
Decrypting a Database
To decrypt the database do:
ALTER DATABASE DECRYPT
For Linux, an example plug-in named libDbCrypt_example.so can be found in the /plugins/ subdirectory.
Security
Important
Use of the new authentication method is not compatible with old security databases and passwords from them.
However, an upgrade procedure is available to migrate users from a Firebird 2.x security2.fdb database.
For instructions, see Upgrading a v.2.x Security Database in the Compatibility chapter.
Use of an old security database can be supported with the Legacy_Auth authentication plug-in, but this kills
the security benefits of Firebird 3.
The Firebird 3 client is built to make it possible to talk to old servers with the default configuration.
SSL/TLS Support
CORE-3251
So, the answer to the question Does Firebird use SSL/TLS for password validation? is yes and no. The No
answer comes because, by default, SSL is not used. That is due to a minor licensing incompatibility between
Firebird and OpenSSL, the most popular SSL implementation.
The Yes applies because anyone is free to write an authentication plug-in that uses SSL and TLS.
Support for the LegacyHash and Authentication parameters in firebird.conf has been dropped. Authentication
is overtaken by an AuthServer parameter in firebird.conf or elsewhere.
Security
User Manageradds, modifies and deletes users on the server. It is not needed if some external authentication
method, such as Windows trusted authentication, is used.
All three parts are actually separate plug-ins which should be configured separately in firebird.conf. Let's
look at an example of configuring a server to accept connections from old clients. The default setting are:
AuthServer = Srp, Win_Sspi
UserManager = Srp
If we also want to manage the list of users in the old format we must add:
UserManager = Legacy_UserManager
SEC$PLUGIN
===============================
Legacy_UserManager
Srp
Srp
Srp
Srp
Srp
Srp
Srp
Srp
Srp
Srp
There might well be two users named SYSDBA in such a list, because each user manager has its own SYSDBA.
Notes
All user management commands can have the USING PLUGIN clause, whose purpose is to enable selection
of a particular UserManager plug-in from the list in firebird.conf.
The default user manager in firebird.conf is Srp. If you need to manage legacy logins, set it to
Legacy_UserManager, e.g., UserManager = Legacy_UserManager,Srp.
UserManager can be configured at database level, in databases.conf.
50
Security
Security
Firebird 3 introduces new SQL privileges to map access between users and groups and security objects and
between databases. See Tracker item CORE-1900.
With Firebird now supporting multiple security databases, some new problems arise that could not occur with
a single, global security database. Clusters of databases using the same security database were efficiently separated. Mappings provide the means to achieve the same efficiency when multiple databases are using their own
security databases. Some cases require control for limited interaction between such clusters. For example:
when EXECUTE STATEMENT ON EXTERNAL DATA SOURCE requires some data exchange between
clusters
when server-wide SYSDBA access to databases is needed from other clusters, using services.
comparable problems that have existed on Firebird 2.1 and 2.5 for Windows, due to support for Trusted User
authentication: two separate lists of usersone in the security database and another in Windows, with cases
where it was necessary to relate them. An example is the demand for a ROLE granted to a Windows group
to be assigned automatically to members of that group.
The single solution for all such cases is mapping the login information assigned to a user when it connects to a
Firebird server to internal security objects in a databaseCURRENT_USER and CURRENT_ROLE.
mapping scopewhether the mapping is local to the current database or whether its effect is to be global,
affecting all databases in the cluster, including security databases
2.
mapping namean SQL identifier, since mappings are objects in a database, like any other
3.
the object FROM which the mapping maps. It consists of four items:
The authentication source
plug-in name or
the product of a mapping in another database or
use of server-wide authentication or
any method
The name of the database where authentication succeeded
The name of the object from which mapping is performed
The type of that nameuser name | role | OS groupdepending upon the plug-in that added that name
during authentication
Any item is accepted but only type is required.
4.
52
Security
Description
Any mapping may be tagged as GLOBAL.
Global mapping works best if a Firebird 3 or higher version database is used as the security database. If
you plan to use another database for this purposeusing your own provider, for examplethen you should
create a table in it named RDB$MAP, with the same structure as RDB$MAP in a Firebird 3 database and
with SYSDBA-only write access.
Beware!
If global and local mappings of the same name exist then know and make it known that they are different
objects!
The CREATE, ALTER and CREATE OR ALTER statements use the same set of options. The name (identifier) of a mapping is used to identify it, as in other DDL command sets.
The USING clause has a highly complicated set of options:
- an explicit plug-in name means it will work only for that plug-in
- it can use any available plug-in; although not if the source is the product of a previous mapping
- it can be made to work only with server-wide plug-ins
- it can be made to work only with previous mapping results
- it can be left to use any method, using the asterisk (*) argument
- it can be provided with the name of the database that originated the mapping for the FROM object
Note
This argument is not valid for mapping server-wide authentication.
The FROM clause takes a mandatory argument, the type of the object named.
-> When mapping names from plug-ins, type is defined by the plug-in.
-> When mapping the product of a previous mapping, type can be only USER or ROLE.
53
Security
-> If an explicit name is provided, it will be taken into account by this mapping
-> Use the ANY keyword to work with any name of the given type.
In the TO clause, the USER or ROLE to which the mapping is made must be specified. NAME is optional:
if it is not supplied, the name from the originating mapping is used.
Examples
The examples use the CREATE syntax. Usage of ALTER is exactly the same and the usage of DROP should
be obvious.
1.
Enable use of Windows trusted authentication in all databases that use the current security database:
CREATE GLOBAL MAPPING TRUSTED_AUTH
USING PLUGIN WIN_SSPI
FROM ANY USER
TO USER;
2.
Note
The group DOMAIN_ANY_RID_ADMINS does not exist in Windows, but such a name would be added
by the win_sspi plug-in to provide exact backwards compatibility.
3.
Enable a particular user from another database to access the current database with another name:
CREATE MAPPING FROM_RT
USING PLUGIN SRP IN "rt"
FROM USER U1 TO USER U2;
Important
Database names or aliases will need to be enclosed in double quotes on operating systems that have casesensitive file names.
4.
Enable the server's SYSDBA (from the main security database) to access the current database. (Assume
that the database is using a non-default security database):
CREATE MAPPING DEF_SYSDBA
USING PLUGIN SRP IN "security.db"
FROM USER SYSDBA
TO USER;
54
Security
5.
Ensure users who logged in using the legacy authentication plug-in do not have too many privileges:
CREATE MAPPING LEGACY_2_GUEST
USING PLUGIN legacy_auth
FROM ANY USER
TO USER GUEST;
When writing authentication plug-ins it is unnecessary to be concerned about character sets, since all data exchange with the new plug-ins is done using UTF8. Just be prepared to handle user names and passwords that
contain characters beyond the range of the 7-bit ASCII character subset.
55
Security
connecting via a Windows text console with the default OEM code page selected
2.
3.
running scripts
All operating systems except Windows use same the same character set (code page, locale), by default, for
all programs. In Windows, for historical reasons, GUI applications use an ANSI code page, but applications
started on the command-line console emulator use the corresponding OEM code page. As an example, the
Russian version of Windows is uses code page 1251 (ANSI Russian) for GUI applications and code page
866 (OEM Russian) for command-line applications.
The Firebird client always uses the ANSI code page. In order to provide the fully functional behaviour of
a console application, the console must be switched to the ANSI codepage (chcp 1251 for our Russian
example).
The Windows weirdness does not stop there. Parameters passed to a Windows application, but not to 16-bit
DOS, are always passed in the ANSI encoding, even if it was started from a command-line console running
in the default OEM mode. This might give the illusion that Firebird utilities run correctly out-of-the-box
on an OEM console. However, they run correctly only as far as the international information supplied in
a command line, e.g.,
C:> isql server:database -user <intl-login> -pas <intl-password>
This works. However, as soon as you try to use a CONNECT or CREATE DATABASE command inside isql,
or to enter the password from the OEM terminal, you will encounter problems. This is inconvenient and
we apologise for that. The OEM console issues are in the plan to be fixed in a future version.
2.
Currently, command-line parameters and the CONNECT and CREATE DATABASE commands in isql are not
affected by SET NAMES or the -CHarset parameter. All the other commands, particularly CREATE/ALTER/DROP USER, are affected by them and thus, the character set must be specified. This is very important
because, in future versions, the plan is to make all usage of international credentials depend on a character
set that is explicitly specified.
Take careful note of one very confusing use case, an attempt to set a non-ASCII password for the current
user:
SQL> alter current user set password '<intl-password>';
This command will succeed, even if the character set has not been set correctly. However, a subsequent
attempt to log in with the modified password will fail.
56
Security
3.
In scripts, the first requirement is to set the correct character set for the SQL server that is to run the script,
using a SET NAMES statement. For Firebird 3, it is essential to pay attention to the locale and code page
settings in the environment in which the script is to execute. They must match the character set that is set
in the script.
Setting the locale correctly affects particularly the credentials passed to the server when attaching to it. The
rest of the script should proceed successfully even without configuring the environment properly.
In summary, if you plan to use international character credentials in the script, you DO need to attend to
the international settings in your environment.
Reminder
User names are SQL identifiers and thus conform to the same rules, i.e., enclosed in double quotes when
containing international characters or when case-sensitivity is required.
Security
Note
The NAME side of the name/value pair can be any valid SQL identifier.
Usage Details
The CREATE USER, CREATE OR ALTER USER and DROP USER clauses are available only for SYSDBA
or another user granted the RDB$ADMIN role in the security database (and logged in under that role, of course.)
The PASSWORD clause is required when creating a new user.
An ordinary user can ALTER his own password, real name attributes and tags. Any attempt to modify another
user will fail, as will an attempt to make self inactive or active.
If you want to modify self, you can use the simplified form ALTER CURRENT USER.
At least one of PASSWORD, FIRSTNAME, MIDDLENAME, LASTNAME, ACTIVE, INACTIVE or TAGS
must be present in an ALTER USER or CREATE OR ALTER USER statement.
It is not a requirement to use any of the clauses FIRSTNAME, MIDDLENAME and LASTNAME. Any of them
may be left empty or used to store short information about the user.
The INACTIVE clause is used to disable the user's login capability without dropping it. The ACTIVE clause
restores that login ability.
TAGS is a list of end-user defined attributes. The length of the string value should not exceed 255 bytes.
Setting a list of tags for the user retains previously set tags if they are not mentioned in the current list.
Note
A UID or GID that was entered by the deprecated gsec utility is treated as a tag in the SQL interface.
Examples
Generic:
58
Security
TAG
==========
<null>
B
C
<null>
VALUE
====================
<null>
x
sample
<null>
PLUGIN
===============================
Srp
Srp
Srp
Legacy_UserManager
Note
Output depends upon the user management plug-in. If the legacy plug-in is used, bear in mind that some options
are not supported and will simply be ignored.
SET ROLE
Alex Peshkov
See Tracker item CORE-1377.
59
Security
The SQL2008-compliant operator SET ROLE allows the CURRENT_ROLE context variable to be set to one
that has been granted to the CURRENT_USER or to a user assigned to the database attachment as trusted (SET
TRUSTED ROLE).
Syntax Pattern for SET ROLE
Enable CURRENT_USER access to a role that has been previously granted:
SET ROLE <rolename>
Displays:
ROLE
===============================
MANAGER
Syntax Pattern
Enable access to a trusted role, if the CURRENT_USER is logged in under Trusted User authentication and
the role is available:
SET TRUSTED ROLE
60
Security
An example of the use of a trusted role is assigning the system role RDB$ADMIN to a Windows administrator
when Windows trusted authentication is in use.
The GRANTED BY clause form is recommended by the SQL standard. The alternative form using AS is
supported by Informix and possibly some other servers and is included for better compatibility.
Example (working as SYSDBA)
create role r1;
grant r1 to user1 with admin option;
grant r1 to public granted by user1;
-- (in isql)
show grant;
/* Grant permissions for this database */
GRANT R1 TO PUBLIC GRANTED BY USER1
GRANT R1 TO USER1 WITH ADMIN OPTION
Example
# gsec -del guest
# isql employee
fbs bin # ./isql employee
Database: employee
SQL> REVOKE ALL ON ALL FROM USER guest;
SQL>
61
Security
Syntax Patterns
Granting metadata privileges:
GRANT CREATE <object-type>
TO [USER | ROLE] <user-name> | <role-name> [WITH GRANT OPTION];
GRANT ALTER ANY <object-type>
TO [USER | ROLE] <user-name> | <role-name> [WITH GRANT OPTION];
GRANT DROP ANY <object-type>
TO [USER | ROLE] <user-name> | <role-name> [WITH GRANT OPTION];
[GRANT OPTION
[USER | ROLE]
[GRANT OPTION
[USER | ROLE]
[GRANT OPTION
[USER | ROLE]
Notes on Usage
<object-type> can be any of the following:
CHARACTER SET
COLLATION
DOMAIN
62
EXCEPTION
Security
FILTER
PROCEDURE
VIEW
FUNCTION
ROLE
GENERATOR
SEQUENCE
PACKAGE
TABLE
Note
The metadata for triggers and indices are accessed through the privileges for the table that owns them.
If the ANY option is used, the user will be able to perform any operation on any object
If the ANY option is absent, the user will be able to perform operations on the object only if he owns it
If the ANY option was acquired via a GRANT operation then, to revoke it, the REVOKE operation must
accord with that GRANT operation
Example
GRANT CREATE TABLE TO Joe;
GRANT ALTER ANY TABLE TO Joe;
REVOKE CREATE TABLE FROM Joe;
Note
The initial EXECUTE permission is granted to the function owner (user who created or declared the function).
Security
Syntax Pattern
GRANT USAGE ON <object type> <name> TO <grantee list>
[<grant option> <granted by clause>]
-REVOKE USAGE ON <object type> <name> FROM <grantee list>
[<granted by clause>]
-<object type> ::= {DOMAIN | EXCEPTION | GENERATOR | SEQUENCE | CHARACTER SET | COLLATION}
Notes
The initial USAGE permission is granted to the object owner (user who created the object).
In Firebird 3.0.0, only USAGE permissions for exceptions (CORE-2884) and generators/sequences (gen_id,
next value for: CORE-2553) are enforced. Granting privileges for character sets, collations and domains is
disabled, making these object types unavailable for any type of GRANT or REVOKE commands. Access to
them is not subject to any form of enforcement, although this could change in future releases if it is deemed
appropriate.
The pseudo-tables are much like the MON$ family tables used for monitoring the server. The table is created
on demand when you run the statement
SELECT * FROM SEC$USERS
or
SELECT * FROM SEC$USER_ATTRIBUTES
The output lists the users (or their attributes) in the security database that is configured for the current database
and available for management to the current user. SEC$USERS includes a field indicating whether a user has
the RDB$ADMIN role in the security database.
64
Chapter 8
Data Definition
Language (DDL)
Quick Links
DDL Enhancements
The following enhancements have been added to the SQL data definition language lexicon:
The IS Operator
Predications use the operator IS [NOT] for matching. For example, field1 IS FALSE, or field1 IS NOT TRUE.
Note
Equivalence operators (=, !=, <> and so on) are valid in all comparisons.
Examples
CREATE TABLE TBOOL (ID INT, BVAL BOOLEAN);
COMMIT;
INSERT INTO TBOOL VALUES (1, TRUE);
INSERT INTO TBOOL VALUES (2, 2 = 4);
INSERT INTO TBOOL VALUES (3, NULL = 1);
COMMIT;
SELECT * FROM TBOOL
ID
BVAL
============ =======
1 <true>
2 <false>
3 <null>
-- Test for TRUE value
SELECT * FROM TBOOL WHERE BVAL
ID
BVAL
============ =======
1 <true>
-- Test for FALSE value
SELECT * FROM TBOOL WHERE BVAL IS FALSE
ID
BVAL
============ =======
2 <false>
-- Test for UNKNOWN value
SELECT * FROM TBOOL WHERE BVAL IS UNKNOWN
ID
BVAL
============ =======
3 <null>
-- Boolean values in SELECT list
SELECT ID, BVAL, BVAL AND ID < 2
FROM TBOOL
ID
BVAL
============ ======= =======
1 <true> <true>
2 <false> <false>
3 <null> <false>
-- PSQL Declaration with start value
DECLARE VARIABLE VAR1 BOOLEAN = TRUE;
-- Valid syntax, but as with a comparison
-- with NULL, will never return any record
66
Notes
Represented in the API with the FB_BOOLEAN type and FB_TRUE and FB_FALSE constants.
The value TRUE is greater than the value FALSE.
Although BOOLEAN is not implicitly convertible to any other datatype, it can be explicitly converted to
and from string with CAST.
When defining a column, the optional START WITH clause allows the generator to be initialised to a value
other than zero. See Tracker ticket CORE-4199.
<alter column definition> ::=
<name> RESTART [ WITH <value> ]
A column definition can be altered to modify the starting value of the generator. RESTART alone resets the
generator to zero; the optional WITH <value> clause allows the restarted generator to start at a value other than
zero. See Tracker ticket CORE-4206.
Rules
The data type of an identity column must be an exact number type with zero scale. Allowed types are thus
SMALLINT, INTEGER, BIGINT, NUMERIC(x,0) and DECIMAL(x,0).
An identity column cannot have DEFAULT or COMPUTED value.
67
Notes
An identity column cannot be altered to become a regular column. The reverse is also true.
Identity columns are implicitly NOT NULL (non-nullable).
Uniqueness is not enforced automatically. A UNIQUE or PRIMARY KEY constraint is required to guarantee uniqueness.
The use of other methods of generating key values for IDENTITY columns, e.g., by trigger-generator code
or by allowing users to change or add them, is discouraged to avoid unexpected key violations.
Example
create table objects (
id integer generated by default as identity primary key,
name varchar(15)
);
insert into objects (name) values ('Table');
insert into objects (name) values ('Book');
insert into objects (id, name) values (10, 'Computer');
select * from objects;
ID
============
1
2
10
NAME
===============
Table
Book
Computer
Implementation Details
Two new columns have been inserted in RDB$RELATION_FIELDS to support identity columns: RDB
$GENERATOR_NAME and RDB$IDENTITY_TYPE.
RDB$GENERATOR_NAME stores the automatically created generator for the column. In RDB$GENERATORS, the value of RDB$SYSTEM_FLAG of that generator will be 6.
Currently, RDB$IDENTITY_TYPE will currently always store the value 1 (by default) for identity columns
and NULL for non-identity columns. In the future this column will store the value 0, too (for ALWAYS)
when Firebird implements support for this type of identity column.
68
Notes
The success of a change in a table column from NULL to NOT NULL is subject to a full data validation on the
table, so ensure that the column has no nulls before attempting the change.
A change in a domain subjects all the tables using the domain to validation.
An explicit NOT NULL on a column that depends on a domain prevails over the domain. In this situation, the
changing of the domain to make it nullable does not propagate to the column.
The alteration does not change any existing data. The new default character set is used only in subsequent DDL
commands and will assume the default collation of the new character set.
69
Usage
To set linger for the database do:
ALTER DATABASE SET LINGER TO 30;
Either of the following forms will clear the linger setting and return the database to the normal condition (no
linger):
ALTER DATABASE DROP LINGER;
ALTER DATABASE SET LINGER TO 0;
Note
Dropping LINGER is not an ideal solution for the occasional need to turn it off for some once-only condition
where the server needs a forced shutdown. The gfix utility now has the -NoLinger switch, which will close the
specified database immediately the last attachment is gone, regardless of the LINGER setting in the database.
The LINGER setting is retained and works normally the next time.
The same one-off override is also available through the Services API, using the tag isc_spb_prp_nolinger,
e.g. (in one line):
fbsvcmgr host:service_mgr user sysdba password xxx
action_properties dbname employee prp_nolinger
See also Tracker ticket CORE-4263 for some discussion of the development of this feature.
GRANT/REVOKE USAGE
New SQL-2008 compliant USAGE permission is introduced to protect metadata objects other than tables, views,
procedures and functions.
72
Chapter 9
Data Manipulation
Language (DML)
In this chapter are the additions and improvements that have been added to the SQL data manipulation language
subset in Firebird 3.0.
Quick Links
Rules
At least one of <merge when matched> or <merge when not matched> should be specified.
Example
MERGE INTO customers c
USING
(SELECT * FROM customers_delta WHERE id > 10) cd
ON (c.id = cd.id)
WHEN MATCHED THEN
UPDATE SET name = cd.name
WHEN NOT MATCHED THEN
INSERT (id, name)
VALUES (cd.id, cd.name)
Notes
A right join is made between the INTO (left-side) and USING tables using the condition. UPDATE is called
when a record exists in the left table (INTO), otherwise INSERT is called.
As soon as it is determined whether or not the source matches a record in the target, the set formed from the
corresponding (WHEN MATCHED / WHEN NOT MATCHED) clauses is evaluated in the order specified,
to check their optional conditions. The first clause whose condition evaluates to true is the one which will be
executed, and the subsequent ones will be ignored.
If no record is returned in the join, INSERT is not called.
74
Results
id
-1
2
department
---------R & D
SALES
salary
-----10.00
12.00
portion
---------0.2040
0.2448
75
SALES
R & D
R & D
8.00
9.00
10.00
0.1632
0.1836
0.2040
The query is repetitive and lengthy to run, especially if EMPLOYEE happened to be a complex view.
The same query could be specified in a much faster and more elegant way using a window function:
select
id,
department,
salary,
salary / sum(salary) OVER () portion
from employee
order by id;
Here, sum(salary) over () is computed with the sum of all SALARY from the query (the employee table).
Partitioning
Like aggregate functions, that may operate alone or in relation to a group, window functions may also operate
on a group, which is called a partition.
Syntax Pattern
<window function>(...) OVER (PARTITION BY <expr> [, <expr> ...])
Aggregation over a group could produce more than one row, so the result set generated by a partition is joined
with the main query using the same expression list as the partition.
Continuing the employee example, instead of getting the portion of each employee's salary over the all-employees total, we would like to get the portion based on just the employees in the same department:
select
id,
department,
salary,
salary / sum(salary) OVER (PARTITION BY department) portion
from employee
order by id;
Results
id
-1
2
3
4
5
department
---------R & D
SALES
SALES
R & D
R & D
salary
-----10.00
12.00
8.00
9.00
10.00
portion
---------0.3448
0.6000
0.4000
0.3103
0.3448
76
Ordering
The ORDER BY sub-clause can be used with or without partitions and, with the standard aggregate functions,
make them return the partial aggregations as the records are being processed.
Example
select
id,
salary,
sum(salary) over (order by salary) cumul_salary
from employee
order by salary;
salary
-----8.00
9.00
10.00
10.00
12.00
cumul_salary
-----------8.00
17.00
37.00
37.00
49.00
Then cumul_salary returns the partial/accumulated (or running) aggregation (of the SUM function). It may
appear strange that 37.00 is repeated for the ids 1 and 5, but that is how it should work. The ORDER BY keys
are grouped together and the aggregation is computed once (but summing the two 10.00). To avoid this, you
can add the ID field to the end of the ORDER BY clause.
It's possible to use multiple windows with different orders, and ORDER BY parts like ASC/DESC and NULLS
FIRST/LAST.
With a partition, ORDER BY works the same way, but at each partition boundary the aggregation is reset.
All aggregation functions, other than LIST(), are usable with ORDER BY.
Ranking Functions
The rank functions compute the ordinal rank of a row within the window partition. In this category are the
functions DENSE_RANK, RANK and ROW_NUMBER.
Syntax
<ranking window function> ::=
77
The ranking functions can be used to create different type of incremental counters. Consider SUM(1) OVER
(ORDER BY SALARY) as an example of what they can do, each of them in a different way. Following is an
example query, also comparing with the SUM behavior.
select
id,
salary,
dense_rank() over (order by salary),
rank() over (order by salary),
row_number() over (order by salary),
sum(1) over (order by salary)
from employee
order by salary;
salary
-----8.00
9.00
10.00
10.00
12.00
dense_rank
---------1
2
3
3
4
rank
---1
2
3
3
5
row_number
---------1
2
3
4
5
sum
--1
2
4
4
5
The difference between DENSE_RANK and RANK is that there is a gap related to duplicate rows (relative to the
window ordering) only in RANK. DENSE_RANK continues assigning sequential numbers after the duplicate
salary. On the other hand, ROW_NUMBER always assigns sequential numbers, even when there are duplicate
values.
Navigational Functions
The navigational functions get the simple (non-aggregated) value of an expression from another row of the
query, within the same partition.
Syntax
<navigational window function> ::=
FIRST_VALUE(<expr>) |
LAST_VALUE(<expr>) |
NTH_VALUE(<expr>, <offset>) [FROM FIRST | FROM LAST] |
LAG(<expr> [ [, <offset> [, <default> ] ] ) |
LEAD(<expr> [ [, <offset> [, <default> ] ] )
Important to Note
FIRST_VALUE, LAST_VALUE and NTH_VALUE also operate on a window frame. Currently, Firebird always frames from the first to the current row of the partition, not to the last. This is likely to produce strange
results for NTH_VALUE and especially LAST_VALUE.
78
salary
-----8.00
9.00
10.00
10.00
12.00
first_value
----------8.00
8.00
8.00
8.00
8.00
last_value
---------8.00
9.00
10.00
10.00
12.00
nth_value
--------<null>
9.00
9.00
9.00
9.00
lag
-----<null>
8.00
9.00
10.00
10.00
lead
-----9.00
10.00
10.00
12.00
<null>
FIRST_VALUE and LAST_VALUE get, respectively, the first and last value of the ordered partition.
NTH_VALUE gets the n-th value, starting from the first (default) or the last record, from the ordered partition. An offset of 1 from first would be equivalent to FIRST_VALUE; an offset of 1 from last is equivalent
to LAST_VALUE.
LAG looks for a preceding row, and LEAD for a following row. LAG and LEAD get their values within a
distance respective to the current row and the offset (which defaults to 1) passed.
In a case where the offset points outside the partition, the default parameter (which defaults to NULL) is returned.
79
Internal Functions
Additions and enhancements to the internal functions set are:
Discussion: TrackerCORE-2006
For more information about the use of SIMILAR TO expressions, refer to README.similar_to.txt in the /
doc/ subdirectory of your Firebird installation.
Tip
The regex used is the SQL one. A guide is available in the DML chapter of the v.2.5 release notes and also
at the Firebird web site.
COSH
Returns the hyperbolic cosine of an angle (expressed in radians). Format: COSH( <number> )
SINH
Returns the hyperbolic sine of an angle (expressed in radians). Format: SINH( <number> )
TANH
Returns the hyperbolic tangent of an angle (expressed in radians). Format: TANH( <number> )
Statistical Functions
Hajime Nakagami
Adriano dos Santos Fernandes
A suite of SQL-standards-compliant statistical functions has been implemented.
<dual param statistical function> ::= <dual param statistical function name>(<expr1>, <expr>>)
<dual param statistical function name> := { COVAR_POP | COVAR_SAMP | CORR }
Semantics
NULL is returned from VAR_SAMP, STDDEV_SAMP or COVAR_SAMP if the result count is 0 or 1
NULL is returned from VAR_POP, STDDEV_POP, COVAR_POP or CORR if the result count is 0
Syntax
SELECT STDDEV_SAMP(salary) FROM employees;
Format
VAR_SAMP
VAR_SAMP( <expr> )
Description
Returns the Sample Variance, equivalent to
81
Function
Format
VAR_POP
VAR_POP( <expr> )
Description
Returns the the Population Variance, equivalent to
STDDEV_SAMP
STDDEV_SAMP( <expr> )
SQRT(VAR_SAMP(<expr>))
STDDEV_POP
STDDEV_POP( <expr> )
SQRT(VAR_POP(<expr>))
COVAR_SAMP
COVAR_SAMP( <expr1>,
<expr2> )
COVAR_POP
COVAR_POP( <expr1>,
<expr2> )
CORR
Formulae
The formulae use the following variables:
82
Important
Y and X are DOUBLE PRECISION. N is SMALLINT, INTEGER or BIGINT.
All functions eliminate expression pairs where either expression in the pair is NULL. If no rows remain, the
functions (except REGR_COUNT()) return NULL.
Format
Description
REGR_AVGX
REGR_AVGX(Y, X)
REGR_AVGY
REGR_AVGY(Y, X)
REGR_COUNT
REGR_COUNT(Y, X)
Formula: REGR_COUNT(Y, X) = N
REGR_INTERCEPT
REGR_INTERCEPT(Y, X)
Returns the y-intercept of the regression line determined by a set of expression pairs (Y and X).
REGR_R2
REGR_R2(Y, X)
REGR_SLOPE
REGR_SLOPE(Y, X)
83
Function
Format
Description
REGR_SXX
REGR_SXX(Y, X)
Returns the sum of squares of the independent expression (Y) in an expression pair (Y and X).
REGR_SXY
REGR_SXY(Y, X)
Returns the sum of products of the independent expression multiplied by the dependent expression in
an expression pair (Y and X).
REGR_SYY
REGR_SYY(Y, X)
Returns the sum of squares of the dependent expression in an expression pair (Y and X).
The (32KB - 3) safety limit on literal string length for writing to text BLOBs has been raised to 65,533
bytes (64KB - 3);
A limit, in characters, is calculated in run-time for strings that are in multi-byte character sets, to avoid
overrunning the bytes limit. For example, for a UTF8 string (max. 4 bytes/character) the run-time limit is
likely to be about (floor (65533/4)) = 16383 characters.
DML Improvements
A collection of useful DML improvements is released with Firebird 3.
Rules
When <alternate start char> is '(', '{', '[' or '<', <alternate end char> is paired up with its respective partner,
viz. ')', '}', ']' and '>'. In other cases, <alternate end char> is the same as <alternate start char>.
Inside the string, i.e., <char> items, single (not escaped) quotes could be used. Each quote will be part of the
result string.
Examples
select q'{abc{def}ghi}' from rdb$database;
select q'!That's a string!' from rdb$database;
-- result: abc{def}ghi
-- result: That's a string
<simple_value_expr> is a (numeric) literal, a DSQL parameter (?) or a PSQL named parameter (:namedparameter) that resolves to an integer data type.
Examples
-- 1:
SELECT * FROM T1 ORDER BY COL1
OFFSET 10 ROWS;
-- 2:
SELECT * FROM T1 ORDER BY COL1
FETCH FIRST 10 ROWS ONLY;
-- 3:
SELECT * FROM (
SELECT * FROM T1 ORDER BY COL1 DESC
OFFSET 1 ROW
FETCH NEXT 10 ROWS ONLY
) a
ORDER BY a.COL1
FETCH FIRST ROW ONLY;
Notes
1.
2.
The OFFSET and/or FETCH clauses cannot be mixed with clauses from the FIRST/SKIP or ROWS alternatives in the same query expression.
3.
Expressions and column references are not allowed within either the OFFSET or the FETCH clause.
4.
Unlike the ROWS clause, OFFSET and FETCH are available only in SELECT statements.
5.
6.
FETCH ... WITH TIES defined in the SQL standard is not supported.
Important
Better SQL coding practice would be to use EXISTS in these cases; however, developers were stumbling over
this problem when using generated SQL from Hibernate, which used the undesirable style.
Note
The keyword AS is optional.
Cursor Stability
Vlad Khorsun
Until this release, Firebird suffered from an infamous bug whereby a data modification operation could loop
infinitely and, depending on the operation, delete all the rows in a table, continue updating the same rows ad
infinitum or insert rows until the host machine ran out of resources. All DML statements were affected (INSERT,
UPDATE, DELETE, MERGE). It occurred because the engine used an implicit cursor for the operations.
To ensure stability, rows to be inserted, updated or deleted had to be marked in some way in order to avoid
multiple visits. Another workaround was to force the query to have a SORT in its plan, in order to materialize
the cursor.
From Firebird 3, engine uses the Undo log to check whether a row was already inserted or modified by the
current cursor.
Important
This stabilisation does NOT work with SUSPEND loops in PSQL.
Optimizations
Optimizations made for this release included:
SIMILAR TO
Adriano dos Santos Fernandes
The performance of SIMILAR TO was improved.
Dialect 1 Interface
Adriano dos Santos Fernandes
Selection of SQL_INT64, SQL_DATE and SQL_TIME in dialect 1 was enabled.
See Tracker CORE-3972
90
Chapter 10
Quick Links
Tip
The CREATE statement is the declaration syntax for PSQL functions, parallel to DECLARE for legacy UDFs.
Example
CREATE FUNCTION F(X INT) RETURNS INT
AS
BEGIN
RETURN X+1;
END;
91
PSQL Sub-routines
Adriano dos Santos Fernandes
The header of a PSQL module (stored procedure, stored function, trigger, executable block) can now accept
sub-procedure and sub-function blocks in the header declarations for use within the body of the module.
Syntax for Declaring a Sub-procedure
DECLARE PROCEDURE <name> [(param1 [, ...])]
[RETURNS (param1 [, ...])]
AS
...
Examples
SET TERM ^;
--- Sub-function in EXECUTE BLOCK
-EXECUTE BLOCK RETURNS (N INT)
AS
DECLARE FUNCTION F(X INT) RETURNS INT
AS
BEGIN
RETURN X+1;
END
BEGIN
N = F(5);
SUSPEND;
END ^
--- Sub-function inside a stored function
-CREATE OR ALTER FUNCTION FUNC1 (n1 INTEGER, n2 INTEGER)
RETURNS INTEGER
AS
DECLARE FUNCTION SUBFUNC (n1 INTEGER, n2 INTEGER)
RETURNS INTEGER
AS
BEGIN
RETURN n1 + n2;
END
BEGIN
RETURN SUBFUNC(n1, n2);
92
Packages
A. dos Santos Fernandes
Acknowledgement
This feature was sponsored with donations gathered at the fifth Brazilian Firebird Developers' Day, 2008
A package is a group of procedures and functions managed as one entity. The notion of packaging the code
components of a database operation addresses several objectives:
Modularisation
The idea is to separate blocks of interdependent code into logical modules, as programming languages do.
In programming it is well recognised that grouping code in various ways, in namespaces, units or classes,
for example, is a good thing. With standard procedures and functions in the database this is not possible.
Although they can be grouped in different script files, two problems remain:
1.
2.
Scripted routines all participate in a flat namespace and are callable by everyone (we are not referring
to security permissions here).
Signatures
For each routine that is assigned to a package, elements of a digital signature (the set of [routine name, parameters
and return type]) are stored in the system tables.
The signature of a procedure or routine can be queried, as follows:
SELECT...
-- sample query to come
Packaging Syntax
<package_header> ::=
{ CREATE [OR ALTER] | ALTER | RECREATE } PACKAGE <name>
AS
BEGIN
[ <package_item> ... ]
END
<package_item> ::=
<function_decl> ; |
<procedure_decl> ;
<function_decl> ::=
FUNCTION <name> [( <parameters> )] RETURNS <type>
<procedure_decl> ::=
PROCEDURE <name> [( <parameters> ) [RETURNS ( <parameters> )]]
<package_body> ::=
{ CREATE | RECREATE } PACKAGE BODY <name>
AS
BEGIN
[ <package_item> ... ]
[ <package_body_item> ... ]
END
94
Syntax rules
All routines declared in the header and at the start of the body should be implemented in the body with the
same signature, i.e., you cannot declare the routine in different ways in the header and in the body.
Default values for procedure parameters cannot be redefined in <package_item> and <package_body_item>.
They can be in <package_body_item> only for private procedures that are not declared.
Notes
DROP PACKAGE drops the package body before dropping its header.
The source of package bodies is retained after ALTER/RECREATE PACKAGE. The column RDB
$PACKAGES.RDB$VALID_BODY_FLAG indicates the state of the package body. See Tracker item
CORE-4487.
UDF declarations (DECLARE EXTERNAL FUNCTION) are currently not supported inside packages.
Syntax is available for a description (COMMENT ON) for package procedures and functions and their
parameters. See Tracker item CORE-4484.
95
Note
More examples can be found in the Firebird installation, in ../examples/package/.
DDL triggers
A. dos Santos Fernandes
Acknowledgement
This feature was sponsored with donations gathered at the fifth Brazilian Firebird Developers' Day, 2008
The purpose of a DDL trigger is to enable restrictions to be placed on users who attempt to create, alter or
drop a DDL object.
Syntax Pattern
<database-trigger> ::=
{CREATE | RECREATE | CREATE OR ALTER}
TRIGGER <name>
[ACTIVE | INACTIVE]
{BEFORE | AFTER} <ddl event>
[POSITION <n>]
AS
BEGIN
...
END
<ddl event> ::=
ANY DDL STATEMENT
| <ddl event item> [{OR <ddl event item>}...]
<ddl event item> ::=
CREATE TABLE
96
ALTER TABLE
DROP TABLE
CREATE PROCEDURE
ALTER PROCEDURE
DROP PROCEDURE
CREATE FUNCTION
ALTER FUNCTION
DROP FUNCTION
CREATE TRIGGER
ALTER TRIGGER
DROP TRIGGER
CREATE EXCEPTION
ALTER EXCEPTION
DROP EXCEPTION
CREATE VIEW
ALTER VIEW
DROP VIEW
CREATE DOMAIN
ALTER DOMAIN
DROP DOMAIN
CREATE ROLE
ALTER ROLE
DROP ROLE
CREATE SEQUENCE
ALTER SEQUENCE
DROP SEQUENCE
CREATE USER
ALTER USER
DROP USER
CREATE INDEX
ALTER INDEX
DROP INDEX
CREATE COLLATION
DROP COLLATION
ALTER CHARACTER SET
CREATE PACKAGE
ALTER PACKAGE
DROP PACKAGE
CREATE PACKAGE BODY
DROP PACKAGE BODY
Semantics
1.
BEFORE triggers are fired before changes to the system tables. AFTER triggers are fired after system table
changes.
Important Rule
The event type [BEFORE | AFTER] of a DDL trigger cannot be changed.
2.
When a DDL statement fires a trigger that raises an exception (BEFORE or AFTER, intentionally or unintentionally) the statement will not be committed. That is, exceptions can be used to ensure that a DDL
operation will fail if the conditions are not precisely as intended.
3.
DDL trigger actions are executed only when committing the transaction in which the affected DDL command runs. Never overlook the fact that what is possible to do in an AFTER trigger is exactly what is
possible to do after a DDL command without autocommit. You cannot, for example, create a table in the
trigger and use it there.
97
4.
With CREATE OR ALTER statements, a trigger is fired one time at the CREATE event or the ALTER
event, according to the previous existence of the object. With RECREATE statements, a trigger is fired for
the DROP event if the object exists, and for the CREATE event.
5.
ALTER and DROP events are generally not fired when the object name does not exist. For the exception,
see point 6.
6.
The exception to rule 5 is that BEFORE ALTER/DROP USER triggers fire even when the user name does
not exist. This is because, underneath, these commands perform DML on the security database and the
verification is not done before the command on it is run. This is likely to be different with embedded users,
so do not write code that depends on this.
7.
If some exception is raised after the DDL command starts its execution and before AFTER triggers are
fired, AFTER triggers will not be fired.
8.
Packaged procedures and triggers do not fire individual {CREATE | ALTER | DROP} {PROCEDURE
| FUNCTION} triggers.
Permissions
The following users can create, alter or drop DDL triggers and access the trigger-related switches in the Firebird
utilities:
the database owner
SYSDBA
a user logged in under the RDB$ADMIN role
a user having the ALTER DATABASE metadata privilege
Support in Utilities
A DDL trigger is a type of database trigger, so the parameters -nodbtriggers (GBAK and ISQL) and -T
(NBACKUP) apply to them. Remember that only users with the appropriate metadata privileges can use these
switches.
The last command raises this exception and procedure TEST is not created
Statement failed, SQLSTATE = 42000
exception 1
-E_INVALID_SP_NAME
99
Implement custom DDL security, in this case restricting the running of DDL commands to certain users:
create exception e_access_denied 'Access denied';
set term !;
create trigger trig_ddl before any ddl statement
as
begin
if (current_user <> 'SUPER_USER') then
exception e_access_denied;
end!
-- Test
create procedure sp_test
as
begin
end!
-------
The last command raises this exception and procedure SP_TEST is not created
Statement failed, SQLSTATE = 42000
exception 1
-E_ACCESS_DENIED
-Access denied
-At trigger 'TRIG_DDL' line: 4, col: 5
set term ;!
100
101
ID DDL_EVENT
OBJECT_NAME
SQL_TEXT OK
===================== ========================= ======================= ================= ======
2 CREATE TABLE
T1
80:3 Y
======================================================================
SQL_TEXT:
recreate table t1 (
n1 integer,
n2 integer
)
======================================================================
3 CREATE TABLE
T1
80:2 N
======================================================================
SQL_TEXT:
create table t1 (
n1 integer,
n2 integer
)
======================================================================
4 DROP TABLE
T1
80:6 Y
======================================================================
SQL_TEXT:
recreate table t1 (
n integer
)
======================================================================
5 CREATE TABLE
T1
80:9 Y
======================================================================
SQL_TEXT:
recreate table t1 (
n integer
)
======================================================================
102
See also Scrollable Cursor Support for DSQL in the chapter entitled [Changes to the Firebird API and ODS]. The
section entitled Scrollable Cursor Usage explains a little more about the usage of the various FETCH options.
Notes
1.
When a scrolling option is omitted, NO SCROLL is implied (i.e., the cursor is opened as forward-only).
This means that only FETCH [NEXT FROM] commands can be used. Other commands will return an
error.
2.
Scrollable cursors are internally materialized as a temporary record set, thus consuming memory/disk
resources, so this feature should be used only when really necessary.
Examples
create exception e_invalid_val 'Invalid value @1 for the field @2';
...
if (val < 1000) then
thing = val;
else
exception e_invalid_val using (val, 'thing');
end
103
Notes
The status vector is generated using this code combination: isc_except, <exception number>,
isc_formatted_exception, <formatted exception message>, <exception parameters>
Since a new error code (isc_formatted_exception) is used, the client must be v.3.0, or at least use the firebird.msg file from v.3.0, in order to translate the status vector to a string.
Considering, in left-to-right order, each parameter passed in the exception-raising statement as the Nth, with
N starting at 1:
If an Nth parameter is not passed, the text is not substituted.
If NULL is passed, it is replaced by the string '*** null ***'.
If more parameters are passed than are defined in the exception message, the surplus ones are ignored.
The total length of the message, including the values of the parameters, is still limited to 1053 bytes.
Example
FOR SELECT A, D FROM ATABLE INTO :achar, :ddate
DO BEGIN
IF (ddate < current_data - 30) THEN
CONTINUE;
ELSE
/* do stuff */
...
END
Previously, this block would loop interminably. Now, the loop will not select the value if it was set within the
loop.
Note
This could change the behaviour of legacy code.
If there is a SUSPEND inside the block, the old instability remains: this query, for example, still produces the
infinite loop:
FOR SELECT ID FROM T INTO :ID
DO BEGIN
INSERT INTO T (ID) VALUES (:ID);
SUSPEND;
END
to allow OLD/NEW fields in cursors to be read or assigned to and to assign them to variables.
2.
to make variable assignment in both DML and PSQL statements in modules and blocks more flexible and,
where needed, to resolve ambiguity between field names and variable names
105
Note
Notice the extension of the use of a colon (:) as a prefix to the referenced cursor field.
Another example
for
select rdb$relation_id as id, rdb$relation_name as name
from rdb$relations
where rdb$view_blr is null
as cursor tables
do begin
out_id = tables.id;
out_name = tables.name;
suspend;
end
106
Here, it is just syntactic sugar but, in other cases, it provides the means to resolve ambiguity between field
name references and variable names.
Example of possible ambiguity
for
select rdb$relation_id as id, rdb$relation_name as name
from rdb$relations
where rdb$view_blr is null
as cursor tables
do begin
out_id = :table.id;
select tables.name from tables where tables.id = :tables.id into :out_name;
suspend;
end
Inside the nested SELECT, tables is both a table name and a cursor name here, so the colon is used to resolve
the ambiguity.
108
Chapter 11
Monitoring &
Command-line Utilities
No new monitoring features or other utilities are released with Firebird 3.0. Existing features have undergone
a few improvements.
Monitoring
> Dmitry Yemanov
Several changes have been made to the set of virtual tables storing the monitoring information. These are listed
in the System Tables section of Chapter 4, Changes to the Firebird API and ODS.
Remote Client Recognition
From this version forward, the port number of the remote client address for TCPv4 and TCPv6 protocols is
included in MON$ATTACHMENTS.MON$REMOTE_ADDRESS. A new column in that table also reports the host
name of the remote client. For details, see Changes to Client Address Reporting in the same chapter.
Tracing
Latest improvements to the Trace functions include:
Trace output now supports showing the explained plan. See Tracker CORE-4451 (V. Khorsun).
Tracing execution of stored functions. See Tracker CORE-4345 (V. Khorsun).
Trace no longer ignores the fact that users from different security databases are actually different users.
It now knows in which security database a particular SYSDBA was authenticated or where a privileged
user's elevated privileges are established. It is no longer possible, for example, for a user named SYSDBA
to access security3.fdb if it is not currently authenticated for that access. See See Tracker CORE-4851
(A. Peshkov).
gbak
New Skip Data Backup Option
Alex Peshkov
gbak has a new option switch-- -skip_d(ata) to ignore the data from specific tables during a backup.
109
Tip
The regex used is the SQL onethe same one that is used for Firebird's SIMILAR TO searches. A guide is
available in the DML chapter of the v.2.5 release notes and also at the Firebird web site.
Argument
Data Reported
Total time
Time elapsed since the gbak process started, in seconds and milliseconds
Time delta
Page reads
Page writes
At least one item is mandatory for the STATISTICS switch. The arguments are case-insensitive and they can
be in any order. For example, TDRW and WdrT are equivalent.
The STATISTICS switch will have no effect if the -v[er] switch is not specified.
Verbose output with STATISTICS includes two special lines:
a line with headers for the specified statistics, printed before the other statistics lines:
gbak: time delta reads writes
110
a line with total statistics summaries for the specified items, printed after the end of the main process:
gbak: 46.684 0.002 171 82442 total statistics
Note
The feature is fully supported in the Services API with a new item in the SPB (Services Parameter Block). The
fbsvcmgr utility also supports the SPB implementation.
Examples
1.
2.
3.
4.
gsec
The gsec utility is deprecated from Firebird 3 forward. This means you are encouraged to use the new SQL
features for managing access described in Chapter 7, Security, in preference to existing equivalents provided
by gsec.
Important
gsec will continue to work with security3.fdb. However, it does not work with alternative security databases.
isql
SET EXPLAIN Extensions for Viewing Detailed Plans
Dmitry Yemanov
A new SET option is added: SET EXPLAIN [ON | OFF]. It extends the SET PLAN option to report the explained
plan instead of the standard one.
If SET PLAN is omitted, then SET EXPLAIN turns the plan output on. SET PLANONLY works as in previous
versions.
Usage options
SET PLAN = simple plan + query execution
SET PLANONLY = simple plan, no query execution
SET PLAN + SET EXPLAIN = explained plan + query execution
SET PLAN + SET EXPLAIN + SET PLANONLY = explained plan, no query execution
SET EXPLAIN = explained plan + query execution
SET EXPLAIN + SET PLANONLY = explained plan, no query execution
Metadata Extract
Claudio Valderrama C.
The metadata extract tool (-[e]x[tract] switch) was improved to create a script that takes the dependency order
of objects properly into account.
A label has also been added, reflecting the deterministic flag for stored functions. (A. dos Santos Fernandes)
fb_lock_print
Input Arguments
Dmitry Yemanov
fb_lock_print now accepts 32-bit integers as the input arguments for seconds and intervals. Previously they were
limited to SMALLINT.
Useability Improvements
Vlad Khorsun
A few other small improvements:
1.
More detailed usage help is available from the command line (-help).
2.
Events history and list of owners are no longer output by default: they may be requested explicitly if required. Header-only is the new default.
3.
New -o[wners] switch to print only owners (locks) with pending requests
gfix
-NoLinger Switch
Alex Peshkov
gfix has a new switch -NoLinger to provide a one-off override to the LINGER setting of a database.
113
Other Tweaks
Some implementation annoyances were cleared up in several utilities.
114
Chapter 12
Compatibility Issues
In this section are features and modifications that might affect the way you have installed and used Firebird
in earlier releases.
aliases.conf Is No More
The file aliases.conf is replaced by databases.conf in the Firebird root directory. The format for
database aliases has not changed so you can copy/paste the contents of your existing aliases.conf file into
databases.conf successfully. The new file is capable of carrying a lot more configuration detail, however,
to enable database-level configuration of many features that were previously available only at the global server
level.
Embedded Connections
For an embedded connection, an authenticated login is no longer required on POSIX platforms. If you provide
a user name and password, the password is ignored. Applications may still require a user name and possibly a
role name, due to SQL privileges in databases.
This feature is new for embedded Firebird on POSIX but it is the way embedded always worked on Windows,
when the embedded engine was a separate executable.
115
Compatibility Issues
Initialization Steps
Initialization is performed in embedded mode using the isql utility. For an embedded connection, an authentication password is not required and will be ignored if you provide one. An embedded connection will work fine
with no login credentials and log you in using your host credentials if you omit a user name. However, even
though the user name is not subject to authentication, creating or modifying anything in the existing security
database requires that the user be SYSDBA; otherwise, isql will throw a privilege error for the CREATE USER
request.
The SQL user management commands will work with any open database. Because the sample database employee.fdb is present in your installation and already aliased in databases.conf, it is convenient to use
it for the user management task.
1.
Stop the Firebird server. Firebird 3 caches connections to the security database aggressively. The presence of server connections may prevent isql from establishing an embedded connection.
2.
In a suitable shell, start an isql interactive session, opening the employee database via its alias:
> isql -user sysdba employee
3.
116
Compatibility Issues
SQL> create user SYSDBA password 'SomethingCryptic';
SQL> commit;
SQL> quit;
Note
The SYSDBA user will have full administrator rights automatically. Do not assign the ADMIN role (RDB
$ADMIN) to SYSDBA.
4.
To complete the initialization, start the Firebird server again. Now you will be able to perform a network
login to databases, including the security database, using the password you assigned to SYSDBA.
About Passwords
An effective password, using the default user manager Srp, can be up to 20 characters, although a password
of up to 255 characters will be valid.
If you intend in future to configure the server to use legacy authentication (not recommended!), then only the
first 8 characters of any password, including that of the SYSDBA, will be read.
masterkey is NOT a recommended password for SYSDBA!
Legacy Authentication
If you do not intend to use SRP encrypted log-ins right away and want to use the security databasesecurity
3.fdb as you have done in previous Firebird versions, proceed as follows:
1.
Using a text editor, open firebird.conf and find the entry for the parameter UserManager:
#UserManager = Srp
2.
Compatibility Issues
3.
4.
5.
6.
Compatibility Issues
Steps
Note
In the commands below, replace masterkey with the actual SYSDBA password for the server version,
as appropriate.
The procedure requires running the script security_database.sql that is located in the misc/upgrade directory of your Firebird 3 installation. These instructions assume you have a temporary copy of
this script in the same directory as the isql executable.
1.
Under the Firebird 2.5 server, back up the security database. Here, use the SYSDBA password for the v.2.5
installation:
gbak -user sysdba -pas masterkey -b {host/path}security2.fdb security2.fbk
2.
Under the Firebird 3 server, restore a copy of v.2.5 backup. Here, use the SYSDBA password for the v.3
installation:
gbak -user sysdba -pas masterkey -c security2.fbk {host/path}security2db.fdb
3.
Under the Firebird 3 server, go to the directory where the isql utility is located and run the upgrade script:
isql -user sysdba -pas masterkey -i security_database.sql {host/path}security2db.fdb
"security2db.fdb" is just a sample name for the database: it can be any preferred name.
4.
The procedure will generate new, random passwords and will output them to screen afterwards. Capture
the output and notify users of their new passwords.
5.
When you are ready, shut down Firebird. Rename security3.fdb or move it another location; then
rename the upgraded database to security3.fdb.
Under the new unified server, that form of connection is no longer valid for a serverless client connection to
Superserver. It attempts to load an embedded server. If you try whilst Superserver is connected to your database,
you will get a refusal message to the effect File is in use by another process.
This is not a bug. Since Superserver clients share resources, another server (in this case, an embedded server)
cannot attach a client to the same database that Superserver has any clients attached to.
119
Compatibility Issues
However, all is not lost. The XNET subsystem can still do local client sessions for Superserver. You just need
a more elaborate connection string now:
xnet://alias-or-path-to-database
or using an alias:
xnet://employee
Note
New connection strings are available as alternatives for other local connection protocols, too. For more information, see New Connection Formats for Local Clients on Windows.
Configuration Parameters
The previously deprecated firebird.conf parameters CompleteBooleanEvaluation, OldColumnNaming
and OldSetClauseSemantics are no longer supported anymore and have been removed. The lack of one or more
of these parameters may break your application code, so please check these settings in firebird.conf on
your older server version.
The parameters UsePriorityScheduler, PrioritySwitchDelay, PriorityBoost, LegacyHash and LockGrantOrder no longer have any use and have been removed.
Important
Ensure that you study the chapter Configuration Additions and Changes in preparation for upgrading user
software to Firebird 3.
Compatibility Issues
121
Compatibility Issues
-no column name specified for column number 1 in derived table C
Reserved Words
A number of new reserved keywords are introduced. Please refer to the chapter Reserved Words and Changes and
ensure your DSQL statements and procedure/trigger sources do not contain any of those keywords as identifiers.
Otherwise, it will be necessary either to use them quoted (in Dialect 3 only) or to rename them.
Pay special attention to the keywords INSERTING, UPDATING and DELETING in your PSQL modules. They are
now reserved words and thus must not be used as identifiers.
Also check very carefully that the keyword BOOLEAN is not used as a domain name in your databases.
New format:
database = %[\\/](test|azk2|rulez).fdb
{
enabled = true
122
Compatibility Issues
time_threshold = 100
log_statement_finish = true
}
Important
Pay attention to the database section header and equality signs between parameter names and values.
A new column in that table also reports the host name of the remote client.
For details, see Changes to Client Address Reporting in the chapter entitled Changes to the Firebird API and
ODS.
123
Chapter 13
Bugs Fixed
Firebird 3.0.0 Release: Bug Fixes
The following bug fixes were reported prior to the v.3.0.0 official release:
Core Engine
(CORE-5184)
An assertion would occur in the cloop dispatcher when trying to save exception information
in the status interface.
fixed by A. Peshkov
~ ~ ~
(CORE-5182)
Failure to find a record on re-fetch would produce inconsistent effects on subsequent
statement execution.
fixed by D. Yemanov
~ ~ ~
(CORE-5166)
(CORE-5165)
HAVING COUNT(*) NOT IN ( <Q> ) would erroneously exclude a record from the outer
result set. (<Q> represents a result set without nulls)
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-5161)
fixed by V. Khorsun
~ ~ ~
(CORE-5159)
system path.
Regression: the engine could throw transliteration errors when running from a non-ASCII
124
Bugs Fixed
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-5157)
The server could go into an infinite loop when data was being sent from a client to the
server in small packets.
fixed by A. Peshkov
~ ~ ~
(CORE-5149)
wrong results.
Regression: LEFT JOIN was incorrectly pushing COALESCE into the inner stream, causing
fixed by D. Yemanov
~ ~ ~
(CORE-5147)
B and table A".
CREATE TRIGGER was failing with the error "Ambiguous field name between table
(CORE-5146)
for the other one.
Join order was sub-optimal if one table had a selective predicate and MIN was calculated
fixed by D. Yemanov
~ ~ ~
(CORE-5144)
parallel load.
Deadlock could occur when a database was being encrypted or decrypted under high
fixed by A. Peshkov
~ ~ ~
(CORE-5133)
ALTER SEQUENCE RESTART WITH was failing to change the initial value.
fixed by D. Yemanov
~ ~ ~
(CORE-5130)
Minor regression: wrong error message was being returned on an attempt to compile a view
with both a subquery and the WITH CHECK OPTION clause in its definitionan illegal combination.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-5122)
The optimizer could avoid using an expression index if the query was running in a different
connection character set to the one that was in effect when the index was created.
fixed by D. Yemanov
125
Bugs Fixed
~ ~ ~
(CORE-4645)
Internal Firebird consistency check (cannot find tip page (165), file: tra.cpp line: 2375)
would occur if too many transactions were created for one connection to a read-only database. This was a very
old bug, dating back to InterBase 6.
fixed by V. Khorsun
~ ~ ~
Server Crashes
(CORE-5153)
Regression: The server would crash when aggregate functions were used together with
the NOT IN predicate.
fixed by A. dos Santos Fernandes
~ ~ ~
Utilities
gbak
(CORE-5143)
gbak restore could fail when there was some SQL function accessing a table while the
switch -O(NE_AT_A_TIME) was in use.
fixed by D. Yemanov
~ ~ ~
gfix
(CORE-5140)
An attempt to set the number of page buffers to a non-supported value would return the
wrong error message.
fixed by V. Khorsun
~ ~ ~
isql
(CORE-5194)
operation.
126
Bugs Fixed
Monitoring
(CORE-5179)
concurrent load.
fixed by D. Yemanov
~ ~ ~
User Management
(CORE-5189)
The codes of operation for user management plug-ins were missing from the public API.
fixed by A. Peshkov
~ ~ ~
(CORE-5162)
Users with the same name can co-exist in the security database if they are created by
different plug-ins. However, tags or attributes for a user created using one plug-in were being displayed in the
SEC$ virtual tables for the same-name user created by the other plug-in.
fixed by A. Peshkov
~ ~ ~
(CORE-5155)
[CREATE OR] ALTER USER statement would fail if the PASSWORD parameter was present
and was not specified immediately after the USER parameter.
fixed by A. Peshkov
~ ~ ~
Builds
(CORE-5181)
fixed by A. Peshkov
~ ~ ~
(CORE-5180)
fixed by A. Peshkov
~ ~ ~
(CORE-5134)
fixed by A. Peshkov
~ ~ ~
127
Bugs Fixed
Minor Improvements
(CORE-4996)
Implemented by A. Peshkov
~ ~ ~
(CORE-1538)
NEW: An option was added to the API function isc_database_info() to return the
number of free pages in a database.
Implemented by V. Khorsun
~ ~ ~
(CORE-5112)
Implemented by D. Sibiryakov
~ ~ ~
(CORE-5100)
IMPROVEMENT: Improved control over database crypt keys, see Encryption Tasks.
Implemented by A. Peshkov
~ ~ ~
(CORE-5083)
IMPROVEMENT: A method was provided to set the correct offsets in user-implemented
IMessageMetadata.
Implemented by A. Peshkov
~ ~ ~
(CORE-5077)
IMPROVEMENT: In isql, SHOW DATABASE includes the encryption status of the
database, as does gstat -h[eader].
Implemented by A. Peshkov
~ ~ ~
(CORE-5063)
IMPROVEMENT: In isql, SHOW DATABASE includes the numbers of used and free
pages in the database.
Implemented by V. Khorsun
~ ~ ~
128
Bugs Fixed
(CORE-5028)
$ATTACHMENTS.
IMPROVEMENT: The remote port number was added to the monitoring table MON
Implemented by V. Khorsun
~ ~ ~
(CORE-4978)
IMPROVEMENT: Validation and repair of lost data pages have been improved.
(CORE-2493)
IMPROVEMENT: The IP address of the remote host is now appended to error messages
in firebird.log for TCP connections.
Implemented by V. Khorsun
~ ~ ~
Bugs
Core Engine
(CORE-5110)
A false primary or foreign key violation could be reported when an attachment used the
isc_dpb_no_garbage_collect flag.
fixed by V. Khorsun
~ ~ ~
(CORE-5104)
(CORE-5097)
COMPUTED BY expressions were not being converted to their data type inside the engine.
(CORE-5093)
ALTER COLUMN was not changing the type of a computed column where it should.
(CORE-5082)
The server was not validating the correctness of the user/password pair provided in the
EXECUTE STATEMENT operation.
fixed by A. Peshkov
~ ~ ~
129
Bugs Fixed
(CORE-5078)
The "Invalid BLOB ID" error was being thrown unexpectedly after a large VARCHAR
column was changed to text BLOB.
fixed by V. Khorsun
~ ~ ~
(CORE-5075)
ON DISCONNECT trigger with EXECUTE STATEMENT was not working and would
lead to a server crash when it was recreated.
fixed by V. Khorsun
~ ~ ~
(CORE-5062)
fixed by A. dos Santos FernandesFunction CHAR_TO_UUID on an indexed column would throw the error
"expression evaluation not supported".
~ ~ ~
(CORE-5060)
available.
CREATE VIEW that selected from a system table would fail, despite all grants being
fixed by A. Peshkov
~ ~ ~
(CORE-5056)
The write lock on the database file was being cleared when retrieving the database statistics
via the Services API.
fixed by A. Peshkov
~ ~ ~
(CORE-5049)
(CORE-5047)
mapUser() routine would establish a secondary attachment using the wrong provider.
fixed by A. Peshkov
~ ~ ~
(CORE-5039)
Connecting to a service with an invalid service name would yield an incorrect error message.
fixed by A. Peshkov
~ ~ ~
(CORE-5034)
A delay of at least 5 seconds could occur on disconnect if the disconnect followed closely
on an Event Manager initialization.
fixed by V. Khorsun
130
Bugs Fixed
~ ~ ~
(CORE-5033)
The file fb_user_mapping could be left behind in the Firebird lock directory after a
correct shutdown of all Firebird worker processes.
fixed by V. Khorsun
~ ~ ~
(CORE-5032)
Connection to a database with its own security database was not possible in the absence
of security3.fdb.
fixed by A. Peshkov
~ ~ ~
(CORE-5026)
common plugin.
Firebird authentication would give up after failing to establish authentication via the first
fixed by A. Peshkov
~ ~ ~
(CORE-5020)
other indices.
An ORDER BY clause on the key columns of a compound index could disable usage of
fixed by D. Yemanov
~ ~ ~
(CORE-5018)
Non-indexed predicates might not have been applied immediately after retrieval when
tables were being joined.
fixed by D. Yemanov
~ ~ ~
(CORE-5017)
Interrupt of aux connection during TCP setup phase would cause a server exit due to an
unhandled exception.
fixed by A. Peshkov
~ ~ ~
(CORE-5014)
Interrupt of aux connection during TCP setup phase was producing unclear error messages
in firebird.log.
fixed by A. Peshkov
~ ~ ~
(CORE-4997)
Races would occur when two threads tried simultaneously to establish the first enbedded
connection to the engine.
fixed by A. Peshkov
~ ~ ~
131
Bugs Fixed
(CORE-4991)
a database.
The Keyholder plug-in was being loaded on connection to a database but not on creating
fixed by A. Peshkov
~ ~ ~
(CORE-4980)
creation time.
The REVOKE operator could modify the privileges granted to system tables at database
fixed by A. Peshkov
~ ~ ~
(CORE-4969)
The SEC$USERS table became unavailable when an error occurred in any configured
UserManager plug-in.
fixed by A. Peshkov
~ ~ ~
(CORE-4964)
manager.
Real errors during connection to a security database were being hidden by the Srp user
fixed by A. Peshkov
~ ~ ~
(CORE-4885)
Retrieving the current user name when using Windows trusted authentication and an OS
user name containing non-ASCII characters would cause an error.
fixed by A. Peshkov, D. Yemanov
~ ~ ~
(CORE-4840)
fixed by D. Yemanov
~ ~ ~
(CORE-2923)
Server Crashes
(CORE-5107)
to a server crash.
SET AUTODDL OFF and sequence of CREATE + ALTER + DROP VIEW would lead
132
Bugs Fixed
(CORE-5087)
A database shutdown could cause a server crash if multiple attachments were running
EXECUTE STATEMENT.
fixed by V. Khorsun
~ ~ ~
(CORE-5016)
The server could crash during garbage collection when a DELETE is executed after adding
a new referencing column.
fixed by D. Yemanov
~ ~ ~
(CORE-5015)
The server could crash when an event was posted from an ON DISCONNECT trigger.
fixed by V. Khorsun
~ ~ ~
(CORE-4982)
The server could crash during a select from a procedure if an exception was thrown while
backing out the current savepoint.
fixed by D. Yemanov
~ ~ ~
Database Encryption
(CORE-5105)
fixed by A. Peshkov
~ ~ ~
(CORE-5044)
fixed by A. Peshkov
~ ~ ~
(CORE-5041)
A database could be corrupted after ALTER DATABASE ENCRYPT/DECRYPT was
issued multiple times per database open time.
fixed by A. Peshkov
~ ~ ~
(CORE-4999)
Trying to access a database with an invalid crypt key would cause a deadlock.
fixed by A. Peshkov
~ ~ ~
(CORE-4990)
Bugs Fixed
fixed by A. Peshkov
~ ~ ~
API/Remote Interface
(CORE-5102)
fbclient.dll API calls were (wrongly) modifying the FPU control word.
fixed by V. Khorsun
~ ~ ~
(CORE-5067)
taking too long.
New connections were being blocked as a consequence of sweeps of the security database
fixed by V. Khorsun
~ ~ ~
(CORE-5042)
fixed by A. Peshkov
~ ~ ~
(CORE-5029)
protocol.
A crash could occur in fbclient when a multi-threaded application was using the XNET
fixed by V. Khorsun
~ ~ ~
(CORE-4998)
Neither client nor server could close the connection after failed authentication.
fixed by V. Khorsun
~ ~ ~
Utilities
gbak
(CORE-5102)
Restore wass slow when the database contained many small tables with indices.
fixed by V. Khorsun
~ ~ ~
gstat
(CORE-5088)
Bugs Fixed
fixed by A. Peshkov
~ ~ ~
isql
(CORE-5092)
The EXTRACT command would lose the data types of COMPUTED BY columns.
(CORE-5089)
Metadata extraction (isql -X): A "CREATE PROCEDURE/FUNCTION" statement would
retain the TYPE OF reference to a table column that no longer existed, if the procedure or function had a
parameter of that type declared at the time it was created.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-5061)
Plan output was being unexpectedly truncated after a query was simplified by shortening it.
fixed by D. Yemanov
~ ~ ~
Monitoring
(CORE-4708)
Content of MON$EXPLAINED_PLAN in MON$STATEMENTS was being truncated if
it exceeded the 32KB limit.
fixed by D. Yemanov
~ ~ ~
(CORE-4179)
The MON$ tables became unavailable when there was intensive disk-bound load.
fixed by D. Yemanov
~ ~ ~
fixed by A. Peshkov
~ ~ ~
(CORE-5002)
(WINDOWS): The Windows installer exhibited some character set confusion (ANSI vs.
UTF8) in its GUI for non-English environments.
fixed by P. Reeves
135
Bugs Fixed
~ ~ ~
(CORE-4910)
(WINDOWS): The Windows build would fail if a path to source files contained spaces.
fixed by D. Sibiryakov
~ ~ ~
(CORE-4862)
fixed by D. Yemanov
~ ~ ~
(CORE-4842)
Minor Improvements
(CORE-4911)
IMPROVEMENT: Most errors that occur in providers are fatal and it is pointless to try
other providers in the hope another will succeed when that one failed. As an example, if the remote redirector
detects that the format of the database connection string matches a certain protocol, trying other providers will
be futile if connection on that protocol failed. Or, suppose the engine reports some internal database error (other
than invalid ODS version) it will be no use trying to open the same database through the loopback provider.
A better option appeared to be to enumerate the codes for those errors after which it would make sense to try
other providersprimarily isc_unavailable and isc_no_priv. Given the desirability of retaining the
content of the status vector as-is, the solution was to add some more error codes.
Implemented by A. Peshkov
~ ~ ~
(CORE-4898)
IMPROVEMENT: Creation and loading of functions was slow when there were many
functions in the database. This process has been given a speed boost.
Implemented by A. dos Santos Fernandes
~ ~ ~
(CORE-4880)
IMPROVEMENT: Creating packages containing many functions was slow. This process
has been given a speed boost.
Implemented by A. dos Santos Fernandes
136
Bugs Fixed
~ ~ ~
(CORE-4939)
page size boundary
IMPROVEMENT: I/O operations on the nBackup backup file at are now aligned at the
Implemented by V. Khorsun
~ ~ ~
(CORE-4936)
IMPROVEMENT: Internal contention in the background garbage collector has been reduced
Implemented by V. Khorsun
~ ~ ~
(CORE-4935)
IMPROVEMENT: Performance was improved on backing out a dead record version or
undoing a newly created primary record version when the back-version chain gets too long
Implemented by V. Khorsun
~ ~ ~
Bugs
Core Engine
(CORE-4984)
Ordering by a compound index together with a range condition was giving wrong results
fixed by D. Yemanov
~ ~ ~
(CORE-4954)
was not specified
Packaged procedure with a default input value would not be called if the default parameter
(CORE-4952)
fixed by V. Khorsun
~ ~ ~
(CORE-4951)
The message Incorrect parameters provided to internal function INF_transaction_info
Invalid token was reported when trying to commit a two-phase-commit transaction
fixed by A. Peshkov
~ ~ ~
(CORE-4950)
Bugs Fixed
~ ~ ~
(CORE-4947)
A compound ALTER TABLE statement that tried to ADD and DROP the same check
constraint would fail
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4943)
was present
Casting a Dialect 1 date to string would break when a domain with a check constraint
(CORE-4938)
Operations (get statistics, change forced wites, make backup) could not be completed on
a database when working in embedded mode
fixed by V. Khorsun
~ ~ ~
(CORE-4929)
PSQL source with ELSE IF ( <expr> ) THEN block containing commands to manipulate
an explicit cursor would not compile
fixed by D. Yemanov
~ ~ ~
(CORE-4921)
Predicate IS [NOT] DISTINCT FROM was not being pushed into unions/aggregates,
resulting in sub-optimal plans
fixed by D. Yemanov
~ ~ ~
(CORE-4917)
ALTER DOMAIN ... TO <new_name> would allow the <new_name> to be specified in
the same pattern as domains generated by the system, i.e., matching to 'RDB$[[:DIGIT:]]*'
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4914)
columns
Moving a database into the 'full shutdown' state could corrupt indexes on long-key text
fixed by V. Khorsun
~ ~ ~
(CORE-4909)
MERGE / HASH JOINs would produce incorrect results when VARCHAR join keys
differed only by trailing spaces
fixed by D. Yemanov
~ ~ ~
138
Bugs Fixed
(CORE-4906)
An access violation would occur if the server was shut down with active trace session(s)
fixed by V. Khorsun
~ ~ ~
(CORE-4904)
Index corruption could occur while inserting data into a long-key-indexed field
fixed by V. Khorsun
~ ~ ~
(CORE-4902)
(CORE-4897)
fixed by A. Peshkov
~ ~ ~
(CORE-4890)
Placing a comment (single-lined or multi-lined) between the final END statement and the
terminator character (^) in stored procedure code produced a compiling error if the utility tool used the legacy
API
fixed by A. Peshkov
~ ~ ~
(CORE-4889)
Using fbsvcmgr with action_trace_start under SuperSsrver would cause a livelock
and prevent attachments using local protocol
fixed by V. Khorsun
~ ~ ~
(CORE-4887)
An AFTER CREATE/ALTER PACKAGE DDL trigger would run before inserts and updates
of RDB$PROCEDURES and RDB$FUNCTIONS, whereas it should run after all changes to the system tables.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4884)
A script containing EXECUTE BLOCK with MULTIPLE nested BEGIN..END statements
would cause a crash during parsing
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4872)
The V.3 fbclient could not work with servers older than V.2.5 via the remote protocol
fixed by D. Yemanov
~ ~ ~
139
Bugs Fixed
(CORE-4861)
A segmentation fault could occur when working with a saved exception in a request
fixed by A. Peshkov
~ ~ ~
(CORE-4854)
rectly in the SPB
The client library was handling non-UTF8 representation of international characters incor-
fixed by A. Peshkov
~ ~ ~
(CORE-4848)
MERGE ... WHEN NOT MATCHED ... RETURNING was returning wrong (non-null)
values when no insert was performed
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4846)
Altering a trigger to attempt to change the table to which it belongs did not succeed but it
failed with bizarre results and an unhelpful error message
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4836)
GRANT UPDATE(c) ON T TO U01 WITH GRANT OPTION: user U01 would be unable
to revoke this privilege if some DML was executed before REVOKE
fixed by A. Peshkov
~ ~ ~
(CORE-4710)
Invalid request BLR at offset 361 context already in use (BLR error) was the wrong
message for the error concerned, occurring only when the context count was near the 256 limit
fixed by D. Yemanov
~ ~ ~
(CORE-4680)
fixed by V. Khorsun
~ ~ ~
(CORE-4585)
A column CHECK constraint could not be created if the column was based on a domain
(CORE-4497)
Regression: wrong handling in FOR-cursor when a NOT EXISTS( select from <view> )
expression was used to check results obtained from a stored procedure
fixed by D. Yemanov
140
Bugs Fixed
~ ~ ~
(CORE-4292)
The server would ignores asynchronous requests (monitoring or cancellation) while preparing
a query with a lot of windowed functions
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4279)
Invalid error message: CHARACTER SET OCTETS is not defined when creating a
database specifying isc_dpb_lc_ctype = OCTETS
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4277)
(CORE-4276)
set DOS775
CREATE TABLE would throw an error if a column was being defined with the character
(CORE-4107)
fixed by D. Yemanov
~ ~ ~
(CORE-3717)
Anomalies existed between the three methods of user management, regarding valid user
names and passwords
fixed by A. Peshkov
~ ~ ~
(CORE-3545)
POSIX-Specific
(CORE-4919)
process
On AIX and Solaris, all processes on a Classic server would hang after the death of one
fixed by A. Peshkov
~ ~ ~
141
Bugs Fixed
Windows-Specific
(CORE-4859)
fixed by V. Khorsun
~ ~ ~
(CORE-4860)
Online validation on Windows would fail if the dbname argument contained forward slash
('/') and a concurrent attachment existed that also used '/'
fixed by V. Khorsun
~ ~ ~
Services API
(CORE-4939)
When using the Services API to manage users (from fbsvcmgr or by building a SPB in some
program, for example) it was requiredbut not documentedto place the user name parameter immediately
after the desired action (add/modify). If any other parameter was placed before the user name, the Services
Manager on the server would go crazy and build a wrong command line for the gsec service.
fixed by A. Peshkov
~ ~ ~
Utilities
fbsvcmgr
(CORE-4855)
Online validation during DML activity in another connection would lead to errors: Error
while trying to read from file and Page in use during flush (210)
fixed by V. Khorsun
~ ~ ~
(CORE-4876)
A named trace session launched by fbsvcmgr with a non-empty value for the parameter
trc_name could not be stopped using its name
fixed by V. Khorsun
~ ~ ~
gbak
(CORE-4928)
The connection information in an ON CONNECT trigger could not be saved if the connection
was established by gbak
142
Bugs Fixed
fixed by A. dos Santos Fernandes
~ ~ ~
gfix
(CORE-4899)
Using gfix -online in Classic returned the message "IProvider::attachDatabase failed
when loading mapping cache" if access was using a remote protocol
fixed by A. Peshkov
~ ~ ~
(CORE-4865)
fixed by V. Khorsun
~ ~ ~
(CORE-3548)
fixed by A. Peshkov
~ ~ ~
isql
(CORE-4882)
The isql INPUT command (or the -i option at the command line) was reading large (>
64K) lines incorrectly
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4864)
fixed by A. Peshkov
~ ~ ~
(CORE-4870)
In isql, SET COUNT ON reports the wrong number of affected rows when issuing UPDATE
on a view which was created WITH CHECK OPTION
fixed by A. dos Santos Fernandes
~ ~ ~
Bugs Fixed
Core Engine
(CORE-4819)
failure of the engine to check the validity of RETURNING_VALUES for EXECUTE
PROCEDURE and INTO for EXECUTE STATEMENT could lead to bugchecks.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4809)
HASH/MERGE JOIN was not used for more than two streams if they were joined via
USING/NATURAL clauses and the join was based on DBKEY concatenations.
fixed by D. Yemanov
~ ~ ~
(CORE-4806)
fixed by D. Yemanov
~ ~ ~
(CORE-4798)
Regression: MIN() or MAX() with a join would ignore possible index navigation.
fixed by D. Yemanov
~ ~ ~
(CORE-4789)
or CHAR.
Timestamps that were out of valid range were not prevented from being cast to VARCHAR
(CORE-4786)
When an attempt was made to insert a duplicate value into a primary or unique key column,
where the length of the key was 127 characters or more, the problematic key was not shown in the error message.
fixed by D. Yemanov
~ ~ ~
(CORE-4781)
Maximum string length (32765 bytes) was not being validated by the parser.
(CORE-4774)
Table aliasing was being required unnecessarily when doing UPDATE ... RETURNING
RDB$ pseudo-columns.
fixed by A. dos Santos Fernandes
~ ~ ~
144
Bugs Fixed
(CORE-4768)
CREATE USER ... TAGS ( argument_1 = 'value1', ..., argument_N = 'valueN' ) would
return wrong results from the statement when there were many arguments.
fixed by A. Peshkov
~ ~ ~
(CORE-4767)
In CREATE USER ... TAGS ( attr = 'prefix #suffix' ) the character # in the attribute value
would cause the subsequent characters to be dropped from storage.
fixed by A. Peshkov
~ ~ ~
(CORE-4760)
A user with non-ascii (multi-byte) characters in the name could not be created.
fixed by A. Peshkov
~ ~ ~
(CORE-4759)
fixed by V. Khorsun
~ ~ ~
(CORE-4755)
exceeded seven.
A parameterized exception would produce wrong output when the number of arguments
(CORE-4754)
Manipulations with a GTT from several attachments (using EXECUTE STATEMENT
with an ON EXTERNAL clause and different roles) could lead to the error Internal Firebird consistency check
(invalid SEND request (167), file: JrdStatement.cpp line: 325).
fixed by V. Khorsun
~ ~ ~
(CORE-4753)
fixed by V. Khorsun
~ ~ ~
(CORE-4752)
ID error.
(CORE-4747)
The error Invalid BLOB ID could occur when retrieving MON$STATEMENTS.MON
$SQL_TEXT using EXECUTE STATEMENT with an ON EXTERNAL clause with the db_connect argument
unspecified.
145
Bugs Fixed
fixed by V. Khorsun
~ ~ ~
(CORE-4744)
The statement ALTER DATABASE SET DEFAULT CHARACTER SET exhibited two
faults: 1) it would take effect only once for the current attachment; 2) it was not checking that the new character
set existed until it was actually used.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4743)
fixed by A. Peshkov
~ ~ ~
(CORE-4740)
SIMILAR TO with quantifier {n,} in the pattern was failing in v.2.5 with the error Invalid
pattern and was producing strange results in v.3.0.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4733)
The command ALTER TABLE <T> ALTER TYPE <C>
DOMAIN_WITH_NOT_NULL was not verifying the data in column <C> and would make incorrect assignments in <C> to ZERO / JULIAN_DATE / ASCII(0) for types INT, TIMESTAMP and VARCHAR.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4725)
Inconsistencies were exhibited with ALTER DOMAIN and ALTER TABLE involving
DROP NOT NULL and PRIMARY KEYs.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4719)
The message Statement failed, SQLSTATE = 00000 + unknown ISC error 0 would appear
when issuing REVOKE ALL ON ALL FROM <existing_user>.
fixed by A. Peshkov
~ ~ ~
(CORE-4713)
A BLOB not found error would be thrown at rollback after inserting into a table with
an expression index.
fixed by V. Khorsun
~ ~ ~
(CORE-4712)
Messages stating Error in isc_release_request() ... when working with legacy security
database were appearing in firebird.log for the Classic server when connecting with legacy authentication.
146
Bugs Fixed
fixed by A. Peshkov
~ ~ ~
(CORE-4702)
fixed by D. Yemanov
~ ~ ~
(CORE-4684)
An error was being thrown while preparing a complex query (Too many Contexts of
Relation/Procedure/Views. Maximum allowed is 256.)
fixed by D. Yemanov
~ ~ ~
(CORE-4675)
Conditions like WHERE <field> = <cursor>.<field> would not use an existing index.
fixed by D. Yemanov
~ ~ ~
(CORE-4673)
A computed index based on a computed column would store NULL for all its keys.
fixed by D. Yemanov
~ ~ ~
(CORE-4670)
fixed by D. Yemanov
~ ~ ~
(CORE-4668)
fixed by D. Yemanov
~ ~ ~
(CORE-4665)
Search criteria would produce wrong results on WHERE <field_C> STARTING WITH
<:value> ORDER BY <field_N> when field_C was the leading part of a compound index key consisting of
{ field_C, field_N }.
fixed by D. Yemanov
~ ~ ~
(CORE-4659)
A bug was introduced when implementing support for multiple user managers, whereby
the error Missing security context for .....\SECURITY3.FDB could appear when performing some operations
where per-database security was configured.
fixed by A. Peshkov
~ ~ ~
147
Bugs Fixed
(CORE-4656)
fixed by D. Starodubov
~ ~ ~
(CORE-4655)
fixed by D. Starodubov
~ ~ ~
(CORE-4648)
A user with the RDB$ADMIN role was denied the privilege for CREATE DATABASE.
fixed by A. Peshkov
~ ~ ~
(CORE-4644)
Security context and open database errors could present under heavy concurrent load.
fixed by A. Peshkov
~ ~ ~
(CORE-4634)
The error No current record for fetch operation could occur when the same indexed
column was specified in both the WHERE and the ORDER BY clauses.
fixed by D. Yemanov
~ ~ ~
(CORE-4631)
When the shared memory region backing the lock table could not be remapped, the status
vector would return the error message Lock manager out of room without any low-level details (e.g. OS level
error), thus hiding the real cause of the problem.
fixed by D. Yemanov
~ ~ ~
(CORE-4624)
fixed by A. Peshkov
~ ~ ~
(CORE-4623)
PSQL variables based on Domain and Type Of referring to BLOB with sub_type <
0 were no longer working.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4622)
Triggers with the UPDATE OR INSERT statement and IIF() were not working as expected.
fixed by D. Yemanov
~ ~ ~
148
Bugs Fixed
(CORE-4618)
Rollback was failing to undo changes when a MERGE statement was updating the same
target rows multiple times and the optimizer used PLAN MERGE.
fixed by D. Yemanov
~ ~ ~
(CORE-4604)
(CORE-4599)
The REPLACE() function was not working correcting with multi-byte character sets.
(CORE-4583)
The embedded engine would try to load the ICU DLLs from PATH folders.
fixed by A. Peshkov
~ ~ ~
(CORE-4582)
properties.
During the linger period, problems would occur when attempting to change some database
fixed by A. Peshkov
~ ~ ~
(CORE-4581)
The embedded server was trying to load UDFs from wrong place.
fixed by V. Khorsun
~ ~ ~
(CORE-4572)
The incorrect error message was returned for PSQL functions when the number of actual
arguments did not match the number of formal arguments.
fixed by D. Yemanov
~ ~ ~
(CORE-4571)
Selecting from a table with ICU columns would fail where the database had been created
on Linux with ICU 4.2.1 and then copied to Windows.
fixed by A. Peshkov
~ ~ ~
(CORE-4561)
BUGCHECK(183) was thrown when using a cursor with ORDER BY ID+0 and FOR
UPDATE WITH LOCK.
fixed by D. Yemanov
149
Bugs Fixed
~ ~ ~
(CORE-4539)
fixed by D. Yemanov
~ ~ ~
(CORE-4507)
fixed by D. Yemanov
~ ~ ~
(CORE-4472)
The message Modifying function <F> which is currently in use was displayed when <F>
was called from an internal function declared in another unit.
fixed by D. Yemanov
~ ~ ~
(CORE-4384)
Problems would occur when a table grew beyond 65535 pointer pages.
fixed by D. Yemanov
~ ~ ~
(CORE-4383)
Index and BLOBs garbage collection was not working for in-place updates.
(CORE-4382)
fixed by D. Sibiryakov
~ ~ ~
(CORE-4369)
fixed by D. Yemanov
~ ~ ~
(CORE-4280)
fixed by D. Yemanov
~ ~ ~
(CORE-4161)
It was not possible to insert records into a table having a column GENERATED BY
DEFAULT AS IDENTITY in its DDL.
fixed by D. Yemanov
~ ~ ~
150
Bugs Fixed
(CORE-3373)
(CORE-2932)
(CORE-2848)
Page-level lock conversion denied or lock denied errors could occur under high load
when no deadlocks were apparent.
fixed by V. Khorsun
~ ~ ~
(CORE-214)
fixed by D. Yemanov
~ ~ ~
Server Crashes
(CORE-4766)
An access violation would occur on an attempt to manage the users list using EXECUTE
STATEMENT on behalf of a non-SYSDBA user having the RDB$ADMIN role.
fixed by V. Khorsun
~ ~ ~
(CORE-4705)
current user.
fixed by D. Yemanov
~ ~ ~
(CORE-4653)
Infinite mutual stored procedure calls were causing the server to crash instead of returning
the appropriate error, Too many concurrent executions of the same request.
fixed by V. Khorsun
~ ~ ~
(CORE-4075)
fixed by D. Yemanov
~ ~ ~
(CORE-3632)
The application would crash after calling fork() in a process using libfbembed.so.
151
Bugs Fixed
fixed by A. Peshkov
~ ~ ~
API/Remote Interface
(CORE-4795)
fixed by A. Peshkov
~ ~ ~
(CORE-4794)
isc_cancel_events() was returning the error invalid events id (handle) (code: 335545021)
if an event was no longer queued.
fixed by A. Peshkov
~ ~ ~
(CORE-4788)
fixed by A. Peshkov
~ ~ ~
(CORE-4785)
fixed by A. Peshkov
~ ~ ~
(CORE-4756)
fixed by A. Peshkov
~ ~ ~
(CORE-4646)
on the client.
Attachment would fail when using LegacyAuth on the server and the default configuration
fixed by A. Peshkov
~ ~ ~
(CORE-4639)
fixed by D. Yemanov
~ ~ ~
(CORE-4471)
after Win_Sspi.
The Legacy_Auth plugin would not connect from a FB3 to a FB2.5 server when tried
fixed by A. Peshkov
152
Bugs Fixed
~ ~ ~
Utilities
isql
(CORE-4782)
SHOW TABLE command in isql would fail when the table contained a field with Unicode
collation in its DDL.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4706)
isql was padding BLOB columns wrongly when the column alias had more than 17 characters.
(CORE-4578)
fixed by A. Peshkov
~ ~ ~
(CORE-4503)
In isql, the command SHOW USERS would display only the current user.
fixed by A. Peshkov
~ ~ ~
(CORE-4259)
The call to setlocale(LC_CTYPE, "") should not be made in isql for Windows.
gbak
(CORE-4715)
was used.
Restore of a shadowed database would fail if the -k (restore without shadow) switch
fixed by A. Peshkov
~ ~ ~
(CORE-4704)
Permissions for generators and exceptions were being corrupted after backup/restore.
fixed by D. Yemanov
~ ~ ~
153
Bugs Fixed
gsec
(CORE-4698)
Typing add -user SYSDBA -pw masterkey -admin yes into gsec would crash firebird.exe.
(CORE-4735)
An expression 'where bool_field IS true | false' can now use the same index as 'where
bool_field = true | false' if such an index exists.
implemented by A. dos Santos Fernandes
~ ~ ~
(CORE-4731)
Issuing DML or DDL statements on the RDB$-- system tables is prohibited in Firebird 3.
implemented by A. Peshkov
~ ~ ~
(CORE-4729)
A flag was added to MON$DATABASE to assist in determining what type of security
database is used - default, self or other.
implemented by A. dos Santos Fernandes
~ ~ ~
(CORE-4696)
Flushing dirty pages to disk after creation of a temporary table index is now avoided.
implemented by V. Khorsun
~ ~ ~
(CORE-4685)
Resolved some risky issues on POSIX when aliases in databases.conf were pointing
to symbolic or hard links, allowing invalid database accesses.
implemented by A. Peshkov
~ ~ ~
(CORE-4671)
Internal temporary blobs are released early, to free up some memory\disk space.
154
Bugs Fixed
implemented by V. Khorsun
~ ~ ~
(CORE-4610)
Block values.
Diagnostics will now report a tag name when transliteration errors occur in Parameter
implemented by A. Peshkov
~ ~ ~
(CORE-4607)
from SQL.
Support added for having multiple UserManagers in firebird.conf and for using them
implemented by A. Peshkov
~ ~ ~
(CORE-4605)
implemented by A. Peshkov
~ ~ ~
(CORE-4590)
The data type of the result returned by the functions CHAR_LENGTH(), BIT_LENGTH()
and OCTET_LENGTH() for BLOBs was changed to BIGINT.
implemented by A. dos Santos Fernandes
~ ~ ~
(CORE-4386)
implemented by D. Yemanov
~ ~ ~
(CORE-3526)
implemented by D. Yemanov
~ ~ ~
(CORE-3234)
Support was added for text BLOBs >= 32K as the first argument for the TRIM() function.
(CORE-3226)
implemented by M. Kubecek
~ ~ ~
(CORE-733)
implemented by A. Peshkov
155
Bugs Fixed
~ ~ ~
Core Engine
(CORE-4576)
fixed by V. Khorsun
~ ~ ~
(CORE-4574)
(CORE-4570)
(CORE-4566)
Incorrect size of the output parameter or argument when EXECUTE BLOCK, procedure
or function used a system field in the metadata character set.
fixed by A. Peshkov
~ ~ ~
(CORE-4565)
GDSCODE could have value = 0 in WHEN-section under some concurrent environments.
This bug affected Superclassic and Classic models but not Superserver.
fixed by V. Khorsun
~ ~ ~
(CORE-4555)
(CORE-4530)
fixed by D. Yemanov
~ ~ ~
(CORE-4522)
Bugs Fixed
fixed by R. Simakov
~ ~ ~
(CORE-4515)
<some_table>.
Regression: trace was reporting UPDATEs in statistics when doing INSERT into
fixed by D. Yemanov
~ ~ ~
(CORE-4505)
fixed by A. Peshkov
~ ~ ~
(CORE-4488)
A FOR SELECT <L> FROM <T> AS CURSOR <C> seems to return a wrong result
if table <T> is modified inside the cursor's BEGIN...END block. Cursor references, which are not variables,
should represent the current state of the record. If it was updated "in place" (via "where current of"), then cursor
references should return the new values. The first example reported in CORE-4488 should return NULLs.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4478)
fixed by A. Peshkov
~ ~ ~
(CORE-4477)
The field RDB$MAP_TO_TYPE was missing from the system table RDB$TYPES.
fixed by A. Peshkov
~ ~ ~
(CORE-4468)
fixed by A. Peshkov
~ ~ ~
(CORE-4464)
fixed by A. Peshkov
~ ~ ~
(CORE-4453)
Regression: The NOT NULL constraint, if declared in a domain, did not work.
(CORE-4447)
field references.
A positioned UPDATE statement would preclude its index usage for the subsequent cursor
157
Bugs Fixed
fixed by D. Yemanov
~ ~ ~
(CORE-4444)
physical backup.
Engine could hang and block all attachments in an out-of-disk-space condition during
fixed by V. Khorsun
~ ~ ~
(CORE-4433)
fixed by V. Khorsun
~ ~ ~
(CORE-4435)
After calling release() instead of detach() for an attachment to a database in embedded
mode, the attachment would remain interminably active.
fixed by A. Peshkov
~ ~ ~
(CORE-4430)
characters.
fixed by A. Peshkov
~ ~ ~
(CORE-4415)
(CORE-4396)
A query executed via EXECUTE STATEMENT was returning the wrong result.
(CORE-4395)
fixed by A. Peshkov
~ ~ ~
(CORE-4394)
fixed by A. Peshkov
~ ~ ~
(CORE-4388)
SELECT WITH LOCK could enter an infinite loop for a single record.
fixed by D. Yemanov
158
Bugs Fixed
~ ~ ~
(CORE-4381)
(CORE-4379)
Explicit cursors containing correlated subqueries in the select list were performing poorly.
fixed by D. Yemanov
~ ~ ~
(CORE-4376)
Preparation of an erroneous DDL statement was not indicating that the main command failed.
(CORE-4375)
A procedure would execute infinitely if it contained more than 32767 statements inside
any BEGIN/END block.
fixed by D. Yemanov
~ ~ ~
(CORE-4374)
(CORE-4373)
(CORE-4372)
Deadlock could occur when two data pages contained record fragments pointing to each other.
fixed by V. Khorsun
~ ~ ~
(CORE-4371)
A CREATE FUNCTION or CREATE PROCEDURE statement that referred to a nonexistent exception would return the error message Error while parsing function's BLR instead of exception
not defined.
fixed by D. Yemanov
~ ~ ~
(CORE-4366)
A WHERE predicate containing NULL IS NOT DISTINCT FROM (select min(NULL)
from ...) was returning the wrong result.
fixed by D. Yemanov
159
Bugs Fixed
~ ~ ~
(CORE-4365)
Equality predicate distribution was not working for some complex queries.
fixed by D. Yemanov
~ ~ ~
(CORE-4360)
SELECT from derived table which contains GROUP BY on a column with a literal value
was returning wrong results.
fixed by D. Yemanov
~ ~ ~
(CORE-4354)
Parsing of a recursive query would return the error Column does not belong to referenced
table when the source table did have such a column.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4353)
fixed by D. Yemanov
~ ~ ~
(CORE-4344)
table.
Error no current record for fetch operation when table inner joins procedure inner joins
fixed by D. Yemanov
~ ~ ~
(CORE-4334)
Resources (e.g. sort files) owned by a trigger could be left unreleased when the trigger
was interrupted asynchronously.
fixed by D. Yemanov
~ ~ ~
(CORE-4331)
LAG, LEAD and NTH_VALUE would raise an error when the second argument was NULL.
(CORE-4330)
The function LAG returned an incorrect result if the OFFSET value was assigned from a table.
(CORE-4326)
optional.
The keyword SET was required in the ALTER USER statement when it should have been
fixed by A. Peshkov
160
Bugs Fixed
~ ~ ~
(CORE-4318)
the aggregation.
Regression: Predicates involving PSQL variables or parameters were not pushed inside
fixed by D. Yemanov
~ ~ ~
(CORE-4313)
Error Attempt to reopen an open cursor could be raised if the query handle was reused
in a different transaction.
fixed by D. Yemanov
~ ~ ~
(CORE-4309)
The 'Cache Writer' record in MON$ATTACHMENTS would vanish when deleting, via
delete from MON$ATTACHMENTS, another connection that was running a heavy update on a big table.
fixed by V. Khorsun
~ ~ ~
(CORE-4307)
Any fields present only in the WHERE clause of a view WITH CHECK OPTION would
cause an invalid CHECK CONSTRAINT violation.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4303)
fixed by A. Peshkov
~ ~ ~
(CORE-4301)
(CORE-4286)
The error Statement already has a cursor assigned would be thrown when trying to execute
another SQL statement using a different cursor name.
fixed by A. Peshkov
~ ~ ~
(CORE-4118)
fixed by D. Yemanov
~ ~ ~
(CORE-3305)
A BLOB not found error would be returned after creating or altering an invalid trigger.
fixed by D. Yemanov
161
Bugs Fixed
~ ~ ~
(CORE-2350)
An over-long column name for a SELECT alias was not being rejected, as it should have been.
(CORE-1475)
A database which had active attachments could not be replaced from a backup file even
after the database was shut down.
fixed by D. Yemanov
~ ~ ~
Server Crashes
(CORE-4575)
The server would crash in the garbage collector thread at disconnect of the last attachment.
fixed by V. Khorsun
~ ~ ~
(CORE-4568)
The server could crash while disconnecting from the database under load.
fixed by D. Yemanov
~ ~ ~
(CORE-4510)
fixed by V. Khorsun
~ ~ ~
(CORE-4506)
The server would crash when executing almost any "show ..." commands after a reconnect.
fixed by A. Peshkov
~ ~ ~
(CORE-4500)
Firebird would crash after an unsuccessful remapping of the lock table's shared memory.
fixed by D. Yemanov
~ ~ ~
(CORE-4498)
The server would crash when getting an explained plan for a DBKEY-based retrieval.
fixed by D. Yemanov
~ ~ ~
(CORE-4422)
ORDER by clause.
162
Bugs Fixed
fixed by D. Yemanov
~ ~ ~
(CORE-4419)
The server could crash while sorting records longer than 128KB.
fixed by D. Yemanov
~ ~ ~
(CORE-4322)
The engine would crash when aggregate or window functions were used in a recursive query.
(CORE-4321)
fixed by A. Peshkov
~ ~ ~
(CORE-4319)
The engine would crash when the Trace config contained the line connection_id=NN and
an attempt was made to connect to a non-existent database or alias.
fixed by V. Khorsun
~ ~ ~
(CORE-4304)
The engine would crash when an attempt to REcreate a table with a foreign key was made
after a syntax error that preceded the RECREATE attempt.
fixed by A. dos Santos Fernandes
~ ~ ~
API/Remote Interface
(CORE-4275)
CREATE DATABASE would fault if fbclient.dll was loaded from another directory
(Providers = Engine12).
fixed by V. Khorsun
~ ~ ~
Utilities
isql
(CORE-4480)
isql would issue the warning Bad debug info format when connecting to a database with
stored functions after a restore.
fixed by D. Yemanov
163
Bugs Fixed
~ ~ ~
(CORE-4440)
isql would crash without connecting when executing the command SHOW VERSION.
fixed by A. Peshkov
~ ~ ~
(CORE-4380)
(CORE-4320)
Regression: isql would crash when receiving statistics from the execution of a SQL query.
fixed by V. Khorsun
~ ~ ~
gbak
(CORE-4470)
functions.
gbak restore would fail on a database containing dependency between views and packaged
(CORE-4425)
on restore.
User collations based on UNICODE were not being upgraded to a newer ICU version
(CORE-4417)
gbak refused to commit the index for a primary key with characters accented with an umlaut.
(CORE-4346)
V.3 gbak was unable to restore backups made on earlier server versions.
fixed by D. Yemanov
~ ~ ~
nBackup
(CORE-4461)
fixed by A. Peshkov
~ ~ ~
164
Bugs Fixed
qli
(CORE-4327)
qli was throwing an error when copying NULL blobs between databases.
fixed by A. Peshkov
~ ~ ~
Core Engine
(CORE-4302)
fixed by V. Khorsun
~ ~ ~
(CORE-4289)
A NOT NULL field from a derived table could become NULL when referred to from
outside the derived table
fixed by D. Yemanov
~ ~ ~
(CORE-4281)
TYPE OF arguments of stored functions could cause the server to hang if depending on
a domain or column that had been changed
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4270)
A subquery involving a windowed function and a where <field> IN(select ...)
condition could cause an error
fixed by D. Yemanov
~ ~ ~
(CORE-4265)
database
An unexpected lock conflict error could be raised while connecting to a heavily loaded
fixed by D. Yemanov
~ ~ ~
(CORE-4262)
Context parsing errors could occur with derived tables and CASE functions
fixed by D. Yemanov
165
Bugs Fixed
~ ~ ~
(CORE-4261)
function
JOIN result could be wrong when joined fields had been created via the row_number()
fixed by D. Yemanov
~ ~ ~
(CORE-4258)
The boundary for the minimum value for BIGINT/DECIMAL(18) was wrong
(CORE-4251)
The Guardian service could write garbage after the end of a message in the Event Log
fixed by V. Khorsun
~ ~ ~
(CORE-4250)
fixed by V. Khorsun
~ ~ ~
(CORE-4237)
Metadata being reported from system table queries for UDF return arguments was different
to that returned in Firebird 2.5
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4234)
(CORE-4229)
Bidirectional cursor was not being positioned by the first call of FETCH LAST
fixed by D. Yemanov
~ ~ ~
(CORE-4227)
A parser conflict was causing wrong evaluation of BETWEEN and Boolean expressions
(CORE-4216)
fixed by V. Khorsun
~ ~ ~
166
Bugs Fixed
(CORE-4211)
The embedded engine would hang for 5 seconds when closing, with errors about timeout
in shutdown process and invalid mutex being written into firebird.log
fixed by A. Peshkov
~ ~ ~
(CORE-4201)
fixed by D. Yemanov
~ ~ ~
(CORE-4198)
number literal
An incorrect token unknown error would occur when an SQL string ended with a hex
(CORE-4177)
(CORE-4159)
fixed by D. Yemanov
~ ~ ~
(CORE-4156)
RDB$GET_CONTEXT/RDB$SET_CONTEXT parameters were being described incorrectly as CHAR NOT NULL instead of VARCHAR NULLABLE
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-3689)
executed
Bad performance and slow response were exhibited when many concurrent sorts were
fixed by D. Yemanov
~ ~ ~
(CORE-3291)
With bugcheckabort=1 and sweep starting at gap ~21000, Bugcheck 186 (record disappeared) and 100% CPU load would occur
fixed by V. Khorsun
~ ~ ~
(CORE-2165)
Unnecessary index reads could occur when using a strict inequality condition
fixed by V. Khorsun
~ ~ ~
167
Bugs Fixed
Server Crashes
(CORE-4293)
OR'd predicates
The server could crash on a SELECT with a long or complex list of compound AND/
fixed by D. Yemanov
~ ~ ~
(CORE-4271)
(CORE-4268)
fixed by D. Yemanov
~ ~ ~
(CORE-4267)
fixed by D. Yemanov
~ ~ ~
(CORE-4225)
level trigger
The server could crash when trace activity was attempted on a database having a database-
fixed by V. Khorsun
~ ~ ~
(CORE-4185)
fixed by A. Peshkov
~ ~ ~
API/Remote Interface
(CORE-4283)
simultaneously
Resource temporarily unavailable errors could occur while events were being registered
fixed by A. Peshkov
~ ~ ~
(CORE-4236)
Database shutdown was being reported as successfully completed before all active connections had actually been interrupted
fixed by D. Yemanov
168
Bugs Fixed
~ ~ ~
(CORE-4178)
The new API was still returning obscure historical definition artifacts of data fields, instead
of proper metadata properties that would make the interface actually usable
fixed by A. Peshkov
~ ~ ~
(CORE-4162)
fixed by A. Peshkov
~ ~ ~
Security/User Management
(CORE-4241)
fixed by A. Peshkov
~ ~ ~
(CORE-4200)
connections
An uncommitted SELECT from the pseudo table sec$users would block new database
fixed by A. Peshkov
~ ~ ~
Procedural Language
(CORE-4247)
newly added fields
Positioned DELETE (WHERE CURRENT OF <CURSOR>) could fail for tables with
(CORE-4244)
Creating a procedure could be a problem if it involved adding text in DOS864 character set
(CORE-4184)
output parameter
An error would be raised while executing an empty EXECUTE BLOCK with NOT NULL
(CORE-4160)
Bugs Fixed
~ ~ ~
(CORE-4145)
Preparing an EXECUTE BLOCK that used domains was causing a memory leak
Global temporary tables were able to reference permanent relations, which they should
fixed by V. Khorsun
~ ~ ~
(CORE-4212)
Dropping a foreign key on a Global temporary table would cause a server crash
fixed by V. Khorsun
~ ~ ~
(CORE-4203)
(CORE-4180)
CREATE COLLATION was not verifying the base collation character set
(CORE-4173)
fixed by D. Yemanov
~ ~ ~
(CORE-4155)
as an error
External routines DDL in packages was wrongly reporting termination with semi-colon
Bugs Fixed
~ ~ ~
(CORE-4255)
fixed by D. Yemanov
~ ~ ~
(CORE-4240)
was requested
Recursive query would return incorrect results if passage through more than one branch
fixed by D. Yemanov
~ ~ ~
(CORE-4158)
Utilities
gfix
(CORE-4297)
gfix would crash when the size of the description of a limbo transaction was larger than 1 KB
fixed by V. Khorsun
~ ~ ~
fbsvcmgr
(CORE-4298)
fixed by A. Peshkov
~ ~ ~
isql
(CORE-4259)
Bug in the isql command setlocale(LC_CTYPE, "") on Windows due to a reference
to editline, which is not available on that platform
fixed by F. Schlottmann-Goedde
~ ~ ~
(CORE-4205)
Bugs Fixed
~ ~ ~
(CORE-4149)
fixed by D. Yemanov
~ ~ ~
(CORE-362)
fixed by F. Schlottmann-Goedde
~ ~ ~
gbak
(CORE-4202)
Backup/restore from an older version to v.3.0 would fail with a BLR error
fixed by D. Yemanov
~ ~ ~
(CORE-4168)
A backup containing procedures or triggers that selected from external tables could not
be restored with ExternalFileAccess = None
fixed by D. Yemanov
~ ~ ~
(CORE-4164)
Owner name was missing for generators and exceptions restored from a backup
fixed by D. Yemanov
~ ~ ~
nbackup
(CORE-2648)
nBackup's delta file was ignoring the Forced Writes setting of the database
fixed by V. Khorsun
~ ~ ~
Deadlock could occur while accessing the monitoring tables under concurrent load
(CORE-4176)
configurations
172
Bugs Fixed
fixed by D. Yemanov
~ ~ ~
Trace
(CORE-4219)
fixed by A. Peshkov
~ ~ ~
(CORE-4163)
fixed by A. Peshkov
~ ~ ~
Attempting to use Legacy_Auth directly after install would not work without restarting
fixed by P. Reeves
~ ~ ~
Core Engine
(CORE-4135)
fixed by V. Khorsun
~ ~ ~
(CORE-4134)
fixed by V. Khorsun
~ ~ ~
(CORE-4074)
Bugs Fixed
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-4027)
result.
Creating a table with computed fields containing SELECT FIRST could produce a corrupted
(CORE-3973)
The SQLDA for an aliased column in a grouped query was missing the original table name,
column name and owner.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-3947)
Wrong results were produced when a column in the WHERE clause used the collation
option (NUMERIC-SORT=1).
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-3941)
(CORE-3929)
The invalid error attempted update of read-only column would appear when selecting
MINVALUE from a list of more than 255 elements.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-3894)
When an attempt was made to reduce the size of a CHAR or VARCHAR column, the
numbers delivered in the error message were incorrect.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-3874)
A computed column would appear in non-existent rows output from a left join.
(CORE-3820)
(CORE-3754)
Bugs Fixed
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-3735)
An unprivileged user could delete from the system tables RDB$DATABASE, RDB$COLLATIONS and RDB$CHARACTER_SETS.
fixed by D. Yemanov
~ ~ ~
(CORE-3694)
Internal consistency check would occur in a query with grouping by subquery+stored
procedure+aggregate.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-3672)
columns.
It was not possible to use the SUBSTRING function to create a computed index for large
(CORE-3638)
Some collation tweaking: FR_CA_CI_AI collation was introduced; FR_FR was changed
to be identical to FR_CA and FR_FR_CI_AI was changed to be identical to the new FR_CA_CI_AI.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-3476)
The LIST function was concatenating binary blobs as though they were text.
(CORE-3401)
Collation errors could occur with the use of [type of] <domain> and type of <column>.
(CORE-3373)
(CORE-3338)
Regression: Code changes had disabled support for expression indexes with COALESCE,
CASE and DECODE.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-3317)
Bugs Fixed
fixed by V. Khorsun
~ ~ ~
(CORE-3310)
A complex expression involving RDB$GET_CONTEXT and BETWEEN worked in DSQL
but failed with a conversion error when selected in a view definition.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-3260)
fixed by A. Peshkov
~ ~ ~
(CORE-3250)
The Firebird server could not be started under any user name other than root, firebird,
interbas or interbase.
fixed by A. Peshkov
~ ~ ~
(CORE-3239)
(CORE-3204)
A constraint violation error involving CAST was not being raised inside views.
(CORE-3052)
Comparisons involving multiple index segments could produce wrong result sets.
(CORE-2988)
The concurrent transaction number was not being reported when a lock timeout occurred.
fixed by N. Samofatov
~ ~ ~
(CORE-2957)
fixed by D. Yemanov
~ ~ ~
(CORE-2952)
Character class names in SIMILAR TO expressions could be case-sensitive or caseinsensitive, depending on the collation of the left part, whereas they should be unequivocally case-insensitive.
fixed by D. Sibiryakov
176
Bugs Fixed
~ ~ ~
(CORE-2932)
An ALTER TABLE..ALTER COLUMN..ALTER POSITION operation could result in
wrong column positions.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-2922)
The character set used in a constant was not being registered as a dependency.
(CORE-2913)
(CORE-2798)
calls.
Plan output lacked the names of views when selecting from views that contained procedure
fixed by D. Yemanov
~ ~ ~
(CORE-2796)
fixed by D. Yemanov
~ ~ ~
(CORE-2678)
A full outer join could not use available indices, resulting in very slow execution sometimes.
fixed by D. Yemanov
~ ~ ~
(CORE-2508)
Use of certain choices of character in double-quoted index names, for example a bracket
character, could defeat the parsing logic when generating a human-readable plan.
fixed by D. Yemanov
~ ~ ~
(CORE-2155)
A join of a stored procedure with a view or a table could fail with the error No current
record for fetch operation.
fixed by D. Yemanov
~ ~ ~
(CORE-1712)
A buffer overrun error was being caught erroneously in a DOUBLE PRECISION to
VARCHAR conversion in a Dialect 1 database.
fixed by C. Valderrama C.
177
Bugs Fixed
~ ~ ~
(CORE-1605)
(CORE-1550)
An unnecessary index scan was executed when the same index is mapped to both WHERE
and ORDER BY clauses.
fixed by D. Yemanov
~ ~ ~
API/Remote Interface
(CORE-3718)
(events) port.
The cient library could hang after an unsuccessful attempt to connect to the remote auxiliary
fixed by A. Peshkov
~ ~ ~
(CORE-3475)
non-nullable.
Parameters inside the CAST function were being wrongly described in the SQLDA as
(CORE-3269)
The client would perform detach incorrectly when the server became unavailable.
fixed by A. Peshkov
~ ~ ~
(CORE-2484)
An erroneous Success message would be returned in the error status vector when failing
to connect to a trash database file.
fixed by C. Valderrama C.
~ ~ ~
(CORE-2431)
String values in error messages were not converted to the connection character set.
Procedural Language
(CORE-4018)
Use of a system domain in declarations of arguments or return values in a stored procedure
could prevent the procedure from being modifiable.
178
Bugs Fixed
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-3737)
EXECUTE BLOCK parameter definitions were not being respected and could cause wrong
behavior with respect to character sets.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-3545)
Validation of domain CHECK constraints when used in PSQL declarations was inconsistent:
it was using the type of the expression, instead of the type of the variable.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-3055)
The names of variables or arguments could be wrong or absent in error messages when
more than 256 variables were used.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-3047)
(CORE-2204)
returned no rows.
Constraints on stored procedure output parameters were checked even when the procedure
(CORE-1620)
Incorrect error message (an absurd column number) was returned if an empty SQL string
was prepared for EXECUTE STATEMENT.
fixed by D. Yemanov
~ ~ ~
(CORE-3056)
Problems could occur if further DDL commands were issued in the same transaction
following a CREATE COLLATION command.
179
Bugs Fixed
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-2696)
The ALTER TABLE command allowed the addition of a column with a NOT NULL
definition, allowing a non-savvy DBAdmin to wreck the table.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-1748)
Unrestorable backup: a problem which would occur if ALTER TABLE...ADD COLUMN
added a column with a NOT NULL constraint. The fix for CORE-2696 has now made it impossible to do this.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-1518)
Adding a non-nullable column to a populated table would render the table inconsistent. The
fix for CORE-2696 has now made it impossible to do this.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-1355)
Client tools tended to be confused about how to interpret a NULL that is returned from
a non-nullable column. The fix for CORE-2696 has now made it impossible to add a non-nullable column to
a populated table.
It is not clear, though, whether this part of the fix makes it mandatory to specify a default value for a nonnullable column.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-634)
Bad behaviour of DELETE when the WHERE clause was a subquery involving FIRST/
SKIP: the operation would zap every row in the table.
fixed by V. Khorsun
~ ~ ~
(CORE-304)
Any user could alter or drop generators and exceptions#a metadata security hole.
fixed by D. Yemanov
~ ~ ~
Bugs Fixed
~ ~ ~
(CORE-4005)
fixed by V. Khorsun
~ ~ ~
(CORE-3416)
Inserting a word containing the 8-bit character '' into a CHARACTER SET ASCII column
would succeed instead of throwing a transliteration error.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-3201)
The internal function ATAN2 was returning an incorrect value with arguments (0, 0).
(CORE-3174)
(CORE-2699)
(CORE-2606)
A multi-byte CHAR value requested as VARCHAR was returned with padded spaces.
(CORE-2238)
With UTF8 and large varchar fields, IS DISTINCT FROM would cause the error Implementation limit exceeded.
fixed by D. Yemanov
~ ~ ~
(CORE-1188)
STARTING WITH ? (where the parameter value supplied is an empty string) would fail
if the plan used a compound index.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-92)
Infinite insertion cycle: INSERT INTO THIS_TABLE SELECT ... FROM THIS_TABLE
would loop forever until resources were exhausted.
fixed by V. Khorsun
181
Bugs Fixed
~ ~ ~
Command-line Utilities
(CORE-2547)
an option.
Utilities did not always honour the minimum number of characters required to recognise
fixed by C. Valderrama C.
~ ~ ~
FbGuard
(CORE-2784)
Guardian would keep creating more and more threads each time FBServer died.
fixed by C. Valderrama C.
~ ~ ~
(CORE-1595)
Firebird Guardian's tray icon would disappear after a Windows Explorer crash.
fixed by C. Valderrama C.
~ ~ ~
isql
(CORE-4137)
isql was generating metadata script output with syntax errors in the CHARACTER SET
clause, e.g., CHARACTER SETISO8859_1.
fixed by A. dos Santos Fernandes
~ ~ ~
(CORE-3431)
(CORE-2788)
isql would extract the array dimensions after the character set name.
fixed by C. Valderrama C.
~ ~ ~
gbak
(CORE-3575)
gbak did not support backup volumes of size greater than 4GB.
182
Bugs Fixed
fixed by A. Peshkov
~ ~ ~
(CORE-2740)
gbak would restore invalid views without any warning to the user.
fixed by C. Valderrama C.
~ ~ ~
(CORE-2545)
fixed by C. Valderrama C.
~ ~ ~
nbackup
(CORE-2543)
fixed by C. Valderrama C.
~ ~ ~
The Sharp-S character was being treated incorrectly in the UNICODE_CI_AI collation.
183
Chapter 14
Country
Major Tasks
Dmitry Yemanov
Russian
Federation
Alex Peshkov
Russian
Federation
Claudio Valderrama
Chile
Vladyslav Khorsun
Ukraine
Brazil
Roman Simakov
Russian
Federation
Paul Beach
France
Pavel Cisar
Czech Republic
Philippe Makowski
France
QA tester
Paul Reeves
France
Mark Rotteveel
The Netherlands
Jiri Cincura
Czech Republic
Alexander Potapchenko
Russian
Federation
Stephen Boyd
Canada
GPRE contributions
Alexey Kovyazin
Russian
Federation
Website coordinator
Paul Vinkenoog
The Netherlands
Norman Dunbar
U.K.
International character-set handling; text and text BLOB enhancements; new DSQL features; code scrutineering
Engine contributions
Release Manager; HP-UX builds; MacOS Builds; Solaris
Builds
QA tools designer/coordinator
Documentation writer
184
Developer
Country
Major Tasks
Pavel Menshchikov
Russian
Federation
Documentation translator
Tomneko Hayashi
Japan
Documentation translator
Italy
Documentation translator
Helen Borrie
Australia
185
Appendix A:
Licence Notice
The contents of this Documentation are subject to the Public Documentation License Version 1.0 (the License); you may only use this Documentation if you comply with the terms of this Licence. Copies of the
Licence are available at http://www.firebirdsql.org/pdfmanual/pdl.pdf (PDF) and http://www.firebirdsql.org/
manual/pdl.html (HTML).
The Original Documentation is entitled Firebird 3.0 Release Notes.
The Initial Writer of the Original Documentation is: Helen Borrie. Persons named in attributions are Contributors.
Copyright (C) 2004-2015. All Rights Reserved. Initial Writer contact: helebor at users dot sourceforge dot net.
186