| Firebird v2.5.0.ReleaseNotes
Firebird 2.5 Release Notes
Helen Borrie (Collator/Editor)
25 November 2009 -Document v.0250_39
-for Firebird 2.5 Release Candidate 1
Firebird 2.5 Release Notes
25 November 2009 -Document v.0250_39
-for Firebird 2.5 Release Candidate 1
Helen Borrie (Collator/Editor)
Table of Contents
1. General Notes
...................................................................................................................................
1
Bug Reporting
...............................................................................................................................
1
Known Issues
...............................................................................................................................
1
An Issue with the RDB$ADMIN Role
....................................................................................
1
SIMILAR TO Works Wrongly
...............................................................................................
1
Hints with Malformed String Exceptions
for Restores
.............................................................. 2
Documentation
...............................................................................................................................
2
2. New in Firebird 2.5
...........................................................................................................................
3
Other New Features
.......................................................................................................................
3
Administrative Enhancements
.................................................................................................
3
Other SQL Language Additions and
Enhancements
................................................................. 3
Data-handling Enhancements
..................................................................................................
4
API Additions
........................................................................................................................
4
International Language Support
..............................................................................................
4
3. Changes in the Firebird Engine
...........................................................................................................
5
New Threading Architecture
...........................................................................................................
5
“Superclassic”
........................................................................................................................
6
Thread-safe Client Library
..............................................................................................................
7
Improvements
...............................................................................................................................
7
Immediate Detection of Disconnected
Clients on Classic
.......................................................... 7
Optimizations
.........................................................................................................................
7
Cache Size Limit Increased for 64-bit
Servers
.........................................................................
8
Default Database Location
......................................................................................................
8
DLL Loading for Windows Embedded Engine
........................................................................
9
Large External Table Support Enabled
....................................................................................
9
Statistics Now Work Properly with
64-bit Values
....................................................................
9
UDFs Safeguard
...................................................................................................................
10
Diagnostics
..........................................................................................................................
10
Metadata Improvements
........................................................................................................
11
4. Changes to the Firebird API and ODS
..............................................................................................
12
ODS (On-Disk Structure) Changes
................................................................................................
12
New ODS Number
...............................................................................................................
12
Maximum Page Size
............................................................................................................
12
Maximum Number of Page Buffers in Cache
.........................................................................
12
API (Application Programming Interface)
Extensions
.....................................................................
12
Connection Strings & Character Sets
.....................................................................................
12
Support for SQLSTATE Completion Codes
...........................................................................
14
“Efficient Unprepare”
...........................................................................................................
14
Cancel Operation Function
...................................................................................................
15
Shutdown Functions
.............................................................................................................
16
Tighter Control Over Header-level
Changes
..........................................................................
21
New Trace Services for Applications
....................................................................................
21
Other Services API Additions
...............................................................................................
24
5. Reserved Words and Changes
...........................................................................................................
27
Clean-up of Reserved Words
........................................................................................................
27
Newly Reserved Words
................................................................................................................
27
Keywords Added as Non-reserved
................................................................................................
27
6. Configuration Parameter Additions
and Changes
................................................................................
28
iv
Firebird 2.5 Release Notes
AuditTraceConfigFile
...................................................................................................................
28
Parameters Affecting Filesystem Cache
Usage
...............................................................................
28
FileSystemCacheSize
............................................................................................................
28
FileSystemCacheThreshold
...................................................................................................
29
MaxFileSystemCache
...........................................................................................................
29
Authentication
..............................................................................................................................
30
Changes in V.2.5
.................................................................................................................
30
MaxUserTraceLogSize
..................................................................................................................
30
OldSetClauseSemantics
................................................................................................................
30
RemoteAuxPort For Classic and
Superclassic
...............................................................................
31
Use Hostname for RemoteBindAddress
........................................................................................
31
RemoteFileOpenAbility
................................................................................................................
31
7. Administrative Features
....................................................................................................................
33
New RDB$ADMIN System Role
..................................................................................................
33
Multiple Databases and Superusers
.......................................................................................
33
System “Superusers”
............................................................................................................
34
Escalating RDB$ADMIN Scope for User
Management ..........................................................
35
Trace and Audit Services
..............................................................................................................
36
Overview of Features
...........................................................................................................
36
The System Audit Session
....................................................................................................
36
User Trace Sessions
.............................................................................................................
37
Trace Scope on Windows
.....................................................................................................
39
Use Cases
............................................................................................................................
40
Monitoring Improvements
.............................................................................................................
40
Extended Access for Ordinary Users
.....................................................................................
40
New MON$ Metadata for ODS 11.2
Databases
.....................................................................
41
Usage Notes
.........................................................................................................................
42
8. Security Hardening
...........................................................................................................................
44
Windows Platforms
......................................................................................................................
44
No SYSDBA Auto-mapping (Windows)
................................................................................
44
9. Data Definition Language (DDL)
......................................................................................................
45
Quick Links
................................................................................................................................
45
Visibility of Procedure Definition
Changes on Classic
............................................................ 45
CREATE/ALTER/DROP USER
...........................................................................................
45
Syntaxes for Altering Views
.................................................................................................
47
Extensions for CREATE VIEW
............................................................................................
48
ALTER Mechanism for Computed Columns
..........................................................................
49
Extensions for SQL Permissions
...........................................................................................
49
Default COLLATION Attribute for a
Database
......................................................................
51
ALTER CHARACTER SET Command
.................................................................................
52
Evolution of CREATE DATABASE
.....................................................................................
53
10. Data Manipulation Language (DML)
...............................................................................................
56
Quick Links
................................................................................................................................
56
RegEx Search Support using SIMILAR TO
...........................................................................
56
Hex Literal Support
..............................................................................................................
61
New UUID Conversion Functions
.........................................................................................
62
SOME_COL = ? OR ? IS NULL Predication
........................................................................
62
Extension to LIST() Function
...............................................................................................
63
Optimizer Improvements
......................................................................................................
64
Other Improvements
.............................................................................................................
64
11. Procedural SQL (PSQL)
.................................................................................................................
66
Quick Links
................................................................................................................................
66
v
Firebird 2.5 Release Notes
Autonomous Transactions
.............................................................................................................
66
Borrow Database Column Type for a PSQL
Variable
.....................................................................
67
New Extensions to EXECUTE STATEMENT
...............................................................................
68
Context Issues
......................................................................................................................
68
External Queries from PSQL
................................................................................................
70
EXECUTE STATEMENT with Dynamic
Parameters
............................................................. 71
Examples Using EXECUTE STATEMENT
...........................................................................
72
Other PSQL Improvements
...........................................................................................................
75
Subqueries as PSQL Expressions
..........................................................................................
75
12. International Language Support
(INTL)
...........................................................................................
76
Default COLLATION Attribute for a
Database
..............................................................................
76
ALTER CHARACTER SET Command
........................................................................................
76
Connection Strings & Character Sets
.............................................................................................
76
Other Improvements
.....................................................................................................................
76
Introducer Syntax Usage
.......................................................................................................
76
Malformed UNICODE_FSS Characters
Disallowed
............................................................... 77
Repair Switches for Malformed Strings
.................................................................................
77
Numeric Sort Attributes
........................................................................................................
77
Character Sets and Collations
...............................................................................................
78
13. Command-line Utilities
...................................................................................................................
79
fbtracemgr
...................................................................................................................................
79
Action Switches
...................................................................................................................
79
Parameters
...........................................................................................................................
79
Examples using fbtracemgr
...................................................................................................
80
Retrieve Password from a File or Prompt
......................................................................................
80
New -fetch_password Switch
................................................................................................
80
gsec
............................................................................................................................................
81
Mapping Switch for Windows
Administrators
........................................................................
81
Command-line Help for gsec
................................................................................................
82
fbsvcmgr
.....................................................................................................................................
82
gbak
...........................................................................................................................................
83
Repair Switches for Malformed Strings
.................................................................................
83
Preserve Character Set Default
Collation
...............................................................................
83
nBackup
......................................................................................................................................
83
isql
.............................................................................................................................................
83
SQLSTATE instead of SQLCODE
........................................................................................
84
Improvement for Exponential Number
Output
.......................................................................
84
SHOW COLLATIONS in isql Help
......................................................................................
84
gpre (Precompiler)
........................................................................................................................
84
Some Updates
......................................................................................................................
84
gstat
............................................................................................................................................
85
14. Installation Notes
...........................................................................................................................
86
Linux (POSIX)
.............................................................................................................................
86
Installation Scripts Cleanup
..................................................................................................
86
Dedicated Firebird Switches for
'configure'
............................................................................
86
Detection of Path to Firebird's
Binaries
.................................................................................
87
Windows
.....................................................................................................................................
87
Managing MSCV8 Assemblies
.............................................................................................
87
15. Compatibility Issues
.......................................................................................................................
89
Effects of Unicode Metadata
.........................................................................................................
89
Configuration Parameters Removed
...............................................................................................
89
SQL Language Changes
...............................................................................................................
89
vi
Firebird 2.5 Release Notes
Reserved Words
...................................................................................................................
89
Execution Results
.................................................................................................................
90
Utilities
.......................................................................................................................................
90
fb_lock_print
........................................................................................................................
90
API Changes
...............................................................................................................................
91
Rejection of Inconsistent TPB Options
..................................................................................
91
Addition of SQL_NULL Constant
.........................................................................................
91
Security Hardening
.......................................................................................................................
91
No SYSDBA Auto-mapping (Windows)
................................................................................
91
Default Authentication Method (Windows)
............................................................................
91
16. Platform Ports
...............................................................................................................................
93
IBM eServer z-Series
...................................................................................................................
93
Linux/s390 (32-bit)
...............................................................................................................
93
Linux/s390x (64-bit)
.............................................................................................................
93
Linux/sh4 (Renesas SH)
...............................................................................................................
93
HP-UX
.......................................................................................................................................
94
Lock Table Improvement for HP-UX
....................................................................................
94
Port for Very Old Windows 32-bit
Platforms
.................................................................................
94
17. Bugs Fixed
....................................................................................................................................
95
Firebird 2.5 Release Candidate 1
..................................................................................................
95
Core Engine/DSQL
..............................................................................................................
95
Server/Client Crashes
.........................................................................................................
100
Security
..............................................................................................................................
100
International Language Support
...........................................................................................
100
Command-line Utilities
.......................................................................................................
101
POSIX-Only Issues
............................................................................................................
102
Windows-Only Issues
.........................................................................................................
102
Firebird 2.5 Beta 2
.....................................................................................................................
102
Core Engine/DSQL
............................................................................................................
102
Server/Client Crashes
.........................................................................................................
106
Remote Interface/API
.........................................................................................................
107
International Language Support
...........................................................................................
107
Command-line Utilities
.......................................................................................................
108
Firebird 2.5 Beta 1
.....................................................................................................................
109
Core Engine/DSQL
............................................................................................................
109
Firebird 2.5 Alpha 1
...........................................................................................................
128
18. Firebird 2.5 Project Teams
............................................................................................................
137
Appendix A: SQLSTATE
...................................................................................................................
139
SQLSTATE Codes & Messages
..................................................................................................
139
Appendix B: Licence Notice
...............................................................................................................
147
vii
List of Tables
10.1. Character class identifiers
............................................................................................................
58
18.1. Firebird Development Teams
......................................................................................................
137
viii
List of Examples
4.1.
....................................................................................................................................................
15
ix
Chapter 1
General Notes
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 alpha 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 alpha.
Known Issues
This release candidate is distributed
with the following known issues, due for resolution before final
release:
An Issue with the RDB$ADMIN Role
(CORE-2765) A user that has acquired
the RDB$ADMIN role should have the same implicit WITH
GRANT OPTION rights in the database as
does the SYSDBA. It appears not to be happening.
Allocated to A. Peshkov
~~~
SIMILAR TO Works Wrongly
(CORE-2755) Cases are occuring where
the SIMILAR TO predicate is returning false negatives from
certain RegEx comparisons.
Allocated to A. dos Santos Fernandes
~~~
1
General Notes
Hints with Malformed String Exceptions
for Restores
(CORE-nnnn) The final release will
supply a hint referring the user to the -FIX_FSS_METADATA and
-FIX_FSS_DATA switches when a restore
fails with malformed string errors.
Allocated to A. dos Santos Fernandes
~~~
Documentation
You will find all of the README
documents referred to in these notes in the doc sub-directory of your
Firebird
2.5 installation.
An automated "Release Notes"
page in the Tracker provides lists and links for all of the Tracker
tickets associated
with this and other pre-release
versions. Use this link.
--The Firebird Project
2
Chapter 2
New in Firebird 2.5
The primary goal for Firebird 2.5 was
to establish the basics for a new threading architecture that is
almost
entirely common to the Superserver,
Classic and Embedded models, taking in lower level synchronization
and
thread safety generally.
Although SQL enhancements are not a
primary objective of this release, for the first time, user
management becomes
accessible through SQL
CREATE/ALTER/DROP USER statements and syntaxes for ALTER VIEW and
CREATE OR ALTER VIEW are implemented.
PSQL improvements include the introduction of autonomous
transactions and ability to query
another database via EXECUTE STATEMENT.
Other New Features
Other new features and improvements in
this release include:
Administrative Enhancements
•
System audit tracing and user trace
sessions via the Services API, making it possible to monitor and
analyse
everything going on in a database in
real time
•
New system role RDB$ADMIN in the ODS
11.2 database allows SYSDBA to transfer its privileges to another
user on a per-database basis
•
More information in the monitoring
tables
•
Asynchronous cancellation of
connections
•
Capability for ordinary users to
monitor any of their own attachments as well as CURRENT_CONNECTION
Other SQL Language Additions and
Enhancements
•
Regular expression support using the
SIMILAR TO predicate
•
ALTER COLUMN for computed columns
•
Autonomous transactions within a PSQL
module (stored procedure, trigger or dynamically executable PSQL
block)
•
Enhanced access to stored procedures in
view definitions
•
Optional GRANTED BY or GRANTED AS for
GRANT and REVOKE statements, enabling the grantor to
be a user other than the CURRENT_USER
(the default).
•
REVOKE ALL syntax to dispose of all
privileges for a user or role at once
3
New in Firebird 2.5
•
Support for WHERE SOME_COL = ? OR ? IS
NULL predications
•
Removal of “reserved”
status for all but a handful of keywords that are not reserved in the
SQL standard
Data-handling Enhancements
•
New built-in functions for converting
UUID CHAR(16) OCTETS strings to RFC4122-compliant format and
vice versa
•
Ability to pass 32-bit and 64-bit
integers as hexadecimal in numeric literal and X-prefixed binary
string literal
formats
API Additions
•
Statements now return an SQL-2003
standard 5-alphanumeric SQLSTATE completion code
•
New constant DSQL_unprepare available
for use with isc_dsql_free_statement for efficient unpreparing of
statements
International Language Support
•
Default COLLATE clause for CREATE
DATABASE
•
Ability to change the default COLLATE
for a used character set
•
GBAK restore switches FIX_FSS_DATA and
FIX_FSS_METADATA to restore legacy databases with
UNICODE_FSS data and/or metadata
correctly without resorting to scripts and manual techniques
•
Accent-insensitive collation for
Unicode
4
Chapter 3
Changes in the
Firebird Engine
The primary objective of this release
was to refactor Firebird's threading architecture to take advantage
of the
symmetric multiprocessing (SMP)
capabilities of multiprocessor hardware. This has a noticeable effect
on the
scaleability of Superserver when
multiple databases are being accessed simultaneously but its major
effect is the
emergence of the architectural
“Superclassic” model that will underpin the fine-grained
multi-threading under
development for Firebird 3.
New Threading Architecture
Dmitry Yemanov
Vladyslav Khorsun
Alex Peshkov
also -
Nickolay Samofatov
Roman Simakov
For Superserver, the new architecture
will be most obvious in two ways:
1.
In a multiple database environment,
Superserver threads for each database are allotted evenly to
available
processors.
Note
The default CpuAffinity setting still
binds SuperServer to a single processor only. In order to take
advantage
of this improvement when working with
multiple databases, this setting should be changed in
firebird.conf.
The default value may change before the
final release.
2. A slight improvement in scaling
should be apparent for single database usage on SMP hardware
It is with Classic that the effects are
most evident:
1.
Classic Server can now be
multi-threaded. The one worker thread per process model remains but
now it is
possible to use additional threads for
parallel tasks such as asynchronous shutdown, sweep, inter-process
communications with the lock manager
and more.
2.
On POSIX, services in Classic also run
in threads now, rather than in forked processes as previously.
5
Changes in the Firebird Engine
Note
For Windows Classic, services became
threadable in v.2.1.
3.
The embedded libraries—libfbembed.so
on POSIX and fbembed.dll on Windows—are now multi-threadcapable
and thread-safe, so they can be used in
multi-threaded applications.
4.
Testing suggests that the performance
of Classic in this version will be be significantly faster than
previous
Classic versions.
“Superclassic”
This multi-threaded mode for Classic
has been dubbed “Superclassic” for its capability to
handle multiple worker
threads—dedicated or
pooled—inside a single server process. It shares all the usual
Classic features, with a few
differences:
•
Safe, full shutdown of the server
engine is possible on any platform
•
Under some TPC conditions, it can
outperform Classic—by about 15-20%
•
It uses fewer kernel resources
(although not less memory)
•
When a Superclassic process crashes, it
takes all its connections with it
•
Recognised limitations in the Services
API for the Classic server, such as the inability to retrieve the
list of
attachments/active users, do not apply
to SuperClassic.
•
On POSIX, Superclassic does not require
[x]inetd.
Embedded Server Notes
•
The embedded server in the Windows
library, fbembed.dll, now uses Superclassic, not Superserver as
previously,
thus unifying its model with that of
local connection to Superclassic on POSIX. The database file-
lock that previously restricted
connections to a single application space is replaced by a global
lock table that
allows simultaneous access to the same
database from different embedded server modules. This facilitates
concurrent debugging of applications
and use of native utility tools like gbak, gstat and so on.
•
A single attachment handle can now be
shared by simultaneous threads. (Tracker reference CORE-2498,
A. dos Santos Fernandes).
Usage Notes
Windows
On Windows, the same
fb_inet_server.exebinary delivers either the Classic or the
Superclassic working
modes, according to switch settings.
Classic is the default mode.
To use the Superclassic mode as a
service, add the -m[ulti-threaded] switch to the instsvc.execommand
line, as follows:
6
Changes in the Firebird Engine
instsvc install -multithreaded
When intending to run Superclassic as
an application, use
fb_inet_server -a -m
New Binary for POSIX
On POSIX, the new binary fb_smp_server
is supplied for the Superclassic model. It contains the network
listener, meaning it works similarly to
fbserver with regard to attachment requests and does not require
[x]inetd.
The multi-threaded engine used by
fb_smp_serveris the libfbembed.solibrary, in accordance with OSRI
requirements. The Classic packages also
include fbguard (the Guardian) which, for Classic, starts fb_smp_
server, rather than fbserveras it does
when the Superserver model is installed with Guardian.
Thread-safe Client Library
Dmitry Yemanov
Vladyslav Khorsun
Alex Peshkov
Tracker reference CORE-707.
The client libraries, including the
embedded one, can now be used in multi-threaded applications without
any
application-level synchronization.
Improvements
Improvements implemented include:
Immediate Detection of Disconnected
Clients on Classic
Vladyslav Khorsun
The Classic server now detects
immediately when a Classic process has been broken by a client
disconnection. Its
response is to terminate any pending
activity, roll back the active transaction and close the network
connection.
Tracker reference CORE-818.
Optimizations
Important optimizations include:
7
Changes in the Firebird Engine
Data Retrieval
Dmitry Yemanov
An optimization improves data retrieval
performance for tables from which no fields are accessed. This
applies,
for example to the SELECT COUNT(*)
style of query.
Tracker reference CORE-1598.
BLOB Memory Usage
Adriano dos Santos Fernandes
An optimization avoids memory
consumption of <page size> bytes for each temporary BLOB
created during
assignment.
Tracker reference CORE-1658.
Performance Improvement for Updates
V. Khorsun
The aim of this improvement was to
reduce the amount of precedence writing that the engine undertakes
when
performing its “careful write”
procedure for updates. The existing procedure had a noticeable effect
on the
performance of mass updates, especially
for “updates-in-place”, where the same records are
updated more than
once in the same transaction. In the
worst case, a page could be written to disk for every single new
record
version created during an update.
See the Tracker reference
(CORE-2672)for a simplified technical description of what was
involved internally.
The solution addresses the potentially
time-consuming process involved in protecting the write operations
from
causing circular references between the
pages on which new record versions and back versions are placed to
maintain correct precedence.
Cache Size Limit Increased for 64-bit
Servers
V. Khorsun
Tracker reference CORE-1687
Previous 64-bit Firebird server
versions could not benefit from 64-bit address space and be
configured for more
than 2 GB (16K * 128 K)of database
cache. The problem has been rectified in this version. On 64-bit
Firebird,
if the resources are available, it is
now possible to configure cache large enough to accommodate a
database
of 5-10 GB completely in RAM .
Although Firebird's caching can get a
lot of help from the filesystem cache, it is a feature that could be
important
for high-throughput systems whose load
is mainly reads. The theoretical upper limit for caches on x64
Firebird
servers is now 2^31 -1 (2,147,483,647)
pages.
Default Database Location
A. Peshkov
Tracker reference CORE-1643
8
Changes in the Firebird Engine
The configuration parameter
DatabaseAccess now has more “meaning” attached to it. In
the absence of any
other indication, the first location
defined in the “Restrict” list for DatabaseAccess is
taken by the engine as the
default location for creating a new
database and for locating a database where the connection parameters
do not
specify either an alias or the full
path specification.
The seek logic is similar to that use
for finding external tables from the Restrict list supplied to the
External-
FileAccess parameter, viz.,
1. All directories in the Restrict list
are searched first.
2. If the database specified is not
found:
• If CREATE DATABASE is involved,
then the first location in the Restrict list is used.
• Otherwise, the attach fails in
the expected fashion.
NOTE :: Current Working Directory
This feature does not suppress the use
of the current working directory as the implicit location of the
specified
database file for direct local
connections. The Y-valve handles the path resolution in these cases,
just as it
ever did.
For a stand-alone server working via
the remote subsystem, trying to connect using the database file name
with no path, although unlikely, is not
recommended, since there is not really any way to be certain where
the database would “land”.
On Windows, for example, under these conditions the current working
directory
would be %system%.
DLL Loading for Windows Embedded Engine
Adriano dos Santos Fernandes
The root determination mechanism for
the Windows embedded engine has been changed to avoid common
problems that occur when an
installation of the application structure encounters “DLL
Hell”. Previously, the
implicit root directory was the
directory containing the user application's main executable file. Now
it is the
directory where the renamed fbembed.dll
library is located.
Tracker reference CORE-1814.
Large External Table Support Enabled
Vlad Khorsun
Previous Firebird versions used 32-bit
I/O when working with external tables, limiting the size of the
external
file to < 2 GB. The mechanism has
been enhanced to use 64-bit I/O on filesystems that support it,
effectively
eliminating the 2 GB limit.
Tracker reference CORE-2492.
Statistics Now Work Properly with
64-bit Values
V. Khorsun
A. Peshkov
Tracker reference CORE-2619
9
Changes in the Firebird Engine
Memory and other statistics did not
work properly 64-bit values in older Firebird versions. The issue had
two
parts:
a. To make the engine use 64-bit
integers for statistics, the internals of AtomicCounter were changed.
b. The isql and qli tools had to be
taught to work with 64-bit values.
Incompatibility with Older Clients
To enable the 32-bit tools to work
correctly with a 64-bit server, it was necessary to introduce some
new internal
API functions (struct perf64 and
perf64_xxx) and change isql and qli to use them. This means that the
isql
and qli programs in V.2.5 are not
compatible with older Firebird clients.
UDFs Safeguard
Adriano dos Santos Fernandes
Tracker reference CORE-1937.
When a string UDF is written to return
a pointer not allocated by the same runtime as the Firebird server is
accessing, the presence of the FREE_IT
keyword in its declaration corrupts memory and crashes the server. As
a safeguard against such dysfunctional
UDFs, the engine now
1. detects such UDFs and throws an
exception
2. depends on the presence of the
updated ib_util library in the path for all server models, including
embedded
Diagnostics
Transaction Diagnostics
Claudio Valderrama
Better diagnostics and error reporting
when TPB contents are malformed. The new TPB validation logic now
rejects:
•
explicitly conflicting options within
the same category, e.g., {WAIT} and {NOWAIT} specified together,
or {READ COMMITTED} and {SNAPSHOT}, or
{READ ONLY} and {WRITE}
•
options making no sense, e.g. [NO]
RECORD VERSION specified for a SNAPSHOT isolation mode
•
incorrect order of table reservation
options, e.g. {PROTECTED READ <TABLE>} instead of {READ
<TABLE> PROTECTED}
Tracker reference CORE-1600.
Access Privilege Error Messages
Alex Peshkov
Both table and column names are now
reported when access privilege exceptions occur for a column.
Tracker reference CORE-1234.
10
Changes in the Firebird Engine
Message Improvement
V. Khorsun
Tracker reference CORE-2587
The diagnostic message when the engine
cannot create shared memory that has already been mapped by another
engine process in another Windows
session is now a bit more user-friendly. It used to say:
The requested operation cannot be
performed on a file with a user-mapped section open.
Now, it says:
Database is probably already opened by
another engine instance in another Windows session.
Metadata Improvements
Preserve Character Set Default
Collation
Adriano dos Santos Fernandes
An improvement allows the current value
of RDB$DEFAULT_COLLATE_NAME in the system table RDB
$CHARACTER_SETS to survive the
backup/restore cycle. The mechanism for such customisation is the new
ALTER CHARACTER SET command.
Tracker reference CORE-789.
11
Chapter 4
Changes to the
Firebird API and ODS
ODS (On-Disk Structure) Changes
On-disk structure (ODS) changes include
the following:
New ODS Number
Firebird 2.5 creates databases with an
ODS (On-Disk Structure) version of 11.2
Maximum Page Size
The maximum page size remains 16 KB
(131072 bytes).
Maximum Number of Page Buffers in Cache
The maximum number of pages that can be
configured for the database cache depends on whether the database
is running under 64-bit or 32-bit
Firebird:
• 64-bit :: 2^31 -1
(2,147,483,647) pages
• 32-bit :: 128,000 pages, i.e.,
unchanged from V.2.1
API (Application Programming Interface)
Extensions
Additions to the Firebird API include.
Connection Strings & Character Sets
A. dos Santos Fernandes
Previous versions had no way to
interoperate with the character set(s) used by the operating system
and its
filesystem. Firebird 2.5 has been made
“environmentally aware” with regard to the file names of
databases,
other files and string parameters
generally, when accessed through and/or passed in API connection
requests.
This change significantly improves
Firebird's ability to accept and work with file names and other
parameters
containing characters that are not in
the ASCII subset.
12
Changes to the Firebird API and ODS
Only DPB Connections Support this
Feature
In the current implementation, only
connections made through the DPB (database parameter block) support
this feature. It is not supported for
Services API (isc_spb*) functions.
isc_dpb_utf8_filename
The new connection option
isc_dpb_utf8_filename has been introduced, to enable Firebird to be
specifically
informed that the file name or other
character item being passed is in the UTF8 (UTF-8) character set. If
the
option is not used, the character set
defaults to the codepage of the operating system.
Client-Server Compatibility
New client, older server
If the client is V.2.5 or newer and it
is connecting to a pre-V.2.5 remote server, using the
isc_dpb_utf8_filename option causes the
client to convert the file name from UTF-8 to the client codepage
before passing it to the server. It
removes the isc_dpb_utf8_filename option from the DPB.
Compatibility is assured when the same
codepage is being used on both the the client and server stations.
New client, new server, without
isc_dpb_utf8_filename
If the client is V.2.5 or newer and it
is connecting to a V.2.5 or newer remote server without using the
isc_dpb_utf8_filename, the client
converts the file name from the OS codepage to UTF-8 and inserts the
isc_dpb_utf8_filename option into the
DPB.
The file name received on the server is
not subject to any special treatment. However, unlike older clients,
the V.2.5 client may convert the file
name automatically and insert the isc_dpb_utf8_filename option into
the DPB. Compatibility is guaranteed,
regardless, when the host and client are using the same code page.
New client, new server, with
isc_dpb_utf8_filename
Whenever the isc_dpb_utf8_filename
option is used, the client passes the unmodified filename to the
server.
The client thus always passes a UTF-8
file name to the server along with the isc_dpb_utf8_filename option.
Code Page Conversions
On Windows the code page used for
conversions is Windows ANSI. On all other platforms, UTF-8 is used.
The operating system codepage and UTF-8
may not be the best choice for file names. For example, if you had
a script or other text file for
processing in isql or some other script-running tool that used
another connection
character set, it would not be possible
to edit the file correctly using multiple character sets (code
pages).
There is a solution: the Unicode code
point. If used correctly, it enables correct interpretation of a
character
even if the client is older than V.2.5.
Using Unicode Code Points
Any Unicode character may now now be
encoded on the connection string file name as though it were an ASCII
character. It is accomplished by using
the symbol # as a prefix for a Unicode code point number (in
hexadecimal
format, similar to U+XXXX notation).
13
Changes to the Firebird API and ODS
Write it as #XXXX with X being 0-9,
a-f, A-F.
If one of the characters happens to be
the literal #, you could either “double” the hash
character ( ## ) or use
the code point number for it, #0023.
Note
The hash character is interpreted at
the server with these new semantics, even if the client is older than
v2.5.
Support for SQLSTATE Completion Codes
W. Oliver
D. Yemanov
Tracker reference CORE-1761.
A new client-side API function,
fb_sqlstate() is available to convert the status vector item for an
error into the
corresponding SQL-2003 standard
5-alphanumeric SQLSTATE.
•
The SQLSTATE code represents the
concatenation of a 2-character SQL CLASS and a 3-character SQL
SUBCLASS.
•
Statements now return an SQLSTATE
completion code.
•
The isql utility now prints the
SQLSTATE diagnostic for errors instead of the SQLCODE one
•
The SQLCODE diagnostic is
deprecated—meaning it will disappear in a future release
Deprecated SQLCODE
Although the SQLCODE is deprecated and
use of the SQLSTATE is preferred, it remains in Firebird for the
time being. The isc_sqlcode() API
function is still supported, as is the WHEN SQLCODE exception
handling.
Appendix A: SQLSTATE provides a list of
all SQLSTATE codes in use in this release, along with the
corresponding
message texts.
“Efficient Unprepare”
W. Oliver
D. Yemanov
Tracker reference CORE-1741.
The new option DSQL_unprepare (numeric
value 4) for the API routine isc_dsql_free_statement() allows the
DSQL statement handle to survive the
“unpreparing” of the statement.
Previously, the
isc_dsql_free_statement() function supported only DSQL_close (for
closing a named cursor) and
DSQL_drop (which frees the statement
handle).
The API addition is:
14
Changes to the Firebird API and ODS
#define DSQL_close 1
#define DSQL_drop 2
#define DSQL_unprepare 4
Cancel Operation Function
Alex Peshkov
New fb_cancel_operation() API call,
allowing cancellation of the current activity being performed by some
kind
of blocking API call in the given
connection.
Syntax
ISC_STATUS
fb_cancel_operation(ISC_STATUS* status_vector,
isc_db_handle* db_handle,
ISC_USHORT option);
Parameters
status vector (ISC_STATUS*
status_vector)
A regular status vector pointer
structure.
db_handle (pointer to a isc_db_handle)
A regular, valid database handle. It
identifies the attachment.
option (unsigned short: symbol)
Determines the action to be performed.
The option symbols are:
•
fb_cancel_raise: cancels any activity
related to the db_handle specified in the second parameter. The
effect will be that, as soon as
possible, the engine will try to stop the running request and return
an
exception to the caller via the status
vector of the interrupted API call.
“..as soon as possible”
will be, under normal conditions, at the next rescheduling point.
Example 4.1.
Thread1:
Thread2:
isc_dsql_execute(status, ....)
........
fb_cancel_operation(cancel_status, ...)
status[1] == isc_cancelled;
cancel_status[1] = 0;
•
fb_cancel_disable: disables execution
of fb_cancel_raise requests for the specified attachment. It can be
useful when your program is executing
critical operations, such as cleanup, for example.
•
fb_cancel_enable: re-enables delivery
of a cancel execution that was previously disabled. The 'cancel'
state is effective by default, being
initialized when the attachment is created.
•
fb_cancel_abort: : forcibly close
client side of connection. Useful if you need to close a connection
urgently.
All active transactions will be rolled
back by the server. 'Success' is always returned to the application.
Use with care !
15
Changes to the Firebird API and ODS
Usage
The cycle of fb_cancel_disable and
fb_cancel_enable requests may be repeated as often as necessary. If
the
engine is already in the requested
state there is no exception: it is simply a no-op.
Usually fb_cancel_raise is called when
you need to stop a long-running request. It is called from a separate
thread, not from the signal handler,
because it is not async signal safe.
Pay attention to the asynchronous
nature of this API call!
Another aspect of asynchronous
execution is that, at the end of API call, the attachment's activity
might be
cancelled or it might not. The latter
is always a possibility. The asynchronicity also means that returned
status
vector will almost always return
FB_SUCCESS. Exceptions, though, are possible: a network packet error,
for
example.
An Example
Thread A:
fb_cancel_operation(isc_status, &DB,
fb_cancel_enable);
isc_dsql_execute_immediate(isc_status,
&DB, &TR, 0, "long running statement", 3, NULL);
// waits for API call to finish...
Thread B:
fb_cancel_operation(local_status, &DB,
fb_cancel_raise);
Thread A:
if (isc_status[1])
isc_print_status(isc_status); // will
print "operation was cancelled"
Shutdown Functions
Alex Peshkov
This release exposes a variety of API
functions for instigating server shutdowns of various types from
client
applications.
Two Interrelated fb_shutdown* Functions
This release exposes two fb_shutdown*
functions that may be useful for embedded server applications:
fb_shutdown() and fb_shutdown_callback.
Prototypes
typedef int
(*FB_SHUTDOWN_CALLBACK)(const int reason, const int mask, void* arg);
int fb_shutdown(unsigned int timeout,
const int reason);
16
Changes to the Firebird API and ODS
ISC_STATUS
fb_shutdown_callback(ISC_STATUS* status_vector,
FB_SHUTDOWN_CALLBACK callback_function,
const int mask,
void* arg);
fb_shutdown()
fb_shutdown() performs a smart shutdown
of various Firebird subsystems (yValve, engine, redirector). It was
primarily designed for use by the
internal engine, since it is only applicable to the current process.
It is exposed
by the API for its possible usefulness
to user applications in the embedded server environment.
Currently operational only for the
embedded engine, this function terminates all the current activity,
rolls back
active transactions, disconnects active
attachments and shuts down the embedded engine instance gracefully.
Important for Application Developers
fb_shutdown() does not perform a
shutdown of a remote server to which your application might be
concurrently
attached. In fact, all of the Firebird
client libraries—including the one in embedded—call it
automatically
at exit(), as long as the client is
attached to at least one database or service.
Hence, it should never be called by a
client in the context of a remote attachment.
Parameters
fb_shutdown() takes two parameters:
1. timeout in milliseconds
2. reason for shutdown
The reason codes (const int reason),
which are negative, are listed in ibase.h: refer to constants
starting
with fb_shutrsn.
Note
When calling fb_shutdown() from your
program, you must pass the value as positive, for it will be passed
as an argument to
fb_shutdown_callback() by way of your callback_function, the routine
where you
would code the appropriate actions.
Return Values
•
A return value of zero means shutdown
was successful
•
A non-zero value means some errors
occurred during the shutdown. Details will be written to firebird.
log.
fb_shutdown_callback()
fb_shutdown_callback() sets up the
callback function that is to be called during shutdown. It is a call
that
almost always returns successfully,
although there are cases, such as an out-of-memory condition, which
could
cause it to return an error.
17
Changes to the Firebird API and ODS
Parameters
fb_shutdown_callback() takes four
parameters:
status vector (ISC_STATUS*
status_vector)
A regular status vector pointer
structure.
pointer to callback function
(FB_SHUTDOWN_CALLBACK callback_function)
This points to the callback function
you have written to perform the actions (if any) to be taken when the
callback occurs.
Your callback function can take three
parameters. The first and second parameters help to determine what
action is to be taken in your callback:
1.
reason for shutdown
Two shutdown reasons are of especial
interest:
•
fb_shutrsn_exit_called: Firebird is
closing due to exit() or unloaded client/embedded library
•
fb_shutrsn_signal, applies only to
POSIX: a SIGINT or SIGTERM signal was caught
Note
Firebird code always uses negative
reasons. Users are expected to use positive values when calling
fb_shutdown() themselves.
2.
actual value of the mask with which it
was called
The purpose of this parameter to help
determine whether the callback was invoked before or after engine
shutdown.
3.
argument passed to
fb_shutdown_callback() by the user application
Can be used for any purpose you like
and may be NULL.
Return Value from the Callback Function
If the callback function returns zero,
it means it performed its job successfully. A non-zero return value
is
interpreted according to the call mask
(see next parameter topic, below):
•
For fb_shut_postproviders calls, it
means some errors occurred and it will result in a non-zero value
being
returned from fb_shutdown(). It is the
responsibility of the callback function to notify the world of the
exact reasons for the error condition
being returned.
•
For fb_shut_preproviders calls, it
means that shutdown will not be performed.
Tip
It is NOT a good idea to return
non-zero if the shutdown is due to exit() having been called ! ;-)
call mask (const int mask)
Can have the following symbolic values:
•
fb_shut_preproviders: callback function
will be called before shutting down engine
18
Changes to the Firebird API and ODS
• fb_shut_postproviders: callback
function will be called after shutting down engine
• An ORed combination of them, to
have the same function called in either case
Values for call mask
fb_shut_confirmation
Engine queries: Is everyone ready to
shut down?
fb_shut_preproviders
Actions to be done before providers are
closed
fb_shut_postproviders
Aactions to be done when providers are
already closed
fb_shut_finish
Final cleanup
Returning non-zero for
fb_shut_confirmation (although not fb_shut_preproviders) means that
shutdown
will not be performed.
argument (void* arg)
This is the argument to be passed to
callback_function.
Using the fb_shutdown Functions
Following is a sample of using the
shutdown and shutdown callback feature to prevent your program from
being
terminated if someone presses Ctrl-C
while it is has database attachments.
#include <ibase.h>
// callback function for shutdown
static int ignoreCtrlC(const int
reason, const int, void*)
{
return reason == fb_shutrsn_signal ? 1
: 0;
}
int main(int argc, char *argv[])
{
ISC_STATUS_ARRAY status;
if (fb_shutdown_callback(status,
ignoreCtrlC, fb_shut_confirmation, 0))
{
isc_print_status(status);
return 1;
}
// your code continues ...
}
New isc_spb_prp_* Constants for
Shutdown
The new database shutdown modes can now
be set using calls to the Services API. A number of new
isc_spb_prp_* constants are available
as arguments.
19
Changes to the Firebird API and ODS
isc_spb_prp_shutdown_mode and
isc_spb_prp_online_mode
These arguments are used for shutting
down a database and bringing it back on-line, respectively. Each
carries
a single-byte parameter to set the new
shutdown mode, exactly in accord with the gfix -shut settings:
• isc_spb_prp_sm_normal
• isc_spb_prp_sm_multi
• isc_spb_prp_sm_single
• isc_spb_prp_sm_full
The shutdown request also requires the
type of shutdown to be specified, viz., one of
• isc_spb_prp_force_shutdown
• isc_spb_prp_attachments_shutdown
•
isc_spb_prp_transactions_shutdown
Each takes a 4-byte integer parameter,
specifying the timeout for the shutdown operation requested.
Note
The older-style parameters are also
supported and should be used to enter the default shutdown (currently
'multi') and online ('normal') modes.
Usage Examples
Following are a few examples of using
the new parameters with the fbsvmgr utility. For simplicity, it is
assumed
that login has already been
established. Each example, though broken to fit the page-width, is a
single line
command.
Shutdown database to single-user
maintenance mode:
fbsvcmgr service_mgr action_properties
dbname employee
prp_shutdown_mode prp_sm_single
prp_force_shutdown 0
Next, enable multi-user maintenance:
fbsvcmgr service_mgr action_properties
dbname employee
prp_online_mode prp_sm_multi
Now go into full shutdown mode,
disabling new attachments for the next 60 seconds:
fbsvcmgr service_mgr action_properties
dbname employee
prp_shutdown_mode prp_sm_full
prp_attachments_shutdown 60
Return to normal state:
20
Changes to the Firebird API and ODS
fbsvcmgr service_mgr action_properties
dbname employee
prp_online_mode prp_sm_normal
Tighter Control Over Header-level
Changes
Alex Peshkov
Several DPB parameters have been made
inaccessible to ordinary users, closing some dangerous loopholes. In
some cases, they are settings that
would alter the database header settings and potentially cause
corruptions if
not performed under administrator
control; in others, they initiate operations that are otherwise
restricted to the
SYSDBA. They are.
• isc_dpb_shutdown and
isc_dpb_online
• isc_dpb_gbak_attach,
isc_dpb_gfix_attach and isc_dpb_gstat_attach
• isc_dpb_verify
• isc_dpb_no_db_triggers
• isc_dpb_set_db_sql_dialect
• isc_dpb_sweep_interval
• isc_dpb_force_write
• isc_dpb_no_reserve
• isc_dpb_set_db_readonly
• isc_dpb_set_page_buffers (on
Superserver)
The parameter isc_dpb_set_page_buffers
can still be used by ordinary users on Classic and it will set
the buffer size temporarily for that
user and that session only. When used by the SYSDBA on either
Superserver
or Classic, it will change the buffer
count in the database header, i.e., make a permanent change to the
default
buffer size.
Important Note for Developers and Users
of Data Access Drivers and Tools
This change will affect any of the
listed DPB parameters that have been explicitly set, either by
including
them in the DPB implementation by
default property values or by enabling them in tools and applications
that access databases as ordinary
users. For example, a Delphi application that included 'RESERVE PAGE
SPACE=TRUE' and 'FORCED WRITES=TRUE' in
its database Params property, which caused no problems
when the application connected to
Firebird 1.x, 2.0.1. 2.0.3, 2.04 or 2.1.0/2.1.1, now rejects a
connection by a
non-SYSDBA user with ISC ERROR CODE
335544788, “Unable to perform operation. You must be either
SYSDBA or owner of the database.”
New Trace Services for Applications
Vlad Khorsun
Five new services relating to the
management of the new user trace sessions have been added to the
Services
Manager, each with its corresponding
Services API action function.
21
Changes to the Firebird API and ODS
isc_action_svc_trace_start
Starts a user trace session
Parameter(s)
isc_spb_trc_name : trace session name,
string, optional
isc_spb_trc_cfg : trace session
configuration, string, mandatory
The mandatory parameter is a string
encompassing the text for the desired configuration. A template file
named
fbtrace.confis provided in Firebird's
root directory as a guide to the contents of this string.
Note
1.
Unlike system audit sessions, a user
session does not read the configuration from a file. It will be the
responsibility of the application
developer to devise a mechanism for storing configurations locally at
the
client and retrieving them for run-time
use.
2.
Superfluous white space in the string
is fine: it will simply be ignored.
Output
Results of the trace session in text
format.
isc_action_svc_trace_stop
Stops a designated trace session
Parameter(s)
isc_spb_trc_id : trace session ID,
integer, mandatory
Output
A text message providing the result
(status) of the request:
• Trace session ID NNN stopped
• No permissions to stop other
user trace session
• Trace session ID NNN not found
isc_action_svc_trace_suspend
Suspends a designated trace session
Parameter(s)
isc_spb_trc_id : trace session ID,
integer, mandatory
22
Changes to the Firebird API and ODS
Output
A text message providing the result
(status) of the request:
• Trace session ID NNN paused
• No permissions to change other
user trace session
• Trace session ID NNN not found
isc_action_svc_trace_resume
Resumes a designated trace session that
has been suspended
Parameter(s)
isc_spb_trc_id : trace session ID,
integer, mandatory
Output
A text message providing the result
(status) of the request:
• Trace session ID NNN resumed
• No permissions to change other
user trace session
• Trace session ID NNN not found
isc_action_svc_trace_list
Lists existing trace sessions
No parameters
Output
A text message listing the trace
sessions and their states:
• Session ID: <number>
• name: <string>. Prints the
trace session name if it is not empty
• user: <string>. Prints the
user name of the user that created the trace session
• date: YYYY-MM-DD HH:NN:SS, start
date and time of the user session
• flags: <string>, a
comma-separated set comprising some or all of the following:
active | suspend
Run state of the session.
admin
Shows admin if an administrator user
created the session. Absent if an ordinary user created the session.
system
Shows system if the session was created
by the Firebird engine (system audit session). Absent if an ordinary
user created the session.
23
Changes to the Firebird API and ODS
audit | trace
Indicates the kind of session: audit
for an engine-created audit session or trace for a user trace
session.
log full
Conditional, appears if it is a user
trace session and the session log file is full.
Note
The output of each service can usually
be obtained using a regular isc_service_query call with either of the
isc_info_svc_line or
isc_info_svc_to_eof information items.
Other Services API Additions
Alex Peshkov
Other additions to the Services API
include:
Mapping for RDB$ADMIN Role in Services
API
Two tag items have been added to the
services parameter block (SPB) to to enable or disable the RDB$ADMIN
role for a privileged operating system
user when requesting access to the security database.
Note
This capability is implemented in the
gsec utility by way of the new -mapping switch. Refer to the notes in
the relevant section of the
Command-line Utilities chapter.
Tag Item isc_action_svc_set_mapping
Enables the RDB$ADMIN role for the
appointed OS user for a service request to access security2.fdb.
Tag Item isc_action_svc_drop_mapping
Disables the RDB$ADMIN role for the
appointed OS user for a service request to access security2.fdb.
Parameter isc_spb_sec_admin
The new parameter isc_spb_sec_admin, is
the SPB implementation of the new DDL syntax introduced to enable
SYSDBA or another sufficiently
privileged user to grant or revoke the RDB$ADMIN role in the security
database (security2.fdb) to or from an
ordinary Firebird user. An ordinary user needs this role to acquire
the
same privileges as SYSDBA to create,
alter or drop users in the security database.
isc_spb_sec_admin is of type spb_long
with a value of either 0 (meaning REVOKE ADMIN ROLE) or a nonzero
number (meaning GRANT ADMIN ROLE).
For more information, refer to the
topic CREATE/ALTER/DROP USER in the chapter Data Definition Language.
24
Changes to the Firebird API and ODS
Tag item isc_spb_bkp_no_triggers
This new SPB tag reflects the Services
API side of the -nodbtriggers switch introduced in the gbak utility
at V.2.1 to prevent database-level and
transaction-level triggers from firing during backup and restore. It
is intended for use as a member of the
isc_spb_options set of optional directives that includes items like
isc_spb_bkp_ignore_limbo, etc.
nBackup Support
Tracker reference: CORE-1758.
The nBackup utility performs two
logical groups of operations: locking or unlocking a database and
backing
it up or restoring it. While there is
no rationale for providing a service action for the lock/unlock
operations—
they can be requested remotely by way
of an SQL language request for ALTER DATABASE—a Services API
interface to the backup/restore
operations is easily justified.
Backup and restore must be run on the
host station and the only way to access them was by running nBackup.
The two new service actions now
enabling nBackup backup and restore to be requested through the
Services
API are:
• isc_action_svc_nbak -incremental
nbackup
• isc_action_svc_nrest
-incremental database restore
The parameter items are:
• isc_spb_nbk_level -backup level
(integer)
• isc_spb_nbk_file -backup file
name (string)
• isc_spb_nbk_no_triggers -option
to suppress database triggers
Usage Examples
Following are a few examples of using
the new parameters with the fbsvcmgr utility. For simplicity, it is
assumed
that login has already been
established. Each example, though broken to fit the page-width, is a
single line
command.
Create backup level 0:
fbsvcmgr service_mgr action_nbak dbname
employee
nbk_file e.nb0 nbk_level 0
Create backup level 1:
fbsvcmgr service_mgr action_nbak dbname
employee
nbk_file e.nb1 nbk_level 1
Restore database from those files:
fbsvcmgr service_mgr action_nrest
dbname e.fdb
nbk_file e.nb0 nbk_file e.nb1
25
Changes to the Firebird API and ODS
FIX_FSS_DATA and FIX_FSS_METADATA
Options Enabled in Services API
A. Peshkov
Tracker reference CORE-2439
The FIX_FSS_DATA and FIX_FSS_METADATA
functions that were implemented as gbak -restore switches
in Firebird 2.1 have been implemented
in the core engine and exposed as corresponding tag constants for the
isc_action_svc_restore structure in the
Services API. Thus, developers now have a path for writing
applications
to automate the migration of older
Firebird databases to the new on-disk structure.
The new SPB tags are
isc_spb_res_fix_fss_data and isc_spb_res_fix_fss_metadata.
26
Chapter 5
Reserved Words and Changes
Note
Asterisks (*) mark keywords that are
reserved, or otherwise recognised by Firebird's grammar as keywords,
but are not reserved words in the SQL
standard.
Clean-up of Reserved Words
A. Peshkov
Tracker reference CORE-2638
The number of Firebird-specific
reserved words has been reduced significantly, in order to mitigate
the pain of
keyword conflicts when converting other
databases to Firebird. Where possible, words that are not reserved by
the standard have been made
non-reserved in Firebird's grammar.
A small list remains of words that are
reserved in Firebird but not in the SQL standard. They are:
ADD * DB_KEY * GDSCODE * INDEX *
LONG * PLAN * POST_EVENT *
RETURNING_VALUES *
SQLCODE * VARIABLE * VIEW * WEEK *
WHILE
All other non-standard keywords
previously reserved are now available for any reasonable purpose.
Newly Reserved Words
SIMILAR
Keywords Added as Non-reserved
AUTONOMOUS * BIN_NOT * CALLER *
CHAR_TO_UUID * COMMON * DATA
FIRSTNAME * GRANTED LASTNAME *
MIDDLENAME * MAPPING * OS_NAME *
SOURCE * TWO_PHASE * UUID_TO_CHAR *
27
Chapter 6
Configuration Parameter
Additions and Changes
The following changes or additions to
firebird.confshould be noted:
AuditTraceConfigFile
V. Khorsun
This parameter points to the name and
location of the file that the Firebird engine is to read to determine
the list
of events required for the next system
audit trace. By default, the value of this parameter is empty,
indicating
that no system audit tracing is
configured.
Note
The template file file fbtrace.conf,
found in Firebird's root directory, contains the full list of
available
events, with format, rules and syntax
for composing an audit trace configuration file.
For more information, see the topic
System Audit Session in section [Trace and Audit Services] in the
chapter
about the new administrative features.
Parameters Affecting Filesystem Cache
Usage
There are now two parameters for
configuring how Firebird interacts with the filesystem cache.
FileSystemCacheSize
N. Samofatov
New in Firebird 2.5,
FileSystemCacheSize controls the maximum amount of RAM used by a
Windows file
system cache on 64-bit Windows XP or a
Microsoft Server 2003 host with Service Pack 1 or higher.
At the V.2.5 initial release, it has no
effect on POSIX host systems.
The setting for this parameter is an
integer expressing the percentage of the total physical RAM that is
available
to the OS. To be valid, settings must
be within the range 10 (per cent) to 95 (per cent), or explicitly set
to 0 to
enforce the host caching settings.
Numbers outside that range will assume the default, which is 30 (per
cent).
As with any firebird.confsetting,
changes will not take effect until the server process is restarted.
28
Configuration Parameter Additions and
Changes
Windows Security Privileges
The OS user needs the
SeIncreaseQuotaPrivilege in order to adjust the filesystem cache
settings. This right is
built in for users with Administrator
privileges and for service accounts and it is also granted to the
Firebird
service account explicitly by the
Windows installer.
Under other conditions, e.g., embedded,
or where the Firebird server is run as an application, or in a custom
service installation, the user may not
have that privilege. The process startup does not fail as a result of
this
misconfiguration: it will write a
warning to the firebird.log and start-up will simply proceed with the
host OS settings.
FileSystemCacheThreshold
V. Khorsun
This parameter was introduced in V.2.1
as MaxFileSystemCache. Because its name has been changed, its
description is repeated here to alert
upgraders.
FileSystemCacheThreshold sets a
threshold determining whether Firebird will allow the page cache to
be duplicated
to the filesystem cache or not. If this
parameter is set to any (integer) value greater than zero, its effect
depends on the current default size of
the page cache: if the default page cache (in pages) is less than the
value
of MaxFileSystemCache (in pages) then
filesystem caching is enabled, otherwise it is disabled.
Note
This applies both when the page cache
buffer size is set implicitly by the DefaultDBCachePages setting or
explicitly as a database header
attribute. It applies to all platforms.
Thus,
•
To disable filesystem caching always,
set FileSystemCacheThreshold to zero
•
To enable filesystem caching always,
set FileSystemCacheThreshold an integer value that is sufficiently
large
to exceed the size of the database page
cache. Remember that the effect of this value will be affected by
subsequent changes to the page cache
size.
Important
•
The default setting for
FileSystemCacheThreshold is 65536 pages, i.e. filesystem caching is
enabled.
•
Observe that, if the configured cache
size affecting a particular database is greater than the
FileSystemCacheThreshold
then the setting for
FileSystemCacheSize (see above) will have no effect on that database.
MaxFileSystemCache
MaxFileSystemCache, introduced in
Firebird 2.1, is no longer a valid parameter.
29
Configuration Parameter Additions and
Changes
Authentication
A. Peshkov
On Windows server platforms, since
V.2.1, Authentication has been used for configuring the server
authentication
mode if you need it to be other than
the default.
The mode settings for v.2.5 are the
same, viz.
•
trusted makes use of Windows “trusted
authentication”. Under the right conditions, this may be the
most
secure way to authenticate on Windows.
•
native sets the traditional Firebird
server authentication mode, requiring users to log in using a user
name
and password defined in the security
database.
•
mixed allows both.
Changes in V.2.5
•
Under v.2.5, although the modes are
unchanged, configuring 'mixed' or 'trusted' mode no longer confers
SYSDBA privileges on Windows domain
administrators automatically by default. Please read the notes in
the Administrative Features chapter
regarding the new RDB$ADMIN role in ODS 11.2 databases and auto-
mapping SYSDBA privileges to domain
administrators.
•
The default configuration has been
changed from mixed to native. To enable trusted user authentication
(whether mixed or trusted, it is now
necessary to configure this parameter specifically.
Tracker reference CORE-2376
MaxUserTraceLogSize
V. Khorsun
Stores the maximum total size of the
temporary files to be created by a user trace session using the new
Trace
functions in the Services API. The
default limit is 10 MB. Use this parameter to raise or lower the
maximum
total size of the temporary files
storing the output.
OldSetClauseSemantics
D. Yemanov
Before Firebird 2.5, the SET clause of
the UPDATE statement assigned columns in the user-defined order, with
the NEW column values being immediately
accessible to the subsequent assignments. This did not conform to
the SQL standard, which requires the
starting value of the column to persist during execution of the
statement.
Now, only the OLD column values are
accessible to any assignment in the SET clause.
The OldSetClauseSemantics enables you
to revert to the legacy behavior via the OldSetClauseSemantics, if
required. Values are 1 for the legacy
behaviour, 0 (the default) for the corrected behaviour.
30
Configuration Parameter Additions and
Changes
Warning
• Changing this parameter affects
all databases on your server.
• This parameter is provided as a
temporary solution to resolve backward compatibility issues. It will
be
deprecated in future Firebird versions.
RemoteAuxPort For Classic and
Superclassic
Dmitry Yemanov
Tracker entry: CORE-2263
Classic and SuperClassic servers can
now be configured to listen for events on a single, designated
RemoteAux-
Port port, as SuperServer has been able
to do since v.1.5.
This long-awaited improvement now
enables applications that connect to databases over the Internet
through a
firewall or a secure tunnel to use
events, regardless of the server model in use.
Use Hostname for RemoteBindAddress
Alex Peshkov
Tracker entry: CORE-2094
It is now possible to use the hostname
of the host where the Firebird server is running to configure Remote-
BindAddress, where previously, only an
IP address was allowed.
Important
RemoteBindAddress can be used to “pin”
user connections to a specific NIC card on the host server. Take
care that the hostname specified is not
associated concurrently with more than one IP address, anywhere! In
particular, check the etc/hostsfile on
all stations, including the host station itself.
RemoteFileOpenAbility
Nickolay Samofatov
Tracker entry: CORE-2263
Code from Red Soft was incorporated, to
make this extreme option available to Windows and allow a database
to be opened on a network share, in
line with the long-time ability to allow access to a database on a
NFS device
on POSIX.
It is offered in the interests of
maintaining feature consistency across platforms. There is no
associated architectural
change or any implication that its use
in practice is considered safer now than in the past. However, it
makes
it possible to shadow databases to
mapped locations and to connect to a database on an external
filesystem for a
specific, well-tested, safe purpose. An
example given was a database kept under lock-and-key on a USB device
that could be plugged in to a diskless
workstation for performing an occasional, isolated security task.
31
Warning
READ THE NOTES IN FIREBIRD.CONF BEFORE
YOU CONSIDER ACTIVATING THIS!
Chapter 7
Administrative Features
Certain improvements to Firebird's
administrative features will be welcomed by many.
New RDB$ADMIN System Role
Alex Peshkov
A new pre-defined system role RDB$ADMIN
has been added for transferring SYSDBA privileges to another
user. Any user, when granted the role
in a particular database, acquires SYSDBA-like rights when attaching
to
that database with the RDB$ADMIN role
specified.
To assign it, SYSDBA should log in to
that database and grant the role RDB$ADMIN to the user, in the same
way one would grant any other role to a
user. After the user has been granted the role, s/he must include it
in
the log-in in order to access the
“superuser” privileges in that database.
Important
If the user attaches with a user
database role passed in the DPB (connection parameters), it will not
be replaced
with RDB$ADMIN, i.e., he/she will not
get SYSDBA rights.
The following example transfers SYSDBA
privileges to users named User1 and Admins\ADMINS. The second
user in our example is typical for a
Windows system user with access enabled via trusted authentication:
GRANT RDB$ADMIN TO User1;
GRANT RDB$ADMIN TO "Admins\ADMINS";
Multiple Databases and Superusers
It should be understood that acquiring
the RDB$ADMIN role does not make a regular user into SYSDBA.
Rather, it gives that user the same
privileges as SYSDBA over the objects in the database in which the
role
is granted to that user.
•
If the same user needs Superuser
privileges in more than one database, the RDB$ADMIN role must be
explicitly granted for that user in
each database.
•
If more than one user is to have
Superuser privileges in a database then each user needs to be granted
the
RDB$ADMIN role.
•
One user that has acquired the
RDB$ADMIN role in the database can grant it to another user.
•
It is not necessary to specify WITH
ADMIN OPTION (for the privilege to grant this role to others) or WITH
GRANT OPTION (for the privilege to
grant permissions on objects to other users without being the owner
of those objects). The ADMIN and GRANT
options are implicit.
33
Administrative Features
System “Superusers”
On POSIX hosts, the root user always
had SYSDBA privileges, but the same was not possible for a domain
administrator on Windows until Firebird
2.1. In V.2.1, a configuration parameter, Authentication, was
introduced,
whereby a user logged in as a Windows
domain administrator could automatically gain server access
with SYSDBA privileges through trusted
user authentication. On POSIX, the mechanism has not changed but
on Windows, the introduction of the
RDB$ADMIN role has changed the way Windows administrators acquire
SYSDBA privileges.
Windows trusted user authentication is
no longer available by default!
By default, the Authentication
parameter in firebird.confis configured as native. It must be
explicitly
configured to either trusted or mixed
to enable trusted user authentication.
Global Admin Privileges for Windows
Administrators
For a trusted domain administrator to
get SYSDBA access privileges on a Firebird server that is configured
for
trusted user authentication, the domain
administrator must acquire the RDB$ADMIN role. The manual method
described above for ordinary users will
work, by granting RDB$ADMIN to each specific administrator, database
by database.
However, there is a way for the SYSDBA
to configure the server so that the RDB$ADMIN role will be mapped
to administrators automatically when
they log into any database, thus arriving at a situation parallel to
the association
of root-privileged users on POSIX
systems with the SYSDBA privileges. The new ALTER ROLE
statement achieves this (and only this)
purpose.
ALTER ROLE Statement
To configure a database to map the
RDB$ADMIN role to administrators automatically on a Windows server
that is configured to enable trusted
user authentication, the SYSDBA logs in to any database and issues
the
following statement:
ALTER ROLE RDB$ADMIN
SET AUTO ADMIN MAPPING;
To revert to the default setting,
preventing administrators from getting SYSDBA privileges
automatically, issue
this statement:
ALTER ROLE RDB$ADMIN
DROP AUTO ADMIN MAPPING;
Services API Tag Items
The same effects are supported in the
Services API by the provision of two tag items:
isc_action_svc_set_mapping to enable
the automatic mapping and isc_action_svc_drop_mapping to disable
it.
34
Administrative Features
These tags are supported in the
fbsvcmgr utility.
Escalating RDB$ADMIN Scope for User
Management
The new DDL command ALTER USER enables
an “ordinary” user (a regular Firebird user, a non-root
user
on POSIX or a trusted user on a Windows
system where trusted authentication is enabled) the ability to change
his or her password and/or personal
name elements, while logged in to any database. Superusers can also
use
the same command to create and drop
users. For more information about this new command, refer to the
topic
CREATE/ALTER/DROP USER in the chapter
Data Definition Language.
Because security2.fdb is created as (or
should be upgraded to) an ODS 11.2 database, it has the pre-defined
RDB
$ADMIN role, too. Since no user—not
even SYSDBA—can log into the security database, alternative
means
have been provided to enable the SYSDBA
or a Superuser to apply the RDB$ADMIN role in security2.fdb to
an ordinary user that needs the ability
to create or drop users. There are three ways, each having the
equivalent
effect:
1.
Use the optional parameter GRANT ADMIN
ROLE with a CREATE USER or ALTER USER statement.
Notes
Notice that GRANT ADMIN ROLE and REVOKE
ADMIN ROLE here are not GRANT/REVOKE statements
but 3-keyword parameters to the CREATE
USER and ALTER USER statements. There is no system
role named 'ADMIN'.
Any user that acquires the RDB$ADMIN
role in a database implicitly acquires the extended privileges
WITH ADMIN OPTION and WITH GRANT
OPTION.
Examples
To grant the RDB$ADMIN role to user
alex in the security database:
ALTER USER alex GRANT ADMIN ROLE;
To revoke the RDB$ADMIN role from user
alex in the security database:
ALTER USER alex REVOKE ADMIN ROLE;
To drop user alex and destroy his
privileges in all databases:
DROP USER alex;
2.
Use the gsec utility with the new
switch -admin. The switch takes one argument: YES to apply the RDB
$ADMIN role to the user, or NO to
revoke it. For more details, refer to the topic Granting the
RDB$ADMIN
Role to An Ordinary User in the gsec
section of the Utilities chapter.
3.
Use the new SPB parameter
isc_spb_sec_admin which implements the assignment of the RDB$ADMIN
role for ordinary users in
security2.fdb via a SPB connection. It is described in more detail in
the chapter
Changes to the Firebird API and ODS, in
the topic Parameter isc_spb_sec_admin.
35
Administrative Features
The fbsvmgr utility also supports the
use of this parameter.
Tip
Firebird 2.5 does not allow you to set
up more than one security database on a server. From V.3.0, it is
intended
to be possible to have separate
security databases for each database. For now, you can be connected
to any
database on the server (even
employee.fdb) to update its one-and-only security2.fdb.
In future, it will be essential to send
these requests from a database that is associated with the security
database
that is to be affected by them.
Trace and Audit Services
Vlad Khorsun
The new trace and audit facilities in
v.2.5 were initially developed from the TraceAPI contributed to us by
Nickolay Samofatov that he had
developed for the Red Soft Database, a commercial product based on
Firebird's
code.
Overview of Features
The new trace and audit facilities
enable various events performed inside the engine, such as statement
execution,
connections, disconnections, etc., to
be logged and collated for real-time analysis of the corresponding
performance characteristics.
A trace takes place in the context of a
trace session. Each trace session has its own configuration, state
and output.
The Firebird engine has a fixed list of
events it can trace. It can perform two different sort of traces: a
system audit
and a user trace. How the engine forms
the list of events for a session depends on which sort of trace is
requested.
The System Audit Session
A system audit session is started by
the engine itself. To determine which events the session is
“interested in”,
it reads the contents of a trace
configuration file as it goes to create the session.
A new parameter in firebird.conf,
AuditTraceConfigFile points to the name and location of the file.
There
can be at most one system audit trace
in progress. By default, the value of this parameter is empty,
indicating
that no system audit tracing is
configured.
A configuration file contains list of
traced events and points to the placement of the trace log(s) for
each event.
It is sufficiently flexible to allow
different sets of events for different databases to be logged to
separate log
files. The template file file
fbtrace.conf, found in Firebird's root directory, contains the full
list of available
events, with format, rules and syntax
for composing an audit trace configuration file.
36
Administrative Features
Note
Initially, regular expression database
names configured in fbtrace.conf were (wrongly) being matched
byte-by-byte. The matching algorithm
was improved to interpret strings in the configuration file according
to
the platform character set and, basing
the strings on UTF-8, to apply platform rules, e.g., treating file
names
as case-insensitive on Windows and
case-sensitive on POSIX.
(Tracker reference CORE-2404, A. dos
Santos Fernandes).
User Trace Sessions
A user trace session is managed by
user, using some new calls to the Services API. There are five new
service
functions for this purpose:
• start:
isc_action_svc_trace_start
• stop: isc_action_svc_trace_stop
• suspend:
isc_action_svc_trace_suspend
• resume:
isc_action_svc_trace_resume
• list all known trace sessions:
isc_action_svc_trace_list
The syntax for the Services API calls
are discussed in the topic New Trace Functions for Applications in
the
chapter entitled Changes to the
Firebird API and ODS.
Workings of a User Trace Session
When a user application starts a trace
session, it sets a session name (optional) and the session
configuration
(mandatory). The session configuration
is a text file conforming to the rules and syntax modelled in the
fbtrace.
conftemplate that is in Firebird's root
directory, apart from the lines relating to placement of the output.
Note
Such files obviously do not live on the
server. It will be the job of the application developer to design a
suitable
mechanism for storing and retrieving
texts for passing in the user trace request.
For example, the command-line fbsvcmgr
utility supports a saved-file parameter, trc_cfg.
The output of a user session is stored
in set of temporary files, each of 1 MB. Once a file has been
completely
read by the application, it is
automatically deleted. By default, the maximum total size of the
output is limited
to 10 MB. It can be changed to a
smaller or larger value using the MaxUserTraceLogSize in
firebird.conf.
Once the user trace session service has
been started by the application, the application has to read its
output,
using calls to isc_service_query(). The
service could be generating output faster than the application can
read
it. If the total size of the output
reaches the MaxUserTraceLogSize limit, the engine automatically
suspends the
trace session. Once the application has
finished reading a file (a 1 MB part of the output) that file is
deleted,
capacity is returned and the engine
resumes the trace session automatically.
At the point where the application
decides to stop its trace session, it simply requests a detach from
the service.
Alternatively, the application can use
the isc_action_svc_trace_* functions to suspend, resume or stop the
trace
session at will.
37
Administrative Features
Who Can Manage Trace Sessions?
Any user can initiate and manage a
trace session. An ordinary user can request a trace only on its own
connections
and cannot manage trace sessions
started by any other users. Administrators can manage any trace
session.
Abnormal Endings
If all Firebird processes are stopped,
no user trace sessions are preserved. What this means is that if a
Superserver
or Superclassic process is shut down,
any user trace sessions that were in progress, including any that
were
awaiting a resume condition, are fully
stopped and a resume cannot restart them.
Note
This situation doesn't apply to the
Classic server, of course, since each connection involves its own
dedicated
server instance. Thus, there is no such
thing as “shutting down” a Classic server instance. No
service instance
can outlive the connection that
instigated it.
User Trace Sample Configuration Texts
The following samples provide a
reference for composing configuration texts for user trace sessions.
a.
Trace prepare, free and execution of
all statements within connection 12345
<database mydatabase.fdb>
enabled true
connection_id 12345
log_statement_prepare true
log_statement_free true
log_statement_start true
log_statement_finish true
time_threshold 0
</database>
b.
Trace all connections of given user to
database mydatabase.fdb, logging executed INSERT, UPDATE
and DELETE statements and nested calls
to procedures and triggers, and show corresponding PLANs and
performance statistics.
<database mydatabase.fdb>
enabled true
include_filter %(INSERT|UPDATE|DELETE)%
log_statement_finish true
log_procedure_finish true
log_trigger_finish true
print_plan true
print_perf true
time_threshold 0
</database>
38
Administrative Features
Command-line Requests for User Trace
Services
A new command-line utility, named
fbtracemgr, has been added for working interactively with trace
services.
It has its own syntax of switches and
parameters, discussed in detail, with examples, in the Utilities
chapter.
As well, the general Services utility,
fbsvcmgr, can be used for submitting service requests from the
command
line, as exemplified in the following
examples.
a.
Start a user trace named “My
trace” using a configuration file named fbtrace.confand read
its output
on the screen:
fbsvcmgr service_mgr action_trace_start
trc_name "My trace" trc_cfg fbtrace.conf
To stop this trace session, press
Ctrl+C at the fbsvcmgr console prompt. (See also (e), below).
b.
List trace sessions:
fbsvcmgr service_mgr action_trace_list
c.
Suspend trace sesson with ID 1
fbsvcmgr service_mgr
action_trace_suspend trc_id 1
d.
Resume trace sesson with ID 1
fbsvcmgr service_mgr
action_trace_resume trc_id 1
e.
Stop trace sesson with ID 1
fbsvcmgr service_mgr action_trace_stop
trc_id 1
Tip
List sessions (see b.) in another
console, look for the ID of a session of interest and use it in the
current
console to stop the session.
Trace Scope on Windows
Tracker reference CORE-2588
On Windows, the trace tools exhibit
shared memory conflicts if multiple engine instances in different
Windows
sessions are allowed to run trace in
global namespace. Tracing scope has therefore been restricted to only
those
processes that are accessible from the
current Windows session.
39
Administrative Features
Use Cases
There are three general use cases:
1.
Constant audit of engine activity
This is served by system audit trace.
Administrator creates or edits the trace configuration file, sets its
name
via the AuditTraceConfigFile setting in
firebird.conf and restarts Firebird. Later, the administrator could
suspend, resume or stop this session
without needing to restart Firebird.
Important
To make audit configuration changes
known to the engine, Firebird must be restarted.
2.
On-demand interactive trace of some (or
all) activity in some (or all) databases
An application (which could be the
fbsvcmgr utility) starts user trace session, reads its output and
shows
traced events to the user in real time
on the screen. The user can suspend and resume the trace and,
finally,
stop it.
3.
Engine activity collection for a
significant period of time (a few hours or perhaps even a whole day)
for later analysis
An application starts a user trace
session, reading the trace output regularly and saving it to one or
more
files. The session must be stopped
manually, by the same application or by another one. If multiple
trace
sessions are running, a listing can be
requested in order to identify the session of interest.
Monitoring Improvements
Dmitry Yemanov
Firebird 2.5 sees the enhancement of
the “MON$” database monitoring features introduced in
V.2.1, with new
tables delivering data about context
variables and memory usage in ODS 11.2 and higher databases. Also, in
these databases, it becomes possible to
terminate a client connection from another connection through the MON
$ structures.
Extended Access for Ordinary Users
The original design allowed
non-privileged database users to see monitoring information
pertaining only to
their CURRENT_CONNECTION. Now they can
request information for any attachment that was authenticated
using the same user name.
Tracker reference CORE-2233.
40
Administrative Features
Notes
1.
For an application architecture that
entails a middleware tier logging in multiple times concurrently with
the same user name on behalf of
different end users, consideration should be given to the impact on
performance and privacy of exposing the
monitoring features to the end users.
2.
The same extension was implemented in
V.2.1.2.
New MON$ Metadata for ODS 11.2
Databases
Note
For the ODS 11.1 metadata please refer
to the V.2.1 documentation.
Character Set Change for MON$ Metadata
The system domain RDB$FILE_NAME2, that
is used to define those columns in the MON$ tables that pertain
to file specifications has been altered
from CHARACTER SET NONE to CHARACTER SET UNICODE_FSS.
The columns currently affected are
MON$DATABASE_NAME, MON$ATTACHMENT_NAME and MON
$REMOTE_PROCESS. This change makes the
affected data consistent with the updated v.2.5 handling of
filespec and other character parameter
items in the DPB.
(Tracker entry CORE-2551, A. dos Santos
Fernandes)
MON$MEMORY_USAGE (current memory usage)
-MON$STAT_ID (statistics ID)
-MON$STAT_GROUP (statistics group)
0: database
1: attachment
2: transaction
3: statement
4: call
-MON$MEMORY_USED (number of bytes
currently in use)
High-level memory allocations performed
by the engine from its pools.
Can be useful for tracing memory leaks
and for investigating unusual
memory consumption and the attachments,
procedures, etc. that might
be responsible for it.
-MON$MEMORY_ALLOCATED (number of bytes
currently allocated at the OS level)
Low-level memory allocations performed
by the Firebird memory manager.
These are bytes actually allocated by
the operating system, so it enables
the physical memory consumption to be
monitored.
41
Administrative Features
Note
Not all records have non-zero values.
On the whole, only MON$DATABASE and memory-bound objects
point to non-zero “allocated”
values. Small allocations are not allocated at this level, being
redirected to
the database memory pool instead.
-MON$MAX_MEMORY_USED (maximum number of
bytes used by this object)
-MON$MAX_MEMORY_ALLOCATED (maximum
number of bytes allocated from
the operating system by this object)
MON$CONTEXT_VARIABLES (known context
variables)
-MON$ATTACHMENT_ID (attachment ID)
Contains a valid ID only for
session-level context variables.
Transaction-level variables have this
field set to NULL.
-MON$TRANSACTION_ID (transaction ID)
Contains a valid ID only for
transaction-level context variables.
Session-level variables have this field
set to NULL.
-MON$VARIABLE_NAME (name of context
variable)
-MON$VARIABLE_VALUE (value of context
variable)
Memory Usage in MON$STATEMENTS and
MON$STATE
Memory usage statistics in
MON$STATEMENTS and MON$STATE represent actual CPU consumption.
Tracker reference: CORE-1583)
Usage Notes
Examples
“Top 10” statements ranked
according to their memory usage:
SELECT FIRST 10
STMT.MON$ATTACHMENT_ID,
STMT.MON$SQL_TEXT,
MEM.MON$MEMORY_USED
FROM MON$MEMORY_USAGE MEM
NATURAL JOIN MON$STATEMENTS STMT
ORDER BY MEM.MON$MEMORY_USED DESC
To enumerate all session-level context
variables for the current connection:
SELECT
VAR.MON$VARIABLE_NAME,
VAR.MON$VARIABLE_VALUE
42
Administrative Features
FROM MON$CONTEXT_VARIABLES VAR
WHERE VAR.MON$ATTACHMENT_ID =
CURRENT_CONNECTION
Terminating a Client
The MON$ structures are, by design,
read-only. Thus, user DML operations on them are prohibited. However,
a mechanism is built in to allow
deleting (only) of records in the MON$STATEMENTS and MON$ATTACHMENTS
tables. The effect of this mechanism is
to make it possible, respectively, to cancel running statements
and, for ODS 11.2 databases, to
terminate client sessions.
To cancel all current activity for a
specified connection:
DELETE FROM MON$STATEMENTS
WHERE MON$ATTACHMENT_ID = 32
To disconnect all clients except the
“Me” connection:
DELETE FROM MON$ATTACHMENTS
WHERE MON$ATTACHMENT_ID <>
CURRENT_CONNECTION
Note
1.
• A statement cancellation attempt
becomes a void operation (“no-op”) if the client has no
statements
currently running.
• Upon cancellation, the
execute/fetch API call returns the isc_cancelled error code.
• Subsequent operations are
allowed.
2.
• Any active transactions in the
connection being terminated will have their activities cancelled
immediately
and they are rolled back.
• Once terminated, the client
session receives the isc_att_shutdown error code.
• Subsequent attempts to use this
connection handle will cause network read/write errors.
43
Chapter 8
Security Hardening
Windows Platforms
No SYSDBA Auto-mapping (Windows)
In V.2.1, members of administrative
Windows groups were mapped to SYSDBA by default. From V.2.5 forward,
automatic SYSDBA mapping is controlled
on per-database basis using the new SQL command
ALTER ROLE RDB$ADMIN SET/DROP AUTO
ADMIN MAPPING
Note
For a full overview of the RDB$ADMIN
role, refer to the topic New RDB$ADMIN System Role in the
Administrative
Features chapter.
44
Chapter 9
Data Definition
Language (DDL)
V.2.5 brings a few significant
additions and enhancements to DDL.
Quick Links
• CREATE/ALTER/DROP USER
• Syntaxes for Altering Views
• SSP Extension for CREATE VIEW
• ALTER Mechanism for Computed
Columns
• GRANTED BY Extension for GRANT
and REVOKE
• ALTER ROLE
• REVOKE ALL
• Default COLLATION Attribute for
a Database
• ALTER CHARACTER SET
• The DIFFERENCES FILE Argument
for CREATE DATABASE
Although this release emphasises
architectural changes in the movement towards Firebird 3, a number of
improvements
and extensions have been implemented,
in many cases as a response to feature requests in the Tracker.
Visibility of Procedure Definition
Changes on Classic
Dmitry Yemanov
Tracker reference CORE-2052.
One such change addressed the problem
of the visibility of altered stored procedures to other connections
to the
Classic server. Now, such changes are
made visible to the entire server as soon as the modifying
transaction
has completed its commit.
CREATE/ALTER/DROP USER
Alex Peshkov
Tracker reference CORE-696.
In v.2.5, Firebird finally has syntax
to enable user accounts on the server to be managed by submitting SQL
statements when logged in to a regular
database.
The CREATE USER and ALTER USER
statements also include the parameters GRANT ADMIN ROLE and
REVOKE ADMIN ROLE to enable a user with
SYSDBA privileges user to grant the RDB$ADMIN role in the
45
Data Definition Language (DDL)
security database to an ordinary user.
For the usage description and a full overview of the RDB$ADMIN role,
refer to the topic New RDB$ADMIN System
Role in the Administrative Features chapter.
Syntax Patterns
The SYSDBA, or a user with SYSDBA
privileges in both the current database and the security database,
can
add a new user:
CREATE USER <username> {PASSWORD
'password'}
[FIRSTNAME 'firstname']
[MIDDLENAME 'middlename']
[LASTNAME 'lastname']
[GRANT ADMIN ROLE];
Note
The PASSWORD clause is required when
creating a new user. It should be the initial password for that new
user. The user can change it later,
using ALTER USER.
The SYSDBA, or a user with SYSDBA
privileges in both the current database and the security database,
can
change one or more of the password and
proper name attributes of an existing user. Non-privileged users can
use this statement to alter only their
own attributes.
ALTER USER <username>
[PASSWORD 'password']
[FIRSTNAME 'firstname']
[MIDDLENAME 'middlename']
[LASTNAME 'lastname']
[{GRANT | REVOKE} ADMIN ROLE];
Note
At least one of PASSWORD, FIRSTNAME,
MIDDLENAME or LASTNAME must be present.
ALTER USER does not allow the
<username> to be changed. If a different <username> is
required, the old
one should be deleted (dropped) and a
new one created.
The SYSDBA, or a user with SYSDBA
privileges in both the current database and the security database,
can
delete a user:
DROP USER <username>;
Restrictions
CREATE USER and DROP USER statements
and GRANT | REVOKE ADMIN ROLE are available only for
the SYSDBA, or a user that has acquired
the RDB$ADMIN role in both the current database and the security
database.
An ordinary user can ALTER his own
password and elements of his proper name. An attempt to modify
another
user will fail.
46
Data Definition Language (DDL)
Examples
SYSDBA or a user with equivalent
privileges in both the current database and the security database,
can do:
CREATE USER alex PASSWORD 'test';
ALTER USER alex FIRSTNAME 'Alex'
LASTNAME 'Peshkov';
ALTER USER alex PASSWORD 'IdQfA';
Syntaxes for Altering Views
Adriano dos Santos Fernandes
Previously, in order to alter a view
definition, it was necessary to save the view definition off-line
somewhere
and drop the view, before recreating it
with its changes. This made things very cumbersome, especially if
there
were dependencies. V.2.5 introduces
syntaxes for ALTER VIEW and CREATE OR ALTER VIEW.
Tracker references are CORE-770 and
CORE-1640.
ALTER VIEW
ALTER VIEW enables a view definition to
be altered without the need to recreate (drop and create) the old
version of the view and all of its
dependencies.
CREATE OR ALTER VIEW
With CREATE OR ALTER VIEW, the view
definition will be altered (as with ALTER VIEW) if it exists, or
created if it does not exist.
Syntax Pattern
create [ or alter ] | alter } view
<view_name>
[ ( <field list> ) ]
as <select statement>
Example
create table users (
id integer,
name varchar(20),
passwd varchar(20)
);
create view v_users as
select name from users;
alter view v_users (id, name) as
select id, name from users;
47
Data Definition Language (DDL)
Extensions for CREATE VIEW
The following extensions have been
added for CREATE VIEW.
Specify Stored Procedure in FROM Clause
Adriano dos Santos Fernandes
Tracker reference CORE-886.
A selectable stored procedure can now
be specified in the FROM clause of a view definition.
Example
create view a_view as
select * from
a_procedure(current_date);
Create UNION View Without Column List
Dmitry Yemanov
Tracker reference CORE-1402.
The column list can now be omitted from
CREATE VIEW when the set is defined by a UNION.
Example
recreate view V1 as
select d.rdb$relation_id from
rdb$database d
union all
select d.rdb$relation_id from
rdb$database d
recreate view V2 as
select d.rdb$relation_id as q from
rdb$database d
union all
select d.rdb$relation_id as w from
rdb$database d
Inferred Column Names
Adriano dos Santos Fernandes
Tracker reference CORE-2424.
CREATE VIEW now has the capability to
infer column names for views involving a GROUP BY clause or
a derived table.
Example
create view V as
select d.rdb$relation_id from
rdb$database d
48
Data Definition Language (DDL)
group by d.rdb$relation_id
create view V as
select a from (select 1 a from
rdb$database);
ALTER Mechanism for Computed Columns
Adriano dos Santos Fernandes
Tracker reference CORE-1454.
A column defined as COMPUTED BY
<expression> can now be altered using the ALTER TABLE...ALTER
COLUMN syntax. This feature can be used
only to change the <expression> element of the column
definition
to a different expression. It cannot
convert a computed column to non-computed or vice versa.
Syntax Pattern
alter table <table-name>
alter <computed-column-name>
[type <data-type>]
COMPUTED BY (<expression>);
Examples
create table test (
n integer,
dn computed by (n * 2)
);
commit;
alter table test
alter dn computed by (n + n);
Extensions for SQL Permissions
Alex Peshkov
The following extensions have been
implemented in the area of SQL permissions (privileges).
GRANTED BY Clause
A GRANTED BY or GRANTED AS clause can
now be optionally included in GRANT and REVOKE statements,
enabling the grantor to be a user other
than the CURRENT_USER (the default).
Syntax Pattern
grant <right> to <object>
[ { granted by | as } [ user ]
<username> ]
revoke <right> from <object>
[ { granted by | as } [ user ]
<username> ]
49
Data Definition Language (DDL)
Tip
GRANTED BY and GRANTED AS are
equivalent. GRANTED BY is the form recommended by the SQL
standard. We support GRANTED AS for
compatibility with some other servers (Informix, for example).
Example
Logged in as SYSDBA:
create role r1; --SYSDBA owns the role
/* next, SYSDBA grants the role to
user1
with the power to grant it to others */
grant r1 to user1 with admin option;
/* SYSDBA uses GRANTED BY to exercise
user1's ADMIN OPTION */
grant r1 to public granted by user1;
In isql, we look at the effects:
SQL>show grant;
/* Grant permissions for this database
*/
GRANT R1 TO PUBLIC GRANTED BY USER1
GRANT R1 TO USER1 WITH ADMIN OPTION
SQL>
ALTER ROLE
Tracker reference CORE-1660.
The new ALTER ROLE statement has a
specialised function to control the assignment of SYSDBA permissions
to Windows administrators during
trusted authentication. It has no other purpose currently.
Note
For the usage description of ALTER ROLE
and a full overview of the RDB$ADMIN role, refer to the topic
New RDB$ADMIN System Role in the
Administrative Features chapter.
REVOKE ALL
Tracker reference CORE-2113.
When a user is removed from the
security database or another authentication source, such as the
operating system
ACL, any associated cleanup of SQL
privileges in databases has to be performed manually. This extension
adds
the capability to revoke all privileges
in one stroke from a particular user or role.
Syntax Pattern
REVOKE ALL ON ALL FROM { <user list>
| <role list> }
50
Data Definition Language (DDL)
Example
Logged in as SYSDBA:
# gsec -del guest
# isql employee
fbs bin # ./isql employee
Database: employee
SQL> REVOKE ALL ON ALL FROM USER
guest;
SQL>
Default COLLATION Attribute for a
Database
Adriano dos Santos Fernandes
Tracker references CORE-1737 and
CORE-1803.
An ODS 11.2 or higher database can now
have a default COLLATION attribute associated with the default
character set, enabling all text
column, domain and variable definitions to be created with the same
collation
order unless a COLLATE clause for a
different collation is specified.
The COLLATION clause is optional. If it
is omitted, the default collation order for the character set is
used.
Tip
Note also that the default collation
order for a character set used in a database can now also be changed,
thanks
to the introduction of syntax for ALTER
CHARACTER SET.
Syntax Pattern
create database <file name>
[ page_size <page size> ]
[ length = <length> ]
[ user <user name> ]
[ password <user password> ]
[ set names <charset name> ]
[ default character set <charset
name>
[ [ collation <collation name> ]
]
[ difference file <file name> ]
Note
The parameter DIFFERENCE FILE is not a
new one for CREATE DATABASE. It was quietly introduced
in association with the nBackup utility
in V.2.0 and has been lurking undocumented for three years. For more
information, see Evolution of CREATE
DATABASE at the end of this chapter.
Example
create database 'test.fdb'
default character set win1252
51
Data Definition Language (DDL)
collation win_ptbr;
ALTER CHARACTER SET Command
Adriano dos Santos Fernandes
Tracker reference CORE-1803.
New syntax introduced in this version,
enabling the default collation for a character set to be set for a
database.
The default collation is used when
table columns are created with a given character set (explicitly,
through a
CHARACTER SET clause in the column or
domain definition, or implicitly, through the default character set
attribute of the database) and no
COLLATION clause is specified.
Note
String constants also use the default
collation of the connection character set.
The character set and collation of
existing columns are not affected by ALTER CHARACTER SET changes.
Syntax Pattern
ALTER CHARACTER SET <charset_name>
SET DEFAULT COLLATION <collation_name>
Example
create database 'people.fdb'
default character set win1252;
alter character set win1252
set default collation win_ptbr;
create table person (
id integer,
name varchar(50) /* will use the
database default
character set and the win1252
default collation */
);
insert into person
values (1, 'adriano');
insert into person
values (2, 'ADRIANO');
/* will retrieve both records
because win_ptbr is case insensitive */
select * from person where name like
'A%';
Tip
Another improvement allows the current
value of RDB$DEFAULT_COLLATE_NAME in the system table
RDB$CHARACTER_SETS to survive the
backup/restore cycle.
52
Data Definition Language (DDL)
Evolution of CREATE DATABASE
DDL support for the database header
attributes introduced to register and change the nBackup states has
been
evolving since Firebird 2.0. Users of
nBackup will be familiar with the ALTER DATABASE statements to
begin and end the storage of the
“delta” data, in a file apart from the main database,
during a full nBackup.
Naming the Delta File for nBackup
ALTER DATABASE also has another
argument that allows you to set the name that will be used for the
file
that stores the delta data. To quote
from Paul Vinkenoog's excellent manual for nBackup:
By default, the delta file lives in the
same directory as the database itself. It also has the same name as
the
database file, but with .delta
appended. There is usually no reason to change this, but it can be
done if need be
—though not via nbackup itself.
Make a connection to the database with
any client that allows you to enter your own SQL statements and give
the command:
alter database
add difference file 'path-and-filename'
The custom delta file specification is
persistent in the database; it is stored in the system table
RDB$FILES.
To revert to the default behaviour,
issue the following statement:
alter database
drop difference file
Those who are still curious may study
the details in the V.2.0 release notes or in the nBackup manual.
The DIFFERENCES FILE Argument for
CREATE DATABASE
C. Valderrama
In Firebird 2.0, syntax for prescribing
a custom name for the delta file appeared as an extra, optional
argument
for CREATE DATABASE. You can observe
its placement in the syntax pattern given above for the topic
Default COLLATION Attribute for a
Database. As with ALTER DATABASE, the keyword for the argument
is DIFFERENCE FILE and the argument is
a valid file specification. It allows you to specify a custom name
for the delta file that will be created
whenever ALTER DATABASE BEGIN BACKUP is called, or when the
equivalent nBackup shell command is
invoked.
Examples of Usage
]..\bin> isql -user sysdba -pass
masterke
Use CONNECT or CREATE DATABASE to
specify a database
SQL> create database 'ticks'
difference file 'jaguar';
SQL> shell dir jaguar;
Volume in drive F is Firebird
53
Data Definition Language (DDL)
Volume Serial Number is BCD9-4211
Directory of ..\bin
File Not Found
This is correct, we only defined the
file name. Now it will be used:
SQL> alter database begin backup;
SQL> shell dir jaguar;
Volume in drive F is Firebird
Volume Serial Number is BCD9-4211
Directory of ..\bin
10-11-2009 00:59 8.192 jaguar
1 File(s) 8.192 bytes
0 Dir(s) 16.617.979.904 bytes free
SQL> alter database end backup;
SQL> shell dir jaguar;
Volume in drive F is Firebird
Volume Serial Number is BCD9-4211
Directory of ..\bin
SQL> drop database;
SQL> .Z
Since the argument is a file name, it
goes inside single quotes. Double-quotes are not valid: the statement
will
fail and return a confusing error
message.
]..\bin> isql -user sysdba -pass
masterke
Use CONNECT or CREATE DATABASE to
specify a database
SQL> create database 'ticks'
difference file 'jaguar';
SQL> alter database add difference
file 'leopard';
Statement failed, SQLCODE = -607
unsuccessful metadata update
-Difference file is already defined
The message is correct. Even though the
delta was deleted by the ALTER DATABASE END BACKUP call,
the name of the difference file is
stored persistently and only one may exist.
SQL> alter database drop difference
file;
SQL> alter database begin backup;
Statement failed, SQLCODE = -607
unsuccessful metadata update
-STORE RDB$FILES failed
-message length error (encountered 278,
expected 276)
It is not a user friendly message but
it means we have no difference file. Perhaps curiously, the engine
does not
rescue the situation and create the
delta using the default mechanism.
54
Data Definition Language (DDL)
SQL> alter database add difference
file 'leopard';
SQL> alter database begin backup;
SQL> alter database drop difference
file;
Statement failed, SQLCODE = -607
unsuccessful metadata update
-Cannot change difference file name
while database is in backup mode
This is correct validation.
SQL> alter database end backup;
SQL> drop database;
SQL> .Z
55
Chapter 10
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 2.5.
Quick Links
• RegEx Search Support using
SIMILAR TO
• Hex Literal Support
• New UUID Conversion Functions
• Extension to LIST() Function
• SOME_COL = ? OR ? IS NULL
Predication
• Optimizer Improvements
RegEx Search Support using SIMILAR TO
Adriano dos Santos Fernandes
Tracker reference CORE-769.
A new SIMILAR TO predicate is
introduced to support regular expressions. The predicate's function
is to verify
whether a given SQL-standard regular
expression matches a string argument. It is valid in any context that
accepts Boolean expressions, such as
WHERE clauses, CHECK constraints and PSQL IF() tests.
Syntax Patterns
<similar predicate> ::=
<value> [ NOT ] SIMILAR TO
<similar pattern> [ ESCAPE <escape character> ]
<similar pattern> ::= <character
value expression: regular expression>
<regular expression> ::=
<regular term>
| <regular expression> <vertical
bar> <regular term>
<regular term> ::=
<regular factor>
| <regular term> <regular
factor>
<regular factor> ::=
<regular primary>
| <regular primary> <asterisk>
| <regular primary> <plus
sign>
| <regular primary> <question
mark>
56
Data Manipulation Language (DML)
| <regular primary> <repeat
factor>
<repeat factor> ::=
<left brace> <low value> [
<upper limit> ] <right brace>
<upper limit> ::= <comma> [
<high value> ]
<low value> ::= <unsigned
integer>
<high value> ::= <unsigned
integer>
<regular primary> ::=
<character specifier>
| <percent>
| <regular character set>
| <left paren> <regular
expression> <right paren>
<character specifier> ::=
<non-escaped character>
| <escaped character>
<regular character set> ::=
<underscore>
| <left bracket> <character
enumeration>... <right bracket>
| <left bracket> <circumflex>
<character enumeration>... <right bracket>
| <left bracket> <character
enumeration include>... <circumflex> <character
enumeration exclude>...
<right bracket>
<character enumeration include>
::= <character enumeration>
<character enumeration exclude>
::= <character enumeration>
<character enumeration> ::=
<character specifier>
| <character specifier> <minus
sign> <character specifier>
| <left bracket> <colon>
<character class identifier> <colon> <right bracket>
<character specifier> ::=
<non-escaped character>
| <escaped character>
<character class identifier> ::=
ALPHA
| UPPER
| LOWER
| DIGIT
| SPACE
| WHITESPACE
| ALNUM
Note
1.
<non-escaped character> is any
character except <left bracket>, <right bracket>, <left
paren>, <right
paren>, <vertical bar>,
<circumflex>, <minus sign>, <plus sign>,
<asterisk>, <underscore>, <percent>,
<question mark>, <left brace>
and <escape character>.
2.
<escaped character> is the
<escape character> succeeded by one of <left bracket>,
<right bracket>, <left
paren>, <right paren>,
<vertical bar>, <circumflex>, <minus sign>, <plus
sign>, <asterisk>, <underscore>,
<percent>, <question mark>,
<left brace> or <escape character>.
57
Data Manipulation Language (DML)
Table 10.1. Character class identifiers
Identifier Description Note
ALPHA All characters that are simple
latin letters
(a-z, A-Z)
Includes latin letters with accents
when
using accent-insensitive collation
UPPER All characters that are simple
latin uppercase
letters (A-Z)
Includes lowercase latters when using
case-insensitive collation
LOWER All characters that are simple
latin lowercase
letters (a-z)
Includes uppercase latters when using
case-insensitive collation
DIGIT All characters that are numeric
digits
(0-9)
SPACE All characters that are the space
character
(ASCII 32)
WHITESPACE All characters that are
whitespaces (vertical
tab (9), newline (10), horizontal tab
(11), carriage return (13), formfeed
(12),
space (32))
ALNUM All characters that are simple
latin letters
(ALPHA) or numeric digits (DIGIT)
Usage Guide
Return true for a string that matches
<regular expression> or <regular term>:
<regular expression> <vertical
bar> <regular term>
'ab' SIMILAR TO 'ab|cd|efg' --true
'efg' SIMILAR TO 'ab|cd|efg' --true
'a' SIMILAR TO 'ab|cd|efg' --false
Match zero or more occurrences of
<regular primary>: <regular primary> <asterisk>
'' SIMILAR TO 'a*' --true
'a' SIMILAR TO 'a*' --true
'aaa' SIMILAR TO 'a*' --true
Match one or more occurrences of
<regular primary>: <regular primary> <plus sign>
'' SIMILAR TO 'a+' --false
'a' SIMILAR TO 'a+' --true
'aaa' SIMILAR TO 'a+' --true
Match zero or one occurrence of
<regular primary>: <regular primary> <question mark>
58
Data Manipulation Language (DML)
'' SIMILAR TO 'a?' --true
'a' SIMILAR TO 'a?' --true
'aaa' SIMILAR TO 'a?' --false
Match exact <low value>
occurrences of <regular primary>: <regular primary> <left
brace> <low value> <right
brace>
'' SIMILAR TO 'a{2}' --false
'a' SIMILAR TO 'a{2}' --false
'aa' SIMILAR TO 'a{2}' --true
'aaa' SIMILAR TO 'a{2}' --false
Match <low value> or more
occurrences of <regular primary>: <regular primary> <left
brace> <low value>
<comma> <right brace>:
'' SIMILAR TO 'a{2,}' --false
'a' SIMILAR TO 'a{2,}' --false
'aa' SIMILAR TO 'a{2,}' --true
'aaa' SIMILAR TO 'a{2,}' --true
Match <low value> to <high
value> occurrences of <regular primary> <regular primary>
<left brace> <low
value> <comma> <high value>
<right brace>:
'' SIMILAR TO 'a{2,4}' --false
'a' SIMILAR TO 'a{2,4}' --false
'aa' SIMILAR TO 'a{2,4}' --true
'aaa' SIMILAR TO 'a{2,4}' --true
'aaaa' SIMILAR TO 'a{2,4}' --true
'aaaaa' SIMILAR TO 'a{2,4}' --false
Match any (non-empty) character:
<underscore>
'' SIMILAR TO '_' --false
'a' SIMILAR TO '_' --true
'1' SIMILAR TO '_' --true
'a1' SIMILAR TO '_' --false
Match a string of any length (including
empty strings): <percent>
'' SIMILAR TO '%' --true
'az' SIMILAR TO 'a%z' --true
'a123z' SIMILAR TO 'a%z' --true
'azx' SIMILAR TO 'a%z' --false
Group a complete <regular
expression> to use as one single <regular primary> as a
sub-expression: <left paren>
<regular expression> <right
paren>
'ab' SIMILAR TO '(ab){2}' --false
59
Data Manipulation Language (DML)
'aabb' SIMILAR TO '(ab){2}' --false
'abab' SIMILAR TO '(ab){2}' --true
Match a character identical to one of
<character enumeration>: <left bracket> <character
enumeration>... <right
bracket>
'b' SIMILAR TO '[abc]' --true
'd' SIMILAR TO '[abc]' --false
'9' SIMILAR TO '[0-9]' --true
'9' SIMILAR TO '[0-8]' --false
Match a character not identical to one
of <character enumeration>: <left bracket> <circumflex>
<character
enumeration>... <right bracket>
'b' SIMILAR TO '[^abc]' --false
'd' SIMILAR TO '[^abc]' --true
Match a character identical to one of
<character enumeration include> but not identical to one of
<character
enumeration exclude>: <left
bracket> <character enumeration include>... <circumflex>
<character enumeration
exclude>...
'3' SIMILAR TO '[[:DIGIT:]^3]' --false
'4' SIMILAR TO '[[:DIGIT:]^3]' --true
Match a character identical to one
character included in <character class identifier>. Refer to
the table of Character
Class Identifiers, above. May be used
with <circumflex> to invert the logic (see above): <left
bracket>
<colon> <character class
identifier> <colon> <right bracket>
'4' SIMILAR TO '[[:DIGIT:]]' --true
'a' SIMILAR TO '[[:DIGIT:]]' --false
'4' SIMILAR TO '[^[:DIGIT:]]' --false
'a' SIMILAR TO '[^[:DIGIT:]]' --true
Examples
create table department (
number numeric(3) not null,
name varchar(25) not null,
phone varchar(14)
check (phone similar to '\([0-9]{3}\)
[0-9]{3}\-[0-9]{4}' escape '\')
);
insert into department
values ('000', 'Corporate
Headquarters', '(408) 555-1234');
insert into department
values ('100', 'Sales and Marketing',
'(415) 555-1234');
insert into department
values ('140', 'Field Office: Canada',
'(416) 677-1000');
insert into department
values ('600', 'Engineering', '(408)
555-123'); --check constraint violation
60
Data Manipulation Language (DML)
select * from department
where phone not similar to
'\([0-9]{3}\) 555\-%' escape '\';
Hex Literal Support
Bill Oliver
Adriano dos Santos Fernandes
Tracker reference CORE-1760.
Support for hexadecimal numeric and
binary string literals has been introduced.
Syntax Patterns
<numeric hex literal> ::=
{ 0x | 0X } <hexit> [ <hexit>...
]
<binary string literal> ::=
{ x | X } <quote> [ { <hexit>
<hexit> }... ] <quote>
<digit> ::=
0|1|2|3|4|5|6|7|8|9
<hexit> ::=
<digit> | A | B | C | D | E | F |
a | b | c | d | e | f
Numeric Hex Literals
•
The number of <hexit> in the
string cannot exceed 16.
•
If the number of <hexit> is
greater than eight, the constant data type is a signed BIGINT. If it
is eight or less,
the data type is a signed INTEGER.
Tip
That means 0xF0000000 is -268435456 and
0x0F0000000 is 4026531840.
Binary String Literals
The resulting string is defined as a
CHAR(n/2) CHARACTER SET OCTETS, where n is the number of <hexit>.
Examples
select 0x10, cast('0x0F0000000' as
bigint)
from rdb$database;
select x'deadbeef'
from rdb$database;
61
Data Manipulation Language (DML)
New UUID Conversion Functions
Adriano dos Santos Fernandes
Tracker references CORE-1656 and
CORE-1682.
Two new built-in functions,
UUID_TO_CHAR and CHAR_TO_UUID, enable conversion between a UUID in
the form of a CHAR(16) OCTETS string
and the RFC4122-compliant form.
CHAR_TO_UUID()
The function CHAR_TO_UUID() converts
the CHAR(32) ASCII representation of a UUID (XXXXXXXXXXXX-
XXXX-XXXX-XXXXXXXXXXXX) to the CHAR(16)
OCTETS representation, optimized for storage.
Syntax Model
CHAR_TO_UUID( <string> )
Example
select
char_to_uuid('93519227-8D50-4E47-81AA-8F6678C096A1')
from rdb$database;
UUID_TO_CHAR()
The function UUID_TO_CHAR() converts a
CHAR(16) OCTETS UUID (as returned by the
GEN_UUID() function) to the CHAR(32)
ASCII representation (XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXXXXXX).
Syntax Model
UUID_TO_CHAR( <string> )
Example
select uuid_to_char(gen_uuid())
from rdb$database;
SOME_COL = ? OR ? IS NULL Predication
Adriano dos Santos Fernandes
Tracker reference CORE-2298
By popular request, particularly from
Delphi programmers, support has been implemented for a predication
that
is able to “OR” test both
the equivalence between a column and a parameter and whether the
value passed to the
62
Data Manipulation Language (DML)
parameter is NULL. This construct is
often desired as a way to avoid the need to prepare one query to
request
a filtered result set and another for
the same query without the filter.
Users of Delphi and other programming
interfaces that apply client-side object names to parameters wanted
the
ability for the DSQL engine to
recognise a usage like the following:
WHERE col1 = :param1 OR :param1 IS NULL
At the API level, the language
interface translates the query to
WHERE col1 = ? OR ? IS NULL
That presented two problems:
1.
While the programmer treated the
parameter :param1 as though it were a single variable with two
references,
the API could not: it is presented with
two parameters
2.
The second parameter is of an unknown
data type and the program has no way to assign to it
What was needed to solve this problem
was to introduce a new data type to handle the “? is NULL”
condition
and teach Firebird to do the right
thing when it received such a request.
The implementation works like this. To
resolve the first problem, the request must supply two parameters
(for
our Delphi example):
WHERE col1 = :param1 OR :param2 IS NULL
•
If “param1” is not NULL,
the language interface is required to assign the correct value for
the first parameter,
set the XSQLVAR.sqlind to NOT NULL and
leave XSQLVAR.sqldata NULL.
•
If “param2” is NULL, the
language interface is required to set the XSQLVAR.sqlind of both
parameters to
NULL and leave the XSQLVAR.sqldata
NULL.
In other words, for the parameter ( ? )
in ? IS NULL
:
•
XSQLVAR.sqlind should be set in
accordance with NULL/NON-NULL state of the parameter. This is the
type of parameter that is described by
the new constant SQL_NULL.
•
The XSQLVAR.sqldata of a SQL_NULL type
of parameter should always be passed by the client application
as a NULL pointer and should never be
accessed.
NULL Specified in the Output Set
When NULL is specified as an output
constant (select NULL from ...), it continues to be described as
CHAR(1),
rather than by SQL_NULL. That may
change in a future version.
Extension to LIST() Function
Adriano dos Santos Fernandes
Tracker reference CORE-1453
63
Data Manipulation Language (DML)
A string expression is now allowed as
the delimiter argument of the LIST() function.
Example
SELECT
DISCUSSION_ID,
LIST(COMMMENT, ASCII_CHAR(13))
FROM COMMENTS
GROUP BY DISCUSSION_ID;
Optimizer Improvements
Changes in optimizer logic that address
recognised problems include:
CROSS JOIN Logic (D. Yemanov)
When a CROSS JOIN involved an empty
table, the optimizer had no special logic to detect that the query
was futile and return the empty set
immediately. That shortcut logic has now been implemented.
Tracker reference CORE-2200.
Note
The same change was implemented in
V.2.1.2.
Derived Tables (A. dos Santos
Fernandes)
The limit on the number of contexts
available when using derived tables has been raised.
Tracker reference CORE-2029.
Timing of DEFAULT Evaluation (A. dos
Santos Fernandes)
Under rare conditions, the early
evaluation of a DEFAULT value or expression defined for a column
might
give rise to a confused situation
regarding the evaluation of an input value supplied for that column.
The
possibility was addressed by deferring
the evaluation of DEFAULT and not actually performing the evaluation
at all unless it was actually
necessary.
Tracker reference CORE-1842.
Index Use for NOT IN Searches (A. dos
Santos Fernandes)
Better performance has been achieved
for the NOT IN predicate by enabling the use of an index.
Tracker reference CORE-1137.
Undo Log Memory Consumption (D.
Yemanov)
Excessive memory consumption by the
Undo log after a lengthy series of updates in a single transaction
has been avoided.
Tracker reference CORE-1477.
Other Improvements
Other changes to smooth out the little
annoyances include:
64
Data Manipulation Language (DML)
FREE_IT Error Detection (A. dos Santos
Fernandes)
Previously, a UDF declared with FREE_IT
would crash if the pointer returned had not been allocated by
the ib_util_malloc() function. Now,
such a condition is detected, an exception is thrown and the pointer
remains in its allocated state.
Tracker reference CORE-1937.
“Expression evaluation not
supported” message improved (C. Valderrama)
A number of secondary GDS codes were
introduced to provide more details about an operation that fails
with an “Expression evaluation
not supported” exception, for example:
'Argument for @1 in dialect 1 must be
string or numeric'
'Strings cannot be added to or
subtracted from DATE or TIME types'
'Invalid data type for subtraction
involving DATE, TIME or TIMESTAMP types'
etc.
These detailed messages follow the GDS
code for the isc_expression_eval_err (expression evaluation not
supported) error in the status vector.
Tracker reference CORE-1799.
65
Chapter 11
Procedural SQL (PSQL)
Several significant changes appear in
Firebird's procedural language (PSQL), the language set for triggers,
stored
procedures and dynamic executable
blocks, especially with regard to new extensions to the capabilities
of EXECUTE
STATEMENT. This release also heralds
the arrival of the “autonomous transaction”.
Quick Links
•
Autonomous Transactions
•
Borrow Database Column Type for a PSQL
Variable
•
New Extensions to EXECUTE STATEMENT
-Context Issues
•
Authentication
•
Transaction Behaviour
• Inherited Access Privileges
-External Queries from PSQL
-EXECUTE STATEMENT with Dynamic
Parameters
-Examples Using EXECUTE STATEMENT
•
Other PSQL Improvements
-Subqueries as PSQL Expressions
Autonomous Transactions
Adriano dos Santos Fernandes
Tracker reference CORE-1409.
This new implementation allows a piece
of code to run in an autonomous transaction within a PSQL module.
It can be handy for a situation where
you need to raise an exception but do not want the database changes
to
be rolled back.
The new transaction is initiated with
the same isolation level as the one from which it is launched. Any
exception
raised in a block within the autonomous
transaction will cause changes to be rolled back. If the block runs
through until its end, the transaction
is committed.
Warning
Because the autonomous transaction is
independent from the one from which is launched, you need to use this
feature with caution to avoid
deadlocks.
Syntax Pattern
IN AUTONOMOUS TRANSACTION
DO
<simple statement | compound
statement>
66
Procedural SQL (PSQL)
Example of Use
create table log (
logdate timestamp,
msg varchar(60)
);
create exception e_conn 'Connection
rejected';
set term !;
create trigger t_conn on connect
as
begin
if (current_user = 'BAD_USER') then
begin
in autonomous transaction
do
begin
insert into log (logdate, msg) values
(current_timestamp, 'Connection rejected');
end
exception e_conn;
end
end!
set term ;!
Borrow Database Column Type for a PSQL
Variable
Adriano dos Santos Fernandes
Tracker reference CORE-1356.
This feature extends the implementation
in v.2 whereby domains became available as “data types”
for declaring
variables in PSQL. Now it is possible
to borrow the data type of a column definition from a table or view
for
this purpose.
Syntax Pattern
data_type ::=
<builtin_data_type>
| <domain_name>
| TYPE OF <domain_name>
| TYPE OF COLUMN <table or
view>.<column>
Note
TYPE OF COLUMN gets only the type of
the column. Any constraints or default values defined for the column
are ignored.
Examples
67
Procedural SQL (PSQL)
CREATE TABLE PERSON (
ID INTEGER,
NAME VARCHAR(40)
);
CREATE PROCEDURE SP_INS_PERSON (
ID TYPE OF COLUMN PERSON.ID,
NAME TYPE OF COLUMN PERSON.NAME
)
AS
DECLARE VARIABLE NEW_ID TYPE OF COLUMN
PERSON.ID;
BEGIN
INSERT INTO PERSON (ID, NAME)
VALUES (:ID, :NAME)
RETURNING ID INTO :NEW_ID;
END
New Extensions to EXECUTE STATEMENT
Unusually for our release notes, we
begin this chapter with the full, newly extended syntax for the
EXECUTE
STATEMENT statement in PSQL and move on
afterwards to explain the various new features and their usage.
[FOR] EXECUTE STATEMENT <query_text>
[(<input_parameters>)]
[ON EXTERNAL [DATA SOURCE]
<connection_string>]
[WITH {AUTONOMOUS | COMMON}
TRANSACTION]
[AS USER <user_name>]
[PASSWORD <password>]
[ROLE <role_name>]
[WITH CALLER PRIVILEGES]
[INTO <variables>]
Note
The order of the optional clauses is
not fixed so, for example, a statement based on the following model
would
be just as valid:
[ON EXTERNAL [DATA SOURCE]
<connection_string>]
[WITH {AUTONOMOUS | COMMON}
TRANSACTION]
[AS USER <user_name>]
[PASSWORD <password>]
[ROLE <role_name>]
[WITH CALLER PRIVILEGES]
Clauses cannot be duplicated.
Context Issues
If there is no ON EXTERNAL DATA SOURCE
clause present, EXECUTE STATEMENT is normally executed
within the CURRENT_CONNECTION context.
This will be the case if the AS USER clause is omitted, or it is
present with its <user_name>
argument equal to CURRENT_USER.
68
Procedural SQL (PSQL)
However, if <user_name> is not
equal to CURRENT_USER, then the statement is executed in a separate
connection,
established without Y-Valve and remote
layers, inside the same engine instance.
Note
In the absence of an AS USER
<user_name> clause, CURRENT_USER is the default.
Authentication
Where server authentication is needed
for a connection that is different to CURRENT_CONNECTION, e.g., for
executing an EXECUTE STATEMENT command
on an external datasource, the AS USER and PASSWORD
clauses are required. However, under
some conditions, the PASSWORD may be omitted and the effects will
be as follows:
1.
On Windows, for the CURRENT_CONNECTION
(i.e., no external data source), trusted authentication
will be performed if it is active and
the AS USER parameter is missing, null or equal to CURRENT_USER.
2.
If the external data source parameter
is present and its <connection_string> refers to the same
database as
the CURRENT_CONNECTION, the effective
user account will be that of the CURRENT_USER.
3.
If the external data source parameter
is present and its <connection_string> refers to a different
database
than the one CURRENT_CONNECTION is
attached to, the effective user account will be the operating
system account under which the Firebird
process is currently running.
In any other case where the PASSWORD
clause is missing, only isc_dpb_user_name will be presented in the
DPB (attachment parameters) and native
authentication will be attempted.
Transaction Behaviour
The new syntax has an optional clause
for setting the appropriate transaction behaviour: WITH AUTONOMOUS
TRANSACTION and WITH COMMON
TRANSACTION. WITH COMMON TRANSACTION
is the default and does not need to be
specified. Transaction lifetimes are bound to the
lifetime of CURRENT_TRANSACTION and are
committed or rolled back in accordance with the
CURRENT_TRANSACTION.
The behaviour for WITH COMMON
TRANSACTION is as follows:
a.
Causes any transaction in an external
data source to be started with the same parameters as
CURRENT_TRANSACTION; otherwise
b.
Executes the statement inside the
CURRENT_TRANSACTION; or
c.
May use another transaction that is
started internally in CURRENT_CONNECTION.
The WITH AUTONOMOUS TRANSACTION setting
starts a new transaction with the same parameters as
CURRENT_TRANSACTION. That transaction
will be committed if the statement is executed without exceptions
or rolled back if the statement
encounters an error.
Inherited Access Privileges
Vladyslav Khorsun
Tracker reference CORE-1928.
69
Procedural SQL (PSQL)
By design, the original implementation
of EXECUTE STATEMENT isolated the executable code from the
access privileges of the calling stored
procedure or trigger, falling back to the privileges available to the
CURRENT_USER. In general, the strategy
is wise, since it reduces the vulnerability inherent in providing for
the execution of arbitrary statements.
However, in hardened environments, or where privacy is not an issue,
it
could present a limitation.
The introduction of the optional clause
WITH CALLER PRIVILEGES now makes it possible to have the executable
statement inherit the access privileges
of the calling stored procedure or trigger. The statement is prepared
using any additional privileges that
apply to the calling stored procedure or trigger. The effect is the
same
as if the statement were executed by
the stored procedure or trigger directly.
Important
The WITH CALLER PRIVILEGES option is
not compatible with the ON EXTERNAL DATA SOURCE
option.
External Queries from PSQL
Vladyslav Khorsun
Tracker reference CORE-1853.
EXECUTE STATEMENT now supports queries
against external databases by inclusion of the ON EXTERNAL
DATA SOURCE clause with its
<connection_string> argument.
The <connection_string> Argument
The format of <connection_string>
is the usual one that is passed through the API function
isc_attach_database(), viz.
[<host_name><protocol_delimiter>]database_path
Character Set
The connection to the external data
source uses the same character set as is being used by the
CURRENT_CONNECTION context.
Access Privileges
If the external data source is on
another server then the clauses AS USER <user_name> and
PASSWORD
<password> will be needed.
The clause WITH CALLER PRIVILEGES is a
no-op if the external data source is on another server.
MORE INFORMATION REQUIRED. ROLES?
Note
Use of a two-phase transaction for the
external connection is not available in V.2.5.
70
Procedural SQL (PSQL)
EXECUTE STATEMENT with Dynamic
Parameters
Vladyslav Khorsun
Alex Peshkov
Tracker reference CORE-1221.
The new extensions provide the ability
to prepare a statement with dynamic input parameters (placeholders)
in a manner similar to a parameterised
DSQL statement. The actual text of the query itself can also be
passed
as a parameter.
Syntax Conventions
The mechanism employs some conventions
to facilitate the run-time parsing and to allow the option of
“naming”
parameters in a style comparable with
the way some popular client wrapper layers, such as Delphi, handle
DSQL
parameters. The API's own convention,
of passing unnamed parameters in a predefined order, is also
supported.
However, named and unnamed parameters
cannot be mixed.
The New Binding Operator
At this point in the implementation of
the dynamic parameter feature, to avoid clashes with equivalence
tests,
it was necessary to introduce a new
assignment operator for binding run-time values to named parameters.
The
new operator mimics the Pascal
assignment operator:“:=”.
Syntax for Defining Parameters
<input_parameters> ::=
<named_parameter> |
<input_parameters>, <named_parameter>
<named_parameter> ::=
<parameter name> := <expression>
Example for named input parameters
For example, the following block of
PSQL defines both <query_text> and named <input_parameters>
(<named_parameter>):
EXECUTE BLOCK AS
DECLARE S VARCHAR(255);
DECLARE N INT = 100000;
BEGIN
/* Normal PSQL string assignment of
<query_text> */
S = 'INSERT INTO TTT VALUES (:a, :b,
:a)';
WHILE (N > 0) DO
BEGIN
/* Each loop execution applies both the
string value
and the values to be bound to the input
parameters */
71
Procedural SQL (PSQL)
EXECUTE STATEMENT (:S) (a :=
CURRENT_TRANSACTION, b := CURRENT_CONNECTION)
WITH COMMON TRANSACTION;
N = N -1;
END
END
Example for unnamed input parameters
A similar block using a set of unnamed
input parameters instead and passing constant arguments directly:
EXECUTE BLOCK AS
DECLARE S VARCHAR(255);
DECLARE N INT = 100000;
BEGIN
S = 'INSERT INTO TTT VALUES (?, ?, ?)';
WHILE (N > 0) DO
BEGIN
EXECUTE STATEMENT (:S)
(CURRENT_TRANSACTION, CURRENT_CONNECTION, CURRENT_TRANSACTION);
N = N -1;
END
END
Note
Observe that, if you use both
<query_text> and <input_parameters> then the <query_text>
must be enclosed
in parentheses, viz.
EXECUTE STATEMENT (:sql) (p1 := 'abc',
p2 := :second_param) ...
Examples Using EXECUTE STATEMENT
The following examples offer a sampler
of ways that the EXECUTE STATEMENT extensions might be applied
in your applications.
Test Connections and Transactions
A couple of tests you can try to
compare variations in settings:
Test a) :Execute this block few times
in the same transaction -it will create three new connections to the
current
database and reuse it in every call.
Transactions are also reused.
EXECUTE BLOCK
RETURNS (CONN INT, TRAN INT, DB
VARCHAR(255))
AS
DECLARE I INT = 0;
DECLARE N INT = 3;
DECLARE S VARCHAR(255);
BEGIN
SELECT A.MON$ATTACHMENT_NAME FROM
MON$ATTACHMENTS A
72
Procedural SQL (PSQL)
WHERE A.MON$ATTACHMENT_ID =
CURRENT_CONNECTION
INTO :S;
WHILE (i < N) DO
BEGIN
DB = TRIM(CASE i -3 * (I / 3)
WHEN 0 THEN '\\.\' WHEN 1 THEN
'localhost:' ELSE '' END) || :S;
FOR EXECUTE STATEMENT
'SELECT CURRENT_CONNECTION,
CURRENT_TRANSACTION
FROM RDB$DATABASE'
ON EXTERNAL :DB
AS USER CURRENT_USER PASSWORD
'masterkey' --just for example
WITH COMMON TRANSACTION
INTO :CONN, :TRAN
DO SUSPEND;
i = i + 1;
END
END
Test b) : Execute this block few times
in the same transaction -it will create three new connections to the
current
database on every call.
EXECUTE BLOCK
RETURNS (CONN INT, TRAN INT, DB
VARCHAR(255))
AS
DECLARE I INT = 0;
DECLARE N INT = 3;
DECLARE S VARCHAR(255);
BEGIN
SELECT A.MON$ATTACHMENT_NAME
FROM MON$ATTACHMENTS A
WHERE A.MON$ATTACHMENT_ID =
CURRENT_CONNECTION
INTO :S;
WHILE (i < N) DO
BEGIN
DB = TRIM(CASE i -3 * (I / 3)
WHEN 0 THEN '\\.\'
WHEN 1 THEN 'localhost:'
ELSE '' END) || :S;
FOR EXECUTE STATEMENT
'SELECT CURRENT_CONNECTION,
CURRENT_TRANSACTION FROM RDB$DATABASE'
ON EXTERNAL :DB
WITH AUTONOMOUS TRANSACTION --note
autonomous transaction
INTO :CONN, :TRAN
DO SUSPEND;
i = i + 1;
END
END
Input Evaluation Demo
Demonstrating that input expressions
evaluated only once:
73
Procedural SQL (PSQL)
EXECUTE BLOCK
RETURNS (A INT, B INT, C INT)
AS
BEGIN
EXECUTE STATEMENT (
'SELECT CAST(:X AS INT),
CAST(:X AS INT),
CAST(:X AS INT)
FROM RDB$DATABASE')
(x := GEN_ID(G, 1))
INTO :A, :B, :C;
SUSPEND;
END
Insert Speed Test
Recycling our earlier examples for
input parameter usage for comparison with the non-parameterised form
of
EXECUTE STATEMENT:
RECREATE TABLE TTT (
TRAN INT,
CONN INT,
ID INT);
--Direct inserts:
EXECUTE BLOCK AS
DECLARE N INT = 100000;
BEGIN
WHILE (N > 0) DO
BEGIN
INSERT INTO TTT VALUES
(CURRENT_TRANSACTION, CURRENT_CONNECTION, CURRENT_TRANSACTION);
N = N -1;
END
END
--Inserts via prepared dynamic
statement
--using named input parameters:
EXECUTE BLOCK AS
DECLARE S VARCHAR(255);
DECLARE N INT = 100000;
BEGIN
S = 'INSERT INTO TTT VALUES (:a, :b,
:a)';
WHILE (N > 0) DO
BEGIN
EXECUTE STATEMENT (:S)
(a := CURRENT_TRANSACTION, b :=
CURRENT_CONNECTION)
WITH COMMON TRANSACTION;
N = N -1;
END
END
--Inserts via prepared dynamic
statement
--using unnamed input parameters:
74
Procedural SQL (PSQL)
EXECUTE BLOCK AS
DECLARE S VARCHAR(255);
DECLARE N INT = 100000;
BEGIN
S = 'INSERT INTO TTT VALUES (?, ?, ?)';
WHILE (N > 0) DO
BEGIN
EXECUTE STATEMENT (:S)
(CURRENT_TRANSACTION, CURRENT_CONNECTION, CURRENT_TRANSACTION);
N = N -1;
END
END
Other PSQL Improvements
Improvements made to existing PSQL
syntax include the following:
Subqueries as PSQL Expressions
A. dos Santos Fernandes
Tracker reference CORE-2580
Previously, a subquery used as a PSQL
expression would return an exception, even though it was logically
valid
in SQL terms. For example, the
following constructions would all return errors:
var = (select ... from ...);
if ((select ... from ...) = 1) then
if (1 = any (select ... from ...)) then
if (1 in (select ... from ...)) then
Now, such potentially valid expressions
are allowed, removing the need to jump through hoops to fetch the
output of a scalar subquery into an
intermediate variable using SELECT...INTO.
75
Chapter 12
International Language
Support (INTL)
Adriano dos Santos Fernandes
Some improvements appear in this
release to tighten and enhance Firebird's handling capabilities for
international
language environment.
Default COLLATION Attribute for a
Database
Databases of ODS 11.2 and higher can
now optionally be created with a default collation associated with
the
default character set. For details,
please see Default COLLATION Attribute for a Database in the DDL
chapter.
ALTER CHARACTER SET Command
DDL syntax has been introduced to
enable the default collation for a character set to be set at
database level.
For details, please see ALTER CHARACTER
SET Command in the DDL chapter.
Connection Strings & Character Sets
Capability has been implemented in the
API database connection (DPB) area to interoperate with the character
set and/or code page of server and
client, to avoid the previous problems that could occur when file
names
contained non-ASCII characters.
Refer to the topic Connection Strings &
Character Sets in the chapter Changes to the Firebird API and ODS.
Even if you are not normally interested
in the API, this topic will be a worthwhile read if you have been
bothered
with such issues.
Other Improvements
Introducer Syntax Usage
The usage of introducer syntax, i.e.,
prefixing an underscore to a character set name, to force the
succeeding text
literal to transliterated to that
character set, has caused some problems in situations where a single
SQL statement
entails usage of more than one
character set. The actual problems differ from version to version,
showing up as
transliteration errors, malformed
string errors or just as some kind of unexpected behaviour.
Problems could occur in two different
usage scenarios.
76
International Language Support (INTL)
1.
One query is employing the introducer
syntax when another query perfoms a select from MON$STATEMENTS
2.
Introducer syntax was used in a PSQL
module
To enable a workaround for such
problems, it is now possible to transform the literal string into the
hex representation
of the ASCII characters being submitted
by the introducer. For example:
select _dos850 '123ae456' from
rdb$database
may be transformed to
select _dos850 X'313233A082343536' from
rdb$database
Malformed UNICODE_FSS Characters
Disallowed
Tracker reference CORE-1600.
Malformed characters are no longer
allowed in data for UNICODE_FSS columns.
Repair Switches for Malformed Strings
New restore switches were added to the
gbak utility code for the purpose of repairing malformed
UNICODE_FSS data and metadata by
restoring a backup of the affected database. Details are in the gbak
section
of the Utilities chapter.
Numeric Sort Attributes
Tracker reference: CORE-1945)
For UNICODE collations only, a custom
attribute NUMERIC-SORT has been enabled for specifying the order
by which to sort numerals.
Format & Usage
NUMERIC-SORT={0 | 1}
The default, 0, sorts numerals in
alphabetical order. For example:
1
10
100
2
20
77
International Language Support (INTL)
1 sorts numerals in numerical order.
For example:
1
2
10
20
100
Example
create collation unicode_num for utf8
from unicode 'NUMERIC-SORT=1';
Character Sets and Collations
UNICODE_CI_AI
Tracker reference CORE-824.
UNICODE_CI_AI: case-insensitive,
accent-insensitive collation added for UNICODE.
WIN_1258
Tracker reference CORE-2185.
Added alias WIN_1258 for WIN1258
character set, for consistency with other WIN* character sets.
SJIS and EUCJ Character Sets
Tracker reference CORE-2103.
Strings in SJIS and EUCJ character sets
are now verified for well-formedness.
Character set GB18030
Tracker reference CORE-2636.
GB18030 is a Chinese national standard
describing the required language and character support necessary for
software in China. It has been
activated from ICU.
78
Chapter 13
Command-line Utilities
Incompatibility with Older Clients
To enable the 32-bit tools to work
correctly with new structures that enable statistics routines to work
properly
with a 64-bit server, it was necessary
to introduce some new internal API functions (struct perf64 and
perf64_xxx) and change isql and qli to
use them. This means that the isql and qli programs in V.2.5 are not
compatible with older Firebird clients.
For more information, see the topic
Statistics Now Work Properly with 64-bit Values in the Engine
chapter.
fbtracemgr
Vlad Khorsun
Tracker reference CORE-2524.
This is a new CLI utility for
interfacing with the new trace facilities. Usage is as follows.
fbtracemgr <action>>
[<parameters>]
Action Switches
-STA[RT] Start trace session
-STO[P] Stop trace session
-SU[SPEND] Suspend trace session
-R[ESUME] Resume trace session
-L[IST] List existing trace sessions
Parameters
Action parameters
-N[AME] <string> Session name
-I[D] <number> Session ID
-C[ONFIG] <string> Trace
configuration file name
Connection parameters
-SE[RVICE] <string> Service name
-U[SER] <string> User name
79
Command-line Utilities
-P[ASSWORD] <string> Password
-FE[TCH] <string> Fetch password
from file
-T[RUSTED] <string> Force trusted
authentication
Examples using fbtracemgr
fbtracemgr -SE remote_host:service_mgr
-USER SYSDBA -PASS masterkey -LIST
fbtracemgr -SE service_mgr -START -NAME
my_trace -CONFIG my_cfg.txt
fbtracemgr -SE service_mgr -SUSPEND -ID
2
fbtracemgr -SE service_mgr -RESUME -ID
2
fbtracemgr -SE service_mgr -STOP -ID 4
Notes
1. All switches and parameter
identifiers are case-insensitive
2. To stop an interactive trace session
on any platform, press Ctrl-C.
Retrieve Password from a File or Prompt
Alex Peshkov
Any command-line utility that takes a
-password parameter is vulnerable to password sniffing, especially
when
the utility is run from a script. Since
v.2.1, the [PASSWORD] argument has displayed in the process list on
POSIX platforms as an asterisk ( * ),
which was an improvement on showing it in clear.
As a second stage towards hiding the
password from unauthorised eyes, this release enables it to be
retrieved
from a file or (on POSIX) from STDIN.
New -fetch_password Switch
Firebird 2.5 introduces the new switch
-fet[ch_password] as an optional replacement for -pa[ssword] for all
command-line utilities that take a
password for authentication purposes. The switch may be progressively
abbreviated
from the right, conforming to the
established rules.
PLEASE NOTE
1. The exception to the rules is the
qli utility, for which only -F is valid.
2. The new switch cannot be applied to
substitute for the -pw switch of the gsec utility.
Usage of -fetch_password
The switch requires one parameter, an
unquoted string that is the file path for the file containing the
password.
If the call is not made by a system
user with Superuser/Administrator privileges, the location must be
accessible
by the system user making the call.
80
Command-line Utilities
For example,
isql -user sysdba -fet passfile
server:employee
extracts the first line of from a file
named “passfile” in the current working directory and
loads it into the
[PASSWORD] argument of the call.
The filename can be specified as stdin:
isql -user sysdba -fet stdin
server:employee
If stdin is the terminal, a prompt is
presented—
Enter password:
—requiring the operator to type
in the password.
Tip
On POSIX, the operator will also be
prompted if s/he specifies
-fetch /dev/tty
This technique could be useful if, for
example, you needed to restore from stdin (all one line):
bunzip2 -c emp.fbk.bz2 | gbak -c stdin
/db/new.fdb
-user sysdba -fetch /dev/tty
gsec
The following improvements have been
added for gsec:
Mapping Switch for Windows
Administrators
Alex Peshkov
Since v.2.1, Windows domain
administrators have had full access to the user management functions.
In v.2.5
they do not get these privileges
automatically unless the SYSDBA has configured the security database
to make
it happen automatically.
In the Administrative Features chapter
is a detailed overview of the new system role RDB$ADMIN. There, you
will find descriptions of the new ALTER
ROLE syntax that can be used by the SYSDBA to enable or disable the
automatic mapping of Windows
administrators to the RDB$ADMIN role in databases, including the
security
database which they access when
creating, altering and dropping users.
81
Command-line Utilities
This automatic mapping can also be done
in a gsec command-line call, using the new -mapping switch.
Mapping an OS Administrator to the
RDB$ADMIN Role
The new -mapping switch is used to
enable or disable the association of an operating system user with
the RDB
$ADMIN role in the security database.
It takes one argument: either set to enable the association or drop
to
disable it. The syntax is:
-mapping {set | drop}
Granting the RDB$ADMIN Role to a
Firebird User
The introduction of the RDB$ADMIN
system role has made it possible to escalate the privileges of an
ordinary
user. However, it was (and still is)
not possible any for any user, even SYSDBA, to attach directly to the
security
database and grant the required
permissions for the user to manage other users. A parameter—GRANT
ADMIN
ROLE—was included in the new
CREATE USER and ALTER USER statement syntaxes to enable SYSDBA,
or another user that has already
acquired the RDB$ADMIN role in the security database, to have the RDB
$ADMIN role applied to an ordinary user
“at arm's length”, as it were.
The same can be achieved in gsec using
the new switch -admin. It takes one argument: either YES (to grant
the
RDB$ADMIN role to the specified user in
security2.fdb) or NO (to revoke it). The syntax is:
-admin {YES | NO}
Command-line Help for gsec
Claudio Valderrama
Tracker reference: CORE-756)
Parameter help has been implemented for
gsec, accessible by using the -help or -? switches.
fbsvcmgr
Additions made to gsec and the Service
Parameter Block (SPB) relating to the system role RDB$ADMIN are
covered by the appropriate support in
the fbsvcmgr utility.
•
for gsec -mapping, two new tag items:
isc_action_svc_set_mapping and isc_action_svc_drop_mapping
•
for gsec -admin: the new parameter
isc_spb_sec_admin, of spb_long with either 0 as its value (meaning
REVOKE ADMIN ROLE) or non-zero (meaning
GRANT ADMIN ROLE).
For a full overview of the RDB$ADMIN
role, refer to the topic New RDB$ADMIN System Role in the
Administrative
Features chapter.
82
Command-line Utilities
gbak
Repair Switches for Malformed Strings
Adriano dos Santos Fernandes
Tracker reference CORE-1831.
The gbak utility has two new restore
switches intended to repair malformed UNICODE_FSS character data and
metadata, respectively, when restoring
the backup of an affected database.
Switch Syntax
-FIX_FSS_D(ATA) <charset> --fix
malformed UNICODE_FSS data
-FIX_FSS_M(ETADATA) <charset>
--fix malformed UNICODE_FSS metadata
Preserve Character Set Default
Collation
Adriano dos Santos Fernandes
An improvement allows the current value
of RDB$DEFAULT_COLLATE_NAME in the system table RDB
$CHARACTER_SETS to survive the
backup/restore cycle.
Tracker reference CORE-789.
nBackup
An improvement has been done for POSIX
versions to address a problem whereby the full backup tool of
the nBackup incremental backup utility
would hog I/O resources when backing up large databases, bringing
production work to a standstill. Now,
nBackup tries to read from the operating system cache before
attempting
to read from disk, thus reducing the
I/O load substantially.
Note
The “cost” may be a 10 to
15 percent increase in the time taken to complete the full backup
under high-load
conditions.
Tracker reference CORE-2316.
isql
Some changes to the isql interactive
query tool have been implemented.
83
Command-line Utilities
SQLSTATE instead of SQLCODE
Claudio Valderrama
isql now returns the SQLSTATE
completion code in diagnostics, instead of the now deprecated
SQLCODE.
For more information, see the topic
Support for SQLSTATE Completion Codes in the chapter Changes to the
Firebird API and ODS.
Improvement for Exponential Number
Output
Claudio Valderrama
Tracker reference CORE-1171.
isql has always output different
formatting of numbers on Windows and POSIX for two-digit exponents.
The
default behaviour of Microsoft and
Intel compilers is to zero-pad the exponent to three digits
regardless. For
example,
select cast ('-2.488355210669293e+39'
as double precision)
from rdb$database;
• On POSIX, the result is
-2.488355210669293e+39
• On Windows, the result was
-2.488355210669293e+039
The isql output has been modified so
that the Windows output now conforms with that on other platforms.
SHOW COLLATIONS in isql Help
Help for SHOW COLLATIONS has been added
to the command-line help for isql. (Tracker reference
CORE-2432, A. dos Santos Fernandes).
gpre (Precompiler)
Some Updates
Stephen Boyd
Adriano dos Santos Fernandes
Tracker reference CORE-1527.
GPRE now supports the IS NOT DISTINCT
predicate and CASE/NULLIF/COALESCE/SUBSTRING functions,
as well as the whole set of CURRENT_*
context variables.
84
Command-line Utilities
Deprecated Features with Future Impact
on Utilities
In anticipation of the dropping of the
intrinsic function isc_ddl from the Firebird 3 codebase, certain
features
currently available in the gdef and
gpre tools are deprecated—meaning that, whilst they may work in
V.2.5,
they will fail in Firebird 3. More
details can be found in the Compatibility chapter.
gstat
Claudio Valderrama
Tracker reference CORE-1411.
The gstat statistics reporting utility
now has -? and -help switches for requesting help about available
switches
and arguments.
85
Chapter 14
Installation Notes
Installation And Migration Guide
The latest version of Installation and
Migration Guide for Firebird versions 2.0.x and 2.1.x is still
applicable
to the v.2.5 series. If a copy of this
document is not present in your /doc/ directory, you can download it
from
the Firebird website.
Some improvements have been done to
solve issues that could arise with the binary installation packages.
Linux (POSIX)
The following improvements apply to
POSIX installations.
Installation Scripts Cleanup
Alex Peshkov
•
(CORE-2195): the Linux Classic
installation scripts were reviewed to improve the assignment of
ownership
and access rights to documentation and
other components.
•
(CORE-2392): Cleanups of installation
scripts for all active POSIX ports for Superserver and Superclassic
were done to address a problem with the
Guardian on these platforms.
•
(CORE-2626): The startup scripts in
/etc/init.d did not previously take into account the presence of
the directories /var/run/firebird and
/tmp/firebird on the host system. Various types of startup
failures were traceable back to this
deficiency.
The startup scripts distributed with
the V.2.5 and later builds address and solve the problem.
Dedicated Firebird Switches for
'configure'
Alex Peshkov
A lot of the standard configure
switches for fine-tuning the installation directories on POSIX
platforms do not
work for Firebird.
It was close to impossible to make the
standard GNU switches work without changing the defaults for them, a
rigmarole that is far from obvious or
easy. Instead, a set of new switches for the configure has been added
to
enable fine-level configuration of the
locations of Firebird's files.
The ib_util loader was also improved to
make the engine work correctly with the configured layout.
Available Switches
86
Installation Notes
--with-fbbin executables DIR
(PREFIX/bin)
--with-fbsbin system admin executables
DIR (PREFIX/bin)
--with-fbconf config files DIR (PREFIX)
--with-fblib object code libraries DIR
(PREFIX/lib)
--with-fbinclude C/C++ header files DIR
(PREFIXinclude)
--with-fbdoc documentation root DIR
(PREFIX/doc)
--with-fbudf UDF DIR (PREFIX/UDF)
--with-fbsample examples DIR
(PREFIX/examples)
--with-fbsample-db examples database
DIR (PREFIX/examples/empbuild)
--with-fbhelp QLI help DIR
(PREFIX/help)
--with-fbintl international DIR
(PREFIX/intl)
--with-fbmisc misc DIR (PREFIX/misc)
--with-fbsecure-db security database
DIR (PREFIX)
--with-fbmsg message files DIR (PREFIX)
--with-fblog log files DIR (PREFIX)
--with-fbglock guardian lock DIR
(PREFIX)
--with-fbplugins plugins DIR (PREFIX)
Detection of Path to Firebird's
Binaries
Adriano dos Santos Fernandes
Tracker reference: CORE-2398)
A feature has been implemented for
POSIX builds, to have Firebird correctly detect the path where its
binaries
are installed.
Important
This is an experimental state currently
and is disabled in the distributed binaries. To activate it, build
Firebird
from source and pass --enable-binreloc
to autogen.sh when building.
Windows
Vlad Khorsun
Tracker entry: CORE-2243
Note
Because the changes took effect from
V.2.1.2, this discussion also appears as a special topic in the V.2
Installation
and Migration document.
Managing MSCV8 Assemblies
Firebird 2.5 is built by the Microsoft
MSVC8 compiler in Visual Studio 2005. Because all the Firebird
binaries
are built to use dynamic linking, they
all require run-time libraries.
To avoid the dll-hell issue Microsoft
introduced new rules for the distribution of components that may be
shared
by multiple applications. From Windows
XP forward, shared libraries—such as the Visual C++ and Visual
C
runtimes msvcp80.dll, msvcr80.dll and
mscvcm80.dll—must be distributed as shared or as private
assemblies.
87
Installation Notes
•
The Microsoft MSI Installer installs
shared assemblies into the common special folder SxSfor use by
multiple
applications.
•
Private assemblies are distributed with
applications and should be put into the application folder. Use of
the
\system32folder for assemblies is now
prohibited on the XP, Server2003 and Vista platform families.
Installing Runtimes as a Shared
Assembly
To install the runtimes as a shared
assembly, the deployment system must have MSI 3.0 installed and the
user
must have administrative privileges.
Often, this is not possible with an application being deployed with
Firebird
Embedded: it must be installed
ready-to-run. In that case, do not plan to install the runtimes as a
shared assembly.
Installing Runtimes as a Private
Assembly
To install the MSVC8 run-time libraries
as a private assembly its contents—the three DLLs mentioned
above
and the assembly's manifest file,
Microsoft VC80.CRT.manifest—must be put into every folder where
a
dependent binary (.exe or .dll)
resides, because of built-in checks for the folders that are the
expected location
of the runtimes that are equivalent to
the compile-time libraries that were used.
A typical installation of Firebird
Embedded would thus require three complete copies of the MSVC8
run-time
assembly: one in the application folder
and one each into the \intl and \udf folders. To avoid the issue of
bloating
the installation, some changes were
done for V.2.1.2 in the way some of the Firebird binaries are built.
(See
also Tracker entry CORE-2243).
These are the changes that enable
Firebird Embedded to work even if the application structure does not
incorporate
the MSVC8 runtime assembly:
a.
The libraries ib_util.dll, fbudf.dll,
ib_udf.dll, fbintl.dll are built without any embedded manifest. The
effect
is to avoid having the loader search
for a MSVC8 assembly in the same folder as corresponding DLL.
For this to work, the host process must
have already loaded the MSVC8 run-time via manifest before any
attempt is made to load these secondary
DLL's.
b.
fbembed.dll now has code to create and
activate the activation context from its own manifest before loading
any secondary DLL that might be
required.
Notes
a.
It is highly recommended to use the
Microsoft redistribution package to install the MSVC8 run-time! The
executable installer vcredist_x86.exeor
vcredist_x64.exe(as appropriate to your kit selection)
should be present in the zip kits for
the full installation and the Embedded version. If not, it can be
downloaded
from the Microsoft download site.
b.
Third party UDFs must satisfy one of
the following requirements if a MSVC8 run-time assembly is installed
as private assembly. When compiling the
UDF library, the MSVC8 runtime EITHER:
•
is NOT used
•
is used but the build is done without
the embedded manifest
•
is used and the build is done with the
embedded manifest—the default option in the MSVC IDE. In
this case the MSVC8 assembly must be in
the same folder as the UDF library
88
Chapter 15
Compatibility Issues
Dmitry Yemanov
For migrating v.2.0.x or v.2.1.x
databases to Firebird 2.5, a number of incompatibilities that are
likely to affect
existing databases or existing
applications should be noted. It is not recommended that you begin a
migration
until you have resolved these.
Incompatibility with Older Clients
To enable the 32-bit tools to work
correctly with new structures that enable statistics routines to work
properly
with a 64-bit server, it was necessary
to introduce some new internal API functions (struct perf64 and
perf64_xxx) and change isql and qli to
use them. This means that the isql and qli programs in V.2.5 are not
compatible with older Firebird clients.
For more information, see the topic
Statistics Now Work Properly with 64-bit Values in the Engine
chapter.
Effects of Unicode Metadata
If you have not previously updated text
objects within the metadata of your databases to be in character set
UTF8, restoring a database until V.2.5
will fail with “malformed string” errors. To resolve this
it is necessary to
pay attention to the files in the
/misc/upgrade/metadatadirectory of your installation and to use the
new
-fix_fss_data and
-fix_fss_metadataswitches in the gbak command line.
Configuration Parameters Removed
The deprecated configuration parameters
OldParameterOrdering and CreateInternalWindow are no
longer supported and have been removed
from firebird.conf.
Two parameters that allowed tuning of
the Lock Manager in previous versions are not required with the new
Lock Manager implementation and have
been removed. They are LockSemCountand LockSignal.
The parameter MaxFileSystemCache has
been renamed to FileSystemCacheThreshold.
SQL Language Changes
It will be necessary to pay attention
to some changes in the SQL language implementation.
Reserved Words
While some new reserved keywords are
introduced, generally the overall list of reserved words has been
reduced
dramatically by making Firebird's
parser grammar allow most of the previously reserved non-standard
keywords
as non-reserved. The list of those
still reserved, and of SQL standard keywords newly reserved, is
available in
the chapter Reserved Words and Changes.
89
Compatibility Issues
Execution Results
Some changes will now cause exceptions
during run-time execution of queries, including those that are run
during the execution of the gbak
utility code (backups and restores).
Malformed String Errors
Well-formedness checks are now
performed on UNICODE_FSS strings and text blobs. If new or existing
UNICODE_FSS is malformed, it will now
cause exceptions at execution time.
Logic Change in SET Clause
Previously, when the SET clause of the
UPDATE statement assigned new values to columns, the new value
replaced the old value immediately. If
the same column was assigned or assigned to more than once, the
current
value would be that of the assignment
most recently done. In other words, previously, assignment order
mattered.
To bring Firebird in line with the
standard, from this version forward, only the original value of a
column is
accessible to any assignment in the SET
clause.
For a period, it is possible to revert
to the legacy behavior by setting the temporary parameter
OldSetClauseSemantics
in firebird.conf. This parameter will
be deprecated and removed in future releases.
Utilities
Be on the watch for the effects of the
following changes to the Firebird command-line utilities.
fb_lock_print
Because v.2.5 maintains separate lock
structures for each database on the server, fb_lock_print now
requires a
database path name in order to print
the lock table. Include the new switch -d <path name>in the
command
line to specify the filesystem path to
the database you wish to analyse.
Deprecated Features with Future Impact
In anticipation of the dropping of the
intrinsic function isc_ddl from the Firebird 3 codebase, certain
features
currently available in the gdef and
gpre tools are deprecated—meaning that, whilst they may work in
V.2.5,
they will fail in Firebird 3.
• gdef will no longer be supported
at all. Instead, isql should be used, with regular DDL commands.
• For gpre pre-processing, replace
all DDL operations with
EXEC SQL
EXECUTE IMMEDIATE "..."
• In all custom applications,
calls to isc_ddl must be replaced with SQL DDL statement requests.
90
Compatibility Issues
API Changes
Notice the following changes to the
application programming interface (API) that is implemented in the
client
libraries.
Rejection of Inconsistent TPB Options
The API functions
isc_start_transaction() and isc_start_multiple() will now reject
combinations of transaction
parameter buffer (TPB) items that do
not “belong together”.
For example, a non-zero wait timeout is
inconsistent with the no wait option; and no record version is
inconsistent
with any transaction isolation mode
other than ReadCommitted. Now, instead of making some arbitrary
(and possibly incorrect) assumption
about the inherent ambiguities, the engine will reject such
combinations
as invalid.
For more information, see the topic
Transaction Diagnostics in the chapter Changes in the Firebird
Engine.
Addition of SQL_NULL Constant
New SQL_NULL constant was introduced to
enable the predication OR ? IS NULL to be recognised and
processed with the expected outcome and
without engendering the “Data type unknown” exception.
This affects
how the XSQLVAR structures are
populated for such queries. For information, refer to the topic
SOME_COL
= ? OR ? IS NULL Predication in the DML
chapter.
Security Hardening
The following changes should be noted.
No SYSDBA Auto-mapping (Windows)
In V.2.1, members of administrative
Windows groups were mapped to SYSDBA by default. From V.2.5 forward,
SYSDBA mapping is controlled on
per-database basis using the new SQL command
ALTER ROLE RDB$ADMIN SET/DROP AUTO
ADMIN MAPPING
For more details, refer to the chapter
on Security.
Default Authentication Method (Windows)
In V.2.1, where support for Windows
trusted authentication was introduced, the default authentication
method
applied was mixed, i.e., the DPB or SPB
would accept either native Firebird logins or trusted user logins.
Thus,
he Authentication parameter in
firebird.confshowed mixed as the default.
91
Compatibility Issues
From V.2.5 forward, the default is
native. To have mixed or trusted, it is now necessary to configure
this parameter
specifically.
Tracker reference CORE-2376)
92
Chapter 16
Platform Ports
In this chapter are topics about ports
of Firebird to non-mainstream platforms, along with notes about
changes
and improvements to ports that have
been done previously.
IBM eServer z-Series
Linux/s390 (32-bit)
D. Ivanov
A. Peshkov
Tracker reference CORE-2625
Port for Linux/s390 (32-bit) platform,
built on s390x architecture.
The patch for this port removes the
-DS390X define from prefix.linux_s390x and replaces it with checks
for
__s390__ and __s390x__ defines which
are presented by gcc. This way, both ports can use the one prefix
file.
Note
s390 has no alignment restrictions.
Linux/s390x (64-bit)
D. Horak
A. Peshkov
Tracker reference CORE-2559
Port for Linux/s390x (64-bit) platform.
Linux/sh4 (Renesas SH)
N. Iwamatsu
D. Ivanov
A. Peshkov
Tracker reference CORE-2655
Port for Linux/sh4 (Renesas SH)
platform
93
Platform Ports
Linux/sh4 (Renesas SH) architecture
comes in little-and big-endian variants. The port supports both. SH
has
alignment constraints.
HP-UX
Lock Table Improvement for HP-UX
A. Peshkov
Tracker reference CORE-2644
All of the POSIX platform ports except
HP-UX enable the lock table to grow when the space initially
allocated
for it becomes exhausted. For the HP-UX
port, the hardware limitations of the PA-RISC platform prevented
the same implementation of dynamic
resizing because it does not support remapping the same file region
to a
different virtual address in the same
process. ISC_remap_file therefore does not work and the lock table
could
not grow.
The SAS team had developed a solution
in their edition of the Vulcan code to make the lock table expansible
on this platform. It is this solution
that has been imported to the Firebird 2.5 port for HP-UX.
Port for Very Old Windows 32-bit
Platforms
At the request of N. Samofatov
Tracker reference CORE-2609
It had been signalled that versions of
Firebird beyond V. 2.1.x would not support Microsoft Windows 98, ME,
or
NT4. However, Red Soft, a commercial
company which wants to support Win98/ME and an idiomatic version
of NT4 used by and maintained for
government departments in Russia, requested permission for the
inclusion of
some re-implemented compiler
conditions, isolated in separate units, that would enable the
building of “ports”
of Firebird 2.5 to those old or
idiomatic Windows platforms.
These ports are not part of the
Firebird 2.5 main stream distribution!
• The Windows binaries distributed
by the Firebird Project do not contain this support.
• No such ports are subjected to
any QA testing by the project.
• Any QA, future maintenance and
development or bug-fixing affecting such ports are the responsibility
of
those who use them.
94
Chapter 17
Bugs Fixed
Firebird 2.5 Release Candidate 1
The following bugs were reported as
fixed in the first release candidate phase:
Core Engine/DSQL
(CORE-2742) The server could stop
responding to a particular client attachment under some conditions.
There would be a small time window
during which the remote server would ignore the incoming operation
request it had just received and,
thereby, seem to block the client application. The listener thread
would remain
operational, but the client would be
synchronously waiting for the reply packet that would not come.
It appears rare: the one known
condition is a client application sending packets at intervals of 60
seconds, which
just happens to coincide with a timeout
for shutting down the inactive worker thread. Reported against
Classic,
but SuperServer may also have been
affected.
fixed by V. Khorsun
~~~
(CORE-2739) ASSERT at parse.cpp line
22885, caused by a text size mismatch involving introducer
syntax with WIN1251 character set.
fixed by A. dos Santos Fernandes
~~~
(CORE-2731) EXECUTE STATEMENT failed to
break out of infinite recursion.
fixed by V. Khorsun
~~~
(CORE-2730) A bus error could occur
when working with DB_KEY on RISC machines: when casting from
a literal (which has no alignment
requirements) to db_key, alignment is necessary at the QWORD boundary
and should have been enforced.
fixed by A. Peshkov
~~~
(CORE-2729) EXECUTE STATEMENT was using
the current connection for its execution, instead of
creating a new attachment.
fixed by V. Khorsun
95
Bugs Fixed
~~~
(CORE-2722) Storage of a malformed blob
was being allowed when copying from a blob with NONE/
OCTETS character set.
fixed by A. dos Santos Fernandes
~~~
(CORE-2721) When SIMILAR TO was applied
to UTF-8 fields the pattern length was being miscalculated.
fixed by A. dos Santos Fernandes
~~~
(CORE-2711) Problems with location or
version of MSVC8 runtimes for some VS2005 installations
(service packs) would compile a
FbEmbed.dllthat could not load ib_util.dll.
fixed by V. Khorsun
~~~
(CORE-2685) System triggers on a view
WITH CHECK OPTION were not being removed.
fixed by A. dos Santos Fernandes
~~~
(CORE-2660) COUNT(*) would incorrectly
return 0 when a match was not found for an outer join
condition. Now it correctly returns
NULL.
fixed by A. dos Santos Fernandes
~~~
(CORE-2659) The query plan for an outer
join involving complex views could be sub-optimal, by not
making use of an available index.
fixed by D. Yemanov
~~~
(CORE-2656 and CORE-2647) Copious
“Error reading data from the connection” messages were
being
reported in firebird.log on Classic,
due to a race condition that could occur on disconnection. It could
also lead
to a memory access violation.
fixed by V. Khorsun
~~~
(CORE-2646) When an engine process gets
a request to 'ALTER DATABASE BEGIN [or END ] BACKUP'
it should change the physical backup
state for nBackup on the header page of the database and immediately
tell
the engine to direct all processes to
flush all “dirty” pages to disk, to either the database
file or the nBackup delta
file, as appropriate for the state
change. (“Dirty” pages are pages of any type that contain
uncommitted changes.)
Under some conditions, an engine
process would continue to write dirty pages to disk immediately, even
after
all processes had acknowledged the
changed backup state.
96
Bugs Fixed
fixed by V. Khorsun, R. Simakov
~~~
(CORE-2640) Under some conditions, the
lock manager could fail to detect a regular deadlock and cause
the server to hang.
fixed by V. Khorsun, D. Yemanov
~~~
(CORE-2635) A unique index could be
corrupted at level 1 if it contained a lot of NULL keys.
fixed by V. Khorsun
~~~
(CORE-2633) SELECT... WITH LOCK could
corrupt tables by clearing their data if no fields were accessed.
fixed by V. Khorsun
~~~
(CORE-2632) Unexpected “Invalid
BLOB ID” errors could occur when working with the monitoring
tables.
fixed by V. Khorsun
~~~
(CORE-2616) Error “page <N>
is of wrong type (expected 7, found 5)” could occur under load,
giving the
impression that something had corrupted
the database. On restart, there would be no evidence of corruption.
fixed by V. Khorsun
~~~
(CORE-2612) Connection is lost
immediately after compiling a PSQL module that calls the system
function
RPAD().
fixed by A. dos Santos Fernandes
~~~
(CORE-2608) On latter versions of
Windows (64-bit XP or later, 32-bit Vista or later), when Firebird
is working with large databases, the
operating system dedicates all RAM to the filesystem cache and stops
responding. Windows may also crash.
It is a documented issue. For Firebird,
it has been addressed by implementing a new parameter, FileSystem-
CacheSize in firebird.conf to control
the amount of RAM used for filesystem caching.
fixed by N. Samofatov
~~~
(CORE-2602) Attachments using character
set NONE could fail to read from the monitoring tables.
fixed by A. dos Santos Fernandes
97
Bugs Fixed
~~~
(CORE-2600) The server could deadlock
while running multiple remote EXECUTE STATEMENTs
concurrently.
fixed by V. Khorsun
~~~
(CORE-2599) Closing an attachment that
was in active use by other threads could cause segmentation
fault in the Y-valve.
fixed by A. Peshkov
~~~
(CORE-2591) High mutex wait ratio and
degraded performance would start to show up after a period
of normal performance.
fixed by D. Yemanov
~~~
(CORE-2590) Segmentation fault could
occur in the page cache AST routine under high load.
fixed by A. Peshkov, D. Yemanov
~~~
(CORE-2584) Wrong results were being
produced when CASE was used in conjunction with GROUP BY.
fixed by A. dos Santos Fernandes
~~~
(CORE-2581 and CORE-2582) Infinity and
NAN results from any expressions, including internal and
external function calls, were not
trapped by the engine as exceptions in some circumstances.
fixed by C. Valderrama
~~~
(CORE-2579) A regression introduced in
Beta 2 caused a bug whereby parameters and local variables could
not be used as expressions in
parameters for EXECUTE PROCEDURE calls in PSQL without being prefixed
by colons.
fixed by A. dos Santos Fernandes
~~~
(CORE-2578) Selecting RDB$DBKEY from a
view with more than one table joined would return a
conversion error.
fixed by A. dos Santos Fernandes, A
Peshkov
~~~
98
Bugs Fixed
(CORE-2514) An error concerning
CreateFile was being reported when space on the 'temp' drive was
insufficient.
fixed by D. Yemanov
~~~
(CORE-2478) Incorrect database memory
was being reported in MON$MEMORY_USAGE on Classic
and SuperClassic.
fixed by D. Yemanov
~~~
(CORE-2477) Sorting memory should have
been reported in MON$MEMORY_USAGE as owned by the
statement but instead it was attributed
as database memory.
fixed by D. Yemanov
~~~
(CORE-2422 and CORE-2321) The server
was not switching between multiple locations configured in
TempDirectories. Instead, the sorting
would fail when the first configured temporary directory had
insufficient
free space. Typically, the user would
see a sorted or other query that required a large amount of temp
space fail
with an error like 'operating system
directive write failed. Invalid argument.'
fixed by D. Yemanov
~~~
(CORE-2315) Firebird FLOAT support did
not conform to the original InterBase specification. According
to the IB documentation, a FLOAT value
should have a range from 1.175E-38 to 3.402E38. Cross-platform tests
proved that the largest value that
would not overflow was < 3.4E38.
fixed by W. Oliver
~~~
(CORE-2252) EXECUTE STATEMENT on
EXTERNAL SOURCE was not checking the status of the
transaction.
fixed by V. Khorsun
~~~
(CORE-1991) When a UDF was declared
with BLOB parameters, the engine was storing null in RDB
$FUNCTION_PARAMETERS.RDB$FIELD_LENGTH.
This was causing a run-time 'message length error'.
fixed by D. Sibiryakov
~~~
(CORE-1781) The engine would throw a
consistency check error when a subquery was ordered by an
aggregate function from another
context.
fixed by A. dos Santos Fernandes
99
Bugs Fixed
~~~
Server/Client Crashes
(CORE-2576) The server could crash when
parsing wrong or truncated BLR.
fixed by A. dos Santos Fernandes
~~~
(CORE-2573) The server would crash when
selecting from the MON$ tables in an ON DISCONNECT
trigger
fixed by D. Yemanov
~~~
(CORE-2558) The engine would crash when
some statement under an autonomous transaction dropped
the transaction level-savepoint.
fixed by V. Khorsun
~~~
Security
(CORE-2657) A poorly documented SPB tag
provided the undesirable ability to pass an arbitrary trusted
user name to a service and enable that
user to acquire any permissions, including those of SYSDBA.
fixed by A. Peshkov
~~~
International Language Support
(CORE-2651) A string overflow error
(“string right truncation”) error was incorrectly being
thrown when
writing to a character set NONE column
from a connection configured for a multi-byte character set.
fixed by A. dos Santos Fernandes
~~~
(CORE-2642) An obscure ICU
initialization problem on Windows could cause misbehaviour in a
multi-
threaded environment.
fixed by A. dos Santos Fernandes
~~~
(CORE-2615) Silent truncation could
occur when using UTF-8 parameters and UTF-8 client character
set encoding.
100
Bugs Fixed
fixed by A. dos Santos Fernandes
~~~
(CORE-2607) Introducer syntax(_charset)
problems were occurring when it was used in association with
monitoring queries or PSQL modules.
For information about the problem and a
workaround provided for it, see the topic Introducer Syntax Usage
under Other Improvements in the
International Language Support chapter.
fixed by A. dos Santos Fernandes
~~~
Command-line Utilities
isql
(CORE-915) The metadata extract tools
of isql were doubling line breaks in PSQL body code in cases
where the PSQL body had been written in
a third-party Windows text editor.
fixed by A. dos Santos Fernandes
~~~
gbak
(CORE-2634) A regression had arisen
whereby performance dropped when restoring a database with a
large amount of metadata.
fixed by A. Peshkov
~~~
nBackup
(CORE-2648) NBackup's delta file was
not respecting the “Forced Writes” database setting.
fixed by V. Khorsun
~~~
gfix
(CORE-97) A lock on the database file
was being left by gfix -shut -force, preventing a subsequent restore.
fixed by D. Yemanov
~~~
101
Bugs Fixed
fb_lock_print
(CORE-2598) fb_lock_print
-c[onsistency] switch was not working on Windows.
fixed by D. Yemanov
~~~
POSIX-Only Issues
(CORE-2601) A lot of the standard
configure switches for fine-tuning the installation directories on
POSIX
platforms do not work for Firebird.
It was close to impossible to make the
standard GNU switches work without changing the defaults for them, a
rigmarole that is far from obvious or
easy. Instead, a set of new switches for the configure has been added
to
enable fine-level configuration of the
locations of Firebird's files.
The switches are listed in the
Installation chapter, in the topic Dedicated Firebird Switches for
'configure'.
fixed by A. Peshkoff
~~~
(CORE-2572) Locks of type
LCK_page_space were being processed incorrectly on big-endian
machines.
fixed by A. Peshkov
~~~
Windows-Only Issues
(CORE-2586) For client-server and
server-server syncronization, Firebird uses various named kernel
objects (such as Events, Mutexes,
Memory-mapped files, etc). To work in proper isolation, the objects
that a
process creates must belong to the same
namespace. Some objects were being created with the namespace set
explicitly, while others were not. This
could have corruption implications for certain deployment
arrangements.
fixed by V. Khorsun
~~~
Firebird 2.5 Beta 2
The following bugs were reported as
fixed in the Beta 2 release:
Core Engine/DSQL
(CORE-2564) Bus errors would be thrown
when working with the monitoring tables on RISC machines.
102
Bugs Fixed
fixed by A. Peshkov
~~~
(CORE-2552) Calls isc_dsql_execute2()
were not returning errors when the output SQLDA was non-null.
fixed by A. dos Santos Fernandes
~~~
(CORE-2550) Bus errors would be thrown
when working with DB_KEY on big-Endian machines.
fixed by A. Peshkov
~~~
(CORE-2538) PSQL would not allow use of
a singleton query result as an input parameter to a stored
procedure if the procedure was called
using EXECUTE PROCEDURE.
fixed by A. dos Santos Fernandes
~~~
(CORE-2532) Volume sizes in a
multi-volume database were being assigned incorrectly.
fixed by V. Khorsun
~~~
(CORE-2526) The server could be shut
down without regard to connections to services.
fixed by A. Peshkov, D. Yemanov
~~~
(CORE-2518) It was impossible to
connect to a database via any engine when using the
isc_dpb_num_buffers
parameter. Since it is expected that
this parameter be available to a Classic process, the behaviour has
been
changed to allow the parameter to be
present and for it to be simply ignored by a Superserver server.
fixed by A. Peshkov
~~~
(CORE-2516) Attempts to define an input
or output parameter for a stored procedure using a domain or
TYPE OF COLUMN where the domain was an
array were not detected by the DSQL compiler as invalid and
thus caused run-time anomalies. Now,
such attempts will cause exceptions.
fixed by A. dos Santos Fernandes
~~~
(CORE-2505) Built-in trigonometric
functions could produce NaN and Infinity.
fixed by C. Valderrama
~~~
103
Bugs Fixed
(CORE-2501) Binary shift functions
would give wrong results with negative shift values.
fixed by C. Valderrama
~~~
(CORE-2499) The implementation limit of
DISTINCT items was not being enforced, causing incorrect
BLR to be generated.
fixed by A. dos Santos Fernandes
~~~
(CORE-2488) Execution of a query
involving multiple re-entrant joins was taking much longer than on
v.2.1.
fixed by D. Yemanov
~~~
(CORE-2482) Monitoring tables data
collection was unstable when the database was accepting attachments
or detachments.
fixed by A. Peshkov
~~~
(CORE-2475) External table data was not
visible to Classic sessions other than the first to access the table.
fixed by V. Khorsun
~~~
(CORE-2462) The firebird.log file would
grow too fast and too much.
fixed by D. Yemanov
~~~
(CORE-2449) An unexpected “lock
conflict” error could be thrown in lieu of the expected
exception.
fixed by D. Yemanov
~~~
(CORE-2444) The engine could hang when
multiple attachments registered their interest in events
simultaneously
and free space in the events table
became exhausted.
fixed by V. Khorsun
~~~
(CORE-2434) The CREATE USER command was
returning an invalid error message.
fixed by A. dos Santos Fernandes
~~~
(CORE-2430) The server was appending
“NOT” at the end of a default value for a TIMESTAMP
field.
104
Bugs Fixed
fixed by D. Yemanov
~~~
(CORE-2427) ALTER VIEW was not clearing
the dependencies pertaining to the old version of the view.
fixed by A. dos Santos Fernandes
~~~
(CORE-2426) ALTER TABLE was not
respecting collations.
fixed by A. dos Santos Fernandes
~~~
(CORE-2420) A parsing error would occur
in EXECUTE STATEMENT with named parameters.
fixed by V. Khorsun
~~~
(CORE-2419) An assert would occur in
the DEBUG build while preparing a query with UNION inside
a derived table.
fixed by V. Khorsun
~~~
(CORE-2417) An index that should be
used with a <field> LIKE <constant%> predicate in the
HAVING
clause was not being considered.
fixed by A. dos Santos Fernandes
~~~
(CORE-2416) Preparing a query with
aggregation over a derived table would cause an access violation.
fixed by V. Khorsun
~~~
(CORE-2411) The optimizer would choose
a slower PLAN for certain types of query than it would in
versions 2.0.4 and 2.1.1. (The bug
affected versions 2.0.5 and 2.1.2 as well.)
fixed by D. Yemanov
~~~
(CORE-2402) Bad permissions on temp
files; /tmp was polluted with a lot of files.
fixed by A. Peshkov
~~~
(CORE-2397) Dropping more than one
index on a table within the same transaction could cause corruption.
fixed by V. Khorsun
105
Bugs Fixed
~~~
(CORE-2386) ALTER VIEW was not
prevented from removing columns used in stored procedures or
triggers.
fixed by V. Khorsun
~~~
(CORE-2359) Logical multibyte maximum
string length was not respected when assigning numbers.
fixed by A. dos Santos Fernandes
~~~
(CORE-2331) ALTER DOMAIN would result
in an invalid RDB$FIELD_SUB_TYPE value being stored.
fixed by A. dos Santos Fernandes
~~~
(CORE-2272) The server would start
returning garbage when killing an events connection attempt.
fixed by A. Peshkov
~~~
(CORE-1971) Set the fixed and
documented evaluation order (always left to right) for the WHERE
clause
and other predicates.
fixed by D. Yemanov
~~~
(CORE-1346) LPAD() and RPAD() functions
hit implementation restrictions when applied to more than
one column in a statement.
fixed by A. dos Santos Fernandes
~~~
Server/Client Crashes
(CORE-2455) The server would fail when
doing DROP DATABASE right after an error occurred in a
statistical function.
fixed by A. Peshkov
~~~
(CORE-2454) An access violation could
occur when enumerating attachments in Superserver or Superclassic
if more than 8 databases were attached.
fixed by V. Khorsun
~~~
106
Bugs Fixed
(CORE-2453) An access violation could
occur in the engine when an XNET client using events disconnected.
fixed by V. Khorsun
~~~
(CORE-2441) The server could crash on
executing an UPDATE OR INSERT statement.
fixed by A. Peshkov
~~~
(CORE-2306) Superserver could terminate
abnormally when some worker thread failed to start.
fixed by A. Peshkov
~~~
Remote Interface/API
(CORE-2563) It was possible to shut
down the Superserver's main port (3050 by default) by sending a
malformed packet of some special
format, that would lead to a Denial of Service condition for new
incoming
connections. This exploit could be used
by an unauthenticated client.
Reported 15-Jul-2009 by Core Security
Technologies.
fixed by D. Yemanov
~~~
(CORE-2561) Database name
transliteration was incorrect when connecting using WNET (Named
Pipes)
or XNET.
fixed by A. dos Santos Fernandes
~~~
(CORE-2437) A buffer overflow could
occur on the client when receiving events.
fixed by A. Peshkov
~~~
International Language Support
~~~
(CORE-2361) String truncation was
occurring when reading a character set 8859_1 Spanish column using
isc_dsql_fetch() with a UTF8
connection.
fixed by A. dos Santos Fernandes
~~~
107
Bugs Fixed
Command-line Utilities
gsec
(CORE-2528) The gsec utility did not
return error codes to the operating system.
fixed by C. Valderrama
~~~
gstat
(CORE-2519) Output from gstat was
incorrect for tables with more than 2 billion records.
fixed by V. Khorsun
~~~
(CORE-1412) Some long-standing bugs in
gstat's processing of parameters needed fixing.
fixed by C. Valderrama
~~~
gbak
(CORE-2461) The restore process was
being terminated by a deadlock error twhile restoring privileges.
fixed by D. Yemanov
~~~
isql
(CORE-2408) The isql metadata
extraction process was placing default values for procedure
parameters
before the NOT NULL and COLLATE flags.
fixed by A. dos Santos Fernandes
~~~
(CORE-2407) The isql metadata
extraction process was omitting the PAGE_SIZE clause from the CREATE
DATABASE statement.
fixed by A. dos Santos Fernandes
~~~
(CORE-2370) An SQL plan of more than
2048 characters was not printed at all in isql.
108
Bugs Fixed
fixed by C. Valderrama
~~~
gfix
(CORE-2268) Non-valid transaction
numbers would cause gfix to throw BUGCHECK errors.
fixed by V. Khorsun
~~~
Firebird 2.5 Beta 1
The following bugs were reported as
fixed in the Beta 1 release:
Core Engine/DSQL
(CORE-2389) Wrong matching of SIMILAR
TO expression with brackets.
fixed by A. dos Santos Fernandes
~~~
(CORE-2356) On Windows the listener
process of Classic Server was unable to create the necessary
resources after restart if any worker
process was present.
fixed by V. Khorsun
~~~
(CORE-2355) Incorrect handling of
LOWER/UPPER when result string shrinks in terms of byte length.
fixed by A. dos Santos Fernandes
~~~
(CORE-2351) It was not possible to
create a database whose <file specification> was an alias, even
though
the alias existed.
fixed by A. Peshkov
~~~
(CORE-2349) The “Invalid SQLDA”
error was being falsely thrown.
fixed by V. Khorsun
~~~
(CORE-2348) More database corruption
problems showed up resulting from transaction numbers overflowing
32-bit signed integer.
109
Bugs Fixed
fixed by V. Khorsun
~~~
(CORE-2347) “Deadlock. Page type
<N> lock conversion denied” errors were reported under a
concurrent
“connect-work-disconnect”
style of load.
fixed by D. Yemanov
~~~
(CORE-2341) Hidden variables could
conflict with output parameters, causing assertions, unexpected
errors or even incorrect results.
fixed by A. dos Santos Fernandes
~~~
(CORE-2340) Bugcheck 258 (page slot not
empty) could occur under high concurrent load.
fixed by V. Khorsun
~~~
(CORE-2339) Incorrect results were
being returned for derived expressions based on aggregation and
computation.
fixed by A. dos Santos Fernandes
~~~
(CORE-2265) Grouping by function was
not working properly.
fixed by A. dos Santos Fernandes
~~~
(CORE-2320) A complex recursive query
did not always return all rows.
fixed by V. Khorsun
~~~
(CORE-2317) select * from (select
cast(.... was returning null.
fixed by A. dos Santos Fernandes
~~~
(CORE-2313) INF_* functions could
invalidate the whole output buffer with isc_info_truncated at the
beginning, due to a boundary condition.
fixed by C. Valderrama
~~~
(CORE-2311) A WITH RECURSIVE query
could cause memory leakage.
110
Bugs Fixed
fixed by V. Khorsun
~~~
(CORE-2308) SIMILAR TO was producing
random results with [x-y] expressions.
fixed by A. dos Santos Fernandes
~~~
(CORE-2300) The second evaluation of
SUBSTRING() would throw an unexpected arithmetic exception,
numeric overflow, or string truncation
error.
fixed by A. dos Santos Fernandes
~~~
(CORE-2293) The wrong dependent object
type (RELATION) was being stored in RDB$DEPENDENCIES
for views.
fixed by V. Khorsun
~~~
(CORE-2289) The wrong name was being
reported for the referenced primary key when a foreign key
violation occurred during foreign key
creation.
fixed by V. Khorsun
~~~
(CORE-2264) Doing ALTER DOMAIN on a
domain with dependencies could leave a transaction handle
in an inconsistent state and cause
segmentation faults.
fixed by A. dos Santos Fernandes, D.
Yemanov
~~~
(CORE-2258) Selecting UPPER (<blob>)
from a UNION was causing an internal error.
fixed by A. dos Santos Fernandes
~~~
(CORE-2257) The error Bugcheck 167
(invalid send request) could occur while altering dependent
procedures.
fixed by D. Yemanov
~~~
(CORE-2255) The error String right
truncation could occur while altering a view with a join.
fixed by A. dos Santos Fernandes
~~~
111
Bugs Fixed
(CORE-2242) The engine was incorrectly
populating integer containers in the blob parameter buffer (BPB)
with integers in machine-local format,
causing errors on Big Endian platforms.
fixed by A. Peshkov
~~~
(CORE-2241) If an ALTER TABLE ALTER
COLUMN.. operation was performed on a table in the course
of a bulk insert operation, minor index
corruption could occur causing subsequent queries to return the wrong
number of records. The bug was traced
to legacy code in BTR\compress_root().
fixed by V. Khorsun
~~~
(CORE-2237) An unresolved assertion was
exhibited at src\jrd\intl.cpp, line 569.
fixed by A. dos Santos Fernandes
~~~
(CORE-2231) A Bugcheck 179
(decompression overran buffer) was thrown when the v.2.5 server
attempted
to read from the table
RDB$TRIGGER_MESSAGES in a ODS 10.x database.
fixed by D. Yemanov
~~~
(CORE-2230) Input parameters for
EXECUTE BLOCK were not being domain-checked.
fixed by A. dos Santos Fernandes
~~~
(CORE-2202) RDB$VIEW_RELATIONS was not
being cleaned up when ALTER VIEW was processed.
fixed by A. dos Santos Fernandes
~~~
(CORE-2186) In the Windows embedded
server, fbintl.dll was not being unloaded after the
isc_dsql_execute_immediate() during the
processing for CREATE DATABASE.
fixed by A. dos Santos Fernandes
~~~
(CORE-2183) An error was being thrown
when a server shutdown was started while an “execute statement”
request was open.
fixed by V. Khorsun
~~~
(CORE-2182) It was not possible to drop
an existing UDF whose name was duplicated by the name of
a new built-in function.
fixed by D. Yemanov
112
Bugs Fixed
~~~
(CORE-2179) Deadlocks were exhibited
when trying to shut down the server whilst an “execute
statement”
request was open.
fixed by A. Peshkov
~~~
(CORE-2176) COALESCE and GROUP BY were
returning unexpected wrong results.
fixed by A. dos Santos Fernandes
~~~
(CORE-2174) The DATEADD() and
DATEDIFF() functions were causing an assert in
TimeStamp::decode().
fixed by A. dos Santos Fernandes
~~~
(CORE-2154) A “request
synchronization error” would occur when calling
isc_dsql_sql_info() with the
isc_info_sql_records parameter after
the last record had been fetched with EXECUTE PROCEDURE.
fixed by V. Khorsun
~~~
(CORE-2153) The “|” option
was causing the SIMILAR TO predicate to hang.
fixed by A. dos Santos Fernandes
~~~
(CORE-2140) Error messages after
substitution of parameters contained '\n' characters instead of the
actual line break.
fixed by C. Valderrama
~~~
(CORE-2138) If a stored procedure with
an EXECUTE STATEMENT against an external database failed
at runtime, the external database would
remain attached.
fixed by V. Khorsun
~~~
(CORE-2132) Indexed retrieval could not
be chosen if a stored procedure call was used in the comparison
predicate.
fixed by D. Yemanov
~~~
(CORE-2117) Incorrect ROW_COUNT values
were being returned with indexed retrieval and subqueries.
113
Bugs Fixed
fixed by A. dos Santos Fernandes
~~~
(CORE-2115) For some long queries the
query plan could go missing.
fixed by D. Yemanov
~~~
(CORE-2101) A Bugcheck 249 (pointer
page vanished) error would be thrown when an attempt was made
to fetch beyond the end-of-stream mark
of an open PSQL cursor.
fixed by D. Yemanov
~~~
(CORE-2098) It was not possible to
create a view that selected from a global temporary table.
fixed by V. Khorsun
~~~
(CORE-2081) RDB$DB_KEY in a subquery
expression would incorrectly return NULL.
fixed by A. dos Santos Fernandes
~~~
(CORE-2078) If selective non-indexed
predicates were involved in a join, the join plan was not optimized
as well as it could be.
fixed by D. Yemanov
~~~
(CORE-2075) Parts of the RDB$DB_KEY of
views could be inverted when using outer joins.
fixed by A. dos Santos Fernandes
~~~
(CORE-2073) Expression indices bug:
incorrect result for the inverted boolean.
fixed by D. Yemanov
~~~
(CORE-2069) Incorrect view expansion
when RDB$DB_KEY was used inside a view body.
fixed by A. dos Santos Fernandes
~~~
(CORE-2068) Comparision would return a
wrong result with the IN <subquery_expression> operand if
the <subquery_expression>
argument involved the RDB$DB_KEY.
fixed by A. dos Santos Fernandes
114
Bugs Fixed
~~~
(CORE-2067) ?? GROUP BY and RDB$DB_KEY
problems ??
fixed by A. dos Santos Fernandes
~~~
(CORE-2066) ?? Conversion of SQL_TEXT /
SQL_VARCHAR to SQL_TIMESTAMP / SQL_TIME /
SQL_DATE ??
fixed by A. dos Santos Fernandes
~~~
(CORE-2062) Classic server exhibited a
lock file remapping error.
fixed by A. Peshkov
~~~
(CORE-2053) Computed expressions could
suffer from poor optimization if used inside the RETURNING
clause of the INSERT statement.
fixed by D. Yemanov
~~~
(CORE-2045) A v.2.1 regression was
picked up, whereby references to non-existent system fields with
blr_field were not being resolved to
NULL, whereas a parallel change involving blr_fld was exhibiting
the proper corrective behaviour.
fixed by dos Santos Fernandes
~~~
(CORE-2044) ?? Incorrect result for
UPDATE OR INSERT ... RETURNING OLD and non-nullable
columns ???
fixed by A. dos Santos Fernandes
~~~
(CORE-2041) UPDATE OR INSERT with
GEN_ID() was causing the generator to step by 3.
fixed by A. dos Santos Fernandes
~~~
(CORE-2039) Domain-level CHECK
constraints were processing NULL values wrongly.
fixed by D. Yemanov
~~~
(CORE-2038) The new EXECUTE STATEMENT
implementation would assert or throw an error if used
both before and after Commit Retaining
or Rollback Retaining.
115
Bugs Fixed
fixed by D. Yemanov
~~~
(CORE-2036) The order of parameters in
an EXECUTE BLOCK statement was being reversed if the
block was called from EXECUTE
STATEMENT.
fixed by V. Khorsun
~~~
(CORE-2031) ??? NULL in the first
record in a condition on RDB$DB_KEY ???
fixed by A. dos Santos Fernandes
~~~
(CORE-2027) The buffer size for ORDER
BY expressions involving system fields was being calculated
wrongly.
fixed by A. dos Santos Fernandes
~~~
(CORE-2026) ??? Problem with a
read-only marked database ???
fixed by V. Khorsun
~~~
(CORE-2022) CREATE USER was not being
supported by the EXECUTE BLOCK statement.
fixed by A. Peshkov
~~~
(CORE-2008) ??? NOT NULL flag for
procedure parameters in the system schema ???
fixed by A. dos Santos Fernandes
~~~
(CORE-2002) A conversion error from a
UDF result would leave a memory leak if the result was marked
with FREE_IT.
fixed by C. Valderrama
~~~
(CORE-2001) When trying to show a
conversion error, the message arithmetic exception or string
truncation
was sometimes appearing instead.
fixed by C. Valderrama
~~~
(CORE-2000) The Lock Manager could
report false deadlocks under high load.
116
Bugs Fixed
fixed by V. Khorsun
~~~
(CORE-1994) An “invalid database
handle” could occur while executing a CREATE USER statement.
fixed by D. Yemanov
~~~
(CORE-1986) Altering the name of a
domain was causing dependencies on the domain to be dropped.
fixed by A. dos Santos Fernandes
~~~
(CORE-1985) The Lock Manager code could
periodically cause 100% CPU load.
fixed by V. Khorsun
~~~
(CORE-1984) The Lock Manager could
falsely report a deadlock if one of the alleged participants was
waiting with a permitted timeout.
fixed by V. Khorsun
~~~
(CORE-1980) Sweeper could consume 100%
of CPU indefinitely.
fixed by V. Khorsun
~~~
(CORE-1970) Lock conversion denied
(215) errors could occur.
fixed by V. Khorsun
~~~
(CORE-1962) The function EXTRACT
(MILLISECONDS FROM aTimeStampOrTime) was returning
incorrect results.
fixed by A. dos Santos Fernandes
~~~
(CORE-1958) A Bugcheck 179
(decompression overran buffer) consistency check error would be
thrown
when attempts were made to update the
same record multiple times in a transaction.
fixed by D. Yemanov
~~~
(CORE-1957) Long access control lists
(ACLs) were being truncated, causing privileges to disappear.
fixed by A. Peshkov
117
Bugs Fixed
~~~
(CORE-1943) A statement that aggregated
on a RAND() expression would return infinite rows.
fixed by A. dos Santos Fernandes
~~~
(CORE-1938) Bugcheck 243 (missing
pointer page) was being thrown on preparing or executing statements
that referred to a table being dropped
or recreated by another connection.
fixed by D. Yemanov
~~~
(CORE-1936) The built-in function
LOG(base, number) was not checking parameters and would deliver
NAN values for out-of-range input
instead of excepting.
fixed by A. dos Santos Fernandes
~~~
(CORE-1935) SIMILAR TO character
classes were not being recognised correctly.
fixed by A. dos Santos Fernandes
~~~
(CORE-1914) If a problem occurred
during table creation, the database could be left in an inconsistent
state.
fixed by A. Peshkov
~~~
(CORE-1812) For some date/time
expressions in dialect 1, indexes were not being used when they
should
have been.
fixed by D. Yemanov
~~~
(CORE-1650) An improbable case was
demonstrated whereby something like SELECT GEN_ID(..)
FROM RDB$DATABASE with a GROUP BY
operation would cause rows to be generated infinitely.
fixed by A. dos Santos Fernandes
~~~
(CORE-1607) A correlated subquery that
depended on a UNION stream would be poorly optimized.
fixed by D. Yemanov
~~~
(CORE-1606) ??? Ability to insert child
record if parent record is locked but foreign key target unchanged
???
fixed by A. Potapchenko, V. Khorsun
118
Bugs Fixed
~~~
(CORE-1575) Multiple updates to a table
in a single transaction would throw up a serious memory bug.
fixed by D. Yemanov
~~~
(CORE-1544) When a user application
created “temporary” stored procedures in run-time for
some
run-time purpose, the internal
generator for the RDB$PROCEDURES.RDB$PROCEDURE_ID column could
easily overflow the 32K limit (a signed
SMALLINT) in its internal generator and cause a “numeric
overflow”
exception on trying to create the new
stored procedure.
The fix wraps around the generated
value at the 32K boundary, allowing reuse of existing gaps in the ID
numbering.
A similar fix was applied to
RDB$GENERATORS and RDB$EXCEPTIONS as well.
fixed by D. Yemanov
~~~
(CORE-1343) ?? simple case and a
subquery ??
fixed by A. dos Santos Fernandes
~~~
(CORE-1246) Outer joins with derived
tables returned incorrect results.
fixed by A. dos Santos Fernandes
~~~
(CORE-1245) Outer joins with views
returned incorrect results.
fixed by A. dos Santos Fernandes
~~~
(CORE-903) Firebird's behaviour with
regard to multiple assignments referring to the same column in the
SET clause of an UPDATE statement did
not comply with the standard.
fixed by D. Yemanov
~~~
(CORE-501) COALESCE exhibited an
optimization problem.
fixed by A. dos Santos Fernandes
~~~
(CORE-216) Privileges could be lost if
a database contained too many.
fixed by A. Peshkov
~~~
119
Bugs Fixed
Server/Client Crashes
(CORE-2372) The server would crash
inside CMP_release() while releasing an already freed collation
resource.
fixed by V. Khorsun
~~~
(CORE-2368) An access violation would
follow the call to isc_cancel_events() if the event was not found.
fixed by V. Khorsun
~~~
(CORE-2248) During port validation, the
server was crashing in server.cpp/loopThread().
fixed by V. Khorsun
~~~
(CORE-2222) Storing a text blob with a
transliterating blob filter could cause an access violation in the
engine.
fixed by V. Khorsun
~~~
(CORE-2158) Client and embedded
libraries could crash while being unloaded.
fixed by A. Peshkov
~~~
(CORE-2137) A database restore could
crash the server when the configuration parameter DummyPacketInterval
was set explicitly.
fixed by D. Yemanov
~~~
(CORE-2121) The Client library could
crash in the course of an operation involving BLOBs.
fixed by A. Peshkov
~~~
(CORE-2071) The client library would
crash if isc_dsql_prepare() was called with a NULL statement text.
fixed by A. Peshkov
~~~
(CORE-2064) A server process could
crash during an exit while under high load.
120
Bugs Fixed
fixed by A. Peshkov
~~~
(CORE-2061) ALTER VIEW WITH CHECK
OPTION could crash the engine.
fixed by D. Yemanov
~~~
(CORE-2042) ?? Connection lost to a
database when using AUTONOMOUS TRANSACTION ??
fixed by A. dos Santos Fernandes
~~~
(CORE-1983) An out-of-memory condition
in the operating system would cause an access violation.
fixed by A. Peshkov
~~~
(CORE-1965) The Lock Manager would
crash with an invalid lock ID under concurrent DDL load.
fixed by D. Yemanov
~~~
(CORE-1894) Circular dependencies
between computed fields would crash the server.
fixed by A. dos Santos Fernandes
~~~
(CORE-1963) The server could crash on
commit when granting/revoking privileges from multiple connections
simultaneously.
fixed by D. Yemanov
~~~
(CORE-1506) Server crashes with
isc_dsql_execute_immediate() and a zero-length string.
fixed by A. Peshkov
~~~
(CORE-210) The Classic server would
crash if the same stored procedure was being altered in two separate
processes.
fixed by D. Yemanov
~~~
Remote Interface/API
(CORE-2307) API information requests
were returning incomplete values in the results.
121
Bugs Fixed
fixed by D. Yemanov
~~~
(CORE-2262) Abrupt termination of a
client connection could occur.
fixed by A. Peshkov
~~~
(CORE-2234) Sometimes, terminated
worker processes in Classic on Windows were still considered to
be alive after termination, due to
improper checks on the Firebird server's part. The same bug could
cause the
Firebird server to misbehave with
prolonged deadlocks when under load.
fixed by V. Khorsun
~~~
(CORE-2151) When a temporary directory
path had spaces within it, it was (wrongly) being truncated
at the rightmost space.
fixed by V. Khorsun
~~~
(CORE-2033) The symbol _Unwind_GetIP in
the client library was being left unresolved due to a missing
static library linkage.
fixed by A. Peshkov
~~~
(CORE-2018) Only a single client could
access a read-only database.
fixed by V. Khorsun
~~~
(CORE-2016) A client's attempt to use
the XNET protocol causes it to hang if the attachment or the
database has been shut down.
fixed by D. Yemanov
~~~
(CORE-1972) A non-SYSDBA user was able
to change the Forced Writes mode of any database, along
with several other database
characteristics that should be restricted to the SYSDBA. This
long-standing, legacy
loophole in the handling of DPB
parameters could lead to database corruptions or give ordinary users
access
to SYSDBA-only operations.
The changes could affect several
existing applications, database tools and connectivity layers
(drivers, components).
Same fix was backported to v.2.1.2 and
v.2.0.5.
fixed by A. Peshkov
122
Bugs Fixed
~~~
POSIX-specific
(CORE-2221) On POSIX platforms, any
attachment to any database would fail after the access rights for
security2.fdb were modified from 0660
to 0666.
fixed by P. Beach, A. Peshkov
~~~
(CORE-2093) SuperServer startup would
fail on Solaris 64-bit.
fixed by A. Peshkov
~~~
Windows-specific
(CORE-2108) When using the Windows
local protocol (XNET), the next available map number was
calculated incorrectly, thus allowing
the server to try to reuse a map number that already existed. If the
“new”
map's timestamp was equal to the
timestamp of the pre-existing map, it would cause the get_free_slot()
function to fail.
fixed by V. Khorsun
~~~
(CORE-2107) Establishing a TCP\IP
connection to the Windows Classic Server could fail under high load.
fixed by V. Khorsun
~~~
(CORE-1923) Successful execution of
instsvc.exe remove was returning 1 as its completion code, instead
of 0.
fixed by D. Yemanov
~~~
MacOSX-specific
(CORE-2102) Firebird 2.5 would not
build on MacOS (Darwin).
fixed by A. Peshkov
~~~
(CORE-2065) The MacOSX installation
package was in violation of platform rules by not including the
client library in the dynamic loader
search paths.
fixed by P. Beach
123
Bugs Fixed
~~~
Database Monitoring/Administration
(CORE-2209) Monitoring requests in high
load conditions could become very slow and even block other
activity during that time.
fixed by D. Yemanov
~~~
(CORE-2171) The column MON$CALLER_ID of
table MON$CALL_STACK was reporting invalid IDs.
fixed by D. Yemanov
~~~
(CORE-2017) I/O statistics for stored
procedures were not being kept account of in the monitoring tables.
fixed by D. Yemanov
~~~
(CORE-1944) On Big Endian platforms,
the monitoring tables contained wrong data.
fixed by A. Peshkov
~~~
Security
(CORE-2087) When the configuration
parameter RemoteBindAddress specified a hostname instead of an
IP address, or specified a non-existent
IP address, it would be silently ignored and the server would bind to
all
interfaces, without any notification in
firebird.log or the system log. This was considered a potential
security
risk if the system had ports open to
the Internet. Now, an invalid or unavailable IP address will be
resolved to
localhost (127.0.0.1).
fixed by A. Peshkov
~~~
(CORE-2055) Buffer overflow in Firebird
client library.
fixed by A. Peshkov
~~~
International Language Support
(CORE-2278) Conversion from and to
CP943C was incorrect on RISC machines.
fixed by A. dos Santos Fernandes
124
Bugs Fixed
~~~
(CORE-2227) Problems were occurring in
some environments when creating triggers that referred to
column names with accented characters.
fixed by A. dos Santos Fernandes
~~~
(CORE-2123) ?? Problem with getting
UNICODE_FSS data in the CP943C connection charset ??
fixed by A. dos Santos Fernandes, D.
Kovalenko
~~~
(CORE-2122) ?? Translation of large
text blobs between UNICODE_FSS / UTF8 and other charsets ??
fixed by A. dos Santos Fernandes, D.
Kovalenko
~~~
(CORE-2095) Bug in
CVJIS_eucj_to_unicode().
fixed by A. dos Santos Fernandes, D.
Kovalenko
~~~
(CORE-2019) A UTF-8 conversion error
(string truncation) was being thrown unexpectedly.
fixed by dos Santos Fernandes
~~~
(CORE-1989) A column with UNICODE_CI
collation for UTF8 could not be used in a foreign key
constraint.
fixed by A. dos Santos Fernandes
~~~
< |