Firebird™ Version 1.5 Release Notes v.1

auroratexicoSecurity

Jun 19, 2012 (1 year and 10 months ago)

685 views

Firebird™ Version 1.5
Release Notes v.1.5
5 février 2004 version 1.08
Contenu
Notes Générales Alias de base de données
Nouvelles fonctionnalités ! Connexion par un alias de base de données
Compatibilité avec d'anciennes versions ! Noms des bases de données sur Windows
Améliorations du Langage Equipes de développement Firebird
! Data types Notes d'Installation
! Metadata ! Windows 32-bit
! DSQL ! Linux/UNIX
! PSQL ! Solaris
! Firebird 1.0.x ! MacOS X
Nouveaux mots réservés ! FreeBSD
ISQL Plus d'Information
Fonctions externes (UDFs) Outils et pilotes
! ib_udf Documentation
! fbudf Bugs corrigés
Nouveau fichier de Configuration—firebird.conf
! Parametres système de fichiers
! Les paramètres liés aux ressources
! Paramètres liés à la communication
! Spécifique POSIX
! Spécifique Windows
! Espace temporaire
! Compatibilité
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 1 Notes Générales
Le moteur de base de donnée Firebird a été développé par une équipe indépendante de développeurs volontaires à
partir du code source d’Interbase fourni par Borland dans le cadre d’une licence publique désignée par «InterBase
Public License v.1.0» le 25 Juillet 2000.
Le développement de la version Firebird 2 a démarré tôt au cours du cycle de développement de Firebird 1, avec le
portage du code source C de Firebird 1 en C++ ainsi que la première opération majeure de nettoyage de code.
Firebird 1.5 est la première version issue des sources de Firebird 2. Il représente une étape significative pour les
développeurs et pour le projet entier, mais il n’en est pas pour autant la fin. Parallèlement à la diffusion de Firebird
1.5, le re-développement continue jusqu’au prochain jalon sur le chemin menant vers Firebird 2.
Firebird 1.0.x est toujours en maintenance, les corrections importantes de bug ainsi que les améliorations de la
version 1.5 y sont reportées.
Les binaires Firebird 1.5
Les binaires Firebird 1.5
Les binaires Firebird peuvent être téléchargés depuis le site web de Firebird -
http://sourceforge.net/project/showfiles.php?group_id=9028
C Ch ha aiin ne es s d de e v ve er rs siio on n p po ou ur r lle es s lliiv vr ra aiis so on ns s F Fiir re eb biir rd d 1 1..5 5
Win32: "WI-V1.5.0.nnnn Firebird 1.5"
Linux: "LI-V1.5.0.nnnn Firebird 1.5"
Ainsi de suite, où nnnn est le numéro de construction
Veuillez vous référer à Section documentation pour vous procurer les documentations recommandées.
Nouvelles fonctionnalités
Nouvelle base du code, meilleure optimisation
Nouvelle base du code, meilleure optimisation
Cette version a été obtenue à partir du code C d’origine porté en C++, un processus initié par Mike Nordell en
l’année 2000. Le nettoyage approfondi de code ainsi que les corrections de bug se sont poursuivis, avec l’arrivée
d’une nouvelle gestion de mémoire et de l’enrichissement de langage SQL. Non des moindres, pendant le
développement de la v.1.5, l’optimiseur de requêtes SQL a subi des améliorations et des corrections sous l’égide
entre autres d’Arno Brinkman, permettant de constater des gains de 30 à 60% en vitesse d’exécution.
A Ar rc ch hiitte ec cttu ur re e
Deux nouveautés significatives pour la plateforme Windows: Classic server et embedded server.
• Il n’y a pas eu de Classic Server depuis près de huit ans. Celui-ci peut exploiter plusieurs processeurs, ce que ne
sait toujours pas faire SuperServer. Même s’il est utilisable, Classic Server doit être considéré comme
expérimental.
• Embedded server est une dll qui rassemble une connexion client unique et un Superservert Firebird pour
construire des applications autonomes qui soient rapides et efficaces.

Plusieurs nouveautés du langage SQL ont fait leur apparition depuis la version 1.0.x, comprenant les expressions
SQL-92 CASE, COALESCE et NULLIF. Leur syntaxe est détaillée dans la section “Nouveautés du langage” plus loin
dans ce document.
Modules installés et sécurité
Modules installés et sécurité
Si vous utilisiez encore Firebird 1.0.x, vous allez remarquer plusieurs changements dans les noms des modules ainsi
que dans les règles d’accès et de localisation de ces modules. Suivent ci-après quelques uns de ces changements;
pour une information détaillée sur l’installation, l’emplacement des fichiers et la configuration, veuillez consulter
les sections correspondantes dans ce document.
1. La plus part des modules et des constantes ont été renommées. Dans la plus part des cas, les nouveaux noms
comportent une variante du mot « firebird » ou « fb ». Par exemple, la bibliothèque d’API est intégrée dans
bibliothèque partagée nommé “fbclient.dll” sous Windows et “libfbclient.so” sous d’autres plates-formes. Une
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 2exception dans cette règle de nommage : la base de donnée de sécurité, autrefois nommée “isc4.gdb”, est
désormais baptisée “security.fdb”.
2. Les fichiers externes utilisés par le serveur (bibliothèques UDF, filtres de BLOB, bibliothèque de jeu de
caractère, tables externes) sont désormais assujettis aux niveaux de protections du système de fichier qui, dans
certains cas, correspond à un niveau différent de celui qu’on avait sous Firebird 1.0.x ou InterBase.
3. Le nouveau fichier de configuration du serveur, firebird.conf, qui remplace ibconfig (Windows) et isc_config
(autres plates-formes) comporte plusieurs nouveaux paramètres et bénéficie d’une organisation améliorée tout
en étant auto-documenté.
4. La désignation d’une base de donnée par un alias a été ajoutée à Firebird 1.5. Vous pouvez désormais
optionnellement désigner dans votre application la localisation du fichier base de donnée par un alias en
remplacement de son chemin complet. La correspondance entre l’alias et le chemin complet est consignée dans
un fichier texte coté serveur, aliases.conf. Le but principal de l’utilisation d’un alias est de protéger la
localisation physique de vos bases contre une tentative malveillante d’intrusion via l’observation du trafic
réseau.
5. Le comportement par défaut sous Windows Server fait que le compte local « system » lance le programme qui
installe le service Firebird au démarrage du système. Cela peut se révéler comme une vulnérabilité de sécurité
si le serveur Firebird venait à être piraté, dans la mesure où il fournit une fenêtre à partir de laquelle le pirate
a accès à toute la machine. La version 1.5 de ce programme (instsvc.exe) accepte désormais une ouverture de
session Windows pour l’installation du service. Il est fortement recommandé de créer un compte utilisateur
Firebird à cet effet et faire usage de cette nouvelle fonctionnalité d’ouverture de session lors de l’installation si
votre serveur est connecté à l’internet d’une quelconque façon.
Suppression des espaces des champs Varchar pour les protocoles Client / Serveur
Suppression des espaces des champs Varchar pour les protocoles Client / Serveur
Il s’agit d’éviter de transférer à travers le réseau les caractères ESPACE se trouvant à droite des champs VARCHAR.
Les travaux ont été repris et terminés sur cette fonctionnalité pour la version 1.5.
NOTE : Comme c’est le client qui demande au serveur la suppression des espaces, la couche cliente Firebird 1.5
(fbclient.dll ou libfbclient.so) va bénéficier de cette fonctionnalité même si vous êtes connecté à une version
Firebird Serveur antérieure à 1.5. Si vous utilisez une ancienne version du client, vous ne tirerez pas profit de cette
fonctionnalité, que vous soyez connecté à une version Firebird Serveur 1.5 ou ultérieure.
Sémantiques Multi-action pour le codage des déclencheurs
Sémantiques Multi-action pour le codage des déclencheurs
Maintenant, vous pouvez coder conditionnellement les actions insert/update/delete dans un même trigger, celui-ci
couvrant alors toutes les actions pour une phase. Cela réduit d’une manière significative le code et la maintenance
des triggers tout en gardant la possibilité de définir plusieurs triggers par phase.
Amélioration dans le nommage des contraintes
Amélioration dans le nommage des contraintes
Les indexes qui servent au respect des contraintes d’intégrité peuvent être nommés par des identificateurs définis
par l’utilisateur.
Nombre maximum d’indexes par table augmenté
Nombre maximum d’indexes par table augmenté
Dans les deux versions 1.0 et 1.5, le nombre maximum d’indexes que vous pouvez définir par table passe de 64 à
(DB_PAGE_SIZE/16)-2.
NOTE Quand le nombre réel d’indexes pour une table dépasse 256, le comportement du moteur de base de donné
devient instable.
V Ve er rr ro ou uiilllla ag ge e P Pe es ss siim miis stte e
Pour les rares fois où vous avez besoin d’imposer un verrou pessimiste (pré-verrouillage), la version 1.5 ajoute une
nouvelle syntaxe pour placer des verrous en lecture sur les enregistrements au moment où ils sont envoyés au
client. A utiliser avec précaution.
Cache des connections à la base de donnée de sécurité
Cache des connections à la base de donnée de sécurité
La connexion à la base de donnée de sécurité fait l’objet d’un cache dans les versions SuperServer. Cela signifie que
le fichier security.fdb est chargé dès la première connexion et reste attachée (fichier verrouillé) jusqu’à la fin de la
dernière connexion client.
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 3 A Am mé élliio or ra attiio on n d du u ttr ra aç ça ag ge e d de es s e er rr re eu ur rs s
Quand cela est possible, les messages d’erreurs indiquent la cause d’erreur SQL d’une manière plus détaillée. Il est
important de noter que vous allez recevoir des messages bizarres si vous utilisez un ancien fichier interbase.msg ou
firebird.msg.
C Ch ha an ng ge em me en ntts s d da an ns s lle es s m mo od du ulle es s c clliie en ntt
Clients Windows
La bibliothèque client s’appelle "fbclient.dll". Tous les utilitaires serveur (gbak, gfix, etc. …) utilisent uniquement
cette bibliothèque. Il est recommandé de connecter les nouvelles applications en utilisant fbclient.dll, sans qu’il y
ait besoin du fichier gds32.dll.
Pour maintenir la compatibilité avec des applications existantes, une bibliothèque passerelle "gds32.dll" a été
ajoutée au kit de distribution. Cette bibliothèque ne comporte aucun code mais se contente de rediriger les appels
API vers fbclient.dll. Par conséquent, pour les anciennes applications, vous devez placer cette version de gds32.dll
ainsi que fbclient.dll dans le répertoire du programme de l’application ou bien dans le répertoire système de l’OS.
Clients Linux
La bibliothèque cliente du Superserver est renommée “libfbclient.so”. Pour maintenir la compatibilité avec des
applications existantes, un lien symbolique “libgds.so” est installé et pointe vers libfbclient.so. Le client local pour
les applications embarquées se connectant au ClassicServer a été renommé libfbembed.so.
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 4 Modules et fichiers renommés
Modules et fichiers renommés
Platform Module Firebird 1.0 Firebird 1.5 Special notes
All Security Isc4.gdb security.fdb
database
All Message file Interbase.msg firebird.msg
All Server log file interbase.log firebird.log
All ODS version 10 10.1 Nouvelle ODS (10.1). n’induit
aucune incompatibilitié avec les
versions précédentes d’ODS mais
la mise à jour n’est pas
automatique. Firebird 1.0 et 1.5
peuvent exploiter des bases de
données en ODS 10.0 et 10.1.
Néanmoins , la procédure de
sauvegarde/restauration est
toujours recommandée pour
migrer des bases de données entre
serveurs de versions différentes.
Linux Classic server gds_inet_server fb_inet_server
binary
Linux Classic lock ib_lock_mgr fb_lock_mgr
manager
Linux Superserver ibmgr.bin fbmgr.bin
control
Linux Superserver ibserver fbserver
binary
Linux Configuration isc_config firebird.conf
file
Linux Client library libgds.so libfbclient.so Client “Thread-safe” distant et
client TCP/IP local loopback pour
Superserver
libfbembed.so Client local (un seul utilisateur,
non-thread-safe) pour Classic
Linux Client library N/A libgds.so
symlink for
compatibility
Windows Guardian ibguard.exe fbguard.exe
Windows Superserver ibserver.exe fbserver.exe Ne prend pas en charge les
binary configurations multiprocesseur
Windows Classic binary N/A fb_inet_server.exe Connexion locale non-disponible
sous Windows.
TCP/IP, NetBEUI OK.
Prend en charge les configurations
multiprocesseur
Platform Module Firebird 1.0 Firebird 1.5 Notes Spéciales
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 5Windows Client library gds32.dll fbclient.dll Les utilitaires Fb 1.5 ainsi que les
nouvelles applications ne
nécessitent que fbclient.dll.
Voir notes ci-après à propos de la
compatibilité gds32.dll pour les
anciennes applications.
Windows Client library N/A gds32.dll
stub for
compatibility
Windows Configuration ibconfig firebird.conf
file
Windows Local IPC port InterBaseIPI FirebirdIPI La configuration par défaut
n’autorise pas des connexions
locales à partir d’applications
utilisant une ancienne version de
la dll gds.dll. Si nécessaire, il est
possible de configurer le serveur
afin qu’il utilise l’ancien nom du
IPC MAP, via firebird.conf.
Windows Default Registry HKLM\/SOFTWARE HKLM\SOFTWARE\ Le chemin est indiqué par le
key \\Borland\\InterBasSOFTWARE\Firebird paramètre "DefaultInstance". i.e.
e project\Firebird plus de clé"CurrentVersion", et
Server\Instances "RootDirectory" remplacé par
"DefaultInstance".
Les nouveaux noms de services sous Windows sont « Firebird Guardian – DefaultInstance » et « Firebird
Server – DefaultInstance »
Compatibilité
O On n- -d diis sk k s sttr ru uc cttu ur re e ( (O OD DS S) )
La structure disque des fichiers Firebird 1.5 est désignée par ODS 10.1. Cette mise a jour mineure était nécessaire
parce que :
- trois nouveaux indexes pour les tables système
- changements mineures dans le BLR (code SQL compilé) de deux triggers système
- amélioration du codage de RDB$TRIGGER_TYPE.
Certaines améliorations nécessitant la modifications de l’ODS ont été repoussées à la version 2.
En attendant, vous devriez être en mesure de porter vos bases de donnée Firebird 1.0.x directement. Par sécurité,
procédez à des tests sur des backups de vos bases 1.0.x avant le portage définitif.
B Ba as se es s d de e d do on nn né ée e IIn ntte er rB Ba as se e™ ™
Si vous voulez essayer Firebird avec des bases existantes Interbase, tout en ayant l’intention de les reconvertir en
Interbase, prenez la précaution de les sauvegarder d’abord avec l’utilitaire gbak d’Interbase. Pour commencer à
travailler avec vos bases sous Firebird 1.5, utilisez la version Firebird 1.5 de gbak pour restaurer votre sauvegarde.
Le manuel “Operations Guide”, disponible à l’url InterBase® 6.0 beta documentation set, décrit la syntaxe de la
commande de sauvegarde et restauration gbak.
Les bases de donnée IB 7.x, et probablement IB 6.5, après migration vers Firebird 1.5 peuvent présenter des
dysfonctionnements si vous y avez utilisé des fonctionnalités nouvelles propres à ces versions d’IB.
Nommage des fichiers et leurs localisations
Nommage des fichiers et leurs localisations
Dans cette version, plusieurs fichiers programme ont été renommés et ce dans le cadre du remplacement progressif
des noms hérités d’ InterBase® 6. Veuillez lire la section correspondante pour une description plus détaillée.
E Ex xé éc cu uttiio on n s siim mu ulltta an né ée e d de es s s se er rv ve eu ur rs s F Fiir re eb biir rd d 1 1..5 5 e ett IIn ntte er rb ba as se e
Le renommage de quelques objets système permet l’installation et l’exécution de FB1.5 sur une machine où est
déjà installé Interbase ou FB 1.0.x. Sous Windows, FB 1.5 utilise aussi une clé de registre différente. Si vous
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 6paramétrez les serveurs de sorte qu’ils utilisent des ports réseau différents, il est alors possible de faire tourner
simultanément plusieurs instances du serveur FB 1.5 ou bien une instance FB 1.5 et une instance IB ou FB 1.0.x.
R Re etto ou ur r à à F Fiir re eb biir rd d 1 1..0 0..x x
En raison du grand nombre de bugs corrigés, le comportement des bases de donnée peut changer si vous passez de
FB 1.5 à FB 1.0.x. Soyez attentifs à l’apparition d’un fichier README détaillant de tels problèmes au grès de leur
apparitions.
C Co om mp pa attiib biilliitté és s L Liin nu ux x
En raison de problèmes historiques avec le compilateur GNU C++, la version Firebird 1.5 Linux nécessite une version
plus récente des runtimes glibc que précédemment. Cela signifie, malheureusement, que nous sommes dans une
période pendant laquelle la capacité d’une distribution particulière à installer et exécuter les binaires FB 1.5 est
difficile à prédire. Cependant, toute autre information est la bienvenue. N’hésitez pas à partager vos expériences
avec les différentes distributions sur le forum firebird-devel.
Distro Level Classic Superserver
Red Hat 7.x Non Non
8.0 Quelques problèmes rapportés Quelques problèmes rapportés
updated from 7.x
8.0 Oui Oui
clean install
Mandrake 8.x Non Non
9.0 Oui, avec Oui, avec
glibc-2.3.1-10mdk.i586.rpm Glibc-2.3.1-10mdk.i586.rpm
9.1 Oui Oui
SuSE 8.0 Oui Inconnu
8.1 Oui Non

Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 7 Améliorations du Langage
T TY YP PE ES S D DE E D DO ON NN NE EE ES S
(1.5) Nouveaux types de donnée natifs
BIGINT
Conforme au type SQL99 exact numeric , 64-bit signé, avec une précision de zéro. Disponible en Dialecte 3 seulement.
Example(s)
i)
DECLARE VARIABLE VAR1 BIGINT;
ii)
CREATE TABLE TABLE1 (FIELD1 BIGINT);
M ME ET TA AD DA AT TA A
(1.5) Amélioration dans le nommage des contraintes
Dmitry Yemanov
Les indexes qui servent au respect des contraintes d’intégrité peuvent être nommés par des identificateurs définis
par l’utilisateur.
Précédemment, bien qu’il était possible de créer en les nommant explicitement des contraintes de clé primaire, de
clé étrangère et d’index unique, il n’en demeurait pas moins que les identificateurs des contraintes générées
automatiquement étaient calculés par le système, tels que RDB$FOREIGN13, et ne pouvaient être renommés. Ce
comportement est toujours celui qui est par défaut si on ne nomme pas explicitement les contraintes.
Toutefois, des extensions du langage ont été ajoutées pour permettre :
a) à un index généré par le système de recevoir le même nom que la contrainte qu’il impose.
b) à un index, qui impose une contrainte nommée ou non nommée, de recevoir explicitement un nom personnalisé
et d’être optionnellement construit dans un ordre descendant.
NOTE : Il n’est actuellement pas possible d’utiliser un index pré-existant
Syntax
...
[ADD] CONSTRAINT [<constraint-identifier>]
<constraint-type> <constraint-definition>
[USING [ASC[ENDING] | DESC[ENDING]] INDEX <index_name>]
Exemples
i) Contrainte nommée et index explicitement nommé
CREATE TABLE ATEST (
ID BIGINT NOT NULL,
DATA VARCHAR(10));
COMMIT;
L’instruction suivante va créer une contrainte de clé primaire nommée PK_ATEST imposée pas un index descendant
nommé IDX_PK_ATEST:
ALTER TABLE ATEST
ADD CONSTRAINT PK_ATEST PRIMARY KEY(ID)
USING DESC INDEX IDX_PK_ATEST;
COMMIT;
ii) Autre alternative à l’exemple ci-dessus :
CREATE TABLE ATEST (
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 8 ID BIGINT NOT NULL,
DATA VARCHAR(10),
CONSTRAINT PK_ATEST PRIMARY KEY(ID)
USING DESC INDEX IDX_PK_ATEST;
iii) L’instruction suivante crée la table ATEST avec la clé primaire PK_ATEST.
L’index sous-jacent est aussi nommé PK_ATEST.
CREATE TABLE ATEST (
ID BIGINT NOT NULL,
DATA VARCHAR(10),
CONSTRAINT PK_ATEST PRIMARY KEY(ID));
(1.5) Trigger mMulti-action
Dmitry Yemanov
La définition des triggers a été modifiée pour permettre la prise en charge conditionnelle de plusieurs actions dans
une même définition.
Syntax
CREATE TRIGGER name FOR table
[ACTIVE | INACTIVE]
{BEFORE | AFTER} <multiple_action>
[POSITION number]
AS trigger_body
<multiple_action> ::= <single_action> [OR <single_action> [OR <single_action>]]
<single_action> ::= {INSERT | UPDATE | DELETE}
Exemples
i)
CREATE TRIGGER TRIGGER1 FOR TABLE1
[ACTIVE] BEFORE INSERT OR UPDATE AS
...;
ii)
CREATE TRIGGER TRIGGER2 FOR TABLE2
[ACTIVE] AFTER INSERT OR UPDATE OR DELETE AS
...;
Changement dans la structure disque ODS
Le codage du champ RDB$TRIGGER_TYPE (table RDB$TRIGGERS) a été étendu pour permettre la prise en charge
conditionnelle de plusieurs actions. Pour plus de détail, reportez vous au document readme.universal_triggers.txt
dans la branche /doc/sql.extensions de l’arborescence CVS de Firebird.
Note(s):
1. Les triggers anciens (à une action) sont totalement compatibles au niveau ODS avec FB 1.0.
2. Le codage (BLR) du champ RDB$TRIGGER_TYPE est dépendant de l’ordre d’apparition des actions, BEFORE
INSERT OR UPDATE et BEFORE UPDATE OR INSERT vont être codés différemment, même s’ils sont
sémantiquement équivalents et s’exécutent de la même manière.
3. Les deux variables contextuelles OLD et NEW sont disponibles dans les triggers multi-action. Si un appel du
trigger interdit l’utilisation de l’un d’eux (OLD pour une opération d’insertion), alors tous les champs de ce
contexte sont évalués à NULL. S’ils sont affectés à un contexte inapproprié, une exception runtime sera
déclenchée.
4. Les nouvelles variables booléennes INSERTING/UPDATEING/DELETING peuvent être utilisés pour vérifier le type
d’action en temps exécution. (Voir ci-dessous.)
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 9 (1.5) RECREATE VIEW
Exactement pareil que CREATE VIEW si l’objet vue n’existe pas déjà. S’il existe, RECREATE VIEW va tenter de le
supprimer et de créer un nouvel objet. RECREATE VIEW échoue si l’objet est référencé par ailleur.
Utilise la même syntaxe que CREATE VIEW.
(1.5) CREATE OR ALTER {TRIGGER | PROCEDURE }
Instruction qui va créer un nouvel objet trigger/procedure (s’il n’existe pas) ou bien le changer et le recompiler s’il
existe.. La syntaxe CREATE OR ALTER préserve les dépendances et les permissions existantes.
Cette nouvelle syntaxe est identique à CREATE TRIGGER | CREATE PROCEDURE, respectivement, excepté pour le
mot-clé “OR ALTER”.
(1.5) NULLs dans les contraintes uniques et indexes
Dmitry Yemanov
Il est désormais possible de définir une contrainte UNIQUE ou un unique index pour un champ n’ayant pas de
contrainte NOT NULL. Ceci est conforme aux spécifications SQL-99. Soyez prudent quant à l’utilisation de cette
définition si vous prévoyez de reconvertir votre base de donnée en FB 1.0 ou n’importe quelle version d’Interbase.
La logique d'essai est la suivante:
<unique constraint definition> ::=
<unique specification> ( <unique column list> )
<unique specification> ::= {UNIQUE | PRIMARY KEY}
1) Si <unique specification> spécifie PRIMARY KEY, alors considérer SC comme étant la condition suivante:
UNIQUE ( SELECT UCL FROM TN ) AND ( UCL ) IS NOT NULL
ii) Sinon, considérer SC comme suit:
UNIQUE ( SELECT UCL FROM TN )
où UNIQUE signifie que s’il n’y a pas deux enregistrements dans ( SELECT UCL FROM TN ) tels que la valeur de
chaque champ de la liste dans un enregistrement est non nulle et n’est pas distincte de la valeur du champ
correspondant dans l’autre enregistrement, alors le résultat est VRAI; autrement il est FAUX.
La contrainte permet l’existence uniquement d’enregistrements pour lesquels la condition mentionnée ci-dessus est
évaluée à VRAI. Cela signifie que la contrainte PRIMARY KEY n’autorise pas des valeurs à NULL tandis que la
contrainte UNIQUE autorise un nombre arbitraire de valeurs à NULL. Pour des résultats multi-colonne de ( SELECT
UCL FROM TN ), les règles générales pour les NULLs sont appliquées, c.à.d (1, NULL) est différent de (NULL, 1) et
(NULL, NULL) est distinct de tout autre (NULL, NULL).
D DS SQ QL L
(1.5) Expressions et variables comme arguments de procedure
Dmitry Yemanov
Les appels de procédure EXECUTE PROCEDURE ProcName(<Argument-list>) et
SELECT <Output-list> FROM ProcName(<Argument-list>) acceptent maintenant comme arguments des variables
locales (en PSQL) et des expressions (en DSQL et PSQL).
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 10 (1.5) Support des instructions de type CASE
Arno Brinkman
a) CASE
Permet la détermination de la valeur d’une colonne par un choix parmi un groupe de conditions exclusives.
Syntax
<case expression> ::=
<case abbreviation> | <case specification>
<case abbreviation> ::=
NULLIF <left paren> <value expression> <comma> <value expression> <right paren>
| COALESCE <left paren> <value expression> { <comma> <value expression> }... <right paren>
<case specification> ::=
<simple case> | <searched case>
<simple case> ::=
CASE <value expression> <simple when clause>...
[ <else clause> ]
END
<searched case> ::=
CASE <searched when clause>...
[ <else clause> ]
END
<simple when clause> ::= WHEN <when operand> THEN <result>
<searched when clause> ::= WHEN <search condition> THEN <result>
<when operand> ::= <value expression>
<else clause> ::= ELSE <result>
<result> ::= <result expression> | NULL
<result expression> ::= <value expression>
Exemples
i) simple
SELECT
o.ID,
o.Description,
CASE o.Status
WHEN 1 THEN 'confirmed'
WHEN 2 THEN 'in production'
WHEN 3 THEN 'ready'
WHEN 4 THEN 'shipped'
ELSE 'unknown status ''' || o.Status || ''''
END
FROM Orders o;
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 11ii) recherché
SELECT
o.ID,
o.Description,
CASE
WHEN (o.Status IS NULL) THEN 'new'
WHEN (o.Status = 1) THEN 'confirmed'
WHEN (o.Status = 3) THEN 'in production'
WHEN (o.Status = 4) THEN 'ready'
WHEN (o.Status = 5) THEN 'shipped'
ELSE 'unknown status ''' || o.Status || ''''
END
FROM Orders o;
b) COALESCE
Permet la détermination de la valeur d’une colonne à partir d’une succession d’expressions, la valeur retournée
étant la première expression évaluée à non - NULL.
Format
<case abbreviation> ::=
| COALESCE <left paren> <value expression> { <comma> <value expression> }... <right paren>
Syntax Rules
i) COALESCE (V1, V2) est équivalente à la spécification de type CASE suivante:
CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END
ii) COALESCE (V1, V2,..., Vn), pour n >= 3, est équivalente à ce qui suit:
<case specification>:
CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2,...,Vn) END
Exemples
SELECT
PROJ_NAME AS Projectname,
COALESCE(e.FULL_NAME,'[> not assigned <]') AS Employeename
FROM
PROJECT p
LEFT JOIN EMPLOYEE e ON (e.EMP_NO = p.TEAM_LEADER);
SELECT
COALESCE(Phone,MobilePhone,'Unknown') AS "Phonenumber"
FROM
Relations
c) NULLIF
Retourne NULL pour une sous-expression si elle est évaluée à une valeur spécifique, sinon retourne la valeur de la
sous-expression.
Format
<case abbreviation> ::=
NULLIF <left paren> <value expression> <comma> <value expression> <right paren>
Syntax Rules
NULLIF (V1, V2) est équivalente à la spécification de type CASE suivante:
CASE WHEN V1 = V2 THEN NULL ELSE V1 END
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 12Example
UPDATE PRODUCTS
SET STOCK = NULLIF(STOCK,0)
(1.5) Instruction SAVEPOINT conforme à SQL99
Nickolay Samofatov
L’instruction SAVEPOINT (connue aussi sous le nom de transactions imbriquées) fournie un moyen pratique pour
manipuler des erreurs de logique métier sans devoir annuler toute la transaction. Utilisable uniquement en DSQL.
Utilisez l’instruction SAVEPOINT pour identifier une étape dans la transaction à laquelle reprendra l’exécution en
cas d’annulation (rollback).
SAVEPOINT <identifier>;
<identifier> spécifie le nom du SAVEPOINT à créer. Après la création d’un SAVEPOINT, vous pouvez continuer
l’exécution, confirmer (COMMIT) la transaction, annuler (ROLLBACK) toute la transaction ou annuler la partie de la
transaction qui s’est exécutée depuis le SAVEPOINT.
Le nom d’un SAVEPOINT doit être unique au sein d’une même transaction. Si vous créez un deuxième SAVEPOINT
avec le même nom qu’un SAVEPOINT crée précédemment, ce dernier est effacé et ne fera plus l’objet d’un
ROLLBACK partiel.
ROLLBACK [WORK] TO [SAVEPOINT] <identifier>;
Cette instruction réalise les opérations suivantes:
- Annule les modifications réalisées depuis le SAVEPOINT
- Efface tous les SAVEPOINT crées depuis ce SAVEPOINT. Le SAVEPOINT nommé est preservé, vous permettant
ainsi de le désigner à plusieurs reprises comme point d’annulation partielle. Les SAVEPOINT définis
précédemment sont aussi préservés.
- Libère tous les verrous d’enregistrement implicites et explicites posés depuis le SAVEPOINT. Les autres
transactions qui ont tenté d’accéder aux enregistrements verrouillés après le SAVEPOINT doivent attendre
jusqu’à ce que la transaction soit confirmée (COMMIT) ou annulée (ROLLBACK). Les transactions qui n’avaient
pas encore tenté d’accéder aux enregistrements en question peuvent le faire et y auront accès
immédiatement.
Note: ce comportement est susceptible de changer dans les prochaines versions.
La journalisation induite par l’annulation d’un SAVEPOINT peut consommer un quantité importante de la mémoire
du serveur, surtout si vous modifiez les même enregistrements plusieurs fois dans la même transaction. Utilisez
l’instruction RELEASE SAVEPOINT pour libérer les ressources système consommées par la mise en oeuvre d’un
SAVEPOINT.
RELEASE SAVEPOINT <identifier> [ONLY];
L’instruction RELEASE SAVEPOINT supprime l’identificateur du SAVEPOINT du contexte de la transaction. À moins
que vous n’utilisiez le mot clé ONLY, tous les SAVEPOINT établis depuis le SAVEPOINT <identifier> sont aussi
supprimés.
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 13Exemple d’utilisation de SAVEPOINT
create table test (id integer);
commit;
insert into test values (1);
commit;
insert into test values (2);
savepoint y;
delete from test;
select * from test; -- returns no rows
rollback to y;
select * from test; -- returns two rows
rollback;
select * from test; -- returns one row
SAVEPOINT interne
Par défaut, le moteur de base de donnée utilise un SAVEPOINT système automatique (non déclaré) pour réaliser
l’annulation d’une transaction. Quand vous utilisez une instruction ROLLBACK, toutes les modifications appliquées
dans le cadre de cette transaction sont annulées via un SAVEPOINT interne et la transaction est alors confirmée.
Cette logique réduit la quantité de mémoire à libérer pour un ROLLBACK de transaction.
Quand le volume des modifications appliquées dans le cadre d’un SAVEPOINT interne devient trop important (10^4-
10^6 enregistrements affectés) le serveur annule le SAVEPOINT interne et utilise un mécanisme nommé TIP pour
annuler la transaction si nécessaire. Si vous prevoyez un tel volume de modifications dans le cadre d’une seule
transaction, vous pouvez utiliser l’indicateur TPB isc_tpb_no_auto_undo pour éviter la création d’un SAVEPOINT
interne.
SAVEPOINT et PSQL
Implémenter le mécanisme des SAVEPOINT en PSQL ferait voler en éclat le règle d’atomicité des instructions,
incluant les appels de procédures stockées. Firebird fournit une gestion d’exception en PSQL pour annuler les
modifications appliquées dans une procédure stockée ou dans un trigger. Chaque SQL/PSQL instruction est exécutée
dans le cadre d’un SAVEPOINT interne lequel garantit que toute l’instruction sera exécuté avec succès ou bien
toutes les modifications seront annulées et une exception est déclenchée. Chaque bloc de gestion d’exception PSQL
est aussi pris en charge par un SAVEPOINT interne.
(1.5) Verrous explicites
Nickolay Samofatov
L’ajout de la clause optionnelle WITH LOCK permet, d’une manière limitée toutefois, de poser un verrou pessimiste.
Il convient de l’utiliser avec précaution et seulement dans le cas ou le jeu de lignes affectées est a) très petit
(idéallement, un singleton) et b) bien controlé par le code de l’application.
Le besoin d’utiliser des verrous pessimistes avec firebird est très peu fréquent et doit être bien compris avant de
l’utiliser.
Syntax
SELECT ... FROM <sometable>
[WHERE ...]
[FOR UPDATE [OF ...]]
WITH LOCK;
Si la clause WITH LOCK est valide, cela emp^chera tout autre transaction d’accéder aux lignes sélectionnées , tant
que la transaction durera.
Si la clause FOR UPDATE est utilisée, le verrou s’appliquera à chaque ligne, une par une, au moment du fetch. Il est
alors possible qu’un verrou soit valide alors même qu’une ligne est verrouillée par une autre transaction.
Il est essentiel de bien comprendre les niveau d’isolation et les attributs des transactions avant d’utiliser des
verrous explicites dans votre application.
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 14La construction SELECT... WITH LOCK est disponible pour DSQL et PSQL. Cela ne peux fonctionner que sur un SELECT
de premier niveau, sur une seule table. Cela n’est pas disponible pour des jointures ou des sous SELECT. L’
operateur DISTINCT , la clause GROUP BY ou tout autre opération d’aggrégat ne peuvent être utilisés. Cela ne peut
être utilisé sur une vue ou le résultat d’une procédure stockée.
Comprendre la clause WITH LOCK
Comme le moteur prend en charge, chacun à leur tour, les enregistrements concernés par le verrou explicite, il
retourne soit le numéro de version de l’enregistrement commité, soit une exception.
Les paramètres du comportement du Wait et les conflits possibles sont les suivants :.
TPB mode Comportement
Les verrous explicites sont surchargés par les verous implicit ou explicite des tables
isc_tpb_consistency
et sont ignorés
Si un enregistrement est modifié par une transaction qui a été validée (commit)
isc_tpb_concurrency
depuis que la transaction essayant d’obtenir un verrous explicite, ou qu’une
+ isc_tpb_nowait
transaction active à modifié cet enregistrement, une exception de conflit de mise à
jour est renvoyée
Si l'enregistrement est modifié par une transaction qui a été validée (commit) depuis
isc_tpb_concurrency
que la transaction qui essaie d’obtenir un verrou est lancée, une exception de conflit
+ isc_tpb_wait
de mise à jour est renvoyée.
Si une transaction active est proprétaire de l’enregistrement (par un verrou explicite
ou par un verrou optimiste) la transaction tentant d’obtenir le verrou explicite va
attendre et tenter encore d’obtenir le verrou. Cela veut dire que si la transaction
bloquant l’enregistrement valide une version modifée de cet enregistrement, une
exception de conflit de mise à jour sera renvoyée.
Si une transaction active est proprétaire de l’enregistrement (par un verrou explicite
isc_tpb_read_committed
ou par un verrou optimiste) , une exception de conflit de mise à jour est renvoyée.
+ isc_tpb_nowait
Si une transaction active est proprétaire de l’enregistrement (par un verrou explicite
isc_tpb_read_committed
ou par un verrou optimiste), la transaction tentant d’obtenir le verrou explicite va
+ isc_tpb_wait
attendre et tenter encore d’obtenir le verrou, il n’y aura jamais de conflit de mise à
jour dans ce cas.
Quand une commande UPDATE est lancé sur un enregistrement qui est verroullé par une autre transaction, soit une
expetion est levée soit elle attend que la transaction qui verrouille l’enregistrement se termine, en fonction du TPB
mose. Le comportement du moteur est le même si l’enregistrement a été modifié par la transaction qui avait le
verrou.
Le moteur garantie que tous les enregistrements concernés par un verrou explicite sont réellement verrouillés et
correspondent à la condition WHERE, tant que les conditions de recherches ne dépendent pas d’une autre table, par
le biais d’une jointure (JOIN) ou d’une sous requête, etc. Le moteur garantie aussi qu’une ligne ne correspondant
pas aux conditions de recherche ne sera pas vérrouillée. Il peut tout de même y avoir des lignes qui satisfont les
conditions de recherche mais qui ne sont pas vérouillées. Cette situation peut arriver quand une autre transaction
parallèle valide (COMMIT) des changements pendant l’exécution de la commande de verrouillage.
Le moteur verrouille les lignes au moment du fetch. Cela à une grande impportance si vous verrouillez plusieures
lignes à la fois. De nombreuses méthodes d’accès aux bases de données Firebird renvoient par défaut des paquets de
quelques centaines de lignes.De ce fait, la plupart des composants d’accès aux données ne peuvent vous renvoyer
les lignes contenues dans le dernier paquet du fetch quand une erreur est renvoyée.
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 15La clause FOR UPDATE permet d’éviter ce système de paquet en cache, avec l’option OF <column-names>.
Autrement, vous pouvez paramétrer vos composants d’accès pour n’avoir que des paquets d’une ligne. Cela vous
permet de traiter la ligne en cours de verrouillage avant que la procaine sont envoyée et verrouillée, ou pour gérer
les erreurs sans annuler (rollback) toute la transaction.
Annuler (roll back) une transaction avec un savepoint implicite ou explicite libère l’enregistrement mais ne prévient
pas les les transactions en attente. Les applications ne doivent pas dépendre de ce comportement car il va
certainement changer dans le futur.
Si les verrous explicites permettent de gérer des conflits de mises à jour inablituels, la contrepartie est que les
verrous mortels peuvent survenir rapidement si vous ne controlez pas rigoureusement votre stratégie. La plupart
des applications non pas besoin de verrous explicites. Les principaux intérêts des verrous explicites sont de (1)
eviter des conflits de mise à jour avec des aplication très chargées et (2) maintenir l’intégrité des objets impliqués
dans un contexte de cluster. Si votre usage de correspond pas à une de ces deux cas de figure, vous faites fausse
route, ce n’est pas la bonne manière de faire ce travail avec Firebird.
Les verrous explicites sont une fonctionnalité avancée, ne vous trompez pas sur sont usage ! Si une solution de ce
type peut être très importante pour des sites web gérant des centaines d’écritures concurrentes our pour des
systèmes d’ERP/CRM, la plupart des applications non pas besoin de travailler avec de telles conditions.
Exemples
i) (simple)
SELECT * FROM DOCUMENT WHERE ID=? WITH LOCK
ii) (plusieureslignes,traitées une à une avec un curseur DSQL)
SELECT * FROM DOCUMENT WHERE PARENT_ID=? FOR UPDATE WITH LOCK
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 16 (1.5) Amélioration du traitement des aggrégats
Arno Brinkman
Avant les groupes ne pouvaient être fait que sur des colonnes nommées. Avec Firebird 1.0, il est devenu possible
de grouper par une expression UDF. Avec 1.5, des extensions ont été mises en oeuvre et la clause GROUP BY peut
porter sur le rang de sortie des colonnes (l’ordre étant le même que pour ORDER BY, de gauche à droite) ou sur
diversses expressions.
NOTE: Toutes les expressions ne sont pas acceptées dans des listes GROUP BY. Par exemple, la concatenation n’est
pas permise.
Syntaxe Group By
SELECT ... FROM .... [GROUP BY group_by_list]
group_by_list : group_by_item [, group_by_list];
group_by_item : column_name
| degree (ordinal)
| udf
| group_by_function;
group_by_function : numeric_value_function
| string_value_function
| case_expression
;
numeric_value_function : EXTRACT '(' timestamp_part FROM value ')';
string_value_function : SUBSTRING '(' value FROM pos_short_integer ')'
| SUBSTRING '(' value FROM pos_short_integer FOR nonneg_short_integer
')'
| KW_UPPER '(' value ')'
;
Le group_by_item ne peut référencer une-fonction d’aggrégat (même incluse dans une expression) dans le même
contexte.
HAVING
La clause having ne peut utiliser que des fonctions d’aggregat ou des expressions valides qui font partie de la clause
GROUP BY. Avant il était possible d’utiliser une colonne qui ne faisait pas partie de la clause GROUP BY et d’utiliser
une expression non valide.
ORDER BY
Quand on utilise un aggregat, la clause ORDER BY n’est utilisable qu’avec une expression valide qui est un agrégat
ou une expression faisant partie de la clause GROUP BY. Avant il était possible d’utiliser une expression non valide.
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 17Fonction d’agrégat dans une sous-requête
Il est maintenant possible d’utiliser une fonction d’agrégat ou une expression contenue dans la clause GROUP BY
dans une sous-requête.
Exemples
SELECT
r.RDB$RELATION_NAME,
MAX(r.RDB$FIELD_POSITION),
(SELECT
r2.RDB$FIELD_NAME
FROM
RDB$RELATION_FIELDS r2
WHERE
r2.RDB$RELATION_NAME = r.RDB$RELATION_NAME and
r2.RDB$FIELD_POSITION = MAX(r.RDB$FIELD_POSITION))
FROM
RDB$RELATION_FIELDS r
GROUP BY
1
SELECT
rf.RDB$RELATION_NAME AS "Relationname",
(SELECT
r.RDB$RELATION_ID
FROM
RDB$RELATIONS r
WHERE
r.RDB$RELATION_NAME = rf.RDB$RELATION_NAME) AS "ID",
COUNT(*) AS "Fields"
FROM
RDB$RELATION_FIELDS rf
GROUP BY
rf.RDB$RELATION_NAME
Mélanger des fonction d’agrégat de différents contextes
Des fonctions d’agrégat de différents contextes peuvent être utilisés dans une expression.
Exemple
SELECT
r.RDB$RELATION_NAME,
MAX(i.RDB$STATISTICS) AS "Max1",
(SELECT
COUNT(*) || ' - ' || MAX(i.RDB$STATISTICS)
FROM
RDB$RELATION_FIELDS rf
WHERE
rf.RDB$RELATION_NAME = r.RDB$RELATION_NAME) AS "Max2"
FROM
RDB$RELATIONS r
JOIN RDB$INDICES i on (i.RDB$RELATION_NAME = r.RDB$RELATION_NAME)
GROUP BY
r.RDB$RELATION_NAME
HAVING
MIN(i.RDB$STATISTICS) <> MAX(i.RDB$STATISTICS)
Note! Cette requête donne un résultat avec FB1.0, mais il est FAUX!
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 18Les sous-requêtes sont acceptées dans une fonction d’agrégat
Il est possible d’utiliser une expression select renvoyant un singleton dans une fonction d’agrégat.
Exemple
SELECT
r.RDB$RELATION_NAME,
SUM((SELECT
COUNT(*)
FROM
RDB$RELATION_FIELDS rf
WHERE
rf.RDB$RELATION_NAME = r.RDB$RELATION_NAME))
FROM
RDB$RELATIONS r
JOIN RDB$INDICES i on (i.RDB$RELATION_NAME = r.RDB$RELATION_NAME)
GROUP BY
r.RDB$RELATION_NAME
Fonctions d’agrégat empilées
Il est possible d’utiliser une fonction d’agrégat dans une fonction d’agrégat si la fonction d’agrégat la plus lointaine
est dans un contexte plus bas (voir exemple si dessus).
Grouper par indice
En utilisant l’indice d’une colone dans une clause GROUP BY ‘copie’ l’expression de la liste du select (comme dans
la clause ORDER BY). Cela signifie que lorsqu’un indice se réferre à une sous requête, la sous-requête est exécutée
au moins deux fois.
(1.5) La clause ORDER BY peut utiliser une expression ou la place des nulls
Nickolay Samofatov
La clause ORDER BY vous permet de spécifier n’importe quelle expression valide pour trier le résultat de la requête.
Si l’expression est constituée d’un simple nombre, il est interprété comme l’indice de la colonne.
L’ordre de classement des nullls peut être controlé. Les nulls peuvent être placés en premier (NULLS FIRST) ou en
dernier (NULLS LAST).
La valeur par défaut est NULLS LAST.
Syntaxe
SELECT ... FROM .... ORDER BY order_list ....;
order_list : order_item [, order_list];
order_item : <expression> [order_direction] [nulls_placement]
order_direction : ASC | DESC;
nulls_placement : NULLS FIRST | NULLS LAST;
Restrictions
! Si NULLS FIRST est specifié, aucun index ne sera utilisé.
! Le résultat d’un tri sur des valeurs issues d’une UDF ou une procédure stockée est imprévisible si les valeurs
retournées ne peuvent êtres utilisées pour déterminé un ordre de tri logique.
• Le nombre d’invocation d’un procédure est imprévisible que l’ordre de tri soit invoqué par l’expression elle
même ou par sont indice dans la liste des colonnes.
! Un ordre de tri sur une requête d’union ne peut être fait que sur l’indice d’une colonne.
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 19Exemples
i)
SELECT * FROM MSG
ORDER BY PROCESS_TIME DESC NULLS FIRST
ii)
SELECT FIRST 10 * FROM DOCUMENT
ORDER BY STRLEN(DESCRIPTION) DESC
iii)
SELECT DOC_NUMBER, DOC_DATE FROM PAYORDER
UNION ALL
SELECT DOC_NUMBER, DOC_DATA FROM BUDGORDER
ORDER BY 2 DESC NULLS LAST, 1 ASC NULLS FIRST
P PS SQ QL L ( (L La an ng ga ag ge e p po ou ur r p pr ro oc cé éd du ur re es s s stto oc ck ké ée es s e ett d dé éc clle en nc ch he eu ur rs s) )
(1.5) EXECUTE STATEMENT
Alex Peshkov
Extension PSQL qui reçoit une chaîne de caractères qui doit être une commande SQL dynamique valide et l'exécute
comme si elle avait été soumise à DSQL.
Disponible dans les déclencheurs et les procédures stockées.
La syntaxe peut avoir trois formes.
Syntaxe 1
Exécuter <chaîne de caractères> comme une instruction SQL ne retournant aucune ligne de résultat, à savoir
INSERT, UPDATE, DELETE, EXECUTE PROCEDURE ou n’importe quel commande DDL excepté
CREATE/DROP DATABASE.
EXECUTE STATEMENT <string>;
Example
CREATE PROCEDURE DynamicSampleOne (Pname VARCHAR(100))
AS
DECLARE VARIABLE Sql VARCHAR(1024);
DECLARE VARIABLE Par INT;
BEGIN
SELECT MIN(SomeField) FROM SomeTable INTO :Par;
Sql = ’EXECUTE PROCEDURE ’ || Pname || ’(’;
Sql = Sql || CAST(Par AS VARCHAR(20)) || ’)’;
EXECUTE STATEMENT Sql;
END
Syntaxe 2
Exécuter <chaîne de caractères> comme une instruction SQL, retournant une seule ligne de résultat. Seules
les instructions SELECT singletons peuvent être exécutées sous cette forme de EXECUTE STATEMENT.
EXECUTE STATEMENT <string> INTO :var1, […, :varn] ;
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 20Example
CREATE PROCEDURE DynamicSampleTwo (TableName VARCHAR(100))
AS
DECLARE VARIABLE Par INT;
BEGIN
EXECUTE STATEMENT ’SELECT MAX(CheckField) FROM ’ || TableName INTO :Par;
IF (Par > 100) THEN
EXCEPTION Ex_Overflow ’Overflow in ’ || TableName;
END
Syntaxe 3
Exécuter <chaîne de caractères> comme une instruction SQL, retournant plusieurs lignes de résultat.
N’importe quelle instruction SELECT peut être exécutée sous cette forme de EXECUTE STATEMENT.
FOR EXECUTE STATEMENT <string> INTO :var1, …, :varn DO
<compound-statement>;
Example
CREATE PROCEDURE DynamicSampleThree (
TextField VARCHAR(100),
TableName VARCHAR(100))
RETURNING_VALUES (Line VARCHAR(32000))
AS
DECLARE VARIABLE OneLine VARCHAR(100);
BEGIN
Line = ’’;
FOR EXECUTE STATEMENT
’SELECT ’ || TextField || ’ FROM ’ || TableName INTO :OneLine
DO
IF (OneLine IS NOT NULL) THEN
Line = Line || OneLine || ’ ’;
SUSPEND;
END
Notes complémentaires sur EXECUTE STATEMENT
La chaîne de caractères de la commande ‘EXECUTE STATEMENT’ ne peut contenir aucun paramètre dans
aucune des variations de syntaxe. Toute substitution de variable, dans la partie statique de la commande SQL,
devrait être faite avant l’exécution de EXECUTE STATEMENT.
Il convient d'être prudent dans l'utilisation de cette fonctionnalité et tous les facteurs doivent être pris en
considération. L’usage de EXECUTE STATEMENT est conseillé seulement lorsque d’autres méthodes sont impossible,
ou lorsque la performance est encore plus mauvaise que sans EXECUTE STATEMENT.
EXECUTE STATEMENT est potentiellement risqué dans quelques cas:
! Il n'est pas possible de valider la syntaxe de la commande.
! Il n'y a aucun contrôle de dépendance pour découvrir si des tables ou des colonnes ont été supprimées.
! L’exécution sera lente car la commande a exécuter doit être préparée à chaque exécution.
! Les valeurs retournées sont strictement examinées pour assurer le type de données afin d’éviter des exceptions
imprévisible de transtypage. Par exemple, la chaîne de caractères ‘1234’ sera convertie en nombre entier, par
contre ‘ABC’ renverrait en erreur de conversion.
! Si les procédures stockées ont des privilèges spéciaux sur quelques objets, la commande dynamique soumise
dans la chaîne de caractères ne les héritera pas. Les privilèges sont limités à ceux accordés à l’utilisateur qui
exécute la procédure.
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 21 (1.5) Nouvelles variables de contexte
Dmitry Yemanov
CURRENT_CONNECTION
et
CURRENT_TRANSACTION
Chacune de ces variables de contexte retourne l’identificateur du système de la connexion active ou le
contexte courant de la transaction, respectivement. Le type retourné est entier (INTEGER). Disponible dans
DSQL et PSQL. Parce que ces valeurs sont stockées sur la page d’en-tête de la base de données, elles seront
remises à zéros après une restauration de celle-ci.
Syntaxe
CURRENT_CONNECTION
CURRENT_TRANSACTION
Examples
SELECT CURRENT_CONNECTION FROM RDB$DATABASE;
NEW.TXN_ID = CURRENT_TRANSACTION;
EXECUTE PROCEDURE P_LOGIN(CURRENT_CONNECTION);
ROW_COUNT
Retourne un entier, le nombre de lignes affectées par la dernière commande DML. Disponible dans PSQL, dans le
contexte de procédure ou des déclencherus. Actuellement, la commande SELECT retournera zéro.
Syntax
ROW_COUNT
Example
UPDATE TABLE1 SET FIELD1 = 0 WHERE ID = :ID;
IF (ROW_COUNT = 0) THEN
INSERT INTO TABLE1 (ID, FIELD1) VALUES (:ID, 0);
Note: cette variable ne peut pas être employée pour vérifier les lignes affectées par la commande EXECUTE
STATEMENT.
SQLCODE et GDSCODE
Chaque variable de contexte retourne un nombre entier qui est le code numérique d’erreur pour l’exception active.
Disponible dans PSQL, dans la portée du bloc particulier d’exception. Tous les deux renverront zéros en dehors du
bloc.
La variable GDSCODE retourne une représentation numérique du code d’erreur de GDS(ISC), par exemple
‘335544349L’ retournera 335544349.
Un bloc d’exception 'WHEN SQLCODE' ou ‘WHEN ANY’ capturera une valeur différente de zéro pour la
variable SQLCODE et zéro pour la variable GDSCODE. Seul un bloc ‘WHEN GDSCODE’ peut retourner
une valeur différente de zéro pour la variable GDSCODE (et retournera zéro pour SQLCODE). Si une
exception définie par l’utilisateur est lancée, les deux variables SQLCODE et GDSCODE contiendront zéro,
indépendamment du type de bloc de manipulation d’exception.
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 22Syntaxe
SQLCODE
GDSCODE
Example
BEGIN
...
WHEN SQLCODE -802 THEN
EXCEPTION E_EXCEPTION_1;
WHEN SQLCODE -803 THEN
EXCEPTION E_EXCEPTION_2;
WHEN ANY DO
EXECUTE PROCEDURE P_ANY_EXCEPTION(SQLCODE);
END
Voir également les Perfectionnements de Manipulation d’Exception, ci-dessous, et le document
LISEZMOI.Exception_handling dans la branche de firebird2/doc/sql.extensions de l’arbre CVS de Firebird .
INSERTING
UPDATING
DELETING
Trois expressions pseudo Booléennes qui peuvent être examinées pour déterminer le type d'opération DML étant
exécutée. Disponible dans PSQL, seulement dans les déclencheurs. Destiné à l'utilisation avec des déclencheurs
universels (voir le METADATA, ci-dessus).
Syntaxe
INSERTING
UPDATING
DELETING
Example
IF (INSERTING OR DELETING) THEN
NEW.ID = GEN_ID(G_GENERATOR_1, 1);
(1.5) Amélioration dans la gestion d’exception dans PSQL
Dmitry Yemanov
a syntaxe commune pour une commande EXCEPTION dans PSQL est:
EXCEPTION {[name] | [value]};
Les améliorations dans la version 1.5 permettent de
ii) Définir un message d’exécution pour une exception nommée.
iii) re-lancer (re-soulever) une exception capturée dans la portée du bloc d'exception
iv) Obtenir un code d'erreur numérique pour une exception capturée
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 231) Transmission de messages d’exécution d’exception
Syntaxe
EXCEPTION <exception_name> <message_value>;
Examples
i)
EXCEPTION E_EXCEPTION_1 'Error!';
ii)
EXCEPTION E_EXCEPTION_2 'Wrong type for record with ID=' || new.ID;
2) Re-soulèvement d’une exception
Note – ceci n'a aucun effet en dehors d'un bloc d'exception.
Syntaxe
EXCEPTION;
Examples
i)
BEGIN
...
WHEN SQLCODE -802 THEN
EXCEPTION E_ARITH_EXCEPT;
WHEN SQLCODE -802 THEN
EXCEPTION E_KEY_VIOLATION;
WHEN ANY THEN
EXCEPTION;
END
ii)
WHEN ANY DO
BEGIN
INSERT INTO ERROR_LOG (...) VALUES (SQLCODE, ...);
EXCEPTION;
END
3) Codes d’erreurs d’exécution
Voir SQLCODE / GDSCODE (au dessus).
(1.5) instructions LEAVE | BREAK
Termine l'exécution dans une boucle, faisant déplacer l'éxécution de la commande à l’instruction suivant
l’instruction END qui termine cette boucle. Disponible uniquement pour WHILE, FOR SELECT et FOR
EXECUTE, autrement une erreur sera retournée. Dans la définition SQL-99 standard le mot-clé LEAVE
remplace BREAK. Disponible dans les déclencheurs aussi bien que dans les procédures stockées.
Syntaxe
BEGIN
<statements>;
IF (<conditions>) THEN
BREAK;
<statements>;
END
NOTE LEAVE | BREAK et EXIT peuvent êtres employés dans les déclencheurs
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 24iv) Des instructions valide de PLAN peuvent être incluse dans les déclencheurs
Ignacio J. Ortega
Jusqu'à présent, un déclencheur contenant une instruction PLAN était rejetéepar le compilateur. Maintenant, un
plan valide peut être inclus et sera employé.
(1.5) Blocs BEGIN..END vides
Dmitry Yemanov
Les blocs BEGIN..END vides dans des modules PSQL sont maintenant légaux. Par exemple, on peut écrire maintenant
des modules comme :
CREATE TRIGGER BI_ATABLE FOR ATABLE
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
END ^
(1.5) Déclarer et définir une variable locale dans une seule instruction
Claudio Valderrama
Simplifie la syntaxe et permet à des variables locales d'être déclarées et définies (ou initialisées) dans une
instruction.
Syntaxe
DECLARE [VARIABLE] name <variable_type> [{'=' | DEFAULT} value];
Example
DECLARE my_var INTEGER = 123;
(1.0) SELECT [FIRST (<integer expr m>)] [SKIP (<integer expr n>)]
(1.5) SELECT FIRST peut maintenant recevoir zéro comme argumen
FB 1.5 permet zéro comme argument de FIRST. Un ensemble vide sera retourné.
Retourne les premières m lignes de l’ensemble choisi. La clause facultative SKIP ignorera les premières n
lignes et retournera un ensemble de m lignes commençant en n+1. Sous la forme la plus simple, m et n sont
des nombres entiers mais n’importe quelle expression de FireBird qui retourne un nombre entier est valide.
Un identificateur qui retourne un nombre entier peut également être employé dans GDML, mais pas dans
SQL ou DSQL.
Des parenthèses sont nécessaires pour les arguments d'expression et facultatif autrement.
Ils peuvent également lier des variables, par exemple SKIP ? * FROM ATABLE retourne l’ensemble de
lignes résultant après avoir rejeté les n lignes du début, où n est passé dans la variable ‘?’. SELECT FIRST ?
COLONNEA, COLONNEB FROM ATABLE retourne les premières m ligne, ignorant le reste.
La clause FIRST est également facultative, c’est-à-dire que l'on peut inclure la clause SKIP dans une
commande sans FIRST et obtenir un résulta qui exclut les lignes désignées à SKIP.
Disponible dans SQL et DSQL excepté les endroits précedemment indiqués.
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 25Examples:
SELECT SKIP (5+3*5) * FROM MYTABLE;
SELECT FIRST (4-2) SKIP ? * FROM MYTABLE;
SELECT FIRST 5 DISTINCT FIELD FROM MYTABLE;
deux problèmes avec SELECT FIRST
1. Ceci
delete from TAB1 where PK1 in (select first 10 PK1 from TAB1);
Supprimera toutes les lignes de la table. Aïe! Le sub-select est évalué a chaque 10 lignes candidates pour la
suppression, en les supprimant, puis prendra les 10 prochaines lignes et les supprimera également, jusqu’à ce que la
table soit vide.
Attention!
2. Une requête comme:
...
WHERE F1 IN ( SELECT FIRST 5 F2 FROM TABLE2 ORDER BY 1 DESC )
ne fonctionnera pas comme prévu, parce que l’optimisation exécutée par le moteur transformera la corrélation
WHERE…IN (SELECT…) en une instruction EXISTS. Il est évident que dans ce cas FIRST N n’est pas raisonnable:
WHERE EXISTS (
SELECT FIRST 5 TABLE2.F2 FROM TABLE2
WHERE TABLE2.F2 = TABLE1.F1 ORDER BY 1 DESC )
Les Charsets
Les Charsets
Ajouté dans la version 1.5
! Nouvelle collation: WIN1251_UA (à la fois le Russe et l’Ukrainien) pour le charset WIN1251.
! Conversion en majuscule par défaut du Charset WIN1251 corrigé.
! Nouvelle collation ISO_HUN (Hongrois) pour le charracter set ISO8859_2.
Nouveaux charsets ajoutés (pas de collations non binaires)
Blas Rodriguez Somoza
! DOS737 PC Grec
! DOS775 PC Baltique
! DOS858 Variante de Cp850 avec le caractère Euro (€)
! DOS862 PC Hébreu
! DOS864 PC Arabe
! DOS866 MS-DOS Russe
! DOS869 IBM Modern Grec
! WIN1255 Windows Hébreu
! WIN1256 Windows Arabe
! WIN1257 Windows Baltique
! ISO8859_3 Latin 3 (Espéranto, Maltais, Pinyi, Sami, Croate et d'autres)
! ISO8859_4 Latin 4 (Baltique, Greenlandic, Lappish)
! ISO8859_5 Cyrillique
! ISO8859_6 Arabe
! ISO8859_7 Grec
! ISO8859_8 Hébreu
! ISO8859_9 Turks
! ISO8859_13 Baltique
Ajouté dans la version 1.0
! Insensibilité à la case pour la collation hongroise, développé et testé par Sandor Szollosi (ssani@freemail.hu).
! Firebird supporte maintenant le charset ISO8859-2 (pour le tchèque).
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 26 LES EXTENTIONS AU LANGUAGE APPORTEES DEPUIS FIREBIRD 1.0.x
LES EXTENTIONS AU LANGUAGE APPORTEES DEPUIS FIREBIRD 1.0.x
Les extensions au langage ci après, introduites par Firebird 1.0.x, sont illustrées ici pour faciliter leur
compréhension.
(1.0) CURRENT_USER et CURRENT_ROLE
1
Ces deux nouvelles variables ont été ajouté pour référencer le USER et (si implementé ) le ROLE de la connexion
courante.
CREATE GENERATOR GEN_USER_LOG;
CREATE DOMAIN INT_64 AS NUMERIC(18,0);
COMMIT;
CREATE TABLE USER_LOG(
LOG_ID INT_64 PRIMARY KEY NOT NULL,
OP_TIMESTAMP TIMESTAMP,
LOG_TABLE VARCHAR(31),
LOG_TABLE_ID INT_64,
LOG_OP CHAR(1),
LOG_USER VARCHAR(8),
LOG_ROLE VARCHAR(31));
COMMIT;
CREATE TRIGGER ATABLE_AI FOR ATABLE
ACTIVE AFTER INSERT POSITION O AS
BEGIN
INSERT INTO USER_LOG VALUES(
GEN_ID(GEN_USER_LOG, 1),
CURRENT_TIMESTAMP,
'ATABLE',
NEW.ID,
'I',
CURRENT_USER,
CURRENT_ROLE);
END
CURRENT_USER est un alias DSQL pour USER qui apparaît dans le SQL standard. Ils sont identiques. CURRENT_USER
n’a pas d’avantages particuliers sur le mot clef USER
1
Si vous continuez à utiliser une base de données InterBase v.4.x ou 5.1 avec Firebird, le rôle n’est pas pris en
charge, ainsi CURRENT_ROLE sera égal à NONE (comme spécifié par la norme SQL en l’absence de rôle explicite)
même si l’utilisateur a indiqué un nom de rôle. Si vous utilisez IB 5.5, IB 6 ou Firebird, le ROLE indiqué est pris en
compte. Si le rôle n’existe pas, il est changé par NONE sans générer d’erreur.
Cela signifie qu’avec FB vous ne pouvez jamais avoir de ROLE invalide retourné par CURRENT_ROLE, parce qu’il sera
changé par NONE, à la différence d’IB ou la valeur erronée est gérée en interne, bien que ce ne soit pas visible par
SQL.
(1.0) DROP GENERATOR
Permet aux générateurs inutilisés d'être retirés de la base de données. L’emplacement sera libéré pour être
réutilisé par le prochain RESTORE. Disponible en SQL et DSQL.
DROP GENERATOR <nom du générateur>;
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 27 (1.0) GROUP BY UDF
Il est maintenant possible de grouper un SELECT selon le résultat d’une fonction UDF.
Ex :
select strlen(rtrim(rdb$relation_name)), count(*) from rdb$relations
group by strlen(rtrim(rdb$relation_name))
order by 2
Un effet secondaire des changements qui on permis de grouper sur un UDF est que, bien que vous ne pouviez
précédemment appeler une fonction Firebird intégrée, dans un GROUP BY, vous pouvez dorénavant formuler une
requête de cette manière :
select count(*)
from rdb$relations r
group by bin_or((select count(rdb$field_name) from rdb$relation_fields f
where f.rdb$relation_name = r.rdb$relation_name),1)
(1.0) RECREATE PROCEDURE
Cette nouvelle commande DDL vous permet de recréer une procédure stockée ayant le même nom qu'une
procédure existante en remplaçant cette dernière, et ce, sans avoir à supprimer d'abord la version précédente. La
syntaxe est identique à CREATE PROCEDURE.
Disponible en SQL et DSQL.
(1.0) RECREATE TABLE
Cette nouvelle commande DDL vous permet redéfinir la structure d’une table sans avoir besoin de la supprimer
avant. La syntaxe est identique à CREATE TABLE.
Notez que RECREATE TABLE ne conserve pas les données de l’ancienne TABLE.
Disponible en SQL et DSQL.
(1.0) SUBSTRING( <string expr> FROM <pos> [FOR <length>])
Fonction intégrée qui implémente la méthode SUBSTRING() de l’ANSI SQL. Cette fonction retourne un stream
comprenant le byte à la position <pos> et tous les bytes suivants, jusqu'à la fin de la chaîne. Si l'option FOR <length>
est spécifiée, la fonction ne retourne pas plus que la longueur indiquée par <length> selon la taille de la chaîne.
Le premier argument peut être n'importe quelle expression, constante ou identifiant qui équivaut à une chaîne.
<pos> doit être à un nombre entier.
<pos> démarre à 1, comme les autres commandes SQL.
Ni <pos> ni <length> ne peuvent être les paramètres d’une requête.
Parce que <pos> et <length> sont des positions de byte, l’identifiant peut être un blob binaire, ou un blob texte de
sous type 1 et dont le charset équivaut à un byte par caractère. Actuellement la fonction ne gère pas les blob
contenant un jeux de caractère Chinois (maximum de 2 byte/char) ou Unicode (maximum de 3 byte/char). Pour un
argument de type chaîne (contrairement à un blob), la fonction manipule N'IMPORTE QUEL charset.
Disponible en SQL et DSQL.
UPDATE ATABLE
SET COLUMNB = SUBSTRING(COLUMNB FROM 4 FOR 99)
WHERE ...
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 28Référez-vous également à la section concernant les Fonctions Externes (UDFs), pour plus de détails sur les
changements et les améliorations apportées aux fonctions qui manipulent les sous-chaînes dans la bibliothèque
standard UDF.
(1.5) Amélioration des commentaires sur une seule ligne
Dmitry Yemanov
Les commentaires d'une seule ligne peuvent être à n'importe quelle position dans la ligne, pas juste le premier.
Ainsi, dans la version 1.5, le symbole "--" peut être utilisé pour commenter l'extrémité d'une ligne d’un un script,
d’une procédure stockée, d’un trigger ou d’une requête DSQL. Il peut ainsi être utilisé pour commenter la partie
indésirable d’une requête. Tous les caractères depuis le symbole "--" jusqu'au prochain retour chariot, ou retour à
la ligne, seront ignorés.
...
WHERE COL1 = 9 OR COL2 = 99 -- OR COL3 = 999
(1.0) Nouveau symbole de commentaire
Claudio Valderrama
A utiliser dans les scripts, le DSQL, les procédures stockées et les triggers.
Exemple
-- Voici un commentaire
Ce nouveau symbole peut être utilisé pour commenter une simple ligne de code dans un script, une requête
DDL/DML, une procédure stockée ou un trigger.
La logique est d'ignorer des caractères comme suit :
1. Ignorer '--' si on le trouve comme premier caractère paire suivant un symbole de fin de ligne (LF sous Linux/Unix,
CRLF sous Windows)
2. Continuer à sauter les caractères jusqu'au prochain symbole de fin de ligne.
Cette forme de commentaire n'est pas prévue pour être combinée avec les blocs de commentaire (/* commentaire
*/). En d'autres termes, n'utilisez pas le type de commentaire '--' dans un bloc de commentaire, et n’utilisez pas un
bloc de commentaire dans un commentaire de type '--'.
SESSIONS ISQL INTERACTIVES: Gardez à l'esprit ceci, quand vous vous trouvez dans une session ISQL, ISQL accepte
que vous saisissiez une requête en plusieurs morceaux séparés, mais continus, en affichant l’invite 'CON>' jusqu'à ce
qu'il reçoive le symbole de terminaison (par défaut ';'). Si vous tapez le symbole '--' en début de ligne, les caractères
suivants seront ignorés jusqu’à ce que le marqueur de fin de ligne soit affiché à l’écran ou écrit dans le fichier de
sortie quand vous pressez sur la touche « entrer ». Il y a potentiellement un risque d’erreur si vous ajoutez plus tard
une suite, en s’attendant à ce qu’elle soit ignorée.
Des problèmes avec ISQL peuvent arriver, en raison des commandes spéciales d’ ISQL qui lui sont propres et qui
devraient seulement être analysées par lui. Si ces commandes ne sont pas reconnues en raison d’un positionnement
malencontreux du symbole "--", alors elles sont passées au moteur. Évidemment, le moteur ne comprend pas les
commandes ISQL SET et SHOW et les rejette.
(1.0) Alter Trigger n’incrémente plus le nombre de modifications sur une table
Quand le nombre de modifications de la structure d’une table atteint un maximum de 255, la base de données
devient indisponible. Un Backup/Resrore est alors nécessaire afin de réinitialiser ce compteur et ainsi rendre la base
de données disponible à nouveau. L’objectif de ce dispositif est de forcer le nettoyage de base de donnée lorsque la
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 29structure des tables a subit de trop nombreuses modifications, et pour ne pas inhiber les capacités du moteur de
base de données.
Auparavant, chaque fois qu’un trigger était activé/désactivé par une requête ALTER TRIGER, le compteur de la
table associé était incrémenté. Ceci limitait l’intérêt d’activer ou de désactiver un trigger pour des opérations
régulières puisque ça provoquait l’erreur trop rapidement.
Nouveaux Mots Réservés
Les nouveaux mots-clés Firebird suivants devraient être ajoutés à la liste des mots réservés publiés pour interBase
6.0.1.
BIGINT (1.5) CASE (1.5) CURRENT_CONNECTION (1.5)
CURRENT_ROLE CURRENT_TRANSACTION CURRENT_USER
(1.5)
RECREATE ROW_COUNT (1.5) RELEASE
SAVEPOINT
Les mots-clés suivants sont réservés pour un usage ultérieur :
ABS BOOLEAN BOTH
CHAR_LENGTH CHARACTER_LENGTH FALSE
LEADING OCTET_LENGTH TRIM
TRAILING TRUE UNKNOWN
Les mots-clés suivants étaient des mots réservés dans Firebird 1.0 et ne sont plus réservés dans Firebird 1.5 :
BREAK DESCRIPTOR FIRST
IIF SKIP SUBSTRING
Les mots non réservés suivants sont reconnus dans la version 1.5 comme mots-clés une fois utilisé dans leur contexte
respectif:
COALESCE DELETING INSERTING
LAST LEAVE LOCK
NULLIF NULLS STATEMENT
UPDATING USING
Les nouveaux mots-clés d’Interbase 6.5 et 7 (non réservés dans Firebird) devraient également être traités comme si
ils étaient réservés, pour la compatibilité :
BOOLEAN FALSE GLOBAL
PERCENT PRESERVE ROWS
TEMPORARY TIES TRUE
Fonctionnalités ISQL
Fonctionnalité “readline” de la console isql.
Fonctionnalité “readline” de la console isql.
Mark O'Donohue
Le support de l’historique des commandes (comme dans Unix) a été rajouté à la console ISQL. Maintenant vous
pouvez utiliser les flèches Haut et Bas pour reculer ou avancer dans l’historique des commandes tapées dans une
cession ISQL.
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 30 Fonctions Définies par l'utilisateur (UDFs)
Dans ib_udf
Dans ib_udf
rpad (instring, length, padcharacter)
Juan Guerrero
Complète à droite la chaîne <instring> par le caractère <padcharacters> jusqu’à ce que la chaîne qui en résulte
atteigne une longueur de <length> caractères. La longueur de la chaîne en entré doit être inférieure 32766
caractères. La longueur <length> ne doit pas excéder 32765 caractères.
Declaration
DECLARE EXTERNAL FUNCTION rpad
CSTRING(80), INTEGER, CSTRING(1)
RETURNS CSTRING(80) FREE_IT
ENTRY_POINT 'IB_UDF_rpad' MODULE_NAME 'ib_udf';
lpad (instring, length, padcharacter)
Juan Guerrero
Complète à gauche la chaîne <instring> par le caractère <padcharacters> jusqu’à ce que la chaîne qui en résulte
atteigne une longueur de <length> caractères. La longueur de la chaîne en entré doit être inférieure 32766
caractères. La longueur <length> ne doit pas excéder 32765 caractères.
Declaration
DECLARE EXTERNAL FUNCTION lpad
CSTRING(80), INTEGER, CSTRING(1)
RETURNS CSTRING(80) FREE_IT
ENTRY_POINT 'IB_UDF_lpad' MODULE_NAME 'ib_udf';
log (x, y)
Paul Vinkenoog
Cette fonction était affectée par un ancien bogue, par lequel les arguments étaient inversés. La fonction devait
retourner le logarithme base x de y mais retournait le logarithme base y de x. Cela a été corrigé.
Si cette fonction est utilisée dans vos applications, VEUILLEZ VERIFIER LE CODE DE VOTRE APPLICATION ! Il est
possible que la fonction retourne une valeur incorrecte si quelqu’un a inversé délibérément les paramètres afin
d’obtenir le bon résultat.
D Da an ns s ffb b_ _u ud dff
1. Les fonction *NVL et *NULLIF restent disponibles pour la compatibilité ascendante, mais sont dépréciées à
cause des nouvelles fonctions intégrées : CASE, COALESCE et NULLIF.
2. Il convient noter que le fbudf ne peut pas manipuler des chaînes plus grandes que 32 Kb - un octet par
caractère. Cette limite peut avoir des effets indésirables, en particulier si des chaînes sont concaténées
avant d'être passées à une fonction UDF prenant comme argument une chaîne de caractères. Si la chaîne
dépasse la limite, le comportement de la fonction peut être indéfini. La fonction peut renvoyer un résultat
incohérent ou le code UDF peut exécuter une opération illégale.
3. Si vous migrez une base de données créée avec Firebird 1.0.x qui utilise les fonctions «truncate » et
« round » de fbudf, leur déclaration de fonctionnera plus dans Firebird 1.5 parce que le nom du point
d’entré de ces fonctions a changé. Vous devrez supprimer ces fonctions puis les recréer à nouveau, en
utilisant les déclarations depuis le script « fbudf.sql » situé dans le répertoire « FB1.5/UDF ».
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 31 Nouveau Fichier de Configuration – firebird.conf
L Le e R Ré ép pe er rtto oiir re e R Ra ac ciin ne e d de e F Fiir re eb biir rd d
Le répertoire racine de votre installation de Firebird est utilisé dans plusieurs circonstances, à la fois au moment de
l’installation que par les sous-programmes du serveur, les paramètres de configurations et les clients qui en
dépendent. Parce qu’il existe plusieurs moyens d’indiquer au serveur ou trouver ces paramètre de configuration, les
développeurs et les administrateurs systèmes doivent comprendre la logique que suit le serveur au démarrage pour
retrouver ces paramètres.
Win32 Versions Superserver et Classic (serveur et client):
1) Variable d'environnement « FIREBIRD ».
2) Paramètre “RootDirectory” dans firebird.conf.
3) Base de registre:
HKLM\SOFTWARE\ SOFTWARE\Firebird Project\Firebird Server\Instances\DefaultInstance
puis chercher le paramètre « RootDirectory ».
4) Le niveau du répertoire au-dessus duquel l’exécutable du serveur est localisé.
Win32 Embedded:
1) Variable d'environnement « FIREBIRD ».
2) Paramètre “RootDirectory” dans firebird.conf.
3) Le dossier ou fbembed.dll (renommé en fbclient.dll) se trouve.
Linux Classic:
1) Variable d'environnement « FIREBIRD ».
2) Paramètre “RootDirectory” dans firebird.conf.
3) Le chemin d’installation par défaut (/usr/local/firebird).
Linux Superserver:
1) Variable d'environnement « FIREBIRD ».
2) Paramètre “RootDirectory” dans firebird.conf.
3) Le niveau du répertoire au-dessus duquel l’exécutable du serveur est localisé (retrouvé par symlink
"/proc/self/exe", if disponible)
4) Le chemin d’installation par défaut (/usr/local/firebird)
P Pa ar ra am mè èttr re es s
Les valeurs par défaut sont applicables à la plupart des paramètres. Les noms et les valeurs des paramètres sont
sensibles à la case sous Linux mais pas sous Windows. Pour affecter n'importe quel paramètre à une valeur autre que
celle par défaut, supprimez le symbole de commentaire (#) et modifiez la valeur. Vous pouvez éditer le fichier de
configuration alors que le serveur fonctionne. Toutefois, pour appliquer les changements de configuration, il est
nécessaire d'arrêter et de relancer le service.
Les entrées sont de la forme :
Nom_du_parametre valeur
• « Nom_du_parametre » est une chaîne qui ne comporte aucun espace et dont le nom correspond à une propriété
du serveur à configurer.
• « value” peut être un nombre, un booléen (1=Vrai, 0=Faux) ou une chaîne qui correspond à la valeur du
paramètre.
Les paramètres liés au système de fichier
RootDirectory
Chaîne de caractères, le chemin d’accès complet vers le dossier racine dans le système de fichier local. Il devrait
rester commenté à moins que vous vouliez obliger la procédure de démarrage à ignorer le chemin d'accès au
répertoire racine de l'installation du serveur de Firebird, qu'il détecterait autrement par lui-même.
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 32 DatabaseAccess
Support de l’accès à la base de données par alias. Dans des versions précédentes, le serveur pouvait se connecter à
n'importe quelle base de données dans le système de fichier local et les applications clientes pouvaient indiquer le
chemin d’accès complet vers la base de donnée. Ce paramètre fournit des options pour restreindre l'accès du
serveur à une base de donnée, en indiquant uniquement un alias, ou un chemin se trouvant dans l’arborescence
d’un dossier spécifique.
DatabaseAccess peut être « None », « Restrict » ou « Full ».
Full (par défaut) permet à des fichiers de base de données d'être consultés n'importe où dans le système de fichier
local.
None Autorise le serveur à se connecter uniquement aux bases données listées dans le fichier « aliases.conf ».
Restrict vous permet de restreindre les bases des données disponibles à une liste de dossiers. Indiquez une liste
d’un ou de plusieurs dossiers séparés par des points-vigules, pour restreindre l’accès à un ou plusieurs répertoires.
Par exemple :
Unix : /db/databases ;/userdir/data
Windows : D:\data
Les chemins d’accès relatifs, sont traités comme relatifs au chemin d’accès que le serveur courant identifie comme
répertoire racine. Par exemple, sous Windows, si le répertoire racine est « C:\Program Files\Firebird », alors la
valeur suivante autorisera le serveur à accéder uniquement aux fichiers de base de données localisés dans le
répertoire « C :\Program Files\Firebird\userdata » :
DatabaseAccess = Restrict userdata
Notez que l’implémentation de ce paramètre comporte un bogue qui vous oblige à utiliser l’option « Restrict » si
vous répliquez n’importe quelle base de données sur le serveur (CREATE SHADOW …).
ExternalFileAccess
Anciennement external_file_directory dans isc_config/ibconfig mais la syntaxe a changé.
Fournit trois niveaux de sécurité concernant EXTERNAL FILES (les fichiers textes au format fixe utilisés comme les
tables d’une base de données). La valeur est une chaîne de caractères, qui peut prendre les valeurs None, Full ou
Restrict.
None (la valeur par défaut) désactive l’usage des fichiers externes sur votre serveur.
Restrict fournit la possibilité de restreindre l'emplacement des fichiers externes accessibles par la base de données,
à une liste de dossiers spécifiques. Indiquez une liste d’un ou de plusieurs dossiers, séparés par des points virgules
(;) correspondants aux répertoires dans les quels ces fichiers peuvent être stockés.
Par exemple :
Unix: /db/extern;/mnt/extern
Windows: C:\ExternalTables
Les chemins d’accès relatifs, sont traités comme relatifs au chemin d’accès que le serveur courant identifie comme
répertoire racine. Par exemple, sous Windows, si le répertoire racine est « C:\Program Files\Firebird », alors la
valeur suivante autorisera la base de données à accéder uniquement aux fichiers externes se trouvant dans le
répertoire « C:\Program Files\Firebird\userdata\ExternalTables » :
ExternalFileAccess = Restrict userdata\ExternalTables
Full permet aux fichiers externes d'être accessibles n'importe où sur le système.
Veuillez également consulter les AVERTISSEMENTS sur le paramètre UdfAccess, ci après.
UdfAccess
Anciennement external_function_directory dans isc_config/ibconfig mais la syntaxe a changé.
UdfAccess ne fait pas que renommer le précédent paramètre, mais modifie également la manière de renseigner les
valeurs. L’objectif est d’étendre le niveau de protection des librairies externes qui sont potentiellement la cible
reconnue d’intrusions malveillantes. UdfAccess peut prendre les valeurs None, Restrict ou Full.
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 33Restrict (valeur par défaut) maintient la compatibilité du paramètre external_function_directory dans Firebird 1.0
afin de limiter l'emplacement des bibliothèques externes accessibles aux emplacements spécifiques du système de
fichier. Fournissez une liste d'un ou plusieurs dossiers, séparés par des points virgule (;), dans lesquels les UDFs, les
filtres BLOB et les informations de « charset » doivent se trouver.
Par exemple :
Unix: /db/extern;/mnt/extern
Windows: C:\ExternalModules
Les chemins d’accès relatifs, sont traités comme relatifs au chemin d’accès que le serveur courant identifie comme
répertoire racine. Par exemple, sous Windows, si le répertoire racine est « C:\Program Files\Firebird », alors la
valeur suivante autorisera le serveur à manipuler uniquement les fichiers se trouvant dans le répertoire
« C:\Program Files\Firebird\userdata\ExternalModules» :
ExternalFileAccess = Restrict userdata\ExternalModules
None Désactive l’utilisation des bibliothèques externes définies pour l'utilisateur.
Full permet d’accéder aux bibliothèques externes ou que soit l’endroit ou elles trouvent sur le système.
AVERTISSEMENT :: Evitez de déclarer des dossiers personnalisés pour UdfAccess et ExternalFileAccess qui auraient
des dossiers en commun dans leur arborescence. Les paramètres par défaut sont fiables. Si vous déclarez des
dossiers en commun pour ces deux paramètres, le serveur peut être facilement piraté pour exécuter du code
malveillant. Un exemple de ce qu’il faut éviter :
UdfAccess = UDF; /bad_dir
ExternalFileAccess = /external; /bad_dir/files
UdfAccess et ExternalFileAccess ont ici un sous dossier en commun : « /bad_dir/files », où quelqu'un pourrait placer
le fichier externe /bad_dir/files/hackudf.ainsi et exécutez son propre code sur le système affecté.
Les paramètres liés aux ressources
CpuAffinityMask
Anciennement cpu_affinity dans isc_config/ibconfig.
Dans la version SuperServer de Firebird pour Windows, il y a un problème qui affecte les systèmes SMP (Symmetric
MultiProcessing), le système d’exploitation alterne continuellement le processus du serveur entre les processeurs du
système, ce qui détériore les performances. Vous pouvez utiliser ce paramètre pour indiquer à Firebird de n’utiliser
qu’un processeur.
ATTENTION Firebird Super Serveur, jusqu’à la version 1.5 inclus, ne supporte pas l’Hyperthreading de quelques modèles
récents de carte mère sous Windows. Pour éviter des problèmes de répartition, vous pourriez avoir à désactiver
l’hyperthreading au niveau du bios directement.
CpuAffinityMask prend comme valeur un entier, le masque CPU.
Exemple
CpuAffinityMask = 1
Ne tourne que sur le premier processeur (CPU 0).
CpuAffinityMask = 2
Ne tourne que sur le second processeur (CPU 1).
CpuAffinityMask = 3
Tourne à la fois sur premier et le second processeur.
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 34 M Mé étth ho od de e d de e c ca allc cu ull d du u m ma as sq qu ue e
Vous pouvez utiliser ce paramètre pour faire tourner le serveur sur n’importe quel processeur (Classic Server), ou
sur n’importe quel combinaison de processeurs du système.
Considérez les processeurs comme une tableau numéroté de 0 à n-1, tel que n représente le nombre de processeurs
installés et i l’indice du processeur dans ce tableau. M est un autre tableau, contenant le masque de chaque
processeur sélectionné. La valeur A est la somme des valeurs de M.
Utilisez la formule suivante pour obtenir M est calculer la valeur de A.
I
M = 2
i
A = M + M + M . . .
1 2 3
Par exemple, pour sélectionner le premier et le quatrième processeur (processeurs 0 et 3), le formule de calcul est :
0 3
A = 2 + 2 = 1 + 8 = 9
DeadlockTimeout
Anciennement deadlock_timeout dans isc_config/ibconfig.
Nombre de secondes (nombre entier) que le « lock manager » attendra après qu'un conflit ait été détecté, avant de
nettoyer les « Locks » des processus morts et de scanner à nouveaux, à la recherche d’autre deadlock.
Normalement, le moteur détecte les deadlock immédiatement. La minuterie ne se déclenche que si quelque chose
tourne mal.
La valeur par défaut de 10 secondes est adaptée à la plus part des situations. Baisser cette valeur n’améliore pas
forcément la rapidité avec laquelle, un problème de deadlock retourne une exception de conflit. Si cette valeur est
trop basse, cela peut engendrer un balayage trop fréquent qui peut nuire aux performances du système.
DefaultDbCachePages
Anciennement database_cache_pages dans isc_config/ibconfig.
Nombre de pages (entier) par défaut à allouer en mémoire par base de données. La valeur prédéfinie peut être
surchargée au niveau de la base de donnée.
La valeur par défaut est 2048 pages pour la version SuperServer, et 75 pages pour la version ClassicServer. Le cache
SuperServeur est partagé avec toutes les connexions, pour la version ClassicServer un cache différent est alloué par
connexion.
EventMemSize
Entier représentant le nombre d’octets de mémoire réservés au gestionnaire d’événements. La valeur par défaut est
65536 (64 Kb).
LockAcquireSpins
Anciennement lock_acquire_spins
Ne concerne que la version ClassicServer tournant sur un système SMP. Dans la version CLassicServer, seul un
processus client à la fois peut accéder à la table des locks. C’est un mutex qui contrôle cette règle. Les processus
Clients interrogent le mutex de façon conditionnelle ou inconditionnelle. Si c’est de façon conditionnelle, la
tentative échoue et l’opération doit être renouvelée. Si c’est de façon inconditionnelle, LockAcquireSpins défini le
nombre de tentatives qui seront effectuées si l’action sur le mutex est conditionnelle.
Entier, La valeur par défaut est 0 (Inconditionnel). Il n’y a pas de recommandations particulières en ce qui concerne
le maximum et le minimum.
LockHashSlots
Anciennement lock_hash_slots in isc_config/ibconfig.
Firebird 1.5 Release Notes v.1.0.8 5 février 2004 Page 35Utilisez ce paramètre pour optimiser la liste de hachage des locks. En cas de chargement conséquent, le débit
devrait être amélioré en faisant en sorte que le nombre slots disperse la liste en des chaînes de hachage plus
petites. Il est recommandé de définir un nombre premier pour cette valeur. La valeur par défaut est 101.
LockGrantOrder
Anciennement lock_grant_order dans isc_config/ibconfig.
Quand une connexion veut verrouiller un objet, elle obtient un « ticket » qui indique l’objet et le niveau de
verrouillage demandé. Chaque objet verrouillé possède un verrou. Le « ticket » et le verrou sont connectés l’un à
l’autre tant que la requête est en cours d’exécution, ou en attente de verrouillage. Le paramètre LockGrantOrder
est un booléen. La valeur par défaut (1=Vrai) indique que les demandes de verrouillage doivent être accordées selon
la méthode : premier arrivé premier servi. La valeur fausse (0), émule le comportement d’Interbase v3.3 qui
accorde le verrou dès que cela devient possible. Cela peut engendrer des verrous surchargés en demandes.
LockMemSize
Ce paramête de type entier représente le nombre de bits de mémoire partagée allouée au gestionnaire de verrous.
Pour un serveur Classic, ce paramêtre donne l’allocation initiale qui grandira dynamiquement tant que la mémoire
ne sera pas pleine. Si il y a beaucoup de connections ou un gros cache de pages, augmentez cette valeur pour éviter
ces erreurs.
Avec SuperServer, la mémoire alouée pour le gestionnaire de verrous n’augmentera pas.
La taille par défaut pour Linux et Solaris est 98304 bits (96 Kb). Pour Windows, c’est 262144 (256 Kb).
LockSemCount
Valeur entière, qui spécifie le nombre de sémaphores disponibles à la communication interprocessus (IPC). La
valeur par défaut est 32. Modifier cette valeur pour augmenter ou réduire le nombre de sémaphores disponibles.
SortMemBlockSize
Ce paramètre vous permet de configurer, en octets, la taille de chaque bloc de mémoire utilisé par le module de tri
de mémoire intégré. La valeur par défaut est 1Mo ; vous pouvez modifier cette valeur dans la limite du paramètre
SortMemUpperLimit (cf ci dessous).