Professional Documents
Culture Documents
PostgreSQL 9.1
PostgreSQL 9.1
PostgreSQL 9.1
14
Prface ......................................................................................................................................................... xx
1. Dfinition de PostgreSQL ................................................................................................................... xx
2. Bref historique de PostgreSQL ............................................................................................................. xx
3. Conventions ...................................................................................................................................... xxii
4. Pour plus d'informations ....................................................................................................................... xxii
5. Lignes de conduite pour les rapports de bogues ........................................................................................ xxii
I. Tutoriel ...................................................................................................................................................... 1
1. Dmarrage ............................................................................................................................................ 2
1.1. Installation ................................................................................................................................... 2
1.2. Concepts architecturaux de base ....................................................................................................... 2
1.3. Cration d'une base de donnes ........................................................................................................ 2
1.4. Accder une base ........................................................................................................................ 4
2. Le langage SQL .................................................................................................................................... 5
2.1. Introduction ................................................................................................................................. 5
2.2. Concepts ..................................................................................................................................... 5
2.3. Crer une nouvelle table ................................................................................................................. 5
2.4. Remplir une table avec des lignes ..................................................................................................... 6
2.5. Interroger une table ........................................................................................................................ 6
2.6. Jointures entre les tables ................................................................................................................. 8
2.7. Fonctions d'agrgat ........................................................................................................................ 9
2.8. Mises jour ................................................................................................................................ 10
2.9. Suppressions ............................................................................................................................... 11
3. Fonctionnalits avances ........................................................................................................................ 12
3.1. Introduction ................................................................................................................................ 12
3.2. Vues .......................................................................................................................................... 12
3.3. Cls trangres ............................................................................................................................ 12
3.4. Transactions ................................................................................................................................ 13
3.5. Fonctions de fentrage .................................................................................................................. 14
3.6. Hritage ........................................................................................................................................
3.7. Conclusion .................................................................................................................................. 18
II. Langage SQL ............................................................................................................................................ 19
4. Syntaxe SQL ....................................................................................................................................... 20
4.1. Structure lexicale ......................................................................................................................... 20
4.2. Expressions de valeurs .................................................................................................................. 27
4.3. Fonctions appelantes ..................................................................................................................... 36
5. Dfinition des donnes ........................................................................................................................... 38
5.1. Notions fondamentales sur les tables ................................................................................................ 38
5.2. Valeurs par dfaut ........................................................................................................................ 39
5.3. Contraintes ................................................................................................................................. 39
5.4. Colonnes systme ......................................................................................................................... 45
5.5. Modification des tables .................................................................................................................. 46
5.6. Droits ......................................................................................................................................... 48
5.7. Schmas ..................................................................................................................................... 48
5.8. L'hritage ......................................................................................................................................
5.9. Partitionnement ............................................................................................................................ 54
5.10. Donnes distantes ....................................................................................................................... 60
5.11. Autres objets de la base de donnes ................................................................................................ 60
5.12. Gestion des dpendances .............................................................................................................. 60
6. Manipulation de donnes ........................................................................................................................ 62
6.1. Insrer des donnes ....................................................................................................................... 62
6.2. Actualiser les donnes ................................................................................................................... 63
6.3. Supprimer des donnes .................................................................................................................. 63
7. Requtes ............................................................................................................................................. 65
7.1. Aperu ....................................................................................................................................... 65
7.2. Expressions de table ..................................................................................................................... 65
7.3. Listes de slection ........................................................................................................................ 73
7.4. Combiner des requtes .................................................................................................................. 74
7.5. Tri des lignes ............................................................................................................................... 74
7.6. LIMIT et OFFSET ....................................................................................................................... 75
7.7. Listes VALUES ............................................................................................................................ 76
7.8. Requtes WITH (Common Table Expressions) ................................................................................... 76
8. Types de donnes ................................................................................................................................. 81
iii
1000
1001
1002
1006
1012
1013
1014
1016
1017
1020
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1063
1066
1071
1074
1075
1076
1078
1080
1082
1084
1086
1087
1089
1090
1091
ROLLBACK .................................................................................................................................
ROLLBACK PREPARED ...............................................................................................................
ROLLBACK TO SAVEPOINT ........................................................................................................
SAVEPOINT ................................................................................................................................
SECURITY LABEL .......................................................................................................................
SELECT ......................................................................................................................................
SELECT INTO ..............................................................................................................................
SET .............................................................................................................................................
SET CONSTRAINTS .....................................................................................................................
SET ROLE ...................................................................................................................................
SET SESSION AUTHORIZATION ..................................................................................................
SET TRANSACTION ....................................................................................................................
SHOW .........................................................................................................................................
START TRANSACTION ................................................................................................................
TRUNCATE .................................................................................................................................
UNLISTEN ..................................................................................................................................
UPDATE ......................................................................................................................................
VACUUM ....................................................................................................................................
VALUES ......................................................................................................................................
II. Applications client de PostgreSQL ......................................................................................................
clusterdb ......................................................................................................................................
createdb .......................................................................................................................................
createlang .....................................................................................................................................
createuser .....................................................................................................................................
dropdb .........................................................................................................................................
droplang .......................................................................................................................................
dropuser .......................................................................................................................................
ecpg ............................................................................................................................................
pg_basebackup ..............................................................................................................................
pg_config .....................................................................................................................................
pg_dump ......................................................................................................................................
pg_dumpall ...................................................................................................................................
pg_restore .....................................................................................................................................
psql .............................................................................................................................................
reindexdb .....................................................................................................................................
vacuumdb .....................................................................................................................................
III. Applications relatives au serveur PostgreSQL .......................................................................................
initdb ...........................................................................................................................................
pg_controldata ...............................................................................................................................
pg_ctl ..........................................................................................................................................
pg_resetxlog .................................................................................................................................
postgres ........................................................................................................................................
postmaster ....................................................................................................................................
VII. Internes ..............................................................................................................................................
44. Prsentation des mcanismes internes de PostgreSQL ............................................................................
44.1. Chemin d'une requte ..............................................................................................................
44.2. tablissement des connexions ...................................................................................................
44.3. tape d'analyse ......................................................................................................................
44.4. Systme de rgles de PostgreSQL ...........................................................................................
44.5. Planificateur/Optimiseur ..........................................................................................................
44.6. Excuteur ..............................................................................................................................
45. Catalogues systme .........................................................................................................................
45.1. Aperu .................................................................................................................................
45.2. pg_aggregate .........................................................................................................................
45.3. pg_am ..................................................................................................................................
45.4. pg_amop ...............................................................................................................................
45.5. pg_amproc ............................................................................................................................
45.6. pg_attrdef .............................................................................................................................
45.7. pg_attribute ...........................................................................................................................
45.8. pg_authid ..............................................................................................................................
45.9. pg_auth_members ...................................................................................................................
45.10. pg_cast ...............................................................................................................................
45.11. pg_class ..............................................................................................................................
xii
1094
1095
1096
1098
1099
1101
1115
1117
1120
1121
1123
1124
1126
1128
1129
1131
1132
1135
1138
1140
1141
1143
1145
1147
1150
1152
1154
1156
1158
1161
1163
1170
1174
1179
1200
1202
1204
1205
1208
1209
1213
1215
1220
1221
1222
1222
1222
1223
1223
1224
1225
1226
1226
1227
1228
1229
1229
1230
1230
1232
1233
1233
1234
1284
1286
1295
1296
1298
1298
1298
1300
1304
1304
1306
1309
1312
1312
1312
1314
1314
1314
1315
1316
1317
1317
1318
1321
1322
1323
1324
1326
1326
1326
1326
1332
1333
1333
1333
1335
1335
1336
1336
1337
1337
1338
1340
1340
1340
1340
1343
1343
1343
1344
1344
1345
1345
1350
1351
1358
1358
1359
1360
1360
1362
1382
1383
1391
1400
1400
1402
1403
1406
1407
1408
1410
1412
1414
1415
1417
1420
1423
1426
1426
1440
1441
1442
1445
1446
1447
1449
1450
1452
1453
1455
1456
1459
1461
1464
1466
1466
1469
1470
1485
1487
1488
1490
1491
1492
1493
1494
1496
1496
1498
1499
1501
1503
1505
1506
1507
1509
1511
1513
1515
1518
1519
1534
1535
1537
1537
1539
1540
1541
1543
1545
1545
1546
1548
1549
1551
1552
1554
1555
1557
1558
1559
1561
1561
1563
1565
1577
1578
1580
1581
1581
1583
1584
1585
1587
1588
1589
1590
1591
1592
1593
1593
1594
1596
1597
1598
1599
1599
1600
1601
1612
1613
1614
1615
1616
1617
1618
1619
1619
1620
1621
1622
1623
1624
1625
1625
1626
1626
1627
1628
1629
1630
1631
1632
1643
1644
1645
1646
1647
1647
1648
1648
1649
1650
1650
1651
1653
1653
1654
1654
1654
1655
1656
1657
1658
1658
1659
1660
1661
1663
1663
1675
1675
1676
1677
1678
1678
1679
1679
1680
1680
1681
1682
1683
1683
1684
1684
1684
1685
1686
1686
1687
1688
1688
1690
1691
1692
1692
1692
1693
1695
1696
1708
1708
1709
1709
1709
1710
1710
1711
1712
1712
1713
1713
1714
1715
1715
1716
1716
1717
1718
1720
1721
1721
1731
1731
1732
1732
1733
1733
1734
1734
1735
1743
1744
1744
1744
1748
1749
1749
1749
1755
1755
1756
1756
1760
1760
1761
1765
1765
1766
1769
1770
1772
1773
1775
1776
1777
1778
1780
1781
1782
1783
1783
1785
1785
1786
1786
1788
1788
1789
1790
1792
1795
1821
1821
1822
1823
1824
1825
1827
1832
1833
1836
1839
1840
1845
1848
1850
1850
1852
1857
1858
1868
1869
1870
1873
1876
1877
1878
1880
1884
1887
1892
1893
1895
1903
1904
1905
1906
1908
1909
1913
1913
1913
1913
1914
1915
1915
1916
1916
1916
1919
1922
1923
1925
1929
1931
Prface
Cet ouvrage reprsente l'adaptation franaise de la documentation officielle de PostgreSQL. Celle-ci a t rdige par les dveloppeurs de PostgreSQL et quelques volontaires en parallle du dveloppement du logiciel. Elle dcrit toutes les fonctionnalits
officiellement supportes par la dernire version de PostgreSQL.
Afin de faciliter l'accs aux informations qu'il contient, cet ouvrage est organis en plusieurs parties. Chaque partie est destine
une classe prcise d'utilisateurs ou des utilisateurs de niveaux d'expertise diffrents :
la Partie I, Tutoriel est une introduction informelle destine aux nouveaux utilisateurs ;
la Partie II, Langage SQL prsente l'environnement du langage de requtes SQL, notamment les types de donnes, les
fonctions et les optimisations utilisateurs. Tout utilisateur de PostgreSQL devrait la lire ;
la Partie III, Administration du serveur , destine aux administrateurs PostgreSQL, dcrit l'installation et l'administration
du serveur ;
la Partie V, Programmation serveur , destine aux utilisateurs expriments, prsente les lments d'extension du serveur,
notamment les types de donnes et les fonctions utilisateurs ;
la Partie VI, Rfrence contient la documentation de rfrence de SQL et des programmes client et serveur. Cette partie est
utilise comme rfrence par les autres parties ;
la Partie VII, Internes contient diverses informations utiles aux dveloppeurs de PostgreSQL.
1. Dfinition de PostgreSQL
PostgreSQL est un systme de gestion de bases de donnes relationnelles objet (ORDBMS) fond sur POSTGRES, Version
4.2. Ce dernier a t dvelopp l'universit de Californie au dpartement des sciences informatiques de Berkeley. POSTGRES
est l'origine de nombreux concepts qui ne seront rendus disponibles au sein de systmes de gestion de bases de donnes commerciaux que bien plus tard.
PostgreSQL est un descendant libre du code original de Berkeley. Il supporte une grande partie du standard SQL tout en offrant
de nombreuses fonctionnalits modernes :
requtes complexes ;
cls trangres ;
triggers ;
vues ;
intgrit transactionnelle ;
contrle des versions concurrentes (MVCC, acronyme de MultiVersion Concurrency Control ).
De plus, PostgreSQL peut tre tendu par l'utilisateur de multiples faons, en ajoutant, par exemple :
Et grce sa licence librale, PostgreSQL peut tre utilis, modifi et distribu librement, quel que soit le but vis, qu'il soit priv, commercial ou acadmique.
Prface
vanced Research Projects Agency), l'ARO (acronyme de Army Research Office), la NSF (acronyme de National Science Foundation) et ESL, Inc. Le dveloppement de POSTGRES a dbut en 1986. Les concepts initiaux du systme ont t prsents dans
Stonebraker and Rowe, 1986 et la dfinition du modle de donnes initial apparut dans Rowe and Stonebraker, 1987. Le systme
de rgles ft dcrit dans Stonebraker, Hanson, Hong, 1987, l'architecture du gestionnaire de stockage dans Stonebraker, 1987.
Depuis, plusieurs versions majeures de POSTGRES ont vu le jour. La premire dmo devint oprationnelle en 1987 et fut
prsente en 1988 lors de la confrence ACM-SIGMOD. La version 1, dcrite dans Stonebraker, Rowe, Hirohama, 1990, fut livre quelques utilisateurs externes en juin 1989. Suite la critique du premier mcanisme de rgles (Stonebraker et al, 1989), celui-ci fut rcrit (Stonebraker et al, ACM, 1990) pour la version 2, prsente en juin 1990. La version 3 apparut en 1991. Elle apporta le support de plusieurs gestionnaires de stockage, un excuteur de requtes amlior et une rcriture du gestionnaire de
rgles. La plupart des versions qui suivirent, jusqu' Postgres95 (voir plus loin), portrent sur la portabilit et la fiabilit.
POSTGRES ft utilis dans plusieurs applications, en recherche et en production. On peut citer, par exemple : un systme
d'analyse de donnes financires, un programme de suivi des performances d'un moteur raction, une base de donnes de suivi
d'astrodes, une base de donnes mdicale et plusieurs systmes d'informations gographiques. POSTGRES a aussi t utilis
comme support de formation dans plusieurs universits. Illustra Information Technologies (devenu Informix, maintenant dtenu
par IBM) a repris le code et l'a commercialis. Fin 1992, POSTGRES est devenu le gestionnaire de donnes principal du projet
de calcul scientifique Sequoia 2000.
La taille de la communaut d'utilisateurs doubla quasiment au cours de l'anne 1993. De manire vidente, la maintenance du prototype et le support prenaient un temps considrable, temps qui aurait d tre employ la recherche en bases de donnes. Dans
un souci de rduction du travail de support, le projet POSTGRES de Berkeley se termina officiellement avec la version 4.2.
2.2. Postgres95
En 1994, Andrew Yu et Jolly Chen ajoutrent un interprteur de langage SQL POSTGRES. Sous le nouveau nom de
Postgres95, le projet fut publi sur le Web comme descendant libre (OpenSource) du code source initial de POSTGRES, version Berkeley.
Le code de Postgres95 tait crit en pur C ANSI et rduit de 25%. De nombreux changements internes amliorrent les performances et la maintenabilit. Les versions 1.0.x de Postgres95 passrent le Wisconsin Benchmark avec des performances
meilleures de 30 50% par rapport POSTGRES, version 4.2. part les correctifs de bogues, les principales amliorations
furent les suivantes :
le langage PostQUEL est remplac par SQL (implant sur le serveur) ; les requtes imbriques n'ont pas t supportes avant
PostgreSQL (voir plus loin) mais elles pouvaient tre imites dans Postgres95 l'aide de fonctions SQL utilisateur ; les
agrgats furent reprogramms, la clause GROUP BY ajoute ;
un nouveau programme, psql, qui utilise GNU Readline, permet l'excution interactive de requtes SQL ; c'est la fin du programme monitor ;
une nouvelle bibliothque cliente, libpgtcl, supporte les programmes crits en Tcl ; un shell exemple, pgtclsh, fournit de
nouvelles commandes Tcl pour interfacer des programmes Tcl avec Postgres95 ;
l'interface de gestion des Large Objects est rcrite ; jusque-l, le seul mcanisme de stockage de ces objets passait par le
systme de fichiers Inversion ( Inversion file system ) ; ce systme est abandonn ;
le systme de rgles d'instance est supprim ; les rgles sont toujours disponibles en tant que rgles de rcriture ;
un bref tutoriel prsentant les possibilits du SQL ainsi que celles spcifiques Postgres95 est distribu avec les sources ;
la version GNU de make est utilise pour la construction la place de la version BSD ; Postgres95 peut galement tre compil avec un GCC sans correctif (l'alignement des doubles est corrig).
2.3. PostgreSQL
En 1996, le nom Postgres95 commence mal vieillir. Le nom choisi, PostgreSQL, souligne le lien entre POSTGRES et
les versions suivantes qui intgrent le SQL. En parallle, la version est numrote 6.0 pour reprendre la numrotation du projet
POSTGRES de Berkeley.
Beaucoup de personnes font rfrence PostgreSQL par Postgres (il est rare que le nom soit crit en capitales) par tradition
ou parce que c'est plus simple prononcer. Cet usage est accept comme alias ou pseudo.
Lors du dveloppement de Postgres95, l'effort tait ax sur l'identification et la comprhension des problmes dans le code.
Avec PostgreSQL, l'accent est mis sur les nouvelles fonctionnalits, sans pour autant abandonner les autres domaines.
L'historique de PostgreSQL partir de ce moment est disponible dans l'Annexe E, Notes de version.
xxi
Prface
3. Conventions
Cet ouvrage utilise les conventions typographiques suivantes pour marquer certaines portions du texte : les nouveaux termes,
phrases en langue trangre et autres passages importants sont tous affichs en italique. Tout ce qui reprsente une entre ou une
sortie l'cran, et en particulier le code, les commandes et les sorties d'cran, est affich l'aide d'une police espacement fixe
(exemple). l'intrieur de tels passages, l'italique (exemple) indique des contenants ; une valeur particulire doit tre insre
la place de ce contenant. Parfois, des bouts de code de programme sont affichs en gras (exemple). Cela permet de souligner les
ajouts et modifications par rapport l'exemple qui prcde.
Les conventions suivantes sont utilises dans le synopsis d'une commande : les crochets ([ et ]) indiquent des parties optionnelles. (Dans le synopsis d'une commande Tcl, des points d'interrogation (?) sont utiliss, comme c'est habituellement le cas en
Tcl.) Les accolades ({ et }) et les barres verticales (|) indiquent un choix entre plusieurs options. Les points de suspension (...)
signifient que l'lment prcdent peut tre rpt.
Lorsque cela amliore la clart, les commandes SQL sont prcdes d'une invite =>, tandis que les commandes shell le sont par $.
Dans le cadre gnral, les invites ne sont pas indiques.
Un administrateur est gnralement une personne en charge de l'installation et de la bonne marche du serveur. Un utilisateur est
une personne qui utilise ou veut utiliser une partie quelconque du systme PostgreSQL. Ces termes ne doivent pas tre pris trop
la lettre ; cet ouvrage n'a pas d'avis fig sur les procdures d'administration systme.
Prface
Un programme se terminant avec un signal fatal ou un message d'erreur du systme d'exploitation qui indiquerait un problme
avec le programme. (Un contre-exemple pourrait tre le message disk full , disque plein, car vous devez le rgler vousmme.)
Un programme refuse d'accepter une entre valide (c'est--dire telle que dfinie dans la documentation).
Un programme accepte une entre invalide sans information ou message d'erreur. Mais gardez en tte que votre ide d'entre
invalide pourrait tre notre ide d'une extension ou d'une compatibilit avec les pratiques traditionnelles.
PostgreSQL choue la compilation, la construction ou l'installation suivant les instructions des plateformes supportes.
La squence exacte des tapes ncessaires pour reproduire le problme partir du lancement du programme. Ceci devrait se
suffire ; il n'est pas suffisant d'envoyer une simple instruction SELECT sans les commandes CREATE TABLE et INSERT
qui ont prcd, si la sortie devrait dpendre des donnes contenues dans les tables. Nous n'avons pas le temps de comprendre
le schma de votre base de donnes. Si nous sommes supposs crer nos propres donnes, nous allons probablement ne pas
voir le problme.
Le meilleur format pour un test suite un problme relatif SQL est un fichier qui peut tre lanc via l'interface psql et qui
montrera le problme. (Assurez-vous de ne rien avoir dans votre fichier de lancement ~/.psqlrc.) Un moyen facile pour
crer ce fichier est d'utiliser pg_dump pour rcuprer les dclarations des tables ainsi que les donnes ncessaires pour mettre
en place la scne. Il ne reste plus qu' ajouter la requte posant problme. Vous tes encourag minimiser la taille de votre
exemple mais ce n'est pas une obligation. Si le bogue est reproductible, nous le trouverons de toute faon.
Si votre application utilise une autre interface client, telle que PHP, alors essayez d'isoler le problme aux requtes errones.
Nous n'allons certainement pas mettre en place un serveur web pour reproduire votre problme. Dans tous les cas, rappelezvous d'apporter les fichiers d'entre exacts ; n'essayez pas de deviner que le problme se pose pour les gros fichiers ou pour
les bases de donnes de moyenne taille , etc. car cette information est trop inexacte, subjective pour tre utile.
La sortie que vous obtenez. Merci de ne pas dire que cela ne fonctionne pas ou s'est arrt brutalement . S'il existe un
message d'erreur, montrez-le mme si vous ne le comprenez pas. Si le programme se termine avec une erreur du systme
d'exploitation, dites-le. Mme si le rsultat de votre test est un arrt brutal du programme ou un autre souci vident, il pourrait
ne pas survenir sur notre plateforme. Le plus simple est de copier directement la sortie du terminal, si possible.
Note
Si vous rapportez un message d'erreur, merci d'obtenir la forme la plus verbeuse de ce message. Avec psql, excutez \set VERBOSITY verbose avant tout. Si vous rcuprez le message des traces du serveur, initialisez la variable d'excution log_error_verbosity avec verbose pour que tous les dtails soient tracs.
Note
Dans le cas d'erreurs fatales, le message d'erreur rapport par le client pourrait ne pas contenir toutes les inforxxiii
Prface
mations disponibles. Jetez aussi un il aux traces du serveur de la base de donnes. Si vous ne conservez pas
les traces de votre serveur, c'est le bon moment pour commencer le faire.
Il est trs important de prciser ce que vous attendez en sortie. Si vous crivez uniquement Cette commande m'a donn cette
rponse. ou Ce n'est pas ce que j'attendais. , nous pourrions le lancer nous-mme, analyser la sortie et penser que tout est
correct car cela correspond exactement ce que nous attendions. Nous ne devrions pas avoir passer du temps pour dcoder la
smantique exacte de vos commandes. Tout spcialement, ne vous contentez pas de dire que Ce n'est pas ce que SQL spcifie/Oracle fait. Rechercher le comportement correct partir de SQL n'est pas amusant et nous ne connaissons pas le comportement de tous les autres serveurs de base de donnes relationnels. (Si votre problme est un arrt brutal du serveur, vous pouvez videmment omettre cet lment.)
Toutes les options en ligne de commande ainsi que les autres options de lancement incluant les variables d'environnement ou
les fichiers de configuration que vous avez modifi. Encore une fois, soyez exact. Si vous utilisez une distribution prpackage qui lance le serveur au dmarrage, vous devriez essayer de retrouver ce que cette distribution fait.
Tout ce que vous avez fait de diffrent partir des instructions d'installation.
La version de PostgreSQL. Vous pouvez lancer la commande SELECT version(); pour trouver la version du serveur
sur lequel vous tes connect. La plupart des excutables disposent aussi d'une option --version ; postgres -version et psql --version devraient au moins fonctionner. Si la fonction ou les options n'existent pas, alors votre
version est bien trop ancienne et vous devez mettre jour. Si vous avez lanc une version prpare sous forme de paquets, tel
que les RPM, dites-le en incluant la sous-version que le paquet pourrait avoir. Si vous tes sur une version Git, mentionnez-le
en indiquant le hachage du commit.
Si votre version est antrieure la 9.1.14, nous allons certainement vous demander de mettre jour. Beaucoup de corrections
de bogues et d'amliorations sont apportes dans chaque nouvelle version, donc il est bien possible qu'un bogue rencontr dans
une ancienne version de PostgreSQL soit dj corrig. Nous ne fournissons qu'un support limit pour les sites utilisant
d'anciennes versions de PostgreSQL ; si vous avez besoin de plus de support que ce que nous fournissons, considrez
l'acquisition d'un contrat de support commercial.
Informations sur la plate-forme. Ceci inclut le nom du noyau et sa version, bibliothque C, processeur, mmoires et ainsi de
suite. Dans la plupart des cas, il est suffisant de prciser le vendeur et la version mais ne supposez pas que tout le monde sait
ce que Debian contient ou que tout le monde utilise des i386. Si vous avez des problmes l'installation, des informations
sur l'ensemble des outils de votre machine (compilateurs, make, etc.) sont aussi ncessaires.
N'ayez pas peur si votre rapport de bogue devient assez long. C'est un fait. Il est prfrable de rapporter tous les faits la premire
fois plutt que nous ayons vous tirer les vers du nez. D'un autre ct, si vos fichiers d'entre sont trop gros, il est prfrable de
demander si quelqu'un souhaite s'y plonger. Voici un article qui relve quelques autres conseils sur les rapports de bogues.
Ne passez pas tout votre temps vous demander quelles modifications apporter pour que le problme s'en aille. Ceci ne nous aidera probablement pas le rsoudre. S'il arrive que le bogue ne peut pas tre corrig immdiatement, vous aurez toujours
l'opportunit de chercher ceci et de partager vos trouvailles. De mme, encore une fois, ne perdez pas votre temps deviner pourquoi le bogue existe. Nous le trouverons assez rapidement.
Lors de la rdaction d'un rapport de bogue, merci de choisir une terminologie qui ne laisse pas place aux confusions. Le paquet logiciel en totalit est appel PostgreSQL , quelquefois Postgres en court. Si vous parlez spcifiquement du serveur, mentionnez-le mais ne dites pas seulement PostgreSQL a plant . Un arrt brutal d'un seul processus serveur est assez diffrent de
l'arrt brutal du postgres pre ; merci de ne pas dire que le serveur a plant lorsque vous voulez dire qu'un seul processus
s'est arrt, ni vice versa. De plus, les programmes clients tels que l'interface interactive psql sont compltement spars du
moteur. Essayez d'tre prcis sur la provenance du problme : client ou serveur.
Prface
ns ne souhaitent pas recevoir de rapports de bogues. Plus important, ils ont peu de chance de les corriger.
De mme, n'envoyez pas vos rapports de bogue la liste de discussion des dveloppeurs
<pgsql-hackers@postgresql.org>. Cette liste sert aux discussions concernant le dveloppement de PostgreSQL et il
serait bon de conserver les rapports de bogue sparment. Nous pourrions choisir de discuter de votre rapport de bogue sur pgsql-hackers si le problme ncessite que plus de personnes s'en occupent.
Si vous avez un problme avec la documentation, le meilleur endroit pour le rapporter est la liste de discussion pour la documentation <pgsql-docs@postgresql.org>. Soyez prcis sur la partie de la documentation qui vous dplat.
Si votre bogue concerne un problme de portabilit sur une plate-forme non supporte, envoyez un courrier lectronique
<pgsql-hackers@postgresql.org>, pour que nous puissions travailler sur le portage de PostgreSQL sur votre plateforme.
Note
D, malheureusement, au grand nombre de pourriels (spam), toutes les adresses de courrier lectronique ci-dessus
appartiennent des listes de discussion fermes. Autrement dit, vous devez tre abonn pour tre autoris y envoyer un courrier. Nanmoins, vous n'avez pas besoin de vous abonner pour utiliser le formulaire web de rapports
de bogue. Si vous souhaitez envoyer des courriers mais ne pas recevoir le trafic de la liste, vous pouvez vous abonner et configurer l'option nomail. Pour plus d'informations, envoyez un courrier
<majordomo@postgresql.org> avec le seul mot help dans le corps du message.
xxv
Partie I. Tutoriel
Bienvenue dans le tutoriel de PostgreSQL. Les chapitres suivants prsentent une courte introduction PostgreSQL, aux
concepts des bases de donnes relationnelles et au langage SQL ceux qui dbutent dans l'un de ces domaines. Seules sont ncessaires des connaissances gnrales sur l'utilisation des ordinateurs. Aucune exprience particulire d'Unix ou de programmation
n'est requise. Ce tutoriel a surtout pour but de faire acqurir une exprience pratique des aspects importants du systme PostgreSQL. Il n'est ni exhaustif ni complet, mais introductif.
la suite de ce tutoriel, la lecture de la Partie II, Langage SQL permettra d'acqurir une connaissance plus complte du langage SQL, celle de la Partie IV, Interfaces client des informations sur le dveloppement d'applications. La configuration et la
gestion sont dtailles dans la Partie III, Administration du serveur .
Chapitre 1. Dmarrage
1.1. Installation
Avant de pouvoir utiliser PostgreSQL, vous devez l'installer. Il est possible que PostgreSQL soit dj install dans votre environnement, soit parce qu'il est inclus dans votre distribution, soit parce que votre administrateur systme s'en est charg. Dans
ce cas, vous devriez obtenir les informations ncessaires pour accder PostgreSQL dans la documentation de votre distribution ou de la part de votre administrateur.
Si vous n'tes pas sr que PostgreSQL soit dj disponible ou que vous puissiez l'utiliser pour vos tests, vous avez la possibilit de l'installer vous-mme. Le faire n'est pas difficile et peut tre un bon exercice. PostgreSQL peut tre install par
n'importe quel utilisateur sans droit particulier. Aucun accs administrateur (root) n'est requis.
Si vous installez PostgreSQL vous-mme, rfrez-vous au Chapitre 15, Procdure d'installation de PostgreSQL du code
source, pour les instructions sur l'installation, puis revenez ce guide quand l'installation est termine. Nous vous conseillons de
suivre attentivement la section sur la configuration des variables d'environnement appropries.
Si votre administrateur n'a pas fait une installation par dfaut, vous pouvez avoir effectuer un paramtrage supplmentaire. Par
exemple, si le serveur de bases de donnes est une machine distante, vous aurez besoin de configurer la variable
d'environnement PGHOST avec le nom du serveur de bases de donnes. Il sera aussi peut-tre ncessaire de configurer la variable d'environnement PGPORT. La dmarche est la suivante : si vous essayez de dmarrer un programme et qu'il se plaint de
ne pas pouvoir se connecter la base de donnes, vous devez consulter votre administrateur ou, si c'est vous, la documentation
pour tre sr que votre environnement est correctement paramtr. Si vous n'avez pas compris le paragraphe prcdent, lisez
donc la prochaine section.
Un processus serveur, qui gre les fichiers de la base de donnes, accepte les connexions la base de la part des applications
clientes et effectue sur la base les actions des clients. Le programme serveur est appel postgres.
L'application cliente (l'application de l'utilisateur), qui veut effectuer des oprations sur la base de donnes. Les applications
clientes peuvent tre de nature trs diffrentes : un client peut tre un outil texte, une application graphique, un serveur web
qui accde la base de donnes pour afficher des pages web ou un outil spcialis dans la maintenance de bases de donnes.
Certaines applications clientes sont fournies avec PostgreSQL ; la plupart sont dveloppes par les utilisateurs.
Comme souvent avec les applications client/serveur, le client et le serveur peuvent tre sur des htes diffrents. Dans ce cas, ils
communiquent travers une connexion rseau TCP/IP. Vous devez garder cela l'esprit car les fichiers qui sont accessibles sur
la machine cliente peuvent ne pas l'tre (ou l'tre seulement en utilisant des noms de fichiers diffrents) sur la machine excutant
le serveur de bases de donnes.
Le serveur PostgreSQL peut traiter de multiples connexions simultanes depuis les clients. Dans ce but, il dmarre un nouveau processus pour chaque connexion. ce moment, le client et le nouveau processus serveur communiquent sans intervention
de la part du processus postgres original. Ainsi, le processus serveur matre s'excute toujours, attendant de nouvelles
connexions clientes, tandis que le client et les processus serveurs associs vont et viennent (bien sr, tout ceci est invisible pour
l'utilisateur ; nous le mentionnons ici seulement par exhaustivit).
Dmarrage
Si cette commande ne fournit aucune rponse, cette tape est russie et vous pouvez sauter le reste de cette section.
Si vous voyez un message similaire :
createdb: command not found
alors PostgreSQL n'a pas t install correctement. Soit il n'a pas t install du tout, soit le chemin systme n'a pas t configur pour l'inclure. Essayez d'appeler la commande avec le chemin absolu :
$ /usr/local/pgsql/bin/createdb ma_base
Le chemin sur votre serveur peut tre diffrent. Contactez votre administrateur ou vrifiez dans les instructions d'installation pour
corriger la commande.
Voici une autre rponse possible :
createdb: could not connect to database postgres: could not connect to server: No such
file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
Cela signifie que le serveur n'tait pas dmarr, ou qu'il n'tait pas dmarr l o createdb l'attendait. Une fois encore, vrifiez les
instructions d'installation ou consultez votre administrateur.
Voici encore une autre rponse possible :
createdb: could not connect to database postgres: FATAL:
mais avec votre propre nom de connexion mentionn la place de joe. Ceci survient si l'administrateur n'a pas cr de compte utilisateur PostgreSQL pour vous (les comptes utilisateurs PostgreSQL sont distincts de ceux du systme d'exploitation). Si
vous tes l'administrateur, la lecture du Chapitre 20, Rles de la base de donnes vous expliquera comment crer de tels comptes.
Vous aurez besoin de prendre l'identit de l'utilisateur du systme d'exploitation sous lequel PostgreSQL a t install
(gnralement postgres) pour crer le compte du premier utilisateur. Cela pourrait aussi signifier que vous avez un nom
d'utilisateur PostgreSQL qui est diffrent de celui de votre compte utilisateur du systme d'exploitation. Dans ce cas, vous avez
besoin d'utiliser l'option -U ou de configurer la variable d'environnement PGUSER pour spcifier votre nom d'utilisateur PostgreSQL.
Si vous n'avez pas les droits requis pour crer une base, vous verrez le message suivant :
createdb: database creation failed: ERROR:
Tous les utilisateurs n'ont pas l'autorisation de crer de nouvelles bases de donnes. Si PostgreSQL refuse de crer des bases
pour vous, alors il faut que l'administrateur vous accorde ce droit. Consultez votre administrateur si cela arrive. Si vous avez install vous-mme PostgreSQL, alors vous devez ouvrir une session sous le compte utilisateur que vous avez utilis pour dmarrer le serveur. 1
Vous pouvez aussi crer des bases de donnes avec d'autres noms. PostgreSQL vous permet de crer un nombre quelconque de
bases sur un site donn. Le nom des bases doit avoir comme premier caractre un caractre alphabtique et est limit 63 octets
de longueur. Un choix pratique est de crer une base avec le mme nom que votre nom d'utilisateur courant. Beaucoup d'outils utilisent ce nom comme nom par dfaut pour la base : cela permet de gagner du temps en saisie. Pour crer cette base, tapez simplement :
$ createdb
Si vous ne voulez plus utiliser votre base, vous pouvez la supprimer. Par exemple, si vous tes le propritaire (crateur) de la base
ma_base, vous pouvez la dtruire en utilisant la commande suivante :
$ dropdb ma_base
(Pour cette commande, le nom de la base n'est pas par dfaut le nom du compte utilisateur. Vous devez toujours en spcifier un.)
Cette action supprime physiquement tous les fichiers associs avec la base de donnes et elle ne peut pas tre annule, donc cela
doit se faire avec beaucoup de prvoyance.
createdb(1) et dropdb(1) apportent beaucoup plus d'informations sur createdb et dropdb.
Quelques explications : les noms d'utilisateurs de PostgreSQL sont diffrents des comptes utilisateurs du systme d'exploitation. Quand vous vous connectez une base de donnes, vous pouvez choisir le nom d'utilisateur PostgreSQL que vous utilisez. Si vous ne spcifiez rien, cela sera par dfaut le mme nom que votre compte systme courant. En fait, il existe toujours un compte utilisateur PostgreSQL qui a le mme nom que l'utilisateur du systme d'exploitation qui a dmarr le serveur, et cet utilisateur a toujours le droit de crer des bases. Au lieu de vous connecter au systme en tant que
cet utilisateur, vous pouvez spcifier partout l'option -U pour slectionner un nom d'utilisateur PostgreSQL sous lequel vous connecter.
Dmarrage
Dmarrez le programme en ligne de commande de PostgreSQL, appel psql, qui vous permet de saisir, d'diter et d'excuter
de manire interactive des commandes SQL.
Utilisez un outil existant avec une interface graphique comme pgAdmin ou une suite bureautique avec un support ODBC ou
JDBC pour crer et manipuler une base. Ces possibilits ne sont pas couvertes dans ce tutoriel.
crivez une application personnalise en utilisant un des nombreux langages disponibles. Ces possibilits sont davantage examines dans la Partie IV, Interfaces client .
Vous aurez probablement besoin de lancer psql pour essayer les exemples de ce tutoriel. Pour cela, saisissez la commande suivante :
$ psql ma_base
Si vous n'indiquez pas le nom de la base, alors psql utilisera par dfaut le nom de votre compte utilisateur. Vous avez dj dcouvert ce principe dans la section prcdente en utilisant createdb.
Dans psql, vous serez accueilli avec le message suivant :
psql (9.1.14)
Type "help" for help.
ma_base=>
La dernire ligne peut aussi tre :
ma_base=#
Cela veut dire que vous tes le super-utilisateur de la base de donnes, ce qui est souvent le cas si vous avez install
PostgreSQL vous-mme. tre super-utilisateur ou administrateur signifie que vous n'tes pas sujet aux contrles d'accs.
Concernant ce tutoriel, cela n'a pas d'importance.
Si vous rencontrez des problmes en excutant psql, alors retournez la section prcdente. Les diagnostiques de psql et de createdb sont semblables. Si le dernier fonctionnait, alors le premier devrait fonctionner galement.
La dernire ligne affiche par psql est l'invite. Cela indique que psql est l'coute et que vous pouvez saisir des requtes SQL
dans l'espace de travail maintenu par psql. Essayez ces commandes :
ma_base=> SELECT version();
version
----------------------------------------------------------------------PostgreSQL 9.1.14 on i586-pc-linux-gnu, compiled by GCC 2.96, 32-bit
(1 row)
ma_base=> SELECT current_date;
date
-----------2002-08-31
(1 row)
ma_base=> SELECT 2 + 2;
?column?
---------4
(1 row)
Le programme psql dispose d'un certain nombre de commandes internes qui ne sont pas des commandes SQL. Elles commencent
avec le caractre antislash (une barre oblique inverse, \ ). Par exemple, vous pouvez obtenir de l'aide sur la syntaxe de nombreuses commandes SQL de PostgreSQL en excutant :
ma_base=> \h
Pour sortir de psql, saisissez :
ma_base=> \q
et psql se terminera et vous ramnera votre shell. Pour plus de commandes internes, saisissez \? l'invite de psql. Les possibilits compltes de psql sont documentes dans psql(1). Dans ce tutoriel, nous ne verrons pas ces caractristiques explicitement mais
vous pouvez les utiliser vous-mme quand cela vous est utile.
2.2. Concepts
PostgreSQL est un systme de gestion de bases de donnes relationnelles (SGBDR). Cela signifie que c'est un systme pour
grer des donnes stockes dans des relations. Relation est essentiellement un terme mathmatique pour table. La notion de stockage de donnes dans des tables est si commune aujourd'hui que cela peut sembler en soi vident mais il y a de nombreuses
autres manires d'organiser des bases de donnes. Les fichiers et rpertoires dans les systmes d'exploitation de type Unix
forment un exemple de base de donnes hirarchique. Un dveloppement plus moderne est une base de donnes oriente objets.
Chaque table est un ensemble de lignes. Chaque ligne d'une table donne a le mme ensemble de colonnes et chaque colonne est
d'un type de donnes particulier. Tandis que les colonnes ont un ordre fix dans chaque ligne, il est important de se rappeler que
SQL ne garantit, d'aucune faon, l'ordre des lignes l'intrieur de la table (bien qu'elles puissent tre explicitement tries pour
l'affichage).
Les tables sont groupes dans des bases de donnes et un ensemble de bases gres par une instance unique du serveur PostgreSQL constitue une instance de bases (cluster en anglais).
-- temprature basse
-- temprature haute
-- prcipitation
Vous pouvez saisir cela dans psql avec les sauts de lignes. psql reconnatra que la commande n'est pas termine jusqu' arriver
un point-virgule.
Les espaces blancs (c'est--dire les espaces, les tabulations et les retours la ligne) peuvent tre librement utiliss dans les commandes SQL. Cela signifie que vous pouvez saisir la commande ci-dessus aligne diffremment ou mme sur une seule ligne.
Deux tirets ( -- ) introduisent des commentaires. Ce qui les suit est ignor jusqu' la fin de la ligne. SQL est insensible la
casse pour les mots-cls et les identifiants except quand les identifiants sont entre double guillemets pour prserver leur casse
(non fait ci-dessus).
5
Le langage SQL
varchar(80) spcifie un type de donnes pouvant contenir une chane de caractres arbitraires de 80 caractres au maximum. int est
le type entier normal. real est un type pour les nombres dcimaux en simple prcision. date devrait s'expliquer de lui-mme (oui, la
colonne de type date est aussi nomme date ; cela peut tre commode ou porter confusion, vous de choisir).
PostgreSQL prend en charge les types SQL standards int, smallint, real, double precision, char(N), varchar(N), date, time, timestamp et interval ainsi que d'autres types d'utilit gnrale et un riche ensemble de types gomtriques. PostgreSQL peut tre personnalis avec un nombre arbitraire de types de donnes dfinis par l'utilisateur. En consquence, les noms des types ne sont pas
des mots-cl dans la syntaxe sauf lorsqu'il est requis de supporter des cas particuliers dans la norme SQL.
Le second exemple stockera des villes et leur emplacement gographique associ :
CREATE TABLE villes (
nom
varchar(80),
emplacement
point
);
Le type point est un exemple d'un type de donnes spcifique PostgreSQL.
Pour finir, vous devez savoir que si vous n'avez plus besoin d'une table ou que vous voulez la recrer diffremment, vous pouvez
la supprimer en utilisant la commande suivante :
DROP TABLE nom_table;
Le langage SQL
Ici, * est un raccourci pour toutes les colonnes . 1 Donc, le mme rsultat pourrait tre obtenu avec :
SELECT ville, t_basse, t_haute, prcp, date FROM temps;
Le rsultat devrait tre ceci :
ville
| t_basse | t_haute | prcp |
date
---------------+---------+---------+------+-----------San Francisco |
46 |
50
| 0.25 | 1994-11-27
San Francisco |
43 |
57
|
0 | 1994-11-29
Hayward
|
37 |
54
|
| 1994-11-29
(3 rows)
Vous pouvez crire des expressions, pas seulement des rfrences de simples colonnes, dans la liste de slection. Par exemple,
vous pouvez faire :
SELECT ville, (t_haute+t_basse)/2 AS temp_moy, date FROM temps;
Cela devrait donner :
ville
| temp_moy |
date
---------------+----------+-----------San Francisco |
48 | 1994-11-27
San Francisco |
50 | 1994-11-29
Hayward
|
45 | 1994-11-29
(3 rows)
Notez comment la clause AS est utilise pour renommer la sortie d'une colonne (cette clause AS est optionnelle).
Une requte peut tre qualifie en ajoutant une clause WHERE qui spcifie les lignes souhaites. La clause WHERE contient une
expression boolenne et seules les lignes pour lesquelles l'expression boolenne est vraie sont renvoyes. Les oprateurs boolens
habituels (AND, OR et NOT) sont autoriss dans la qualification. Par exemple, ce qui suit recherche le temps San Francisco les
jours pluvieux :
SELECT * FROM temps
WHERE ville = 'San Francisco' AND prcp > 0.0;
Rsultat :
ville
| t_basse | t_haute | prcp |
date
---------------+---------+---------+------+-----------San Francisco |
46 |
50 | 0.25 | 1994-11-27
(1 row)
Vous pouvez demander ce que les rsultats d'une requte soient renvoys dans un ordre tri :
SELECT * FROM temps
ORDER BY ville;
ville
| t_basse | t_haute | prcp |
date
--------------+---------+---------+------+-----------Hayward
|
37 |
54 |
| 1994-11-29
San Francisco |
43 |
57 |
0 | 1994-11-29
San Francisco |
46 |
50 | 0.25 | 1994-11-27
Dans cet exemple, l'ordre de tri n'est pas spcifi compltement, donc vous pouvez obtenir les lignes San Francisco dans n'importe
quel ordre. Mais, vous auriez toujours obtenu les rsultats affichs ci-dessus si vous aviez fait :
SELECT * FROM temps
ORDER BY ville, t_basse;
Vous pouvez demander que les lignes dupliques soient supprimes du rsultat d'une requte :
SELECT DISTINCT ville
FROM temps;
ville
--------------Hayward
San Francisco
(2 rows)
1
Alors que SELECT * est utile pour des requtes rapides, c'est gnralement considr comme un mauvais style dans un code en production car l'ajout d'une colonne dans la table changerait les rsultats.
Le langage SQL
De nouveau, l'ordre des lignes rsultats pourrait varier. Vous pouvez vous assurer des rsultats cohrents en utilisant DISTINCT
et ORDER BY ensemble : 2
SELECT DISTINCT ville
FROM temps
ORDER BY ville;
Note
Ceci est uniquement un modle conceptuel. La jointure est habituellement excute d'une manire plus efficace que
la comparaison de chaque paire de lignes mais c'est invisible pour l'utilisateur.
Ceci sera accompli avec la requte suivante :
SELECT *
FROM temps, villes
WHERE ville = nom;
ville
| t_basse | t_haute | prcp |
date
|
nom
| emplacement
---------------+---------+---------+------+------------+---------------+------------San Francisco |
46 |
50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
San Francisco |
43 |
57 |
0 | 1994-11-29 | San Francisco | (-194,53)
(2 rows)
Deux remarques propos du rsultat :
Il n'y a pas de lignes pour la ville de Hayward dans le rsultat. C'est parce qu'il n'y a aucune entre correspondante dans la
table villes pour Hayward, donc la jointure ignore les lignes n'ayant pas de correspondance avec la table temps. Nous verrons
rapidement comment cela peut tre rsolu.
Il y a deux colonnes contenant le nom des villes. C'est correct car les listes des colonnes des tables temps et villes sont concatnes. En pratique, ceci est indsirable, vous voudrez probablement lister les colonnes explicitement plutt que d'utiliser * :
SELECT ville, t_basse, t_haute, prcp, date, emplacement
FROM temps, villes
WHERE ville = nom;
Exercice : Essayez de dterminer la smantique de cette requte quand la clause WHERE est omise.
Puisque toutes les colonnes ont un nom diffrent, l'analyseur a automatiquement trouv quelle table elles appartiennent. Si des
noms de colonnes sont communs entre les deux tables, vous aurez besoin de qualifier les noms des colonnes pour prciser celles
dont vous parlez. Par exemple :
SELECT temps.ville, temps.t_basse, temps.t_haute,
temps.prcp, temps.date, villes.emplacement
FROM temps, villes
WHERE villes.nom = temps.ville;
La qualification des noms de colonnes dans une requte de jointure est frquemment considre comme une bonne pratique. Cela
vite l'chec de la requte si un nom de colonne dupliqu est ajout plus tard dans une des tables.
Les requtes de jointure vues jusqu'ici peuvent aussi tre crites sous une autre forme :
SELECT *
FROM temps INNER JOIN villes ON (temps.ville = villes.nom);
Dans certains systmes de bases de donnes, ceci incluant les anciennes versions de PostgreSQL, l'implmentation de DISTINCT ordonne automatiquement les lignes. Du coup, ORDER BY n'est pas
ncessaire. Mais, ceci n'est pas requis par le standard SQL et PostgreSQL ne vous garantit pas actuellement que DISTINCT ordonne les lignes.
Le langage SQL
Cette syntaxe n'est pas aussi couramment utilise que les prcdentes mais nous la montrons ici pour vous aider comprendre les
sujets suivants.
Maintenant, nous allons essayer de comprendre comment nous pouvons avoir les entres de Hayward. Nous voulons que la requte parcourt la table temps et que, pour chaque ligne, elle trouve la (ou les) ligne(s) de villes correspondante(s). Si aucune ligne
correspondante n'est trouve, nous voulons que les valeurs des colonnes de la table villes soient remplaces par des valeurs
vides . Ce genre de requtes est appel jointure externe (outer join). (Les jointures que nous avons vus jusqu'ici sont des jointures
internes -- inner joins). La commande ressemble cela :
SELECT *
FROM temps LEFT OUTER JOIN villes ON (temps.ville = villes.nom);
ville
| t_basse | t_haute | prcp |
date
|
nom
| emplacement
---------------+---------+---------+------+------------+---------------+------------Hayward
|
37 |
54 |
| 1994-11-29 |
|
San Francisco |
46 |
50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
San Francisco |
43 |
57 |
0 | 1994-11-29 | San Francisco | (-194,53)
(3 rows)
Cette requte est appele une jointure externe gauche (left outer join) parce que la table mentionne la gauche de l'oprateur de
jointure aura au moins une fois ses lignes dans le rsultat tandis que la table sur la droite aura seulement les lignes qui correspondent des lignes de la table de gauche. Lors de l'affichage d'une ligne de la table de gauche pour laquelle il n'y a pas de correspondance dans la table de droite, des valeurs vides (appeles NULL) sont utilises pour les colonnes de la table de droite.
Exercice : Il existe aussi des jointures externes droite et des jointures externes compltes. Essayez de trouver ce qu'elles font.
Nous pouvons galement joindre une table avec elle-mme. Ceci est appel une jointure rflexive. Comme exemple, supposons
que nous voulons trouver toutes les entres de temps qui sont dans un intervalle de temprature d'autres entres de temps. Nous
avons donc besoin de comparer les colonnes t_basse et t_haute de chaque ligne de temps aux colonnes t_basse et
t_haute de toutes les autres lignes de temps. Nous pouvons faire cela avec la requte suivante :
SELECT T1.ville, T1.t_basse AS bas, T1.t_haute AS haut,
T2.ville, T2.t_basse AS bas, T2.t_haute AS haus
FROM temps T1, temps T2
WHERE T1.t_basse < T2.t_basse
AND T1.t_haute > T2.t_haute;
ville
| bas | haut |
ville
| bas | haut
----------------+-----+------+---------------+-----+-----San Francisco | 43 |
57 | San Francisco | 46 |
50
Hayward
| 37 |
54 | San Francisco | 46 |
50
(2 rows)
Dans cet exemple, nous avons renomm la table temps en T1 et en T2 pour tre capable de distinguer respectivement le ct
gauche et droit de la jointure. Vous pouvez aussi utiliser ce genre d'alias dans d'autres requtes pour conomiser de la frappe,
c'est--dire :
SELECT *
FROM temps t, villes v
WHERE t.ville = v.nom;
Vous rencontrerez ce genre d'abrviation assez frquemment.
Le langage SQL
FAUX
mais cela ne marchera pas puisque l'agrgat max ne peut pas tre utilis dans une clause WHERE (cette restriction existe parce que
la clause WHERE dtermine les lignes qui seront traites par l'agrgat ; donc les lignes doivent tre values avant que les fonctions
d'agrgat ne calculent leur rsultat). Cependant, comme cela est souvent le cas, la requte peut tre rpte pour arriver au rsultat
attendu, ici en utilisant une sous-requte :
SELECT ville FROM temps
WHERE t_basse = (SELECT max(t_basse) FROM temps);
ville
--------------San Francisco
(1 row)
Ceci est correct car la sous-requte est un calcul indpendant qui traite son propre agrgat sparment partir de ce qui se passe
dans la requte externe.
Les agrgats sont galement trs utiles s'ils sont combins avec les clauses GROUP BY. Par exemple, nous pouvons obtenir la
temprature la plus haute parmi les tempratures basses observes dans chaque ville avec :
SELECT ville, max(t_basse)
FROM temps
GROUP BY ville;
ville
| max
---------------+----Hayward
| 37
San Francisco | 46
(2 rows)
ce qui nous donne une ligne par ville dans le rsultat. Chaque rsultat d'agrgat est calcul avec les lignes de la table correspondant la ville. Nous pouvons filtrer ces lignes groupes en utilisant HAVING :
SELECT ville, max(t_basse)
FROM temps
GROUP BY ville
HAVING max(t_basse) < 40;
ville | max
---------+----Hayward | 37
(1 row)
ce qui nous donne le mme rsultat uniquement pour les villes qui ont toutes leurs valeurs de t_basse en-dessous de 40. Pour finir, si nous nous proccupons seulement des villes dont le nom commence par S , nous pouvons faire :
SELECT ville, max(t_basse)
FROM temps
WHERE ville LIKE 'S%'
GROUP BY ville
HAVING max(t_basse) < 40;
L'oprateur LIKE fait la correspondance avec un motif ; cela est expliqu dans la Section 9.7, Correspondance de motif .
Il est important de comprendre l'interaction entre les agrgats et les clauses SQL WHERE et HAVING. La diffrence fondamentale
entre WHERE et HAVING est que WHERE slectionne les lignes en entre avant que les groupes et les agrgats ne soient traits
(donc, cette clause contrle les lignes qui se retrouvent dans le calcul de l'agrgat) tandis que HAVING slectionne les lignes groupes aprs que les groupes et les agrgats aient t traits. Donc, la clause WHERE ne doit pas contenir de fonctions d'agrgat ; cela
n'a aucun sens d'essayer d'utiliser un agrgat pour dterminer les lignes en entre des agrgats. D'un autre ct, la clause HAVING
contient toujours des fonctions d'agrgat (pour tre prcis, vous tes autoriss crire une clause HAVING qui n'utilise pas
d'agrgats mais c'est rarement utilis. La mme condition pourra tre utilise plus efficacement par un WHERE).
Dans l'exemple prcdent, nous pouvons appliquer la restriction sur le nom de la ville dans la clause WHERE puisque cela ne ncessite aucun agrgat. C'est plus efficace que d'ajouter la restriction dans HAVING parce que nous vitons le groupement et les calculs d'agrgat pour toutes les lignes qui ont chou lors du contrle fait par WHERE.
Le langage SQL
Vous pouvez mettre jour une ligne existante en utilisant la commande UPDATE. Supposez que vous dcouvrez que les tempratures sont toutes excdentes de deux degrs aprs le 28 novembre. Vous pouvez corriger les donnes de la faon suivante :
UPDATE temps
SET t_haute = t_haute - 2,
WHERE date > '1994-11-28';
t_basse = t_basse - 2
2.9. Suppressions
Les lignes peuvent tre supprimes de la table avec la commande DELETE. Supposez que vous n'tes plus intress par le temps
de Hayward. Vous pouvez faire ce qui suit pour supprimer ses lignes de la table :
DELETE FROM temps WHERE ville = 'Hayward';
Toutes les entres de temps pour Hayward sont supprimes.
SELECT * FROM temps;
ville
| t_basse | t_haute | prcp |
date
---------------+---------+---------+------+-----------San Francisco |
46 |
50 | 0.25 | 1994-11-27
San Francisco |
41 |
55 |
0 | 1994-11-29
(2 rows)
Faire trs attention aux instructions de la forme
DELETE FROM nom_table;
Sans une qualification, DELETE supprimera toutes les lignes de la table donne, la laissant vide. Le systme le fera sans demander de confirmation !
11
3.2. Vues
Se rfrer aux requtes de la Section 2.6, Jointures entre les tables . Si la liste des enregistrements du temps et des villes est
d'un intrt particulier pour l'application considre mais qu'il devient contraignant de saisir la requte chaque utilisation, il est
possible de crer une vue avec la requte. De ce fait, la requte est nomme et il peut y tre fait rfrence de la mme faon qu'il
est fait rfrence une table :
CREATE VIEW ma_vue AS
SELECT ville, t_basse, t_haute, prcp, date, emplacement
FROM temps, villes
WHERE ville = nom;
SELECT * FROM ma_vue;
L'utilisation des vues est un aspect cl d'une bonne conception des bases de donnes SQL. Les vues permettent d'encapsuler les
dtails de la structure des tables. Celle-ci peut alors changer avec l'volution de l'application, tandis que l'interface reste
constante.
Les vues peuvent tre utilises dans quasiment toutes les situations o une vraie table est utilisable. De plus, il n'est pas inhabituel de construire des vues reposant sur d'autres vues.
12
Fonctionnalits avances
Le comportement des cls trangres peut tre adapt trs finement une application particulire. Ce tutoriel ne va pas plus loin
que cet exemple simple. De plus amples informations sont accessibles dans le Chapitre 5, Dfinition des donnes. Une utilisation
efficace des cls trangres amliore la qualit des applications accdant aux bases de donnes. Il est donc fortement conseill
d'apprendre les utiliser.
3.4. Transactions
Les transactions sont un concept fondamental de tous les systmes de bases de donnes. Une transaction assemble plusieurs
tapes en une seule opration tout-ou-rien. Les tats intermdiaires entre les tapes ne sont pas visibles par les transactions concurrentes. De plus, si un chec survient qui empche le succs de la transaction, alors aucune des tapes n'affecte la base de donnes.
Si l'on considre, par exemple, la base de donnes d'une banque qui contient le solde de diffrents comptes clients et le solde total
des dpts par branches et que l'on veuille enregistrer un virement de 100 euros du compte d'Alice vers celui de Bob, les commandes SQL peuvent ressembler cela (aprs simplification) :
UPDATE comptes SET balance = balance - 100.00
WHERE nom = 'Alice';
UPDATE branches SET balance = balance - 100.00
WHERE nom = (SELECT nom_branche FROM comptes WHERE nom = 'Alice');
UPDATE comptes SET balance = balance + 100.00
WHERE nom = 'Bob';
UPDATE branches SET balance = balance + 100.00
WHERE nom = (SELECT nom_branche FROM comptes WHERE nom = 'Bob');
Ce ne sont pas les dtails des commandes qui importent ici ; le point important est la ncessit de plusieurs mises jour spares
pour accomplir cette opration assez simple. Les employs de la banque veulent tre assurs que, soit toutes les commandes sont
effectues, soit aucune ne l'est. Il n'est pas envisageable que, suite une erreur du systme, Bob reoive 100 euros qui n'ont pas t
dbits du compte d'Alice. De la mme faon, Alice ne restera pas longtemps une cliente fidle si elle est dbite du montant sans
que celui-ci ne soit crdit sur le compte de Bob. Il est important de garantir que si quelque chose se passe mal, aucune des tapes
dj excutes n'est prise en compte. Le regroupement des mises jour au sein d'une transaction apporte cette garantie. Une transaction est dite atomique : du point de vue des autres transactions, elle passe compltement ou pas du tout.
Il est galement ncessaire de garantir qu'une fois la transaction termine et valide par la base de donnes, les transactions sont
enregistres dfinitivement et ne peuvent tre perdues, mme si une panne survient peu aprs. Ainsi, si un retrait d'argent est effectu par Bob, il ne faut absolument pas que le dbit de son compte disparaisse suite une panne survenant juste aprs son dpart de
la banque. Une base de donnes transactionnelle garantit que toutes les mises jour faites lors d'une transaction sont stockes de
manire persistante (c'est--dire sur disque) avant que la transaction ne soit dclare valide.
Une autre proprit importante des bases de donnes transactionnelles est en relation troite avec la notion de mises jour atomiques : quand plusieurs transactions sont lances en parallle, aucune d'entre elles ne doit tre capable de voir les modifications
incompltes effectues par les autres. Ainsi, si une transaction calcule le total de toutes les branches, inclure le dbit de la branche
d'Alice sans le crdit de la branche de Bob, ou vice-versa, est une vritable erreur. Les transactions doivent donc tre tout-ou-rien,
non seulement pour leur effet persistant sur la base de donnes, mais aussi pour leur visibilit au moment de leur excution. Les
mises jour faites jusque-l par une transaction ouverte sont invisibles aux autres transactions jusqu' la fin de celle-ci. ce moment, toutes les mises jours deviennent simultanment visibles.
Sous PostgreSQL, une transaction est dclare en entourant les commandes SQL de la transaction par les commandes BEGIN
et COMMIT. La transaction bancaire ressemble alors ceci :
BEGIN;
UPDATE comptes SET balance = balance - 100.00
WHERE nom = 'Alice';
-- etc etc
COMMIT;
Si, au cours de la transaction, il est dcid de ne pas valider (peut-tre la banque s'aperoit-elle que la balance d'Alice passe en ngatif), la commande ROLLBACK peut tre utilise la place de COMMIT. Toutes les mises jour ralises jusque-l sont alors
annules.
En fait, PostgreSQL traite chaque instruction SQL comme si elle tait excute dans une transaction. En l'absence de commande
BEGIN explicite, chaque instruction individuelle se trouve implicitement entoure d'un BEGIN et (en cas de succs) d'un COMMIT. Un groupe d'instructions entoures par BEGIN et COMMIT est parfois appel bloc transactionnel.
Note
Quelques bibliothques clientes lancent les commandes BEGIN et COMMIT automatiquement. L'utilisateur bn13
Fonctionnalits avances
ficie alors des effets des blocs transactionnels sans les demander. Vrifiez la documentation de l'interface que vous
utilisez.
Il est possible d'augmenter la granularit du contrle des instructions au sein d'une transaction en utilisant des points de retournement (savepoint). Ceux-ci permettent d'annuler des parties de la transaction tout en validant le reste. Aprs avoir dfini un point de
retournement l'aide de SAVEPOINT, les instructions excutes depuis ce point peuvent, au besoin, tre annules avec ROLLBACK TO. Toutes les modifications de la base de donnes effectues par la transaction entre le moment o le point de retournement a t dfini et celui o l'annulation est demande sont annules mais les modifications antrieures ce point sont conserves.
Le retour un point de retournement ne l'annule pas. Il reste dfini et peut donc tre utilis plusieurs fois. l'inverse, lorsqu'il
n'est plus ncessaire de revenir un point de retournement particulier, il peut tre relch, ce qui permet de librer des ressources
systmes. Il faut savoir toutefois que relcher un point de retournement ou y revenir relche tous les points de retournement qui
ont t dfinis aprs.
Tout ceci survient l'intrieur du bloc de transaction, et n'est donc pas visible par les autres sessions en cours sur la base de donnes. Si le bloc est valid, et ce moment-l seulement, toutes les actions valides deviennent immdiatement visibles par les
autres sessions, tandis que les actions annules ne le seront jamais.
Reconsidrant la base de donnes de la banque, on peut supposer vouloir dbiter le compte d'Alice de $100.00, somme crditer
sur le compte de Bob, mais considrer plus tard que c'est le compte de Wally qu'il convient de crditer. l'aide des points de retournement, cela peut se drouler ainsi :
BEGIN;
UPDATE comptes SET balance = balance
WHERE nom = 'Alice';
SAVEPOINT mon_pointdesauvegarde;
UPDATE comptes SET balance = balance
WHERE nom = 'Bob';
-- oups ... oublions a et crditons
ROLLBACK TO mon_pointdesauvegarde;
UPDATE comptes SET balance = balance
WHERE nom = 'Wally';
COMMIT;
- 100.00
+ 100.00
le compte de Wally
+ 100.00
Cet exemple est bien sr trs simplifi mais de nombreux contrles sont ralisables au sein d'un bloc de transaction grce
l'utilisation des points de retournement. Qui plus est, ROLLBACK TO est le seul moyen de regagner le contrle d'un bloc de
transaction plac dans un tat d'annulation par le systme du fait d'une erreur. C'est plus rapide que de tout annuler pour tout recommencer.
Fonctionnalits avances
La quatrime colonne reprsente une moyenne calcule sur tous les enregistrements de la table qui ont la mme valeur de nomdep que la ligne courante. (Il s'agit effectivement de la mme fonction que la fonction d'agrgat classique avg, mais la clause
OVER entrane son excution en tant que fonction de fentrage et son calcul sur le jeu appropri d'enregistrements.)
Un appel une fonction de fentrage contient toujours une clause OVER qui suit immdiatement le nom et les arguments de la
fonction. C'est ce qui permet de la distinguer syntaxiquement d'une fonction simple ou d'une fonction d'agrgat. La clause OVER
dtermine prcisment comment les lignes de la requte sont clates pour tre traites par la fonction de fentrage. La liste PARTITION BY contenue dans la clause OVER spcifie la rpartition des enregistrements en groupes, ou partitions, qui partagent les
mmes valeurs pour la (les) expression(s) contenue(s) dans la clause PARTITION BY. Pour chaque enregistrement, la fonction
de fentrage est calcule sur les enregistrements qui se retrouvent dans la mme partition que l'enregistrement courant.
Vous pouvez aussi contrler l'ordre dans lequel les lignes sont traites par les fonctions de fentrage en utilisant la clause ORDER
BY l'intrieur de la clause OVER (la partition traite par le ORDER BY n'a de plus pas besoin de correspondre l'ordre dans lequel les lignes seront affiches). Voici un exemple :
SELECT nomdep, noemp, salaire, rank() OVER (PARTITION BY nomdep ORDER BY salaire DESC)
FROM salaireemp;
nomdep
| noemp | salaire| rank
-----------+-------+--------+-----develop
|
8 |
6000 |
1
develop
|
10 |
5200 |
2
develop
|
11 |
5200 |
2
develop
|
9 |
4500 |
4
develop
|
7 |
4200 |
5
personnel |
2 |
3900 |
1
personnel |
5 |
3500 |
2
ventes
|
1 |
5000 |
1
ventes
|
4 |
4800 |
2
ventes
|
3 |
4800 |
2
(10 rows)
On remarque que la fonction rank produit un rang numrique dans la partition de l'enregistrement pour chaque valeur diffrente
de l'ORDER BY, dans l'ordre dfini par la clause ORDER BY. rank n'a pas besoin de paramtre explicite, puisque son comportement est entirement dtermin par la clause OVER.
Les lignes prises en compte par une fonction de fentrage sont celles de la table virtuelle produite par la clause FROM de la requte
filtre par ses clauses WHERE, GROUP BY et HAVING, s'il y en a. Par exemple, une ligne rejete parce qu'elle ne satisfait pas la
condition WHERE n'est vue par aucune fonction de fentrage. Une requte peut contenir plusieurs de ces fonctions de fentrage qui
dcoupent les donnes de faons diffrentes, par le biais de clauses OVER diffrentes, mais elles travaillent toutes sur le mme jeu
d'enregistrements, dfini par cette table virtuelle.
ORDER BY peut tre omis lorsque l'ordre des enregistrements est sans importance. Il est aussi possible d'omettre PARTITION
BY, auquel cas il n'y a qu'une seule partition, contenant tous les enregistrements.
Il y a un autre concept important associ aux fonctions de fentrage : pour chaque enregistrement, il existe un jeu
d'enregistrements dans sa partition appel son window frame (cadre de fentre). Beaucoup de fonctions de fentrage, mais pas
toutes, travaillent uniquement sur les enregistrements du window frame, plutt que sur l'ensemble de la partition. Par dfaut, si on
a prcis une clause ORDER BY, la window frame contient tous les enregistrements du dbut de la partition jusqu'
l'enregistrement courant, ainsi que tous les enregistrements suivants qui sont gaux l'enregistrement courant au sens de la clause
ORDER BY. Quand ORDER BY est omis, la window frame par dfaut contient tous les enregistrements de la partition. 1 Voici un
exemple utilisant sum :
SELECT salaire, sum(salaire) OVER () FROM salaireemp;
salaire| sum
--------+------5200 | 47100
5000 | 47100
3500 | 47100
4800 | 47100
3900 | 47100
4200 | 47100
4500 | 47100
1
Il existe des options pour dfinir la window frame autrement, mais ce tutoriel ne les prsente pas. Voir la Section 4.2.8, Appels de fonction de fentrage pour les dtails.
15
Fonctionnalits avances
4800 | 47100
6000 | 47100
5200 | 47100
(10 rows)
Dans l'exemple ci-dessus, puisqu'il n'y a pas d'ORDER BY dans la clause OVER, la window frame est gale la partition ; en
d'autres termes, chaque somme est calcule sur toute la table, ce qui fait qu'on a le mme rsultat pour chaque ligne du rsultat.
Mais si on ajoute une clause ORDER BY, on a un rsultat trs diffrent :
SELECT salaire, sum(salaire) OVER (ORDER BY salaire) FROM salaireemp;
salaire| sum
--------+------3500 | 3500
3900 | 7400
4200 | 11600
4500 | 16100
4800 | 25700
4800 | 25700
5000 | 30700
5200 | 41100
5200 | 41100
6000 | 47100
(10 rows)
Ici, sum est calcul partir du premier salaire (c'est--dire le plus bas) jusqu'au salaire courant, en incluant tous les doublons du
salaire courant (remarquez les valeurs pour les salaires identiques).
Les fonctions window ne sont autorises que dans la liste SELECT et la clause ORDER BY de la requte. Elles sont interdites
ailleurs, comme par exemple dans les clauses GROUP BY,HAVING et WHERE. La raison en est qu'elles sont excutes aprs le
traitement de ces clauses. Par ailleurs, les fonctions de fentrage s'excutent aprs les fonctions d'agrgat classiques. Cela signifie
qu'il est permis d'inclure une fonction d'agrgat dans les arguments d'une fonction de fentrage, mais pas l'inverse.
S'il y a besoin de filtrer ou de grouper les enregistrements aprs le calcul des fonctions de fentrage, une sous-requte peut tre utilise. Par exemple :
SELECT nomdep, noemp, salaire, date_embauche
FROM
(SELECT nomdep, noemp, salaire, date_embauche,
rank() OVER (PARTITION BY nomdep ORDER BY salaire DESC, noemp) AS pos
FROM salaireemp
) AS ss
WHERE pos < 3;
La requte ci-dessus n'affiche que les enregistrements de la requte interne ayant un rang infrieur 3.
Quand une requte met en jeu plusieurs fonctions de fentrage, il est possible d'crire chacune avec une clause OVER diffrente,
mais cela entrane des duplications de code et augmente les risques d'erreurs si on souhaite le mme comportement pour plusieurs
fonctions de fentrage. la place, chaque comportement de fentrage peut tre associ un nom dans une clause WINDOW et ensuite tre rfrenc dans OVER. Par exemple :
SELECT sum(salaire) OVER w, avg(salaire) OVER w
FROM salaireemp
WINDOW w AS (PARTITION BY nomdep ORDER BY salaire DESC);
Plus de dtails sur les fonctions de fentrage sont disponibles dans la Section 4.2.8, Appels de fonction de fentrage , la Section 9.19, Fonctions Window , la Section 7.2.4, Traitement de fonctions Window et la page de rfrence SELECT(7).
3.6. Hritage
L'hritage est un concept issu des bases de donnes orientes objet. Il ouvre de nouvelles possibilits intressantes en conception
de bases de donnes.
Soient deux tables : une table villes et une table capitales. Les capitales tant galement des villes, il est intressant d'avoir
la possibilit d'afficher implicitement les capitales lorsque les villes sont listes. Un utilisateur particulirement brillant peut crire
16
Fonctionnalits avances
ceci
CREATE TABLE
nom
population
altitude
etat
);
capitales (
text,
real,
int,
-- (en pied)
char(2)
CREATE TABLE
nom
population
altitude
);
non_capitales (
text,
real,
int
-- (en pied)
villes (
text,
real,
int
-- (en pied)
Fonctionnalits avances
Note
Bien que l'hritage soit frquemment utile, il n'a pas t intgr avec les contraintes d'unicit et les cls trangres,
ce qui limite son utilit. Voir la Section 5.8, L'hritage pour plus de dtails.
3.7. Conclusion
PostgreSQL dispose d'autres fonctionnalits non dcrites dans ce tutoriel d'introduction orient vers les nouveaux utilisateurs de
SQL. Ces fonctionnalits sont discutes plus en dtails dans le reste de ce livre.
Si une introduction plus approfondie est ncessaire, le lecteur peut visiter le site web de PostgreSQL qui fournit des liens vers
d'autres ressources.
18
Syntaxe SQL
Voici un deuxime type d'identificateur : l'identificateur dlimit ou l'identificateur entre guillemets. Il est form en englobant une
squence arbitraire de caractres entre des guillemets doubles ("). Un identificateur dlimit est toujours un identificateur, jamais
un mot cl. Donc, "select" pourrait tre utilis pour faire rfrence une colonne ou une table nomme select , alors
qu'un select sans guillemets sera pris pour un mot cl et du coup, pourrait provoquer une erreur d'analyse lorsqu'il est utilis
alors qu'un nom de table ou de colonne est attendu. L'exemple peut tre crit avec des identificateurs entre guillemets comme ceci :
UPDATE "ma_table" SET "a" = 5;
Les identificateurs entre guillemets peuvent contenir tout caractre autre que celui de code 0. (Pour inclure un guillemet double,
crivez deux guillemets doubles.) Ceci permet la construction de noms de tables et de colonnes qui ne seraient pas possible autrement, comme des noms contenant des espaces ou des arobases. La limitation de la longueur s'applique toujours.
Une variante des identificateurs entre guillemets permet d'inclure des caractres Unicode chapps en les identificateur par leur
point de code. Cette variante commence par U& (U en majuscule ou minuscule suivi par un et commercial ) immdiatement
suivi par un guillemet double d'ouverture, sans espace entre eux. Par exemple U&"foo". (Notez que c'est source d'ambigut avec
l'oprateur &. Utilisez les espaces autour de l'oprateur pour viter ce problme.) l'intrieur des guillemets, les caractres Unicode peuvent tre indiqus dans une forme chappe en crivant un antislash suivi par le code hexadcimal sur quatre chiffres ou,
autre possibilit, un antislash suivi du signe plus suivi d'un code hexadcimal sur six chiffres. Par exemple, l'identificateur "data" peut tre crit ainsi :
U&"d\0061t\+000061"
L'exemple suivant, moins trivial, crit le mot russe slon (lphant) en lettres cyrilliques :
U&"\0441\043B\043E\043D"
Si un caractre d'chappement autre que l'antislash est dsir, il peut tre indiqu en utilisant la clause UESCAPE aprs la chane.
Par exemple :
U&"d!0061t!+000061" UESCAPE '!'
La chane d'chappement peut tre tout caractre simple autre qu'un chiffre hexadcimal, le signe plus, un guillemet simple ou
double, ou un espace blanc. Notez que le caractre d'chappement est crit entre guillemets simples, pas entre guillemets doubles.
Pour inclure le caractre d'chappement dans l'identificateur sans interprtation, crivez-le deux fois.
La syntaxe d'chappement Unicode fonctionne seulement quand l'encodage serveur est UTF8. Quand d'autres encodages clients
sont utiliss, seuls les codes dans l'chelle ASCII (jusqu' \007F) peuvent tre utiliss. La forme sur quatre chiffres et la forme
sur six chiffres peuvent tre utilises pour indiquer des paires UTF-16 composant ainsi des caractres comprenant des points de
code plus grands que U+FFFF (et ce, bien que la disponibilit de la forme sur six chiffres ne le ncessite pas techniquement). (Les
paires de substitution ne sont pas stockes directement mais combines dans un point de code seul qui est ensuite encod en UTF8.)
Mettre un identificateur entre guillemets le rend sensible la casse alors que les noms sans guillemets sont toujours convertis en
minuscules. Par exemple, les identificateurs FOO, foo et "foo" sont considrs identiques par PostgreSQL mais "Foo" et
"FOO" sont diffrents des trois autres et entre eux. La mise en minuscule des noms sans guillemets avec PostgreSQL n'est pas
compatible avec le standard SQL qui indique que les noms sans guillemets devraient tre mis en majuscule. Du coup, foo devrait
tre quivalent "FOO" et non pas "foo" en respect avec le standard. Si vous voulez crire des applications portables, nous
vous conseillons de toujours mettre entre guillemets un nom particulier ou de ne jamais le mettre.
4.1.2. Constantes
Il existe trois types implicites de constantes dans PostgreSQL : les chanes, les chanes de bits et les nombres. Les constantes
peuvent aussi tre spcifies avec des types explicites, ce qui peut activer des reprsentations plus prcises et gres plus efficacement par le systme. Les constantes implicites sont dcrites ci-dessous ; ces constantes sont discutes dans les sous-sections suivantes.
Syntaxe SQL
ment comme si la chane avait t crite dans une constante. Par exemple :
SELECT 'foo'
'bar';
est quivalent :
SELECT 'foobar';
mais :
SELECT 'foo'
'bar';
n'a pas une syntaxe valide (ce comportement lgrement bizarre est spcifi par le standard SQL ; PostgreSQL suit le standard).
Interprtation
\b
suppression
\f
\n
saut de ligne
\r
saut de ligne
\t
tabulation
valeur octale
\xh, \xhh (h = 0 - 9, A - F)
valeur hexadcimale
\uxxxx, \Uxxxxxxxx (x = 0 - 9, A - F)
Tout autre caractre suivi d'un antislash est pris littralement. Du coup, pour inclure un caractre antislash, crivez deux antislashs
(\\). De plus, un guillemet simple peut tre inclus dans une chane d'chappement en crivant \', en plus de la faon normale
''.
Il est de votre responsabilit que les squences d'octets que vous crez, tout spcialement lorsque vous utilisez les chappements
octaux et hexadcimaux, soient des caractres valides dans l'encodage du jeu de caractres du serveur. Quand l'encodage est UTF8, alors les chappements Unicode ou l'autre syntaxe d'chappement Unicode, expliqus dans la Section 4.1.2.3, Constantes de
chanes avec des chappements Unicode , devraient tre utiliss. (L'alternative serait de raliser l'encodage UTF-8 manuellement
et d'crire les octets, ce qui serait trs lourd.)
La syntaxe d'chappement Unicode fonctionne compltement mais seulement quand l'encodage du serveur est justement UTF8.
Lorsque d'autres encodages serveur sont utiliss, seuls les points de code dans l'chelle ASCII (jusqu' \u007F) peuvent tre utiliss. La forme sur quatre chiffres et la forme sur six chiffres peuvent tre utilises pour indiquer des paires UTF-16 composant
ainsi des caractres comprenant des points de code plus grands que U+FFFF et ce, bien que la disponibilit de la forme sur six
chiffres ne le ncessite pas techniquement. (Quand des paires de substitution sont utilises et que l'encodage du serveur est UTF8,
elles sont tout d'abord combines en un point code seul qui est ensuite encod en UTF-8.)
Attention
Si le paramtre de configuration standard_conforming_strings est dsactiv (off), alors PostgreSQL reconnat
les chappements antislashs dans les constantes traditionnelles de type chanes et celles chappes. Nanmoins,
partir de PostgreSQL 9.1, la valeur par dfaut est on, ce qui signifie que les chappements par antislash ne sont
reconnus que dans les constantes de chanes d'chappement. Ce comportement est plus proche du standard SQL
mais pourrait causer des problmes aux applications qui se basent sur le comportement historique o les chappements par antislash taient toujours reconnus. Pour contourner ce problme, vous pouvez configurer ce paramtre
off bien qu'il soit prfrable de ne plus utiliser les chappements par antislash. Si vous avez besoin d'un chappement par antislash pour reprsenter un caractre spcial, crivez la chane fixe avec un E.
22
Syntaxe SQL
Syntaxe SQL
Syntaxe SQL
REAL '1.23'
1.23::REAL
-- style chane
-- style PostgreSQL (historique)
Ce sont en fait des cas spciaux des notations de conversion gnrales discutes aprs.
4.1.3. Oprateurs
Un nom d'oprateur est une squence d'au plus NAMEDATALEN-1 (63 par dfaut) caractres provenant de la liste suivante :
+-*/<>=~!@#%^&|`?
Nanmoins, il existe quelques restrictions sur les noms d'oprateurs :
-- et /* ne peuvent pas apparatre quelque part dans un nom d'oprateur car ils seront pris pour le dbut d'un commentaire.
Un nom d'oprateur plusieurs caractres ne peut pas finir avec + ou -, sauf si le nom contient aussi un de ces caractres :
~!@#%^&|`?
Par exemple, @- est un nom d'oprateur autoris mais *- ne l'est pas. Cette restriction permet PostgreSQL d'analyser des
requtes compatibles avec SQL sans requrir des espaces entre les jetons.
Lors d'un travail avec des noms d'oprateurs ne faisant pas partie du standard SQL, vous aurez habituellement besoin de sparer
les oprateurs adjacents avec des espaces pour viter toute ambigut. Par exemple, si vous avez dfini un oprateur unaire gauche
nomm @, vous ne pouvez pas crire X*@Y ; vous devez crire X* @Y pour vous assurer que PostgreSQL le lit comme deux
noms d'oprateurs, et non pas comme un seul.
Un signe dollar ($) suivi de chiffres est utilis pour reprsenter un paramtre de position dans le corps de la dfinition d'une
fonction ou d'une instruction prpare. Dans d'autres contextes, le signe dollar pourrait faire partie d'un identificateur ou d'une
constante de type chane utilisant le dollar comme guillemet.
Les parenthses (()) ont leur signification habituelle pour grouper leurs expressions et renforcer la prcdence. Dans certains
cas, les parenthses sont requises car faisant partie de la syntaxe d'une commande SQL particulire.
Les crochets ([]) sont utiliss pour slectionner les lments d'un tableau. Voir la Section 8.14, Tableaux pour plus
25
Syntaxe SQL
Les virgules (,) sont utilises dans quelques constructions syntaxiques pour sparer les lments d'une liste.
Le point-virgule (;) termine une commande SQL. Il ne peut pas apparatre quelque part dans une commande, sauf l'intrieur
d'une constante de type chane ou d'un identificateur entre guillemets.
Le caractre deux points (:) est utilis pour slectionner des morceaux de tableaux (voir la Section 8.14, Tableaux ).
Dans certains dialectes SQL (tel que le SQL embarqu), il est utilis pour prfixer les noms de variables.
L'astrisque (*) est utilis dans certains contextes pour indiquer tous les champs de la ligne d'une table ou d'une valeur composite. Elle a aussi une signification spciale lorsqu'elle est utilise comme argument d'une fonction d'agrgat. Cela signifie que
l'agrgat ne requiert par de paramtre explicite.
Le point (.) est utilis dans les constantes numriques et pour sparer les noms de schma, table et colonne.
4.1.5. Commentaires
Un commentaire est une squence de caractres commenant avec deux tirets et s'tendant jusqu' la fin de la ligne, par exemple :
-- Ceci est un commentaire standard en SQL
Autrement, les blocs de commentaires style C peuvent tre utiliss :
/* commentaires multilignes
* et imbriqus: /* bloc de commentaire imbriqu */
*/
o le commentaire commence avec /* et s'tend jusqu' l'occurrence de */. Ces blocs de commentaires s'imbriquent, comme spcifi dans le standard SQL mais pas comme dans le langage C. De ce fait, vous pouvez commenter des blocs importants de code
pouvant contenir des blocs de commentaires dj existants.
Un commentaire est supprim du flux en entre avant une analyse plus pousse de la syntaxe et est remplac par un espace blanc.
Oprateur/lment
Associativit
Description
gauche
::
gauche
[]
gauche
+-
droite
gauche
exposant
*/%
gauche
+-
gauche
addition, soustraction
IS
Syntaxe SQL
Oprateur/lment
Associativit
Description
ISNULL
NOTNULL
(autres)
gauche
IN
appartenance un ensemble
BETWEEN
compris entre
OVERLAPS
<>
infrieur, suprieur
droite
galit, affectation
NOT
droite
ngation logique
AND
gauche
conjonction logique
OR
gauche
disjonction logique
Notez que les rgles de prcdence des oprateurs s'appliquent aussi aux oprateurs dfinis par l'utilisateur qui ont le mme nom
que les oprateurs internes mentionns ici. Par exemple, si vous dfinissez un oprateur + pour un type de donnes personnalis, il aura la mme prcdence que l'oprateur interne + , peu importe ce que fait le votre.
Lorsqu'un nom d'oprateur qualifi par un schma est utilis dans la syntaxe OPERATOR, comme par exemple dans :
SELECT 3 OPERATOR(pg_catalog.+) 4;
la construction OPERATOR est prise pour avoir la prcdence par dfaut affiche dans le Tableau 4.2, Prcdence des oprateurs
(en ordre dcroissant) pour les oprateurs autres . Ceci est vrai quelque soit le nom spcifique de l'oprateur apparaissant
l'intrieur de OPERATOR().
une rfrence de la position d'un paramtre, dans le corps d'une dfinition de fonction ou d'instruction prpare ;
un appel d'oprateur ;
un appel de fonction ;
un constructeur de tableau ;
un constructeur de ligne ;
27
Syntaxe SQL
toute expression de valeur entre parenthses, utile pour grouper des sous-expressions et surcharger la prcdence.
En plus de cette liste, il existe un certain nombre de constructions pouvant tre classes comme une expression mais ne suivant aucune rgle de syntaxe gnrale. Elles ont gnralement la smantique d'une fonction ou d'un oprateur et sont expliques au Chapitre 9, Fonctions et oprateurs. Un exemple est la clause IS NULL.
Nous avons dj discut des constantes dans la Section 4.1.2, Constantes . Les sections suivantes discutent des options restantes.
4.2.3. Indices
Si une expression rcupre une valeur de type tableau, alors un lment spcifique du tableau peut tre extrait en crivant :
expression[indice]
Des lments adjacents (un morceau de tableau ) peuvent tre extraits en crivant :
expression[indice_bas:indice_haut]
Les crochets [ ] doivent apparatre rellement. Chaque indice est lui-mme une expression, devant contenir une valeur entire.
En gnral, l'expression de type tableau doit tre entre parenthses mais ces dernires peuvent tre omises lorsque l'expression
utilise comme indice est seulement une rfrence de colonne ou un paramtre de position. De plus, les indices multiples peuvent
tre concatns lorsque le tableau original est multi-dimensionnel. Par exemple :
ma_table.colonnetableau[4]
ma_table.colonnes_deux_d[17][34]
$1[10:42]
(fonctiontableau(a,b))[42]
Dans ce dernier exemple, les parenthses sont requises. Voir la Section 8.14, Tableaux pour plus d'informations sur les tableaux.
Syntaxe SQL
ma_table.macolonne
$1.unecolonne
(fonctionligne(a,b)).col3
En fait, une rfrence de colonne qualifie est un cas spcial de syntaxe de slection de champ. Un cas spcial important revient
extraire un champ de la colonne de type composite d'une table :
(colcomposite).unchamp
(matable.colcomposite).unchamp
Les parenthses sont requises ici pour montrer que colcomposite est un nom de colonne, et non pas un nom de table, ou que
matable est un nom de table, pas un nom de schma dans le deuxime cas.
Dans une liste d'extraction (voir la Section 7.3, Listes de slection ), vous pouvez demander tous les champs d'une valeur composite en crivant .* :
(compositecol).*
Note
Une fonction qui prend un seul argument de type composite peut aussi tre appele en utilisant la syntaxe de slection de champ. Du coup, un champ peut tre crit dans le style fonctionnel. Cela signifie que les notations
col(table) et table.col sont interchangeables. Ce comportement ne respecte pas le standard SQL mais il
est fourni dans PostgreSQL car il permet l'utilisation de fonctions mulant les champs calculs . Pour plus
d'informations, voir la Section 35.4.2, Fonctions SQL sur les types composites .
Syntaxe SQL
nom_agregat ( * )
o nom_agregat est un agrgat prcdemment dfini (parfois qualifi d'un nom de schma), expression est toute expression de valeur qui ne contient pas lui-mme une expression d'agrgat ou un appel une fonction de fentrage. order_by_clause est une clause ORDER BY optionnelle comme dcrite ci-dessous.
La premire forme d'expression d'agrgat appelle l'agrgat une fois pour chaque ligne en entre. La seconde forme est identique
la premire car ALL est une clause active par dfaut. La troisime forme fait appel l'agrgat une fois pour chaque valeur distincte
de l'expression (ou ensemble distinct de valeurs, pour des expressions multiples) trouve dans les lignes en entre. La dernire
forme appelle l'agrgat une fois pour chaque ligne en entre ; comme aucune valeur particulire en entre n'est spcifie, c'est gnralement utile pour la fonction d'agrgat count(*).
La plupart des fonctions d'agrgats ignorent les entres NULL, pour que les lignes qui renvoient une ou plusieurs expressions
NULL soient disqualifies. Ceci peut tre considr vrai pour tous les agrgats internes sauf indication contraire.
Par exemple, count(*) trouve le nombre total de lignes en entre alors que count(f1) rcupre le nombre de lignes en entre
pour lesquelles f1 n'est pas NULL. En effet, la fonction count ignore les valeurs NULL mais count(distinct f1) retrouve le nombre de valeurs distinctes non NULL de f1.
D'habitude, les lignes en entre sont passes la fonction d'agrgat dans un ordre non spcifi. Dans la plupart des cas, cela n'a pas
d'importance. Par exemple, min donne le mme rsultat quelque soit l'ordre dans lequel il reoit les donnes. Nanmoins, certaines fonctions d'agrgat (tels que array_agg et string_agg) donnent un rsultat dpendant de l'ordre des lignes en entre.
Lors de l'utilisation de ce type d'agrgat, la clause clause_order_by peut tre utilise pour prciser l'ordre de tri dsir. La
clause clause_order_by a la mme syntaxe que la clause ORDER BY d'une requte, qui est dcrite dans la Section 7.5, Tri
des lignes , sauf que ses expressions sont toujours des expressions simples et ne peuvent pas tre des noms de colonne en sortie
ou des numros. Par exemple :
SELECT array_agg(a ORDER BY b DESC) FROM table;
Lors de l'utilisation de fonctions d'agrgat plusieurs arguments, la clause ORDER BY arrive aprs tous les arguments de
l'agrgat. Par exemple, il faut crire ceci :
SELECT string_agg(a, ',' ORDER BY a) FROM table;
et non pas ceci :
SELECT string_agg(a ORDER BY a, ',') FROM table;
-- incorrect
Ce dernier exemple est syntaxiquement correct mais il concerne un appel une fonction d'agrgat un seul argument avec deux
cls pour le ORDER BY (le deuxime tant inutile car il est constant).
Si DISTINCT est indiqu en plus de la clause clause_order_by, alors toutes les expressions de l'ORDER BY doivent correspondre aux arguments de l'agrgat ; autrement dit, vous ne pouvez pas trier sur une expression qui n'est pas inclus dans la liste
DISTINCT.
Note
La possibilit de spcifier la fois DISTINCT et ORDER BY dans une fonction d'agrgat est une extension de
PostgreSQL.
Les fonctions d'agrgat prdfinies sont dcrites dans la Section 9.18, Fonctions d'agrgat . D'autres fonctions d'agrgat pourraient tre ajoutes par l'utilisateur.
Une expression d'agrgat peut seulement apparatre dans la liste de rsultats ou dans la clause HAVING d'une commande SELECT. Elle est interdite dans d'autres clauses, tels que WHERE, parce que ces clauses sont logiquement values avant que les rsultats des agrgats ne soient calculs.
Lorsqu'une expression d'agrgat apparat dans une sous-requte (voir la Section 4.2.11, Sous-requtes scalaires et la Section 9.20, Expressions de sous-requtes ), l'agrgat est normalement valu sur les lignes de la sous-requte. Cependant, une
exception survient si les arguments de l'agrgat contiennent seulement des niveaux externes de variables : ensuite, l'agrgat appartient au niveau externe le plus proche et est valu sur les lignes de cette requte. L'expression de l'agrgat est une rfrence externe pour la sous-requte dans laquelle il apparat et agit comme une constante sur toute valuation de cette requte. La restriction
apparaissant seulement dans la liste de rsultat ou dans la clause HAVING s'applique avec respect du niveau de requte auquel appartient l'agrgat.
Syntaxe SQL
en une seule ligne rsultat -- chaque ligne reste spare dans les rsultats. Nanmoins, la fonction de fentrage est capable de parcourir toutes les lignes qui font partie du groupe de la ligne courante d'aprs la spcification du groupe (liste PARTITION BY) de
l'appel de la fonction de fentrage. La syntaxe d'un appel de fonction de fentrage est une des suivantes :
nom_fonction
nom_fonction
nom_fonction
nom_fonction
Syntaxe SQL
Les appels de fonctions de fentrage sont autoriss seulement dans la liste SELECT et dans la clause ORDER BY de la requte.
Il existe plus d'informations sur les fonctions de fentrages dans la Section 3.5, Fonctions de fentrage , dans la Section 9.19,
Fonctions Window et dans la Section 7.2.4, Traitement de fonctions Window .
Note
La syntaxe par fonction est en fait seulement un appel de fonction. Quand un des deux standards de syntaxe de
conversion est utilis pour faire une conversion l'excution, elle appellera en interne une fonction enregistre pour
raliser la conversion. Par convention, ces fonctions de conversion ont le mme nom que leur type de sortie et, du
coup, la syntaxe par fonction n'est rien de plus qu'un appel direct la fonction de conversion sous-jacente. videmment, une application portable ne devrait pas s'y fier. Pour plus d'informations, voir la page de manuel de CREATE
CAST(7).
Syntaxe SQL
Notez que, dans le dernier cas, la clause COLLATE est attache l'argument en entre de l'oprateur. Peu importe l'argument de
l'oprateur ou de la fonction qui a la clause COLLATE parce que le collationnement appliqu l'oprateur ou la fonction est driv en considrant tous les arguments, et une clause COLLATE explicite surchargera les collationnements des autres arguments.
(Attacher des clauses COLLATE diffrentes sur les arguments aboutit une erreur. Pour plus de dtails, voir la Section 22.2,
Support des collations .) Du coup, ceci donne le mme rsultat que l'exemple prcdent :
SELECT * FROM tbl WHERE a COLLATE "C" > 'foo';
Mais ceci n'est pas valide :
SELECT * FROM tbl WHERE (a > 'foo') COLLATE "C";
car cette requte cherche appliquer un collationnement au rsultat de l'oprateur >, qui est du type boolean, type non sujet au collationnement.
Syntaxe SQL
Comme les tableaux multidimensionnels doivent tre rectangulaires, les constructeurs internes du mme niveau doivent produire
des sous-tableaux de dimensions identiques. Toute conversion applique au constructeur ARRAY externe se propage automatiquement tous les constructeurs internes.
Les lments d'un constructeur de tableau multidimensionnel peuvent tre tout ce qui rcupre un tableau du bon type, pas seulement une construction d'un tableau imbriqu. Par exemple :
CREATE TABLE tab(f1 int[], f2 int[]);
INSERT INTO tab VALUES (ARRAY[[1,2],[3,4]], ARRAY[[5,6],[7,8]]);
SELECT ARRAY[f1, f2, '{{9,10},{11,12}}'::int[]] FROM tab;
array
-----------------------------------------------{{{1,2},{3,4}},{{5,6},{7,8}},{{9,10},{11,12}}}
(1 row)
Vous pouvez construire un tableau vide mais, comme il est impossible d'avoir un tableau sans type, vous devez convertir explicitement votre tableau vide dans le type dsir. Par exemple :
SELECT ARRAY[]::integer[];
array
------{}
(1 row)
Il est aussi possible de construire un tableau partir des rsultats d'une sous-requte. Avec cette forme, le constructeur de tableau
est crit avec le mot cl ARRAY suivi par une sous-requte entre parenthses (et non pas des crochets). Par exemple :
SELECT ARRAY(SELECT oid FROM pg_proc WHERE proname LIKE 'bytea%');
?column?
------------------------------------------------------------{2011,1954,1948,1952,1951,1244,1950,2005,1949,1953,2006,31}
(1 row)
La sous-requte doit renvoyer une seule colonne. Le tableau une dimension rsultant aura un lment pour chaque ligne dans le
rsultat de la sous-requte, avec un type lment correspondant celui de la colonne en sortie de la sous-requte.
Les indices d'un tableau construit avec ARRAY commencent toujours un. Pour plus d'informations sur les tableaux, voir la Section 8.14, Tableaux .
Note
Avant PostgreSQL 8.2, la syntaxe .* n'tait pas tendue. De ce fait, ROW(t.*, 42) crait une ligne deux
champs dont le premier tait une autre valeur de ligne. Le nouveau comportement est gnralement plus utile. Si
vous avez besoin de l'ancien comportement de valeurs de ligne imbriques, crivez la valeur de ligne interne sans
.*, par exemple ROW(t, 42).
Par dfaut, la valeur cre par une expression ROW est d'un type d'enregistrement anonyme. Si ncessaire, il peut tre converti en
un type composite nomm -- soit le type de ligne d'une table soit un type composite cr avec CREATE TYPE AS. Une conver34
Syntaxe SQL
sion explicite pourrait tre ncessaire pour viter toute ambigut. Par exemple :
CREATE TABLE ma_table(f1 int, f2 float, f3 text);
CREATE FUNCTION recup_f1(ma_table) RETURNS int AS 'SELECT $1.f1' LANGUAGE SQL;
-- Aucune conversion ncessaire parce que seul un recup_f1() existe
SELECT recup_f1(ROW(1,2.5,'ceci est un test'));
recup_f1
---------1
(1 row)
CREATE TYPE mon_typeligne AS (f1 int, f2 text, f3 numeric);
CREATE FUNCTION recup_f1(mon_typeligne) RETURNS int AS 'SELECT $1.f1' LANGUAGE SQL;
-- Maintenant, nous avons besoin d'une conversion
-- pour indiquer la fonction appeler
SELECT recup_f1(ROW(1,2.5,'ceci est un test'));
ERROR: function recup_f1(record) is not unique
SELECT recup_f1(ROW(1,2.5,'ceci est un test')::ma_table);
getf1
------1
(1 row)
SELECT recup_f1(CAST(ROW(11,'ceci est un test',2.5) AS mon_typeligne));
getf1
------11
(1 row)
Les constructeurs de lignes peuvent tre utiliss pour construire des valeurs composites stocker dans une colonne de table de
type composite ou pour tre pass une fonction qui accepte un paramtre composite. De plus, il est possible de comparer deux
valeurs de lignes ou pour tester une ligne avec IS NULL ou IS NOT NULL, par exemple
SELECT ROW(1,2.5,'ceci est un test') = ROW(1, 3, 'pas le mme');
SELECT ROW(table.*) IS NULL FROM table; -- dtecte toutes les lignes non NULL
Pour plus de dtails, voir la Section 9.21, Comparaisons de lignes et de tableaux . Les constructeurs de lignes peuvent aussi tre
utiliss en relation avec des sous-requtes, comme discut dans la Section 9.20, Expressions de sous-requtes .
Syntaxe SQL
Syntaxe SQL
Note
Les notations par appel nomm ou mixe ne peuvent pas tre utilis lors de l'appel d'une fonction d'agrgat (mais
elles fonctionnent quand une fonction d'agrgat est utilise en tant que fonction de fentrage).
37
Astuce
Quand de nombreuses tables lies sont cres, il est prfrable de dfinir un motif cohrent pour le nommage des
tables et des colonnes. On a ainsi la possibilit d'utiliser le pluriel ou le singulier des noms, chacune ayant ses fidles et ses dtracteurs.
38
Le nombre de colonnes d'un table est limit. En fonction du type de colonnes, il oscille entre 250 et 1600. Dfinir une table avec
un nombre de colonnes proche de cette limite est, cependant, trs inhabituel et doit conduire se poser des questions quant la
conception du modle.
Lorsqu'une table n'est plus utile, elle peut tre supprime l'aide de la commande DROP TABLE(7). Par exemple :
DROP TABLE ma_premiere_table;
DROP TABLE produits;
Tenter de supprimer une table qui n'existe pas lve une erreur. Il est, nanmoins, habituel dans les fichiers de scripts SQL
d'essayer de supprimer chaque table avant de la crer. Les messages d'erreur sont alors ignors afin que le script fonctionne que la
table existe ou non. (La variante DROP TABLE IF EXISTS peut aussi tre utilise pour viter les messages d'erreur mais elle
ne fait pas partie du standard SQL.)
Pour la procduure de modification d'une table qui existe dj, voir la Section 5.5, Modification des tables plus loin dans ce
chapitre.
Les outils prcdemment dcrits permettent de crer des tables fonctionnelles. Le reste de ce chapitre est consacr l'ajout de
fonctionnalits la dfinition de tables pour garantir l'intgrit des donnes, la scurit ou l'ergonomie. Le lecteur impatient
d'insrer des donnes dans ses tables peut sauter au Chapitre 6, Manipulation de donnes et lire le reste de ce chapitre plus tard.
5.3. Contraintes
Les types de donnes sont un moyen de restreindre la nature des donnes qui peuvent tre stockes dans une table. Pour beaucoup
d'applications, toutefois, la contrainte fournie par ce biais est trop grossire. Par exemple, une colonne qui contient le prix d'un
produit ne doit accepter que des valeurs positives. Mais il n'existe pas de type de donnes standard qui n'accepte que des valeurs
positives. Un autre problme peut provenir de la volont de contraindre les donnes d'une colonne par rapport aux autres colonnes
ou lignes. Par exemple, dans une table contenant des informations de produit, il ne peut y avoir qu'une ligne par numro de produit.
39
Pour cela, SQL permet de dfinir des contraintes sur les colonnes et les tables. Les contraintes donnent autant de contrle sur les
donnes des tables qu'un utilisateur peut le souhaiter. Si un utilisateur tente de stocker des donnes dans une colonne en violation
d'une contrainte, une erreur est leve. Cela s'applique mme si la valeur vient de la dfinition de la valeur par dfaut.
prix_promotion numeric,
CHECK (prix_promotion > 0 AND prix > prix_promotion)
);
C'est une question de got.
Les contraintes de table peuvent tre nommes, tout comme les contraintes de colonne :
CREATE TABLE produits (
no_produit integer,
nom text,
prix numeric,
CHECK (prix > 0),
prix_promotion numeric,
CHECK (prix_promotion > 0),
CONSTRAINT promo_valide CHECK (prix > prix_promotion)
);
Une contrainte de vrification est satisfaite si l'expression est value vraie ou NULL. Puisque la plupart des expressions sont values NULL si l'une des oprandes est nulle, elles n'interdisent pas les valeurs NULL dans les colonnes contraintes. Pour s'assurer
qu'une colonne ne contient pas de valeurs NULL, la contrainte NOT NULL dcrite dans la section suivante peut tre utilise.
Astuce
Dans la plupart des bases de donnes, il est prfrable que la majorit des colonnes soient marques NOT NULL.
Une cl primaire indique qu'une colonne ou un groupe de colonnes peut tre utilis(e) comme identifiant unique des lignes de la
table. (C'est une consquence directe de la dfinition d'une cl primaire. Une contrainte d'unicit ne suffit pas fournir un identifiant unique car elle n'exclut pas les valeurs NULL). Ceci est utile la fois pour des raisons documentaires et pour les applications
clientes. Par exemple, une application graphique qui permet de modifier les valeurs de lignes a probablement besoin de connatre
la cl primaire d'une table pour pouvoir identifier les lignes de manire unique.
L'ajout d'une cl primaire crera automatiquement un index B-tree unique sur la colonne ou le groupe de colonnes utilis dans la
cl primaire.
Une table a, au plus, une cl primaire. (Le nombre de contraintes UNIQUE NOT NULL, qui assurent la mme fonction, n'est pas
limit, mais une seule peut tre identifie comme cl primaire.) La thorie des bases de donnes relationnelles impose que chaque
table ait une cl primaire. Cette rgle n'est pas force par PostgreSQL, mais il est prfrable de la respecter.
);
CREATE TABLE commandes (
id_commande integer PRIMARY KEY,
adresse_de_livraison text,
...
);
CREATE TABLE commande_produits (
no_produit integer REFERENCES produits,
id_commande integer REFERENCES commandes,
quantite integer,
PRIMARY KEY (no_produit, id_commande)
);
La cl primaire de la dernire table recouvre les cls trangres.
Les cls trangres interdisent dsormais la cration de commandes qui ne soient pas lies un produit. Qu'arrive-t-il si un produit
est supprim alors qu'une commande y fait rfrence ? SQL permet aussi de le grer. Intuitivement, plusieurs options existent :
Pour illustrer ce cas, la politique suivante est implante sur l'exemple de relations n-n voqu plus haut :
quand quelqu'un veut retirer un produit qui est encore rfrenc par une commande (au travers de commande_produits),
on l'interdit ;
si quelqu'un supprime une commande, les lments de la commande sont aussi supprims.
Une cl trangre peut faire rfrence des colonnes qui constituent une cl primaire ou forment une contrainte d'unicit. Si la cl
trangre rfrence une contrainte d'unicit, des possibilits supplmentaires sont offertes concernant la correspondance des valeurs NULL. Celles-ci sont expliques dans la documentation de rfrence de CREATE TABLE(7).
une contrainte d'unicit doit tre ajoute sur la colonne OID de chaque table dont l'OID est utilis pour identifier les lignes.
45
Dans ce cas (ou dans celui d'un index d'unicit), le systme n'engendre pas d'OID qui puisse correspondre celui d'une ligne
dj prsente. Cela n'est videmment possible que si la table contient moins de 232 (4 milliards) lignes ; en pratique, la taille de
la table a tout intrt tre bien plus petite que a, dans un souci de performance ;
l'unicit inter-tables des OID ne doit jamais tre envisage ; pour obtenir un identifiant unique sur l'ensemble de la base, il faut
utiliser la combinaison du tableoid et de l'OID de ligne ;
les tables en question doivent tre cres avec l'option WITH OIDS. Depuis PostgreSQL 8.1, WITHOUT OIDS est l'option
par dfaut.
Les identifiants de transaction sont aussi des nombres de 32 bits. Dans une base de donnes age, il est possible que les ID de transaction bouclent. Cela n'est pas un problme fatal avec des procdures de maintenance appropries ; voir le Chapitre 23, Planifier
les tches de maintenance pour les dtails. Il est, en revanche, imprudent de considrer l'unicit des ID de transaction sur le long
terme (plus d'un milliard de transactions).
Les identifiants de commande sont aussi des nombres de 32 bits. Cela cre une limite dure de 232 (4 milliards) commandes SQL
au sein d'une unique transaction. En pratique, cette limite n'est pas un problme -- la limite est sur le nombre de commandes SQL,
pas sur le nombre de lignes traites. De plus, partir de PostgreSQL 8.3, seules les commandes qui modifient rellement le
contenu de la base de donnes consomment un identifiant de commande.
Toutes ces actions sont ralises l'aide de la commande ALTER TABLE(7), dont la page de rfrence est bien plus dtaille.
Astuce
Ajouter une colonne avec une valeur par dfaut ncessite la mise jour de chaque ligne de la table pour stocker la
valeur de la nouvelle colonne. Cependant, si aucune valeur par dfaut n'est prcise, PostgreSQL peut viter la
mise jour physique. Il est, de ce fait, prfrable, si la colonne doit tre remplie en majorit avec des valeurs diffrentes de la valeur par dfaut, d'ajouter la colonne sans valeur par dfaut, d'insrer les bonnes valeurs avec une
commande UPDATE puis d'ajouter la valeur par dfaut dsire comme dcrit ci-dessus.
PostgreSQL tente de convertir la valeur par dfaut de la colonne le cas chant, ainsi que toute contrainte impliquant la colonne.
Mais ces conversions peuvent chouer ou produire des rsultats surprenants. Il est souvent prfrable de supprimer les contraintes
de la colonne avant d'en modifier le type, puis d'ajouter ensuite les contraintes convenablement modifies.
5.6. Droits
Quand un objet est cr, il se voit affecter un propritaire. Le propritaire est normalement le rle qui a excut la requte de cration. Pour la plupart des objets, l'tat initial est que seul le propritaire (et les superutilisateurs) peuvent faire quelque chose avec
cet objet. Pour permettre aux autres rles de l'utiliser, des droits doivent tre donns.
Il existe un certain nombre de droits diffrents : SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER,
CREATE, CONNECT, TEMPORARY, EXECUTE et USAGE. Les droits applicables un objet particulier varient selon le type d'objet
(table, fonction...). La page de rfrence GRANT(7) fournit une information complte sur les diffrents types de droits grs par
PostgreSQL. La section et les chapitres suivants prsentent l'utilisation de ces droits.
Le droit de modifier ou de dtruire un objet est le privilge du seul propritaire.
Un objet peut se voir affecter un nouveau propritaire avec la commande ALTER correspondant l'objet, par exemple ALTER
TABLE(7). Les superutilisateurs peuvent toujours le faire. Les rles ordinaires peuvent seulement le faire s'ils sont le propritaire
actuel de l'objet (ou un membre du rle propitaire) et un membre du nouveau rle propritaire.
La commande GRANT est utilise pour accorder des privilges (on dit aussi granter un privilge ). Par exemple, si joe est un
utilisateur et comptes une table, le privilge d'actualiser la table comptes peut tre accord joe avec :
GRANT UPDATE ON comptes TO joe;
crire ALL la place d'un droit spcifique accorde tous les droits applicables ce type d'objet.
Le nom d' utilisateur spcial PUBLIC peut tre utilis pour donner un privilge tous les utilisateurs du systme. De plus, les
rles de type group peuvent tre configurs pour aider la gestion des droits quand il y a beaucoup d'utilisateurs dans une base
-- pour les dtails, voir Chapitre 20, Rles de la base de donnes.
Pour rvoquer un privilge, on utilise la commande bien-nomme REVOKE, comme dans l'exemple ci-dessous :
REVOKE ALL ON comptes FROM PUBLIC;
Les privilges spciaux du propritaire de l'objet (c'est--dire, le droit d'excuter DROP, GRANT, REVOKE, etc.) appartiennent
toujours implicitement au propritaire. Il ne peuvent tre ni accords ni rvoqus. Mais le propritaire de l'objet peut choisir de rvoquer ses propres droits ordinaires pour, par exemple, mettre une table en lecture seule pour lui-mme et pour les autres.
Habituellement, seul le propritaire de l'objet (ou un superutilisateur) peut granter ou rvoquer les droits sur un objet. Nanmoins,
il est possible de donner un privilge avec possibilit de transmission ( with grant option ), qui donne celui qui le reoit la
permission de le donner d'autres. Si cette option est ensuite rvoque, alors tous ceux qui ont reu ce privilge par cet utilisateur
(directement ou indirectement via la chane des dons) perdent ce privilge. Pour les dtails, voir les pages de rfrences
GRANT(7) et REVOKE(7).
5.7. Schmas
Un cluster de bases de donnes PostgreSQL contient une ou plusieurs base(s) nomme(s). Si les utilisateurs et groupes
d'utilisateurs sont partags sur l'ensemble du cluster, aucune autre donne n'est partage. Toute connexion cliente au serveur ne
peut accder qu'aux donnes d'une seule base, celle indique dans la requte de connexion.
Note
Les utilisateurs d'un cluster n'ont pas obligatoirement le droit d'accder toutes les bases du cluster. Le partage des
48
noms d'utilisateur signifie qu'il ne peut pas y avoir plusieurs utilisateurs nomms joe, par exemple, dans deux
bases du mme cluster ; mais le systme peut tre configur pour n'autoriser joe accder qu' certaines bases.
Une base de donnes contient un ou plusieurs schma(s) nomm(s) qui, eux, contiennent des tables. Les schmas contiennent aussi d'autres types d'objets nomms (types de donnes, fonctions et oprateurs, par exemple). Le mme nom d'objet peut tre utilis
dans diffrents schmas sans conflit ; par exemple, schema1 et mon_schema peuvent tous les deux contenir une table nomme
ma_table. la diffrence des bases de donnes, les schmas ne sont pas spars de manire rigide : un utilisateur peut accder
aux objets de n'importe quel schma de la base de donnes laquelle il est connect, sous rserve qu'il en ait le droit.
Il existe plusieurs raisons d'utiliser les schmas :
autoriser de nombreux utilisateurs utiliser une base de donnes sans interfrer avec les autres ;
organiser les objets de la base de donnes en groupes logiques afin de faciliter leur gestion ;
les applications tiers peuvent tre places dans des schmas spars pour viter les collisions avec les noms d'autres objets.
Les schmas sont comparables aux rpertoires du systme d'exploitation, ceci prs qu'ils ne peuvent pas tre imbriqus.
mettre, le propritaire du schma doit donner le droit USAGE sur le schma. Pour autoriser les utilisateurs manipuler les objets
d'un schma, des privilges supplmentaires doivent ventuellement tre accords, en fonction de l'objet.
Un utilisateur peut aussi tre autoris crer des objets dans le schma d'un d'autre. Pour cela, le privilge CREATE sur le schma
doit tre accord. Par dfaut, tout le monde bnficie des droits CREATE et USAGE sur le schma public. Cela permet tous les
utilisateurs qui peuvent se connecter une base de donnes de crer des objets dans son schma public. Si cela ne doit pas tre
le cas, ce privilge peut tre rvoqu :
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
Le premier public est le schma, le second public signifie tout utilisateur . Dans le premier cas, c'est un identifiant, dans
le second, un mot cl, d'o la casse diffrente. (Se reporter aux rgles de la Section 4.1.1, identificateurs et mots cls .)
5.7.6. Utilisation
Les schmas peuvent tre utiliss de diffrentes faons pour organiser les donnes. Certaines d'entre elles, recommandes, sont facilement supports par la configuration par dfaut :
si aucun schma n'est cr, alors tous les utilisateurs ont implicitement accs au schma public. Cela permet de simuler une situation dans laquelle les schmas ne sont pas disponibles. Cette situation est essentiellement recommande lorsqu'il n'y a qu'un
utilisateur, ou un trs petit nombre d'utilisateurs qui cooprent au sein d'une base de donnes. Cette configuration permet aussi
d'oprer une transition en douceur depuis un monde o les schmas sont inconnus ;
pour chaque utilisateur, un schma, de nom identique celui de l'utilisateur, peut tre cr. Le chemin de recherche par dfaut
commence par $user, soit le nom de l'utilisateur. Si tous les utilisateurs disposent d'un schma distinct, ils accdent, par dfaut, leur propre schma. Dans cette configuration, il est possible de rvoquer l'accs au schma public (voire de supprimer
ce schma) pour confiner les utilisateurs dans leur propre schma ;
l'installation d'applications partages (tables utilisables par tout le monde, fonctionnalits supplmentaires fournies par des applications tiers, etc) peut se faire dans des schmas distincts. Il faut alors accorder des privilges appropris pour permettre aux
autres utilisateurs d'y accder. Les utilisateurs peuvent alors se rfrer ces objets additionnels en qualifiant leur nom du nom
de schma ou ajouter les schmas supplmentaires dans leur chemin de recherche, au choix.
5.7.7. Portabilit
Dans le standard SQL, la notion d'objets d'un mme schma appartenant des utilisateurs diffrents n'existe pas. De plus, certaines implantations ne permettent pas de crer des schmas de nom diffrent de celui de leur propritaire. En fait, les concepts de
schma et d'utilisateur sont presque quivalents dans un systme de base de donnes qui n'implante que le support basique des
schmas tel que spcifi dans le standard. De ce fait, beaucoup d'utilisateurs considrent les noms qualifis comme correspondant
en ralit utilisateur.table. C'est comme cela que PostgreSQL se comporte si un schma utilisateur est cr pour
chaque utilisateur.
Le concept de schma public n'existe pas non plus dans le standard SQL. Pour plus de conformit au standard, le schma public ne devrait pas tre utilis (voire tre supprim).
Certains systmes de bases de donnes n'implantent pas du tout les schmas, ou fournissent le support de namespace en autorisant
(peut-tre de faon limite) l'accs inter-bases de donnes. Dans ce cas, la portabilit maximale est obtenue en n'utilisant pas les
schmas.
51
5.8. L'hritage
PostgreSQL implante l'hritage des tables, qui peut s'avrer trs utile pour les concepteurs de bases de donnes. (SQL:1999 et
les versions suivantes dfinissent une fonctionnalit d'hritage de type qui diffre par de nombreux aspects des fonctionnalits dcrites ici.)
Soit l'exemple d'un modle de donnes de villes. Chaque tat comporte plusieurs villes mais une seule capitale. Pour rcuprer rapidement la ville capitale d'un tat donn, on peut crer deux tables, une pour les capitales et une pour les villes qui ne sont pas des
capitales. Mais, que se passe-t'il dans le cas o toutes les donnes d'une ville doivent tre rcupres, qu'elle soit une capitale ou
non ? L'hritage peut aider rsoudre ce problme. La table capitales est dfinie pour hriter de villes :
CREATE TABLE villes
nom
population
altitude
);
(
text,
float,
int
-- (en pied)
FROM villes v
WHERE v.altitude > 500;
qui renvoie :
tableoid |
nom
| altitude
----------+-----------+---------139793 | Las Vegas |
2174
139793 | Mariposa |
1953
139798 | Madison
|
845
(Reproduire cet exemple conduit probablement des OID numriques diffrents). Une jointure avec pg_class, permet d'obtenir les
noms rels des tables :
SELECT p.relname, v.nom, v.altitude
FROM villes v, pg_class p
WHERE v.altitude > 500 AND v.tableoid = p.oid;
ce qui retourne :
relname
|
nom
| altitude
-----------+-----------+---------villes
| Las Vegas |
2174
villes
| Mariposa |
1953
capitales | Madison
|
845
L'hritage ne propage pas automatiquement les donnes des commandes INSERT ou COPY aux autres tables de la hirarchie de
l'hritage. Dans l'exemple considr, l'instruction INSERT suivante choue :
INSERT INTO villes (nom, population, altitude, etat)
VALUES ('New York', NULL, NULL, 'NY');
On pourrait esprer que les donnes soient magiquement routes vers la table capitales mais ce n'est pas le cas : INSERT insre
toujours dans la table indique. Dans certains cas, il est possible de rediriger l'insertion en utilisant une rgle (voir Chapitre 37,
Systme de rgles). Nanmoins, cela n'est d'aucune aide dans le cas ci-dessus car la table villes ne contient pas la colonne etat.
La commande est donc rejete avant que la rgle ne soit applique.
Toutes les contraintes de vrification et toutes les contraintes NOT NULL sur une table parent sont automatiquement hrites par
les tables enfants. Les autres types de contraintes (unicit, cl primaire, cl trangre) ne sont pas hrits.
Une table peut hriter de plusieurs tables, auquel cas elle possde l'union des colonnes dfinies par les tables mress. Toute colonne dclare dans la dfinition de la table enfant est ajoute cette dernire. Si le mme nom de colonne apparat dans plusieurs
tables mres, ou la fois dans une table mre et dans la dfinition de la table enfant, alors ces colonnes sont assembles pour
qu'il n'en existe qu'une dans la table enfant. Pour tre assembles, les colonnes doivent avoir le mme type de donnes, sinon une
erreur est leve. La colonne assemble hrite de toutes les contraintes de vrification en provenance de chaque dfinition de colonnes dont elle provient, et est marque NOT NULL si une d'entre elles l'est.
L'hritage de table est tabli la cration de la table enfant, l'aide de la clause INHERITS de l'instruction CREATE TABLE(7).
Alternativement, il est possible d'ajouter une table, dfinie de faon compatible, une nouvelle relation de parent l'aide de la
clause INHERIT de ALTER TABLE(7). Pour cela, la nouvelle table enfant doit dj inclure des colonnes de mmes nom et type
que les colonnes de la table parent. Elle doit aussi contenir des contraintes de vrification de mmes nom et expression que celles
de la table parent.
De la mme faon, un lien d'hritage peut tre supprim d'un enfant l'aide de la variante NO INHERIT d'ALTER TABLE.
Ajouter et supprimer dynamiquement des liens d'hritage de cette faon est utile quand cette relation d'hritage est utilise pour le
partitionnement des tables (voir Section 5.9, Partitionnement ).
Un moyen pratique de crer une table compatible en vue d'en faire ultrieurement une table enfant est d'utiliser la clause LIKE
dans CREATE TABLE. Ceci cre une nouvelle table avec les mme colonnes que la table source. S'il existe des contraintes
CHECK dfinies sur la table source, l'option INCLUDING CONSTRAINTS de LIKE doit tre indique car le nouvel enfant doit
avoir des contraintes qui correspondent celles du parent pour tre considre compatible.
Une table mre ne peut pas tre supprime tant qu'elle a des enfants. Pas plus que les colonnes ou les contraintes de vrification
des tables enfants ne peuvent tre supprimes ou modifies si elles sont hrites. La suppression d'une table et de tous ces descendants peut tre aisment obtenue en supprimant la table mre avec l'option CASCADE.
ALTER TABLE(7) propage toute modification dans les dfinitions des colonnes et contraintes de vrification travers la hirarchie d'hritage. L encore, supprimer des colonnes qui dpendent d'autres tables mres n'est possible qu'avec l'option CASCADE.
ALTER TABLE suit les mmes rgles d'assemblage de colonnes dupliques et de rejet que l'instruction CREATE TABLE.
Notez comment sont grs les droits d'accs aux tables. Excuter une requte sur une table parent permet automatiquement
53
d'accder aux donnes des tables enfants sans vrification supplmentaire sur les droits. Ceci prserve l'apparence que les donnes
proviennent de la table parent. L'accs aux tables enfants directement est, nanmoins, pas automatiquement permis et ncessitera
la vrification des droits sur ces tables.
5.8.1. Restrictions
Notez que toutes les commandes SQL fonctionnent avec les hritages. Les commandes utilises pour rcuprer des donnes, pour
modifier des donnes ou pour modifier le schma (autrement dit SELECT, UPDATE, DELETE, la plupart des variantes de ALTER
TABLE, mais pas INSERT ou ALTER TABLE ... RENAME) incluent par dfaut les tables filles et supportent la notation ONLY pour les exclure. Les commandes qui font de la maintenance de bases de donnes et de la configuration (par exemple REINDEX, VACUUM) fonctionnent typiquement uniquement sur les tables physiques, individuelles et ne supportent pas la rcursion sur
les tables de l'hritage. Le comportement respectif de chaque commande individuelle est document dans la rfrence (Commandes SQL).
Il existe une relle limitation la fonctionnalit d'hritage : les index (dont les contraintes d'unicit) et les contraintes de cls trangres ne s'appliquent qu'aux tables mres, pas leurs hritiers. Cela est valable pour le ct rfrenant et le ct rfrenc d'une
contrainte de cl trangre. Ce qui donne, dans les termes de l'exemple ci-dessus :
si villes.nom est dclare UNIQUE ou cl primaire (PRIMARY KEY), cela n'empche pas la table capitales de possder des
lignes avec des noms dupliqus dans villes. Et ces lignes upliques s'affichent par dfaut dans les requtes sur villes. En fait,
par dfaut, capitales n'a pas de contrainte d'unicit du tout et, du coup, peut contenir plusieurs lignes avec le mme nom. Une
contrainte d'unicit peut tre ajoute capitales mais cela n'empche pas la duplication avec villes ;
de faon similaire, si villes.nom fait rfrence (REFERENCES) une autre table, cette contrainte n'est pas automatiquement
propage capitales. Il est facile de contourner ce cas de figure en ajoutant manuellement la mme contrainte REFERENCES
capitales ;
si une autre table indique REFERENCES villes(nom), cela l'autorise contenir les noms des villes mais pas les noms des
capitales. Il n'existe pas de contournement efficace de ce cas.
Ces dficiences seront probablement corriges dans une version future, mais, en attendant, il est obligatoire de rflchir consciencieusement l'utilit de l'hritage pour une application donne.
5.9. Partitionnement
PostgreSQL offre un support basique du partitionnement de table. Cette section explique pourquoi et comment implanter le partitionnement lors de la conception de la base de donnes.
5.9.1. Aperu
Le partitionnement fait rfrence la division d'une table logique volumineuse en plusieurs parties physiques plus petites. Le partitionnement comporte de nombreux avantages :
les performances des requtes peuvent tre significativement amliores dans certaines situations, particulirement lorsque la
plupart des lignes fortement accdes d'une table se trouvent sur une seule partition ou sur un petit nombre de partitions. Le
partitionnement se substitue aux colonnes principales des index, rduisant ainsi la taille des index et facilitant la tenue en mmoire des parties les plus utilises de l'index ;
lorsque les requtes ou les mises jour accdent un important pourcentage d'une seule partition, les performances peuvent
tre grandement amliores par l'utilisation avantageuse de parcours squentiels sur cette partition plutt que d'utiliser un index et des lectures alatoires rparties sur toute la table ;
les chargements et suppressions importants de donnes peuvent tre obtenus par l'ajout ou la suppression de partitions, sous rserve que ce besoin ait t pris en compte lors de la conception du partitionnement. ALTER TABLE NO INHERIT et
DROP TABLE sont bien plus rapides qu'une opration de masse. Cela supprime galement la surcharge d au VACUUM
caus par un DELETE massif ;
les donnes peu utilises peuvent tre dplaces sur un mdia de stockage moins cher et plus lent.
Les bnfices ne sont rellement intressants que si cela permet d'viter une table autrement plus volumineuse. Le point
d'quilibre exact partir duquel une table tire des bnfices du partitionnement dpend de l'application. Toutefois, le partitionnement doit tre envisag si la taille de la table peut tre amene dpasser la taille de la mmoire physique du serveur.
Actuellement, PostgreSQL supporte le partitionnement travers l'hritage de tables. Chaque partition doit tre cre comme une
table enfant d'une unique table parent. La table parent est, elle, habituellement vide ; elle n'existe que pour reprsenter l'ensemble
complet des donnes. Il est impratif de matriser les concepts de l'hritage (voir Section 5.8, L'hritage ) avant de tenter
54
d'implanter le partitionnement.
Les formes suivantes de partitionnement peuvent tre implantes dans PostgreSQL :
Partitionnement par chelon
La table est partitionne en intervalles (ou chelles) dfinis par une colonne cl ou par un ensemble de colonnes, sans recouvrement entre les chelles de valeurs affectes aux diffrentes partitions. Il est possible, par exemple, de partitionner par
chelles de date ou par chelles d'identifiants pour des objets mtier particuliers.
Partitionnement par liste
La table est partitionne en listant explicitement les valeurs cls qui apparaissent dans chaque partition.
5.9.2. Partitionner
Pour partionner une table, la procdure est la suivante :
1. Crer la table matre . C'est de celle-ci qu'hritent toutes les partitions.
Cette table ne contient pas de donnes. Les contraintes de vrification ne doivent tre dfinies sur cette table que si elles sont
appliques toutes les partitions. Il n'y a de plus aucune raison de dfinir des index ou des contraintes d'unicit sur cette table.
2. Crer plusieurs tables filles (ou enfants) qui hritent chacune de la table matre. Normalement, ces tables n'ajoutent pas de
colonnes l'ensemble hrit du matre.
Par la suite, les tables enfants sont appeles partitions, bien qu'elles soient, en tout point, des tables PostgreSQL normales.
3. Ajouter les contraintes de tables aux tables de partitions pour dfinir les valeurs des cls autorises dans chacune.
Quelques exemples typiques :
CHECK ( x = 1 )
CHECK ( comt IN ( 'Oxfordshire', 'Buckinghamshire', 'Warwickshire' ))
CHECK ( ID >= 100 AND ID < 200 )
Les contraintes doivent garantir qu'il n'y a pas de recouvrement entre les valeurs cls autorises dans les diffrentes partitions.
Une erreur commune est de configurer des contraintes d'chelle de cette faon :
CHECK ( comt BETWEEN 100 AND 200 )
CHECK ( comt BETWEEN 200 AND 300 )
Il est dans ce cas difficile de savoir quelle partition appartient la cl 200.
Il n'y a aucune diffrence entre les syntaxes de partitionnement par chelon et de partitionnement par liste ; ces termes ne sont
que descriptifs.
4. Pour chaque partition, crer un index sur la (ou les) colonne(s) cl(s), ainsi que tout autre index ncessaire. (L'index cl n'est
pas vraiment ncessaire mais, dans la plupart des scnarios, il est utile. Si les valeurs cls doivent tre uniques, alors il faut toujours crer une contrainte d'unicit ou de cl primaire pour chaque partition.)
5. Optionnellement, dfinir un dclencheur ou une rgle pour rediriger les donnes insres dans la table matre vers la partition
approprie.
6. S'assurer que le paramtre de configuration constraint_exclusion n'est pas dsactiv dans postgresql.conf. S'il l'est, les
requtes ne sont pas optimises.
Soit la base de donnes d'une grande fabrique de glaces. La compagnie mesure le pic de temprature journalier ainsi que les ventes
de glaces dans chaque rgion. Conceptuellement, la table ressemble :
CREATE TABLE mesure
id_ville
date_trace
temperature
ventes
);
(
int not null,
date not null,
int,
int
La plupart des requtes n'accdent qu'aux donnes de la dernire semaine, du dernier mois ou du dernier trimestre car cette table
est essentiellement utilise pour prparer des rapports en ligne pour la direction. Pour rduire le nombre de donnes anciennes
stocker, seules les trois dernires annes sont conserves. Au dbut de chaque mois, les donnes du mois le plus ancien sont supprimes.
Dans cette situation, le partitionnement permet de rpondre aux diffrents besoins identifis sur la table des mesures. En suivant
les tapes indiques ci-dessus, le partitionnement peut tre configur de la faon suivante :
1. la table matre est la table mesure, dclare exactement comme ci-dessus ;
2. une partition est ensuite cre pour chaque mois actif :
55
CREATE
CREATE
...
CREATE
CREATE
CREATE
Chaque partition est une table part entire mais sa dfinition est hrite de la table mesure.
Ceci rsoud un des problmes : la suppression d'anciennes donnes. Chaque mois, il suffit d'effectuer un DROP TABLE sur la
table enfant la plus ancienne et de crer une nouvelle table enfant pour les donnes du nouveau mois.
3. Il est ncessaire de fournir des contraintes de table qui interdisent les recouvrements. Plutt que de simplement crer les tables
de la partition comme ci-dessus, le script de cration de tables ressemble ;
CREATE TABLE mesure_a2006m02 (
CHECK ( date_trace >= DATE
) INHERITS (mesure);
CREATE TABLE mesure_a2006m03 (
CHECK ( date_trace >= DATE
) INHERITS (mesure);
...
CREATE TABLE mesure_a2007m11 (
CHECK ( date_trace >= DATE
) INHERITS (mesure);
CREATE TABLE mesure_a2007m12 (
CHECK ( date_trace >= DATE
) INHERITS (mesure);
CREATE TABLE mesure_a2008m01 (
CHECK ( date_trace >= DATE
) INHERITS (mesure);
Note
En pratique, il pourrait prfrable de vrifier prioritairement la dernire partition cre si la plupart des insertions lui sont destines. Pour des raisons de simplicit, les tests du dclencheur sont prsents dans le mme
ordre que les autres parties de l'exemple.
Un schma complexe de partitionnement peut amener crire une grande quantit de DDL. Dans l'exemple ci-dessus, une nouvelle partition est crite chaque mois. Il est donc conseill d'crire un script qui engendre automatiquement la DDL requise.
58
AS
FROM mesure_a2006m02
FROM mesure_a2006m03
FROM mesure_a2007m11
FROM mesure_a2007m12
FROM mesure_a2008m01;
Nanmoins, le besoin de recrer la vue ajoute une tape supplmentaire l'ajout et la suppression de partitions individuelles de
l'ensemble des donnes. En pratique, cette mthode a peu d'intrt au regard de l'hritage.
5.9.6. Restrictions
Les restrictions suivantes s'appliquent aux tables partitionnes :
il n'existe pas de moyen automatique de vrifier que toutes les contraintes de vrification (CHECK) sont mutuellement exclusives. Il est plus sr de crer un code qui fabrique les partitions et cre et/ou modifie les objets associs plutt que de les crer
manuellement ;
les schmas montrs ici supposent que les colonnes cls du partitionnement d'une ligne ne changent jamais ou, tout du moins,
ne changent pas suffisamment pour ncessiter un dplacement vers une autre partition. Une commande UPDATE qui tente de
le faire choue cause des contraintes CHECK. Pour grer ce type de cas, des dclencheurs peuvent tre convenablement positionns pour la mise jour sur les tables de partition mais cela rend la gestion de la structure beaucoup plus complexe.
si VACUUM ou ANALYZE sont lancs manuellement, il est obligatoire de les utiliser sur chaque partition. Une commande
comme :
ANALYZE mesure;
ne traite que la table matre.
l'exclusion de contrainte ne fonctionne que si la clause WHERE de la requte contient des constantes. Une requte avec paramtre n'est pas optimise car le planificateur ne peut avoir connaissance au pralable des partitions slectionnes par la valeur
du paramtre l'excution. Pour la mme raison, il faut viter les fonctions stable s comme CURRENT_DATE ;
59
les contraintes de partitionnement doivent rester simples. Dans le cas contraire, le planificateur peut rencontrer des difficults
dterminer les partitions qu'il n'est pas ncessaire de parcourir. Des conditions simples d'galit pour le partitionnement de
liste ou des tests d'chelle simples lors de partitionnement d'chelle sont recommandes, comme cela est illustr dans les
exemples prcdents. Une bonne rgle consiste s'assurer que les comparaisons entre colonnes de partitionnement et
constantes utilises par les contraintes de partitionnement se fassent uniquement l'aide d'oprateurs utilisables par les index
B-tree.
toutes les contraintes de toutes les partitions de la table matre sont examines lors de l'exclusion de contraintes. De ce fait, un
grand nombre de partitions augmente considrablement le temps de planification de la requte. Un partitionnement qui utilise
ces techniques fonctionne assez bien jusqu'environ une centaine de partitions ; il est impensable de vouloir atteindre des milliers de partitions.
Vues
Fonctions et oprateurs
Des informations dtailles sur ces sujets apparaissent dans la Partie V, Programmation serveur .
Note
D'aprs le standard SQL, il est ncessaire d'indiquer RESTRICT ou CASCADE. Aucun systme de base de donne
ne force cette rgle, en ralit, mais le choix du comportement par dfaut, RESTRICT ou CASCADE, varie suivant
le systme.
Note
Les dpendances de contraintes de cls trangres et de colonnes serial des versions de PostgreSQL antrieures
7.3 ne sont pas maintenues ou cres pendant le processus de mise jour. Tout autre type de dpendance est proprement cr pendant une mise jour partir d'une base de donnes antrieure la 7.3.
61
Astuce
Lors de l'insertion d'une grande quantit de donnes en mme temps, il est prfrable d'utiliser la commande COPY(7). Elle n'est pas aussi flexible que la commande INSERT(7) mais elle est plus efficace. Se rfrer Section 14.4, Remplir une base de donnes pour plus d'informations sur l'amlioration des performances lors de
62
Manipulation de donnes
Manipulation de donnes
64
Chapitre 7. Requtes
Les prcdents chapitres ont expliqu comme crer des tables, comment les remplir avec des donnes et comment manipuler ces
donnes. Maintenant, nous discutons enfin de la faon de rcuprer ces donnes depuis la base de donnes.
7.1. Aperu
Le processus et la commande de rcupration des donnes sont appels une requte. En SQL, la commande SELECT(7) est utilise pour spcifier des requtes. La syntaxe gnrale de la commande SELECT est
[WITH with_requtes] SELECT liste_select FROM expression_table [specification_tri]
Les sections suivantes dcrivent le dtail de la liste de slection, l'expression des tables et la spcification du tri. Les requtes
WITH sont traites en dernier car il s'agit d'une fonctionnalit avance.
Un type de requte simple est de la forme :
SELECT * FROM table1;
En supposant qu'il existe une table appele table1, cette commande rcuprera toutes les lignes et toutes les colonnes de
table1. La mthode de rcupration dpend de l'application cliente. Par exemple, le programme psql affichera une table,
faon art ASCII, alors que les bibliothques du client offriront des fonctions d'extraction de valeurs individuelles partir du rsultat de la requte. * comme liste de slection signifie que toutes les colonnes de l'expression de table seront rcupres. Une
liste de slection peut aussi tre un sous-ensemble des colonnes disponibles ou effectuer un calcul en utilisant les colonnes. Par
exemple, si table1 dispose des colonnes nommes a, b et c (et peut-tre d'autres), vous pouvez lancer la requte suivante :
SELECT a, b + c FROM table1;
(en supposant que b et c soient de type numrique). Voir la Section 7.3, Listes de slection pour plus de dtails.
FROM table1 est un type trs simple d'expression de tables : il lit une seule table. En gnral, les expressions de tables sont
des constructions complexes de tables de base, de jointures et de sous-requtes. Mais vous pouvez aussi entirement omettre
l'expression de table et utiliser la commande SELECT comme une calculatrice :
SELECT 3 * 4;
Ceci est plus utile si les expressions de la liste de slection renvoient des rsultats variants. Par exemple, vous pouvez appeler
une fonction de cette faon :
SELECT random();
Requtes
Requtes
Requtes
Requtes
-- mauvais
Les alias de table sont disponibles principalement pour aider l'criture de requte mais ils deviennent ncessaires pour joindre
une table avec elle-mme, par exemple :
SELECT * FROM personnes AS mere JOIN personnes AS enfant ON mere.id = enfant.mere_id;
De plus, un alias est requis si la rfrence de la table est une sous-requte (voir la Section 7.2.1.3, Sous-requtes ).
Les parenthses sont utilises pour rsoudre les ambiguts. Dans l'exemple suivant, la premire instruction affecte l'alias b la
deuxime instance de ma_table mais la deuxime instruction affecte l'alias au rsultat de la jonction :
SELECT * FROM ma_table AS a CROSS JOIN ma_table AS b ...
SELECT * FROM (ma_table AS a CROSS JOIN ma_table) AS b ...
Une autre forme d'alias de tables donne des noms temporaires aux colonnes de la table ainsi qu' la table :
FROM reference_table [AS] alias ( colonne1 [, colonne2 [, ...]] )
Si le nombre d'alias de colonnes spcifi est plus petit que le nombre de colonnes dont dispose la table relle, les colonnes suivantes ne sont pas renommes. Cette syntaxe est particulirement utile dans le cas de jointure avec la mme table ou dans le cas de
sous-requtes.
Quand un alias est appliqu la sortie d'une clause JOIN, l'alias cache le nom original rfrenc l'intrieur du JOIN. Par
exemple :
SELECT a.* FROM ma_table AS a JOIN ta_table AS b ON ...
est du SQL valide mais :
SELECT a.* FROM (ma_table AS a JOIN ta_table AS b ON ...) AS c
n'est pas valide l'alias de table a n'est pas visible en dehors de l'alias c.
7.2.1.3. Sous-requtes
Une sous-requte spcifiant une table drive doit tre enferme dans des parenthses et doit se voir affect un alias de table (voir
la Section 7.2.1.2, Alias de table et de colonne ). Par exemple :
FROM (SELECT * FROM table1) AS nom_alias
Cet exemple est quivalent FROM table1 AS nom_alias. Des cas plus intressants, qui ne peuvent pas tre rduit une
jointure pleine, surviennent quand la sous-requte implique un groupement ou un agrgat.
Uns sous-requte peut aussi tre une liste VALUES :
FROM (VALUES ('anne', 'smith'), ('bob', 'jones'), ('joe', 'blow'))
AS noms(prenom, nom)
De nouveau, un alias de table est requis. Affecter des noms d'alias aux colonnes de la liste VALUES est en option mais c'est une
bonne pratique. Pour plus d'informations, voir Section 7.7, Listes VALUES .
Requtes
$$ LANGUAGE SQL;
SELECT * FROM recuptruc(1) AS t1;
SELECT * FROM truc
WHERE trucsousid IN (
SELECT trucsousid
FROM recuptruc(truc.trucid) z
WHERE z.trucid = truc.trucid);
CREATE VIEW vue_recuptruc AS SELECT * FROM recuptruc(1);
SELECT * FROM vue_recuptruc;
Dans certains cas, il est utile de dfinir des fonctions de table pouvant renvoyer des ensembles de colonnes diffrentes suivant la
faon dont elles sont appeles. Pour supporter ceci, la fonction de table est dclare comme renvoyant le pseudotype record.
Quand une telle fonction est utilise dans une requte, la structure de ligne attendue doit tre spcifie dans la requte elle-mme,
de faon ce que le systme sache comment analyser et planifier la requte. Considrez cet exemple :
SELECT *
FROM dblink('dbname=mabd', 'SELECT proname, prosrc FROM pg_proc')
AS t1(proname nom, prosrc text)
WHERE proname LIKE 'bytea%';
La fonction dblink(3) (part of the dblink module>) excute une requte distante. Elle dclare renvoyer le type record car elle pourrait tre utilise pour tout type de requte. L'ensemble de colonnes relles doit tre spcifi dans la requte appelante de faon ce
que l'analyseur sache, par exemple, comment tendre *.
Note
La condition de jointure d'une jointure interne peut tre crite soit dans la clause WHERE soit dans la clause JOIN.
Par exemple, ces expressions de tables sont quivalentes :
FROM a, b WHERE a.id = b.id AND b.val > 5
et :
FROM a INNER JOIN b ON (a.id = b.id) WHERE b.val > 5
ou mme peut-tre :
FROM a NATURAL JOIN b WHERE b.val > 5
Laquelle vous utilisez est plutt une affaire de style. La syntaxe JOIN dans la clause FROM n'est probablement pas
aussi portable vers les autres systmes de gestion de bases de donnes SQL, mme si cela fait partie du standard
SQL. Pour les jointures externes, il n'y a pas d'autres choix : elles doivent tre faites dans la clause FROM. La clause
ON ou USING d'une jointure externe n'est pas quivalente une condition WHERE parce qu'elle dtermine l'ajout de
lignes (pour les lignes qui ne correspondent pas en entre) ainsi que pour la suppression de lignes dans le rsultat final.
Voici quelques exemples de clauses WHERE :
SELECT ... FROM fdt WHERE c1 > 5
SELECT ... FROM fdt WHERE c1 IN (1, 2, 3)
SELECT ... FROM fdt WHERE c1 IN (SELECT c1 FROM t2)
70
Requtes
SELECT ... FROM fdt WHERE c1 IN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10)
SELECT ... FROM fdt WHERE c1 BETWEEN (SELECT c3 FROM t2 WHERE c2 = fdt.c1 + 10) AND 100
SELECT ... FROM fdt WHERE EXISTS (SELECT c1 FROM t2 WHERE c2 > fdt.c1)
fdt est la table drive dans la clause FROM. Les lignes qui ne correspondent pas la condition de recherche de la clause WHERE
sont limines de la table fdt. Notez l'utilisation de sous-requtes scalaires en tant qu'expressions de valeurs. Comme n'importe
quelle autre requte, les sous-requtes peuvent employer des expressions de tables complexes. Notez aussi comment fdt est rfrence dans les sous-requtes. Qualifier c1 comme fdt.c1 est seulement ncessaire si c1 est aussi le nom d'une colonne dans la
table d'entre drive de la sous-requte. Mais qualifier le nom de colonne ajoute la clart mme lorsque cela n'est pas ncessaire. Cet exemple montre comment le nom de colonne d'une requte externe est tendue dans les requtes internes.
Astuce
Le regroupement sans expressions d'agrgats calcule effectivement l'ensemble les valeurs distinctes d'une colonne.
Ceci peut aussi se faire en utilisant la clause DISTINCT (voir la Section 7.3.3, DISTINCT ).
71
Requtes
Voici un autre exemple : il calcule les ventes totales pour chaque produit (plutt que le total des ventes sur tous les produits) :
SELECT produit_id, p.nom, (sum(v.unite) * p.prix) AS ventes
FROM produits p LEFT JOIN ventes v USING (produit_id)
GROUP BY produit_id, p.nom, p.prix;
Dans cet exemple, les colonnes produit_id, p.nom et p.prix doivent tre dans la clause GROUP BY car elles sont rfrences dans la liste de slection de la requte (but see below). La colonne s.unite n'a pas besoin d'tre dans la liste GROUP BY
car elle est seulement utilise dans l'expression de l'agrgat (sum(...)) reprsentant les ventes d'un produit. Pour chaque produit, la requte renvoie une ligne de rsum sur les ventes de ce produit.
If the products table is set up so that, say, product_id is the primary key, then it would be enough to group by product_id
in the above example, since name and price would be functionally dependent on the product ID, and so there would be no ambiguity about which name and price value to return for each product ID group.
En SQL strict, GROUP BY peut seulement grouper les colonnes de la table source mais PostgreSQL tend ceci en autorisant
GROUP BY grouper aussi les colonnes de la liste de slection. Grouper par expressions de valeurs au lieu de simples noms de
colonnes est aussi permis.
Si une table a t groupe en utilisant la clause GROUP BY mais que seuls certains groupes sont intressants, la clause HAVING
peut tre utilise, comme une clause WHERE, pour liminer les groupes du rsultat. Voici la syntaxe :
SELECT liste_selection FROM ... [WHERE ...] GROUP BY ... HAVING expression_boolenne
Les expressions de la clause HAVING peuvent rfrer la fois aux expressions groupes et aux expressions non groupes (ce qui
impliquent ncessairement une fonction d'agrgat).
Exemple :
=> SELECT x, sum(y) FROM test1 GROUP BY x HAVING sum(y) > 3;
x | sum
---+----a |
4
b |
5
(2 rows)
=> SELECT x, sum(y) FROM test1 GROUP BY x HAVING x < 'c';
x | sum
---+----a |
4
b |
5
(2 rows)
De nouveau, un exemple plus raliste :
SELECT produit_id, p.nom, (sum(v.unite) * (p.prix - p.cout)) AS profit
FROM produits p LEFT JOIN ventes v USING (produit_id)
WHERE v.date > CURRENT_DATE - INTERVAL '4 weeks'
GROUP BY produit_id, p.nom, p.prix, p.cout
HAVING sum(p.prix * s.unite) > 5000;
Dans l'exemple ci-dessus, la clause WHERE slectionne les lignes par une colonne qui n'est pas groupe (l'expression est vraie
seulement pour les ventes des quatre dernires semaines) alors que la clause HAVING restreint la sortie aux groupes dont le total
des ventes dpasse 5000. Notez que les expressions d'agrgats n'ont pas besoin d'tre identiques dans toutes les parties d'une requte.
Si une requte contient des appels des fonctions d'aggrgat, mais pas de clause GROUP BY, le regroupement a toujours lieu : le
rsultat est une seule ligne de regroupement (ou peut-tre pas de ligne du tout si la ligne unique est ensuite limine par la clause
HAVING). Ceci est vrai aussi si elle comporte une clause HAVING, mme sans fonction d'aggrgat ou GROUP BY.
Requtes
l'valuation de fonctions ayant des spcifications de PARTITION BY ou ORDER BY diffrentes. (Dans ces cas, une tape de tri
est gnralement ncessaire entre les passes d'valuations de fonctions Window, et le tri ne garantit pas la prservation de l'ordre
des enregistrements que son ORDER BY estime comme identiques.)
l'heure actuelle, les fonctions window ncessitent toujours des donnes pr-tries, ce qui fait que la sortie de la requte sera trie
suivant l'une ou l'autre des clauses PARTITION BY/ORDER BY des fonctions Window. Il n'est toutefois pas recommand de s'en
servir. Utilisez une clause ORDER BY au plus haut niveau de la requte si vous voulez tre sr que vos rsultats soient tris d'une
certaine faon.
Note
73
Requtes
Le nom des colonnes en sortie est diffrent ici de ce qui est fait dans la clause FROM (voir la Section 7.2.1.2,
Alias de table et de colonne ). Il est possible de renommer deux fois la mme colonne mais le nom affect dans
la liste de slection est celui qui sera pass.
7.3.3. DISTINCT
Aprs le traitement de la liste de slection, la table rsultant pourrait tre optionnellement sujet l'limination des lignes dupliques. Le mot cl DISTINCT est crit directement aprs SELECT pour spcifier ceci :
SELECT DISTINCT liste_selection ...
(au lieu de DISTINCT, le mot cl ALL peut tre utilis pour spcifier le comportement par dfaut, la rcupration de toutes les
lignes)
videmment, les deux lignes sont considres distinctes si elles diffrent dans au moins une valeur de colonne. Les valeurs NULL
sont considres gales dans cette comparaison.
Autrement, une expression arbitraire peut dterminer quelles lignes doivent tre considres distinctes :
SELECT DISTINCT ON (expression [, expression ...]) liste_selection ...
Ici, expression est une expression de valeur arbitraire, value pour toutes les lignes. Les lignes dont toutes les expressions
sont gales sont considres comme dupliques et seule la premire ligne de cet ensemble est conserve dans la sortie. Notez que
la premire ligne d'un ensemble est non prvisible sauf si la requte est trie sur assez de colonnes pour garantir un ordre
unique des colonnes arrivant dans le filtre DISTINCT (le traitement de DISTINCT ON parvient aprs le tri de ORDER BY).
La clause DISTINCT ON ne fait pas partie du standard SQL et est quelque fois considre comme tant un mauvais style cause
de la nature potentiellement indtermine de ses rsultats. Avec l'utilisation judicieuse de GROUP BY et de sous-requtes dans
FROM, la construction peut tre vite mais elle reprsente souvent l'alternative la plus agrable.
Requtes
-- mauvais
Cette restriction est l pour rduire l'ambigut. Il y en a toujours si un lment ORDER BY est un simple nom qui pourrait correspondre soit un nom de colonne en sortie soit une colonne d'une expression de table. La colonne en sortie est utilise dans de
tels cas. Cela causera seulement de la confusion si vous utilisez AS pour renommer une colonne en sortie qui correspondra un
autre nom de colonne d'une table.
ORDER BY peut tre appliqu au rsultat d'une combinaison UNION, d'une combinaisonINTERSECT ou d'une combinaison EXCEPT mais, dans ce cas, il est seulement permis de trier par les noms ou numros de colonnes, pas par les expressions.
En fait, PostgreSQL utilise la classe d'oprateur B-tree par dfaut pour le type de donnes de l'expression pour dterminer l'ordre de tri avec ASC et DESC. De faon conventionnelle, les types de donnes seront initialiss de faon ce que les oprateurs < et > correspondent cet ordre de tri mais un concepteur des types de donnes dfinis par l'utilisateur pourrait choisir de faire quelque chose de diffrent.
75
Requtes
L'optimiseur de requtes prend LIMIT en compte lors de la gnration des plans de requtes, de faon ce que vous obteniez diffrents plans (avec diffrents ordres de lignes) suivant ce que vous donnez LIMIT et OFFSET. Du coup, utiliser des valeurs
LIMIT/OFFSET diffrentes pour slectionner des sous-ensembles diffrents d'un rsultat de requte donnera des rsultats inconsistants sauf si vous forcez un ordre de rsultat prvisible avec ORDER BY. Ceci n'est pas un bogue ; c'est une consquence inhrente du fait que le SQL ne promette par de dlivrer les rsultats d'une requte dans un ordre particulier sauf si ORDER BY est utilis pour contraindre l'ordre.
Les lignes passes par une clause OFFSET devront toujours tre traites l'intrieur du serveur ; du coup, un OFFSET important
peut tre inefficace.
Requtes
produit,
SUM(quantite) AS unites_produit,
SUM(montant) AS ventes_produit
FROM commandes
WHERE region IN (SELECT region FROM meilleures_regions)
GROUP BY region, produit;
qui affiche les totaux de ventes par produit dans seulement les rgions ayant les meilleures ventes. La clause WITH dfinit deux
ordres auxiliaires appels ventes_regionales et meilleures_regions, o la sortie de ventes_regionales est utilis dans
meilleures_regions et la sortie de meilleures_regions est utilise dans la requte SELECT primaire. Cet exemple aurait pu tre
crit sans WITH, mais aurait alors ncessit deux niveaux de sous-SELECT imbriqus. Les choses sont un peu plus faciles
suivre de cette faon.
Le modificateur optionnel RECURSIVE fait passer WITH du statut de simple aide syntaxique celui de quelque chose qu'il serait
impossible d'accomplir avec du SQL standard. Grce RECURSIVE, une requte WITH peut utiliser sa propre sortie. Un exemple
trs simple se trouve dans cette requte, qui ajoute les nombres de 1 100 :
WITH RECURSIVE t(n) AS (
VALUES (1)
UNION ALL
SELECT n+1 FROM t WHERE n < 100
)
SELECT sum(n) FROM t;
La forme gnrale d'une requte WITH est toujours un terme non-recursif, puis UNION (ou UNION ALL), puis un terme rcursif.
Seul le terme rcursif peut contenir une rfrence la sortie propre de la requte. Une requte de ce genre est excute comme
suit :
Procdure 7.1. valuation de requte rcursive
1.
valuer le terme non rcursif. Pour UNION (mais pas UNION ALL), supprimer les enregistrements en double. Inclure le
reste dans le rsultat de la requte rcursive et le mettre aussi dans une table temporaire de travail (working table.)
2.
Tant que la table de travail n'est pas vide, rpter ces tapes :
a.
valuer le terme rcursif, en substituant la rfrence rcursive le contenu courant de la table de travail. Pour UNION
(mais pas UNION ALL), supprimer les doublons, ainsi que les enregistrements en doublon des enregistrements dj obtenus. Inclure les enregistrements restants dans le rsultat de la requte rcursive, et les mettre aussi dans une table temporaire intermdiaire (intermediate table).
b.
Remplacer le contenu de la table de travail par celui de la table intermdiaire, puis supprimer la table intermdiaire.
Note
Dans son appellation stricte, ce processus est une itration, pas une rcursion, mais RECURSIVE est la terminologie choisie par le comit de standardisation de SQL.
Dans l'exemple prcdent, la table de travail a un seul enregistrement chaque tape, et il prend les valeurs de 1 100 en tapes
successives. la centime tape, il n'y a plus de sortie en raison de la clause WHERE, ce qui met fin la requte.
Les requtes rcursives sont utilises gnralement pour traiter des donnes hirarchiques ou sous forme d'arbres. Cette requte est
un exemple utile pour trouver toutes les sous-parties directes et indirectes d'un produit, si seule une table donne toutes les inclusions immdiates :
WITH RECURSIVE parties_incluses(sous_partie, partie, quantite) AS (
SELECT sous_partie, partie, quantite FROM parties WHERE partie = 'notre_produit'
UNION ALL
SELECT p.sous_partie, p.partie, p.quantite
FROM parties_incluses pr, parties p
WHERE p.partie = pr.sous_partie
)
SELECT sous_partie, SUM(quantite) as quantite_totale
FROM parties_incluses
GROUP BY sous_partie
77
Requtes
Quand on travaille avec des requtes rcursives, il est important d'tre sr que la partie rcursive de la requte finira par ne retourner aucun enregistrement, au risque sinon de voir la requte boucler indfiniment. Quelquefois, utiliser UNION la place de
UNION ALL peut rsoudre le problme en supprimant les enregistrements qui doublonnent ceux dj retourns. Toutefois, souvent, un cycle ne met pas en jeu des enregistrements de sortie qui sont totalement des doublons : il peut s'avrer ncessaire de vrifier juste un ou quelques champs, afin de s'assurer que le mme point a dj t atteint prcdemment. La mthode standard pour
grer ces situations est de calculer un tableau de valeurs dj visites. Par exemple, observez la requte suivante, qui parcourt une
table graphe en utilisant un champ lien :
WITH RECURSIVE parcourt_graphe(id, lien, donnee, profondeur) AS (
SELECT g.id, g.lien, g.donnee, 1
FROM graphe g
UNION ALL
SELECT g.id, g.lien, g.donnee, sg.profondeur + 1
FROM graphe g, parcourt_graphe sg
WHERE g.id = sg.lien
)
SELECT * FROM parcourt_graphe;
Cette requte va boucler si la liaison lien contient des boucles. Parce que nous avons besoin de la sortie profondeur , simplement remplacer UNION ALL par UNION ne rsoudra pas le problme. la place, nous avons besoin d'identifier si nous avons atteint un enregistrement que nous avons dj trait pendant notre parcours des liens. Nous ajoutons deux colonnes chemin et
boucle la requte :
WITH RECURSIVE parcourt_graphe(id, lien, donnee, profondeur, chemin, boucle) AS (
SELECT g.id, g.lien, g.donnee, 1,
ARRAY[g.id],
false
FROM graphe g
UNION ALL
SELECT g.id, g.lien, g.donnee, sg.profondeur + 1,
chemin || g.id,
g.id = ANY(chemin)
FROM graphe g, parcourt_graphe sg
WHERE g.id = sg.lien AND NOT boucle
)
SELECT * FROM parcourt_graphe;
En plus de prvenir les boucles, cette valeur de tableau est souvent pratique en elle-mme pour reprsenter le chemin pris pour
atteindre chaque enregistrement.
De faon plus gnrale, quand plus d'un champ a besoin d'tre vrifi pour identifier une boucle, utilisez un tableau
d'enregistrements. Par exemple, si nous avions besoin de comparer les champs f1 et f2 :
WITH RECURSIVE parcourt_graphe(id, lien, donnee, profondeur, chemin, boucle) AS (
SELECT g.id, g.lien, g.donnee, 1,
ARRAY[ROW(g.f1, g.f2)],
false
FROM graphe g
UNION ALL
SELECT g.id, g.lien, g.donnee, sg.profondeur + 1,
chemin || ROW(g.f1, g.f2),
ROW(g.f1, g.f2) = ANY(path)
FROM graphe g, parcourt_graphe sg
WHERE g.id = sg.link AND NOT boucle
)
SELECT * FROM parcourt_graphe;
Astuce
Omettez la syntaxe ROW() dans le cas courant o un seul champ a besoin d'tre test pour dterminer une boucle.
Ceci permet, par l'utilisation d'un tableau simple plutt que d'un tableau de type composite, de gagner en efficacit.
Astuce
78
Requtes
L'algorithme d'valuation rcursive de requte produit sa sortie en ordre de parcours en largeur (algorithme
breadth-first). Vous pouvez afficher les rsultats en ordre de parcours en profondeur (depth-first) en faisant sur la
requte externe un ORDER BY sur une colonne chemin construite de cette faon.
Si vous n'tes pas certain qu'une requte peut boucler, une astuce pratique pour la tester est d'utiliser LIMIT dans la requte parente. Par exemple, cette requte bouclerait indfiniment sans un LIMIT :
WITH RECURSIVE t(n) AS (
SELECT 1
UNION ALL
SELECT n+1 FROM t
)
SELECT n FROM t LIMIT 100;
Ceci fonctionne parce que l'implmentation de PostgreSQL n'value que le nombre d'enregistrements de la requte WITH rcuprs par la requte parente. L'utilisation de cette astuce en production est dconseille parce que d'autres systmes pourraient
fonctionner diffremment. Par ailleurs, cela ne fonctionnera pas si vous demandez la requte externe de trier les rsultats de la
requte rcursive, ou si vous les joignez une autre table, parce dans ces cas, la requte exterieure essaiera habituellement de rcuprer toute la sortie de la requte WITH de toutes faons.
Une proprit intressante des requtes WITH est qu'elles ne sont values qu'une seule fois par excution de la requte parente ou
des requtes WITH surs. Par consquent, les calculs coteux qui sont ncessaires plusieurs endroits peuvent tre placs dans
une requte WITH pour viter le travail redondant. Un autre intrt peut tre d'viter l'excution multiple d'une fonction ayant des
effets de bord. Toutefois, le revers de la mdaille est que l'optimiseur est moins capable d'extrapoler les restrictions de la requte
parente vers une requte WITH que vers une sous-requte classique. La requte WITH sera gnralement excute telle quelle,
sans suppression d'enregistrements, que la requte parente devra supprimer ensuite. (Mais, comme mentionn prcdemment,
l'valuation pourrait s'arrter rapidement si la (les) rfrence(s) la requte ne demande(nt) qu'un nombre limit
d'enregistrements).
Les exemples prcdents ne montrent que des cas d'utilisation de WITH avec SELECT, mais on peut les attacher de la mme
faon un INSERT, UPDATE, ou DELETE. Dans chaque cas, le mcanisme fournit en fait des tables temporaires auxquelles on
peut faire rfrence dans la commande principale.
Requtes
)
DELETE FROM bar;
Cet exemple supprimerait tous les lments des tables foo et bar. Le nombre d'enregistrements retourn au client n'incluerait que
les enregistrements supprims de bar.
Les auto-rfrences rcursives dans les ordres de modification de donnes ne sont pas autorises. Dans certains cas, il est possible
de contourner cette limitation en faisant rfrence la sortie d'un WITH, par exemple:
WITH RECURSIVE pieces_incluses(sous_piece, piece) AS (
SELECT sous_piece, piece FROM pieces WHERE piece = 'notre_produit'
UNION ALL
SELECT p.sous_piece, p.piece
FROM pieces_incluses pr, pieces p
WHERE p.piece = pr.sous_piece
)
DELETE FROM pieces
WHERE piece IN (SELECT piece FROM pieces_incluses);
Cette requte supprimerait toutes les pices directes et indirectes d'un produit.
Les ordres de modification de donnes dans WITH sont excutes exactement une fois, et toujours jusqu' la fin, indpendamment
du fait que la requte primaire lise tout (ou mme une partie) de leur sortie. Notez que c'est diffrent de la rgle pour SELECT
dans WITH: comme prcis dans la section prcdente, l'excution d'un SELECT est n'est poursuivie que tant que la requte primaire consomme sa sortie.
Les sous-requtes du WITH sont toutes excutes simultanment et simultanment avec la requte principale. Par consquent,
quand vous utilisez un ordre de modification de donnes avec WITH, l'ordre dans lequel les mises jour sont effectues n'est pas
prvisible. Toutes les requtes sont excutes dans le mme instantan (voyez Chapitre 13, Contrle d'accs simultan), elles ne
peuvent donc pas voir les effets des autres sur les tables cibles. Ceci rend sans importance le problme de l'imprvisibilit de
l'ordre des mises jour, et signifie que RETURNING est la seule faon de communiquer les modifications entre les diffntes sousrequtes WITH et la requte principale. En voici un exemple:
WITH t AS (
UPDATE produits SET prix = prix * 1.05
RETURNING *
)
SELECT * FROM produits;
le SELECT externe retournerait les prix originaux avant l'action de UPDATE, alors que
WITH t AS (
UPDATE produits SET prix = prix * 1.05
RETURNING *
)
SELECT * FROM t;
le SELECT externe retournerait les donnes mises jour.
Essayer de mettre jour le mme enregistrement deux fois dans le mme ordre n'est pas support. Seule une des deux modifications a lieu, mais il n'est pas ais (et quelquefois pas possible) de dterminer laquelle. Ceci s'applique aussi pour la suppression
d'un enregistrement qui a dj t mis jour dans le mme ordre: seule la mise jour est effectue. Par consquent, vous devriez
viter en rgle gnrale de mettre jour le mme enregistrement deux fois en un seul ordre. En particulier, vitez d'crire des
sous-requtes qui modifieraient les mmes enregistrements que la requte principale ou une autre sous-requte. Les effets d'un
ordre de ce type seraient imprvisibles.
l'heure actuelle, les tables utilises comme cibles d'un ordre modifiant les donnes dans un WITH ne doivent avoir ni rgle
conditionnelle, ni rgle ALSO, ni une rgle INSTEAD qui gnre plusieurs ordres.
80
Nom
Alias
Description
bigint
int8
bigserial
serial8
bit [ (n) ]
varbit
boolean
bool
Boolen (Vrai/Faux)
box
bytea
varchar [ (n) ]
character [ (n) ]
char [ (n) ]
cidr
circle
date
double precision
float8
inet
integer
Intervalle de temps
line
lseg
macaddr
money
Montant montaire
numeric [ (p, s) ]
decimal [ (p, s) ]
path
point
polygon
real
float4
smallint
int2
serial
serial4
text
timetz
tsquery
tsvector
txid_snapshot
Types de donnes
Nom
Alias
Description
uuid
xml
donnes XML
Compatibilit
Les types suivants sont conformes la norme SQL: bigint, bit, bit varying, boolean, char, character varying, character, varchar, date, double precision, integer, interval, numeric, decimal, real, smallint, time (avec et sans fuseau
horaire), timestamp (avec et sans fuseau horaire), xml, .
Chaque type de donnes a une reprsentation externe dtermine par ses fonctions d'entre et de sortie. De nombreux types de
donnes internes ont un format externe vident. Cependant, certains types sont spcifiques PostgreSQL, comme les chemins
gomtriques, ou acceptent diffrents formats, comme les types de donnes de date et d'heure. Certaines fonctions d'entre et de
sortie ne sont pas inversables : le rsultat de la fonction de sortie peut manquer de prcision compar l'entre initiale.
Nom
Taille de stockage
Description
tendue
smallint
2 octets
de -32768 +32767
integer
4 octets
entier habituel
de -2147483648 +2147483647
bigint
8 octets
grand entier
de
-9223372036854775808
9223372036854775807
decimal
variable
prcision indique par l'utilisateur, valeur jusqu' 131072 chiffres avant le point dexacte
cimal ; jusqu' 16383 aprs le point dcimal
numeric
variable
prcision indique par l'utilisateur, valeur jusqu' 131072 chiffres avant le point dexacte
cimal ; jusqu' 16383 aprs le point dcimal
real
4 octets
prcision de 6 dcimales
double precision
8 octets
prcision de 15 dcimales
serial
4 octets
de 1 2147483647
bigserial
8 octets
La syntaxe des constantes pour les types numriques est dcrite dans la Section 4.1.2, Constantes . Les types numriques ont un
ensemble complet d'oprateurs arithmtiques et de fonctions. On peut se rfrer au Chapitre 9, Fonctions et oprateurs pour plus
d'informations. Les sections suivantes dcrivent ces types en dtail.
Types de donnes
Note
La prcision maximale autorise, si elle est explicitement spcifie dans la dclaraion du type, est de 1000. NUMERIC sans prcision est sujet aux limites dcrites dans Tableau 8.2, Types numriques .
Si l'chelle d'une valeur stocker est suprieure celle de la colonne, le systme arrondit la valeur au nombre de dcimales indiqu pour la colonne. Si le nombre de chiffres gauche du point dcimal est suprieur la diffrence entre la prcision dclare et
l'chelle dclare, une erreur est leve.
Les valeurs numriques sont stockes physiquement sans zro avant ou aprs. Du coup, la prcision dclare et l'chelle de la colonne sont des valeurs maximales, pas des allocations fixes (en ce sens, le type numrique est plus proche de varchar(n) que de
char(n)). Le besoin pour le stockage rel est de deux octets pour chaque groupe de quatre chiffres dcimaux, plus trois huit octets d'en-tte.
En plus des valeurs numriques ordinaires, le type numeric autorise la valeur spciale NaN qui signifie not-a-number (NdT :
pas un nombre). Toute opration sur NaN retourne NaN. Pour crire cette valeur comme une constante dans une requte SQL, elle
doit tre place entre guillemets. Par exemple, UPDATE table SET x = 'NaN'. En saisie, la chane NaN est reconnue
quelque soit la casse utilise.
Note
Dans la plupart des implmentations du concept not-a-number , NaN est considr diffrent de toute valeur numrique (ceci incluant NaN). Pour autoriser le tri des valeurs de type numeric et les utiliser dans des index bass sur
le tri, PostgreSQL traite les valeurs NaN comme identiques entre elles, mais toutes suprieures aux valeurs non
NaN.
Les types decimal et numeric sont quivalents. Les deux types sont dans le standard SQL.
Types de donnes
l'informatique, qui n'est pas le sujet de ce document, l'exception des points suivants :
pour un stockage et des calculs exacts, comme pour les valeurs montaires, le type numeric doit tre privilgi ;
pour des calculs compliqus avec ces types pour quoi que ce soit d'important, et particulirement pour le comportement aux limites (infini, zro), l'implantation spcifique la plate-forme doit tre tudi avec soin ;
tester l'galit de deux valeurs virgule flottante peut ne pas donner le rsultat attendu.
Sur la plupart des plates-formes, le type real a une tendue d'au moins 1E-37 1E37 avec une prcision d'au moins 6 chiffres dcimaux. Le type double precision a gnralement une tendue de 1E-307 1E+308 avec une prcision d'au moins 15 chiffres. Les
valeurs trop grandes ou trop petites produisent une erreur. Un arrondi peut avoir lieu si la prcision d'un nombre en entre est trop
grande. Les nombres trop proches de zro qui ne peuvent tre reprsents autrement que par zro produisent une erreur
(underflow).
Note
Le paramtre extra_float_digits contrle le nombre de chiffres significatifs inclus lorsqu'une valeur virgule flottante est convertie en texte. Avec la valeur par dfaut de 0, la sortie est la mme sur chaque plateforme supporte
par PostgreSQL. L'augmenter va produire une sortie reprsentant plus prcisment la valeur stocke mais il est possible que la sortie soit diffrente suivant les plateformes.
En plus des valeurs numriques ordinaires, les types virgule flottante ont plusieurs valeurs spciales :
Infinity
-Infinity
NaN
Elles reprsentent les valeurs spciales de l'IEEE 754, respectivement infinity (NdT : infini), negative infinity (NdT : infini
ngatif) et not-a-number (NdT : pas un nombre) (sur une machine dont l'arithmtique virgule flottante ne suit pas l'IEEE 754,
ces valeurs ne fonctionnent probablement pas comme espr). Lorsqu'elles sont saisies en tant que constantes dans une commande
SQL, ces valeurs doivent tre places entre guillemets. Par exemple, UPDATE table SET x = 'Infinity'. En entre, ces
valeurs sont reconnues quelque soit la casse utilise.
Note
IEEE754 spcifie que NaN ne devrait pas tre considr gale toute autre valeur en virgule flottante (ceci incluant
NaN). Pour permettre le tri des valeurs en virgule flottante et leur utilisation dans des index bass sur des arbres,
PostgreSQL traite les valeurs NaN comme identiques entre elles, mais suprieures toute valeur diffrente de
NaN.
PostgreSQL autorise aussi la notation float du standard SQL, ainsi que float(p) pour indiquer des types numriques inexacts. p
indique la prcision minimale acceptable en chiffres binaires. PostgreSQL accepte de float(1) float(24), qu'il transforme en
type real, et de float(25) float(53), qu'il transforme en type double precision. Toute valeur de p hors de la zone des valeurs possibles produit une erreur. float sans prcision est compris comme double precision.
Note
Avant PostgreSQL 7.4, la prcision d'un float(p) tait suppose indiquer une prcision en chiffres dcimaux. Cela a t corrig pour respecter le standard SQL, qui indique que la prcision est indique en chiffres binaires.
L'affirmation que les real et les double precision ont exactement 24 et 53 bits dans la mantisse est correcte pour les
implmentations des nombres virgule flottante respectant le standard IEEE. Sur les plates-formes non-IEEE, c'est
peut-tre un peu sous-estim mais, pour plus de simplicit, la gamme de valeurs pour p est utilise sur toutes les
plates-formes.
Types de donnes
);
est quivalent crire :
CREATE SEQUENCE nom_de_table_nom_de_colonne_seq;
CREATE TABLE nom_de_table (
nom_de_colonne integer NOT NULL DEFAULT nextval('nom_de_table_nom_de_colonne_seq')
NOT NULL
);
ALTER SEQUENCE nom_de_table_nom_de_colonne_seq OWNED BY nom_de_table.nom_de_colonne;
Une colonne d'entiers a ainsi t cre dont la valeur par dfaut est assigne par un gnrateur de squence. Une contrainte NOT
NULL est ajoute pour s'assurer qu'une valeur NULL ne puisse pas tre insre. (Dans la plupart des cas, une contrainte UNIQUE
ou PRIMARY KEY peut tre ajoute pour interdire que des doublons soient crs par accident, mais ce n'est pas automatique.) Enfin, la squence est marque owned by (possde par) la colonne pour qu'elle soit supprime si la colonne ou la table est supprime.
Note
Comme smallserial, serial et bigserial sont implments en utilisant des squences, il peut y avoir des trous dans la
squence de valeurs qui apparait dans la colonne, mme si aucune ligne n'est jamais supprime. Une valeur alloue
partir de la squence est toujours utilise mme si la ligne contenant cette valeur n'est pas insre avec succs
dans la colonne de la table. Cela peut survenir si la transaction d'insertion est annule. Voir nextval() dans Section 9.15, Fonctions de manipulation de squences pour plus de dtails.
Note
Avant PostgreSQL 7.3, serial sous-entendait UNIQUE. Ce n'est plus automatique. Pour qu'une colonne de type
serial soit unique ou soit une cl primaire, il faut le prciser, comme pour les autres types.
Pour insrer la valeur suivante de la squence dans la colonne serial, il faut prciser que la valeur par dfaut de la colonne doit tre
utilise. Cela peut se faire de deux faons : soit en excluant cette colonne de la liste des colonnes de la commande INSERT soit en
utilisant le mot cl DEFAULT.
Les types serial et serial4 sont identiques : ils crent tous les deux des colonnes integer. Les types bigserial et serial8 fonctionnent
de la mme faon mais crent des colonnes bigint. bigserial doit tre utilis si plus de 231 identifiants sont prvus sur la dure de
vie de la table.
La squence cre pour une colonne serial est automatiquement supprime quand la colonne correspondante est supprime. La squence peut tre dtruite sans supprimer la colonne, mais la valeur par dfaut de la colonne est alors galement supprime.
Nom
Taille de stockage
Description
tendue
money
8 octets
montant montaire
-92233720368547758.08
+92233720368547758.07
Comme la sortie de type de donnes est sensible la locale, la recharge de donnes de type money dans une base de donnes pourrait ne pas fonctionner si la base a une configuration diffrente pour lc_monetary. Pour viter les problmes, avant de restaurer
une sauvegarde dans une nouvelle base de donnes, assurez-vous que lc_monetary a la mme valeur ou une valeur quivalente
celle de la base qui a t sauvegarde.
Les valeurs de types numeric, int et bigint peuvent tre converties en type money. La conversion partir du type real et double
precision peut tre fait en convertissant tout d'abord vers le type numeric. Par exemple :
SELECT '12.34'::float8::numeric::money;
85
Types de donnes
Nanmoins, ce n'est pas recommand. Les nombres virgules flottantes ne doivent pas tre utiliss pour grer de la monnaie
cause des erreurs potentielles d'arrondis.
Une valeur money peut tre convertie en numeric sans perdre de prcision. Les conversion vers d'autres types peuvent potentiellement perdre en prcision et doivent aussi de faire en deux tapes :
SELECT '52093.89'::money::numeric::float8;
Quand une valeur de type money est divise par une autre valeur de type money, le rsultat est du type double precision
(c'est--dire un nombre pur, pas une monnaie). Les units de monnaie s'annulent dans la division.
Nom
Description
character(n), char(n)
text
Le Tableau 8.4, Types caractre prsente les types gnriques disponibles dans PostgreSQL.
SQL dfinit deux types de caractres principaux : character varying(n) et character(n) o n est un entier positif. Ces deux types
permettent de stocker des chanes de caractres de taille infrieure ou gale n (ce ne sont pas des octets). Toute tentative
d'insertion d'une chane plus longue conduit une erreur, moins que les caractres en excs ne soient tous des espaces, auquel
cas la chane est tronque la taille maximale (cette exception trange est impose par la norme SQL). Si la chane stocker est
plus petite que la taille dclare, les valeurs de type character sont compltes par des espaces, celles de type character varying
sont stockes en l'tat.
Si une valeur est explicitement transtype en character varying(n) ou en character(n), une valeur trop longue est tronque n caractres sans qu'aucune erreur ne soit leve (ce comportement est aussi impos par la norme SQL.)
Les notations varchar(n) et char(n) sont des alias de character varying(n) et character(n), respectivement. character sans indication de taille est quivalent character(1). Si character varying est utilis sans indicateur de taille, le type accepte des chanes de
toute taille. Il s'agit l d'une spcificit de PostgreSQL.
De plus, PostgreSQL propose aussi le type text, qui permet de stocker des chanes de n'importe quelle taille. Bien que le type
text ne soit pas dans le standard SQL, plusieurs autres systmes de gestion de bases de donnes SQL le proposent galement.
Les valeurs de type character sont compltes physiquement l'aide d'espaces pour atteindre la longueur n indique. Ces valeurs
sont galement stockes et affiches de cette faon. Les espaces de remplissage n'ont, toutefois, aucune signification smantique.
Les espaces finales sont ignores lors de la comparaison de deux valeurs de type character et sont supprimes lors de la conversion
d'une valeur character en un des autres types chane. Ces espaces ont une signification smantique pour les valeurs de type character varying et text, et lors de l'utilisation de la correspondance de motifs, par exemple avec LIKE ou avec les expressions rationnelles.
L'espace ncessaire pour une chane de caractres courte (jusqu' 126 octets) est de un octet, plus la taille de la chane qui inclut le
remplissage avec des espaces dans le cas du type character. Les chanes plus longues ont quatre octets d'en-tte au lieu d'un seul.
Les chanes longues sont automatiquement compresses par le systme, donc le besoin pourrait tre moindre. Les chanes vraiment trs longues sont stockes dans des tables supplmentaires, pour qu'elles n'empchent pas d'accder rapidement des valeurs
plus courtes. Dans tous les cas, la taille maximale possible pour une chane de caractres est de l'ordre de 1 Go. (La taille maximale pour n dans la dclaration de type est infrieure. Il ne sert rien de modifier ce comportement, car avec les encodages sur
plusieurs octets, les nombres de caractres et d'octets peuvent tre trs diffrents. Pour stocker de longues chanes sans limite suprieure prcise, il est prfrable d'utiliser les types text et character varying sans taille, plutt que d'indiquer une limite de taille
arbitraire.)
Astuce
Il n'y a aucune diffrence de performance parmi ces trois types, si ce n'est la place disque supplmentaire requise
pour le type remplissage et quelques cycles CPU supplmentaires pour vrifier la longueur lors du stockage dans
une colonne contrainte par la taille. Bien que character(n) ait des avantages en terme de performance sur certains
autres systmes de bases de donnes, il ne dispose pas de ce type d'avantages dans PostgreSQL ; en fait, charac86
Types de donnes
ter(n) est habituellement le plus lent des trois cause des cots de stockage supplmentaires. Dans la plupart des situations, les types text et character varying peuvent tre utiliss leur place.
On peut se rfrer la Section 4.1.2.1, Constantes de chanes pour obtenir plus d'informations sur la syntaxe des libells de
chanes, et le Chapitre 9, Fonctions et oprateurs pour des informations complmentaires sur les oprateurs et les fonctions. Le jeu
de caractres de la base de donnes dtermine celui utilis pour stocker les valeurs texte ; pour plus d'informations sur le support
des jeux de caractres, se rfrer la Section 22.3, Support des jeux de caractres .
Exemple 8.1. Utilisation des types caractre
b
| char_length
-------+------------ok
|
2
bien |
5
trop |
5
La fonction char_length est dcrite dans la Section 9.4, Fonctions et oprateurs de chanes .
Il y a deux autres types caractre de taille fixe dans PostgreSQL. Ils sont dcrits dans le Tableau 8.5, Types caractres spciaux . Le type name existe uniquement pour le stockage des identifiants dans les catalogues systmes et n'est pas destin tre
utilis par les utilisateurs normaux. Sa taille est actuellement dfinie 64 octets (63 utilisables plus le terminateur) mais doit tre
rfrence en utilisant la constante NAMEDATALEN en code source C. La taille est dfinie la compilation (et est donc ajustable
pour des besoins particuliers). La taille maximale par dfaut peut ventuellement tre modifie dans une prochaine version. Le
type "char" (attention aux guillemets) est diffrent de char(1) car il n'utilise qu'un seul octet de stockage. Il est utilis dans les catalogues systmes comme un type d'numration simpliste.
Tableau 8.5. Types caractres spciaux
Nom
Taille de stockage
Description
"char"
1 octet
name
64 octets
Nom
Espace de stockage
Description
bytea
Une chane binaire est une squence d'octets. Les chanes binaires se distinguent des chanes de caractres de deux faons : tout
87
Types de donnes
d'abord, les chanes binaires permettent de stocker des octets de valeurs zro ainsi que les autres caractres non imprimables
(habituellement, les octets en dehors de l'chelle de 32 126). Les chanes de caractres interdisent les octets de valeur zro et interdisent aussi toute valeur d'octet ou squence d'octets invalide selon l'encodage slectionn pour la base de donnes. Ensuite, les
oprations sur les chanes binaires traitent rellement les octets alors que le traitement de chanes de caractres dpend de la configuration de la locale. En rsum, les chanes binaires sont appropries pour le stockage de donnes que le dveloppeur considre
comme des octets bruts alors que les chanes de caractres sont appropries pour le stockage de texte.
Le type bytea supporte deux formats externes pour l'entre et la sortie : le format d'chappement ( escape ) historique de PostgreSQL et le format hexadcimal ( hex ). Les deux sont accepts en entre. Le format de sortie dpend du paramtre de configuration bytea_output ; ce dernier slectionne par dfaut le format hexadcimal. (Notez que le format hexadcimal est disponible
depuis PostgreSQL 9.0 ; les versions antrieures et certains outils ne le comprennent pas.)
Le standard SQL dfinit un type de chane binaire diffrent, appel BLOB ou BINARY LARGE OBJECT. Le format en entre est
diffrent du bytea, mais les fonctions et oprateurs fournis sont pratiquement les mmes.
Valeur
l'octet
dcimale
de Description
Reprsentation en sortie
octet zro
E'\\000'
SELECT
\000
E'\\000'::bytea;
39
apostrophe
'''' or E'\\047'
SELECT
E'\''::bytea;
'
92
antislash
E'\\\\'
E'\\134'
or SELECT
E'\\\\'::bytea;
\\
non
La ncessit d'chapper les octets non affichables dpend des paramtrages de la locale. Il est parfois possible de s'en sortir sans
chappement. Le rsultat de chacun des exemples du Tableau 8.7, Octets littraux bytea chapper fait exactement un octet,
mme si la reprsentation en sortie fait plus d'un caractre.
S'il faut crire tant d'antislashs, comme indiqu dans le Tableau 8.7, Octets littraux bytea chapper , c'est qu'une chane bi88
Types de donnes
naire doit passer travers deux phases d'analyse dans le serveur PostgreSQL. Le premier antislash de chaque paire est vu
comme un caractre d'chappement par l'analyseur de chane (en supposant que la syntaxe d'chappement des chanes soit utilise)
et est donc consomm, laissant le second antislash de la paire. (Les chanes guillemets dollar peuvent tre utilises pour viter ce
niveau d'chappement.) L'antislash restant est compris par la fonction d'entre de PostgreSQL comme le dbut d'une valeur octale sur trois caractres ou comme l'chappement d'un autre antislash. Par exemple, une chane littrale passe au serveur comme
E'\\001' devient \001 aprs tre passe au travers de l'analyseur d'chappement de chane. Le \001 est envoy la fonction
d'entre de bytea, qui le convertit en un octet simple ayant une valeur dcimale de 1. Le guillemet simple n'est pas trait spcialement par bytea et suit les rgles normales des chanes littrales de chane. Voir aussi la Section 4.1.2.1, Constantes de chanes .
Les octets de bytea sont galement chapps en sortie. En gnral, tout octet non-imprimable est converti en son quivalent
octal sur trois caractres et prcd d'un antislash. La plupart des caractres imprimables sont affichs avec leur reprsentation
standard dans le jeu de caractres du client. Les octets de valeur dcimale 92 (antislash) sont doubls. Les dtails sont dans le Tableau 8.8, Octets chapps en sortie pour bytea .
Tableau 8.8. Octets chapps en sortie pour bytea
Valeur
l'octet
dcimale
de Description
92
antislash
0 31 et 127 255
32 126
octets affichables
\\
Rsultat en sortie
SELECT
\\
E'\\134'::bytea;
SELECT
\001
E'\\001'::bytea;
En fonction de l'interface utilise pour accder PostgreSQL, un travail supplmentaire d'chappement/de dschappement
des chanes bytea peut tre ncessaire. Il faut galement chapper les sauts de lignes et retours la ligne si l'interface les traduit
automatiquement, par exemple.
Nom
Taille de stockage
Description
Valeur minimale
Valeur maximale
Rsolution
294276 aprs JC
1 microseconde / 14
chiffres
294276 aprs JC
1 microseconde / 14
chiffres
date
date seule
d'heure)
5874897 aprs JC
1 jour
4 octets
24:00:00
1 microseconde / 14
chiffres
24:00:00-1459
1 microseconde / 14
chiffres
1 microseconde / 14
chiffres
Note
Le standard SQL impose que timestamp soit un quivalent de timestamp without time zone. PostgreSQL force ce
comportement partir de la version 7.3. Les versions antrieures traitaient ce type de donnes comme le type timestamp with time zone.) timestamptz est accept comme abrviation pour timestamp with time zone ; c'est une
89
Types de donnes
extension PostgreSQL.
time, timestamp, et interval acceptent une prcision optionnelle p, qui indique le nombre de dcimales pour les secondes. Il n'y a
pas, par dfaut, de limite explicite cette prcision. Les valeurs acceptes pour p s'tendent de 0 6 pour les types timestamp et
interval.
Note
Quand des valeurs de type timestamp sont stockes sur des entiers de 8 octets (ce qui est la valeur par dfaut actuelle), la prcision la microseconde prs est disponible sur tout le spectre des valeurs. Quand les timestamp sont
stocks en nombres virgule flottante double prcision la place (une option de compilation obsolte), la limite effective de prcision peut tre infrieure 6. Les valeurs de type timestamp sont stockes en secondes avant ou
aprs le 01/01/2000 minuit. Quand les valeurs timestamp sont implmentes avec des nombres virgule flottante,
la prcision la microseconde n'est obtenue que sur les quelques annes autour du 01/01/2000, et dcrot pour les
dates plus loignes. Notez qu'utiliser des types date virgule flottante permet d'avoir une plus grande tendue de
timestamp : de 4713 av. J.-C. 5874897 ap. J.-C., la diffrence de ce qui est crit plus haut.
La mme option de compilation dtermine aussi si les valeurs de type time et interval sont stockes en tant que
nombres virgule flottante ou entiers de 8 octets. Dans le cas de la virgule flottante, la prcision des valeurs de
type interval se dgradent avec leur accroissement.
Pour les types time, l'intervalle accept pour p s'tend de 0 6 pour les entiers sur 8 octets et de 0 10 pour les nombres virgule
flottante.
Le type interval a une option supplmentaire, qui permet de restreindre le jeu de champs stocks en crivant une de ces expressions :
YEAR
MONTH
DAY
HOUR
MINUTE
SECOND
YEAR TO MONTH
DAY TO HOUR
DAY TO MINUTE
DAY TO SECOND
HOUR TO MINUTE
HOUR TO SECOND
MINUTE TO SECOND
Notez que si champs et p sont tous les deux indiqus, champs doit inclure SECOND, puisque la prcision s'applique uniquement
aux secondes.
Le type time with time zone est dfini dans le standard SQL mais sa dfinition lui prte des proprits qui font douter de son utilit. Dans la plupart des cas, une combinaison de date, time, timestamp without time zone et timestamp with time zone devrait permettre de rsoudre toutes les fonctionnalits de date et heure ncessaires une application.
Les types abstime et reltime sont des types de prcision moindre, utiliss en interne. Il n'est pas recommand de les utiliser dans de
nouvelles applications car ils pourraient disparatre dans une prochaine version.
Types de donnes
o p, prcision optionnelle, est un entier correspondant au nombre de dcimales du champ secondes. La prcision peut tre prcise pour les types time, timestamp, et interval. Les valeurs admissibles sont mentionnes plus haut. Si aucune prcision n'est indique dans une dclaration de constante, celle de la valeur littrale est utilise.
8.5.1.1. Dates
Le Tableau 8.10, Saisie de date regroupe les formats de date possibles pour la saisie de valeurs de type date.
Tableau 8.10. Saisie de date
Exemple
Description
1999-01-08
January 8, 1999
1/8/1999
1/18/1999
01/02/03
2 janvier 2003 en mode MDY ; 1er fvrier 2003 en mode DMY ; 3 fvrier 2001 en mode YMD
1999-Jan-08
Jan-08-1999
08-Jan-1999
99-Jan-08
08-Jan-99
Jan-08-99
19990108
990108
1999.008
J2451187
January 8, 99 BC
8.5.1.2. Heures
Les types heure-du-jour sont time [ (p) ] without time zone et time [ (p) ] with time zone. time est quivalent time without time
zone.
Les saisies valides pour ces types sont constitues d'une heure suivie ventuellement d'un fuseau horaire (voir le Tableau 8.11,
Saisie d'heure et le Tableau 8.12, Saisie des fuseaux horaires ). Si un fuseau est prcis pour le type time without time zone,
il est ignor sans message d'erreur. Si une date est indique, elle est ignore sauf si un fuseau horaire impliquant une rgle de
changement d'heure (heure d't/heure d'hiver) est prcis, America/New_York par exemple. Dans ce cas, la date est ncessaire pour pouvoir dterminer la rgle de calcul de l'heure qui s'applique. Le dcalage appropri du fuseau horaire est enregistr
dans la valeur de time with time zone.
Tableau 8.11. Saisie d'heure
Exemple
Description
04:05:06.789
ISO 8601
04:05:06
ISO 8601
04:05
ISO 8601
040506
ISO 8601
04:05 AM
04:05 PM
04:05:06.789-8
ISO 8601
04:05:06-08:00
ISO 8601
04:05-08:00
ISO 8601
040506-08
ISO 8601
91
Types de donnes
Exemple
Description
04:05:06 PST
2003-04-12
fuseau horaire en nom complet
04:05:06
America/New_York
Exemple
Description
PST
-8:00
-800
-8
zulu
L'Section 8.5.3, Fuseaux horaires apporte des prcisions quant la faon d'indiquer les fuseaux horaires.
8.5.1.3. Horodatage
Les saisies valides sont constitues de la concatnation d'une date et d'une heure, ventuellement suivie d'un fuseau horaire et d'un
qualificatif AD (aprs Jsus Christ) ou BC (avant Jsus Christ). (AD/BC peut aussi apparatre avant le fuseau horaire mais ce n'est
pas l'ordre prfr.) Ainsi :
1999-01-08 04:05:06
et :
1999-01-08 04:05:06 -8:00
sont des valeurs valides, qui suivent le standard ISO 8601. Le format trs courant :
January 8 04:05:06 1999 PST
est galement support.
Le standard SQL diffrencie les liblls timestamp without time zone et timestamp with time zone par la prsence d'un symbole
+ ou d'un - et le dclage du fuseau horaire aprs l'indication du temps. De ce fait, d'aprs le standard,
TIMESTAMP '2004-10-19 10:23:54'
est du type timestamp without time zone alors que
TIMESTAMP '2004-10-19 10:23:54+02'
est du type timestamp with time zone. PostgreSQL n'examine jamais le contenu d'un libell avant de dterminer son type. Du
coup, il traite les deux ci-dessus comme des valeurs de type timestamp without time zone. Pour s'assurer qu'un littral est trait
comme une valeur de type timestamp with time zone, il faut prciser explicitement le bon type :
TIMESTAMP WITH TIME ZONE '2004-10-19 10:23:54+02'
Dans un libell de type timestamp without time zone, PostgreSQL ignore silencieusement toute indication de fuseau horaire.
C'est--dire que la valeur rsultante est drive des champs date/heure de la valeur saisie et n'est pas corrige par le fuseau horaire.
Pour timestamp with time zone, la valeur stocke en interne est toujours en UTC (Universal Coordinated Time ou Temps Universel Coordonn), aussi connu sous le nom de GMT (Greenwich Mean Time). Les valeurs saisies avec un fuseau horaire explicite
sont converties en UTC l'aide du dcalage appropri. Si aucun fuseau horaire n'est prcis, alors le systme considre que la date
est dans le fuseau horaire indiqu par le paramtre systme timezone, et la convertit en UTC en utilisant le dcalage de la zone
timezone.
Quand une valeur timestamp with time zone est affiche, elle est toujours convertie de l'UTC vers le fuseau horaire courant
(variable timezone), et affiche comme une heure locale. Pour voir l'heure dans un autre fuseau horaire, il faut, soit changer la
valeur de timezone, soit utiliser la construction AT TIME ZONE (voir la Section 9.9.3, AT TIME ZONE ).
92
Types de donnes
Les conversions entre timestamp without time zone et timestamp with time zone considrent normalement que la valeur timestamp without time zone utilise le fuseau horaire timezone. Un fuseau diffrent peut tre choisi en utilisant AT TIME ZONE.
Saisie
Types valides
epoch
date, timestamp
infinity
date, timestamp
-infinity
date, timestamp
now
today
date, timestamp
tomorrow
date, timestamp
yesterday
date, timestamp
allballs
time
Les fonctions suivantes, compatibles avec le standard SQL, peuvent aussi tre utilises pour obtenir l'heure courante pour le type
de donnes correspondant : CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, LOCALTIME, LOCALTIMESTAMP.
Les quatre derniers acceptent une indication optionnelle de prcision en dessous de la seconde (voir la Section 9.9.4, Date/Heure
courante ). Ce sont l des fonctions SQL qui ne sont pas reconnues comme chanes de saisie de donnes.
Spcification de style
Description
Exemple
ISO
1997-12-17 07:37:16-08
SQL
style traditionnel
POSTGRES
style original
German
style rgional
Dans les styles SQL et POSTGRES, les jours apparaissent avant le mois si l'ordre des champs DMY a t prcis, sinon les mois
apparaissent avant les jours (voir la Section 8.5.1, Saisie des dates et heures pour savoir comment ce paramtre affecte
l'interprtation des valeurs en entre). Le Tableau 8.15, Convention de prsentation des dates prsente un exemple.
Tableau 8.15. Convention de prsentation des dates
Ordre de saisie
Exemple d'affichage
SQL, DMY
jour/mois/anne
SQL, MDY
mois/jour/anne
Postgres, DMY
jour/mois/anne
93
Types de donnes
Les styles de date/heure peuvent tre slectionns l'aide de la commande SET datestyle, du paramtre datestyle du fichier de
configuration postgresql.conf ou par la variable d'environnement PGDATESTYLE sur le serveur ou le client. La fonction de
formatage to_char (voir Section 9.8, Fonctions de formatage des types de donnes ) permet de formater les affichages de
date/heure de manire plus flexible.
bien que le type date ne peut pas se voir associer un fuseau horaire, le type heure peut en avoir un. Les fuseaux horaires, dans
le monde rel, ne peuvent avoir de sens qu'associs une date et une heure, vu que l'cart peut varier avec l'heure d't ;
le fuseau horaire par dfaut est prcis comme un cart numrique constant avec l'UTC. Il n'est, de ce fait, pas possible de
s'adapter l'heure d't ou d'hiver lorsque l'on fait des calculs arithmtiques qui passent les limites de l'heure d't et de l'heure
d'hiver.
Pour viter ces difficults, il est recommand d'utiliser des types date/heure qui contiennent la fois une date et une heure lorsque
les fuseaux horaires sont utiliss. Il est galement prfrable de ne pas utiliser le type time with time zone. (Ce type est nanmoins
propos par PostgreSQL pour les applications existantes et pour assurer la compatibilit avec le standard SQL.) PostgreSQL
utilise le fuseau horaire local pour tous les types qui ne contiennent qu'une date ou une heure.
Toutes les dates et heures lies un fuseau horaire sont stockes en interne en UTC. Elles sont converties en heure locale dans le
fuseau indiqu par le paramtre de configuration timezone avant d'tre affich sur le client.
PostgreSQL permet d'indiquer les fuseaux horaires de trois faons diffrentes :
un nom complet de fuseau horaire, par exemple America/New_York. Les noms reconnus de fuseau horaire sont lists dans
la vue pg_timezone_names (voir Section 45.67, pg_timezone_names ). PostgreSQL utilise les donnes zoneinfo
pour cela, les mmes noms sont donc reconnus par de nombreux autres logiciels ;
une abrviation de fuseau horaire, par exemple PST. Une telle indication ne dfinit qu'un dcalage particulier partir d'UTC,
en contraste avec les noms complets de fuseau horaire qui peuvent aussi impliquer un ensemble de dates pour le changement
d'heure. Les abrviations reconnues sont listes dans la vue pg_timezone_abbrevs (voir Section 45.66,
pg_timezone_abbrevs ). Les paramtres de configuration timezone et log_timezone ne peuvent pas tre configurs l'aide
d'une abrviation de fuseau horaire, mais ces abrviations peuvent tre utilises dnas les saisies de date/heure et avec
l'oprateur AT TIME ZONE ;
une spcification POSIX de fuseau sous la forme STDdcalage ou STDdcalageDST avec STD une abrviation de fuseau et dcalage un dcalage numrique en nombre d'heures l'ouest d'UTC et DST une abrviation optionnelle de changement d'heure, interprter comme une heure avant le dcalage donn. Par exemple si EST5EDT n'est pas dj reconnu comme
fuseau horaire, il est accept et est fonctionnellement quivalent l'heure du fuseau de la cte est des USA. Si un nom de
changement d'heure est prsent, il est interprt selon les rgles rgissant les changements d'heure utilises dans l'entre posixrules de la base de donnes des fuseaux horaires, zoneinfo. Dans une installation PostgreSQL standard, posixrules est identique US/Eastern, pour que les spcifications POSIX des fuseaux horaires correspondent aux rgles de
changements d'heure aux tats-Unis. Ce comportement peut, au besoin, tre ajust en remplaant le fichier posixrules.
En rsum, il y a une diffrence entre les abrviations et les noms complets : les abrviations reprsentent toujours un dcalage
fixe par rapport UTC alors que la plupart des noms complets impliquent une rgle de changement d'heure et donc deux dcalages possibles.
La fonctionnalit des fuseaux horaires POSIX peut accepter silencieusement des saisies errones car il n'y a pas de vrification des
abrviations de fuseaux horaires. Par exemple, SET TIMEZONE TO FOOBAR0 fonctionne mais conduit le systme utiliser en
ralit une abrviation trs particulire d'UTC. Un autre problme conserver en tte est que, pour les noms des fuseaux horaires
POSIX, les dcalages positifs sont utiliss pour les emplacements situs l'ouest de Greenwich. Partout ailleurs, PostgreSQL
suit la convention ISO-8601 pour qui les dcalages positifs de fuseaux horaires concernent l'est de Greenwich.
Dans tous les cas, les noms des fuseaux horaires sont insensibles la casse. (C'est un changement par rapport aux versions de
PostgreSQL antrieures la 8.2 qui taient sensibles la casse dans certains cas et pas dans d'autres.)
94
Types de donnes
Ni les noms complets ni les abrviations ne sont cods en dur dans le serveur ; ils sont obtenus partir des fichiers de configuration stocks sous .../share/timezone/ et .../share/timezonesets/ du rpertoire d'installation (voir Section B.3,
Fichiers de configuration date/heure ).
Le paramtre de configuration timezone peut tre fix dans le fichier postgresql.conf ou par tout autre moyen standard dcrit dans le Chapitre 18, Configuration du serveur. Il existe aussi quelques manires spciales de le configurer :
si timezone n'est prcis ni dans postgresql.conf ni comme une option en ligne de commande du serveur, le serveur
tente d'utiliser la valeur de la variable d'environnement TZ comme fuseau horaire par dfaut. Si TZ n'est pas dfinie ou ne fait
pas partie des noms de fuseau horaire connus par PostgreSQL, le serveur tente de dterminer le fuseau horaire par dfaut du
systme d'exploitation en vrifiant le comportement de la fonction localtime() de la bibliothque C. Le fuseau horaire par
dfaut est slectionn comme la correspondance la plus proche parmi les fuseaux horaires connus par PostgreSQL ; (Ces
rgles sont aussi utilises pour choisir la valeur par dfaut de log_timezone, si elle n'est pas prcise.)
la commande SQL SET TIME ZONE configure le fuseau horaire pour une session. C'est une autre faon d'indiquer SET TIMEZONE TO avec une syntaxe plus compatible avec les spcifications SQL ;
la variable d'environnement PGTZ est utilise par les applications clientes fondes sur libpq pour envoyer une commande SET
TIME ZONE au serveur lors de la connexion.
Abrviation
Signification
Annes
Semaines
Jours
Heures
Secondes
95
Types de donnes
Exemple
Description
1-2
3 4:05:06
P1Y2M3DT4H5M6S
P0001-02-03T04:05:06
Types de donnes
positionn ISO.
La sortie du style postgres_verbose correspond la sortie des versions de PostgreSQL prcdant la 8.4, si le paramtre
datestyle tait positionn autre chose que ISO.
La sortie du style iso_8601 correspond au format avec designateurs dcrit dans la section 4.4.3.2 du standard ISO 8601.
Tableau 8.18. Exemples de styles d'affichage d'intervalles
Spcification de style
Intervalle anne-mois
Intervalle date-temps
Interval Mixte
sql_standard
1-2
3 4:05:06
-1-2 +3 -4:05:06
postgres
1 year 2 mons
3 days 04:05:06
postgres_verbose
@ 1 year 2 mons
iso_8601
P1Y2M
P3DT4H5M6S
P-1Y-2M3DT-4H-5M-6S
Nom
Taille du stockage
Description
boolean
1 octet
97
Types de donnes
8.7.2. Tri
L'ordre des valeurs dans un type enum correspond l'ordre dans lequel les valeurs sont cres lors de la dclaration du type. Tous
les oprateurs de comparaison et les fonctions d'agrgats relatives peuvent tre utiliss avec des types enum. Par exemple :
INSERT INTO personne VALUES ('Larry', 'triste');
INSERT INTO personne VALUES ('Curly', 'heureux');
SELECT * FROM personne WHERE humeur_actuelle > 'triste';
nom
| humeur_actuelle
-------+----------------Moe
| happy
Curly | ok
(2 rows)
SELECT * FROM personne WHERE humeur_actuelle > 'triste' ORDER BY humeur_actuelle;
nom
| humeur_actuelle
-------+-------------Curly | ok
Moe
| happy
(2 rows)
SELECT nom
FROM personne
WHERE humeur_actuelle = (SELECT MIN(humeur_actuelle) FROM personne);
98
Types de donnes
nom
------Larry
(1 row)
Nom
Taille de stockage
Reprsentation
Description
point
16 octets
Point du plan
(x,y)
line
32 octets
lseg
32 octets
((x1,y1),(x2,y2))
box
32 octets
Bote rectangulaire
((x1,y1),(x2,y2))
path
16+16n octets
path
16+16n octets
Chemin ouvert
[(x1,y1),...]
polygon
40+16n octets
((x1,y1),...)
circle
24 octets
Cercle
Types de donnes
Un large ensemble de fonctions et d'oprateurs permettent d'effectuer diffrentes oprations gomtriques, comme l'chelonnage,
la translation, la rotation, la dtermination des intersections. Elles sont expliques dans la Section 9.11, Fonctions et oprateurs
gomtriques .
8.8.1. Points
Les points sont les briques fondamentales des types gomtriques. Les valeurs de type point sont indiques l'aide d'une des syntaxes suivantes :
( x , y )
x , y
o x et y sont les coordonnes respectives sous forme de nombre virgule flottante.
Les points sont affichs en utilisant la premire syntaxe.
,
,
,
,
y1 ) , ( x2
y1 ) , ( x2
y1 ) , ( x2
y1
,
x2
,
,
,
,
y2 ) ]
y2 ) )
y2 )
y2
8.8.3. Botes
Les botes (rectangles) sont reprsentes par les paires de points des coins opposs de la bote selon une des syntaxes suivantes :
( ( x1 , y1 ) , ( x2 , y2 ) )
( x1 , y1 ) , ( x2 , y2 )
x1 , y1
,
x2 , y2
o (x1,y1) et (x2,y2) sont les coins opposs du rectangle.
Les rectangles sont affichs selon la deuxime syntaxe.
Les deux coins opposs peuvent tre fournis en entre mais les valeurs seront r-ordonns pour stocker les coins en haut droite et
en bas gauche, dans cet ordre.
8.8.4. Chemins
Les chemins ( type path ) sont reprsents par des listes de points connects. Ils peuvent tre ouverts, si le premier et le dernier
point ne sont pas considrs connects, ou ferms, si le premier et le dernier point sont considrs connects.
Les valeurs de type path sont saisies selon une des syntaxes suivantes :
[ ( x1
( ( x1
( x1
( x1
x1
,
,
,
,
,
y1 ) , ... , ( xn , yn
y1 ) , ... , ( xn , yn
y1 ) , ... , ( xn , yn
y1
, ... ,
xn , yn
y1
, ... ,
xn , yn
) ]
) )
)
)
o les points sont les extrmits des segments de droite qui forment le chemin. Les crochets ([]) indiquent un chemin ouvert alors
que les parenthses (()) indiquent un chemin ferm. Quand les parenthses externes sont omises, comme dans les syntaxes trois
cinq, un chemin ferm est utilis.
Les chemins sont affichs selon la premire ou la seconde syntaxe approprie.
8.8.5. Polygones
Les polygones ( type polygon) sont reprsents par des listes de points (les vertex du polygone). Ils sont trs similaires des chemins ferms, mais ils sont stocks diffremment et disposent de leurs propres routines de manipulation.
Les valeurs de type polygon sont saisies selon une des syntaxes suivantes :
( ( x1 , y1 ) , ... , ( xn , yn ) )
100
Types de donnes
( x1 , y1 ) , ... , ( xn , yn )
( x1 , y1
, ... ,
xn , yn )
x1 , y1
, ... ,
xn , yn
o les points sont les extrmits des segments de droite qui forment les limites du polygone.
Les polygones sont affichs selon la premire syntaxe.
8.8.6. Cercles
Les cercles (type circle) sont reprsents par un point central et un rayon. Les valeurs de type circle sont saisies selon une des syntaxes suivantes :
< ( x
( ( x
( x
x
,
,
,
,
y ) , r >
y ) , r )
y ) , r
y
, r
Nom
Taille de stockage
Description
cidr
7 ou 19 octets
inet
7 ou 19 octets
macaddr
6 octets
adresses MAC
Lors du tri de donnes de types inet ou cidr, les adresses IPv4 apparaissent toujours avant les adresses IPv6, y compris les adresses
IPv4 encapsules, comme ::10.2.3.4 ou ::ffff:10.4.3.2.
8.9.1. inet
Le type inet stocke une adresse d'hte IPv4 ou IPv6 et, optionnellement, son sous-rseau, le tout dans un seul champ. Le sous-rseau est reprsente par le nombre de bits de l'adresse hte constituent l'adresse rseau (le masque rseau ). Si le masque rseau
est 32 et l'adresse de type IPv4, alors la valeur n'indique pas un sous-rseau, juste un hte. En IPv6, la longueur de l'adresse est de
128 bits, si bien que 128 bits dfinissent une adresse rseau unique. Pour n'accepter que des adresses rseau, il est prfrable
d'utiliser le type cidr plutt que le type inet.
Le format de saisie pour ce type est adresse/y o adresse est une adresse IPv4 ou IPv6 et y est le nombre de bits du masque
rseau. Si y est omis, alors le masque vaut 32 pour IPv4 et 128 pour IPv6, et la valeur reprsente un hte unique. l'affichage, la
portion /y est supprime si le masque rseau indique un hte unique.
8.9.2. cidr
Le type cidr stocke une dfinition de rseau IPv4 ou IPv6. La saisie et l'affichage suivent les conventions Classless Internet Domain Routing. Le format de saisie d'un rseau est address/y o address est le rseau reprsent sous forme d'une adresse
IPv4 ou IPv6 et y est le nombre de bits du masque rseau. Si y est omis, il calcul en utilisant les rgles de l'ancien systme de
classes d'adresses, ceci prs qu'il est au moins assez grand pour inclure tous les octets saisis. Saisir une adresse rseau avec des
bits positionns droite du masque indiqu est une erreur.
Tableau 8.22, Exemples de saisie de types cidr prsente quelques exemples.
Tableau 8.22. Exemples de saisie de types cidr
Saisie cidr
Affichage cidr
abbrev(cidr)
192.168.100.128/25
192.168.100.128/25
192.168.100.128/25
101
Types de donnes
Saisie cidr
Affichage cidr
abbrev(cidr)
192.168/24
192.168.0.0/24
192.168.0/24
192.168/25
192.168.0.0/25
192.168.0.0/25
192.168.1
192.168.1.0/24
192.168.1/24
192.168
192.168.0.0/24
192.168.0/24
128.1
128.1.0.0/16
128.1/16
128
128.0.0.0/16
128.0/16
128.1.2
128.1.2.0/24
128.1.2/24
10.1.2
10.1.2.0/24
10.1.2/24
10.1
10.1.0.0/16
10.1/16
10
10.0.0.0/8
10/8
10.1.2.3/32
10.1.2.3/32
10.1.2.3/32
2001:4f8:3:ba::/64
2001:4f8:3:ba::/64
2001:4f8:3:ba::/64
2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128
2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128
2001:4f8:3:ba:2e0:81ff:fe22:d1f1
::ffff:1.2.3.0/120
::ffff:1.2.3.0/120
::ffff:1.2.3/120
::ffff:1.2.3.0/128
::ffff:1.2.3.0/128
::ffff:1.2.3.0/128
Astuce
Les fonctions host, text et abbrev permettent de modifier le format d'affichage des valeurs inet et cidr.
8.9.4. macaddr
Le type macaddr stocke des adresses MAC, connues par exemple partir des adresses de cartes rseau Ethernet (mais les adresses
MAC sont aussi utilises dans d'autres cas). Les saisies sont acceptes dans les formats suivants :
'08:00:2b:01:02:03'
'08-00-2b-01-02-03'
'08002b:010203'
'08002b-010203'
'0800.2b01.0203'
'08002b010203'
Ces exemples indiquent tous la mme adresse. Les majuscules et les minuscules sont acceptes pour les chiffres a f. L'affichage
se fait toujours selon le premier des formats ci-dessus.
Le standard IEEE 802-2001 spcifie la seconde forme affiche (avec les tirets) comme forme canonique pour les adresses MAC,
et que la premire forme (avec les :) est la notation bits retourns, ce qui donne l'quivalence 08-00-2b-01-02-03 =
01:00:4D:08:04:0C. Cette convention est largement ignore aujourd'hui, et n'a de sens que pour des protocoles rseaux obsoltes
(comme Token Ring). PostgreSQL ne tient pas compte des bits retourns, et tous les formats accepts utilisent l'ordre canonique
LSB.
Les quatre derniers formats ne font partie d'aucun standard.
Types de donnes
Note
Lors du transtypage explicite (cast) d'une chane de bits en champ de type bit(n), la chane obtenue est complte
avec des zros ou bien tronque pour obtenir une taille de n bits exactement, sans que cela produise une erreur. De
la mme faon, si une chane de bits est explicitement transtype en un champ de type bit varying(n), elle est tronque si sa longueur dpasse n bits.
Voir la Section 4.1.2.5, Constantes de chanes de bits pour plus d'information sur la syntaxe des constantes en chane de bits.
Les oprateurs logiques et les fonctions de manipulation de chanes sont dcrits dans la Section 9.6, Fonctions et oprateurs sur
les chanes de bits .
Exemple 8.3. Utiliser les types de chanes de bits
8.11.1. tsvector
Une valeur tsvector est une liste trie de lexemes distincts, qui sont des mots qui ont t normaliss pour fusionner diffrentes variantes du mme mot apparaissent (voir Chapitre 12, Recherche plein texte pour plus de dtails). Trier et liminer les duplicats se
font automatiquement lors des entres, comme indiqu dans cet exemple :
SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector;
tsvector
---------------------------------------------------'a' 'and' 'ate' 'cat' 'fat' 'mat' 'on' 'rat' 'sat'
Pour reprsenter des lexemes contenant des espaces blancs ou des signes de ponctuation, entourez-les avec des guillemets
simples :
SELECT $$the lexeme '
' contains spaces$$::tsvector;
tsvector
------------------------------------------'
' 'contains' 'lexeme' 'spaces' 'the'
(Nous utilisons les valeurs litrales entre guillemets simples dans cet exemple et dans le prochain pour viter une confusion en
ayant doubler les guillemets l'intrieur des valeurs litrales.) Les guillemets imbriqus et les antislashs doivent tre doubls :
SELECT $$the lexeme 'Joe''s' contains a quote$$::tsvector;
tsvector
103
Types de donnes
8.11.2. tsquery
Une valeur tsquery enregistre les lexemes qui doivent tre recherchs et les combine en utilisant les oprateurs boolens & (AND),
| (OR) et ! (NOT). Les parenthses peuvent tre utilises pour forcer le regroupement des oprateurs :
SELECT 'fat & rat'::tsquery;
tsquery
--------------'fat' & 'rat'
SELECT 'fat & (rat | cat)'::tsquery;
tsquery
--------------------------'fat' & ( 'rat' | 'cat' )
SELECT 'fat & rat & ! cat'::tsquery;
tsquery
-----------------------'fat' & 'rat' & !'cat'
En l'absence de ces parenthses, ! (NOT) est li plus fortement, et & (AND) est li plus fortement que | (OR).
En option, les lexemes dans une tsquery peuvent tre labeliss avec une lettre de poids ou plus, ce qui les restreint une corres104
Types de donnes
Types de donnes
{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}
L'affichage est toujours dans la forme standard.
Pour gnrer des UUID, le module uuid-ossp fournit des fonctions qui implmentent les algorithmes standards. Sinon, les UUID
peuvent tre gnrs par des applications clientes ou par d'autres bibliothques appeles par une fonction serveur.
Note
Avec le paramtrage par dfaut des options XML, vous ne pouvez pas convertir directement des chanes de caractres dans le type xml si elles contiennent une dclaration du type de document car la dfinition du fragment de
contenu XML ne les accepte pas. Si vous avez besoin de changer cela, soit vous utilisez XMLPARSE soit vous
106
Types de donnes
Attention
Certaines fonctions relatives XML pourraient ne pas fonctionner du tout sur des donnes non ASCII quand
l'encodage du serveur n'est pas UTF-8. C'est un problme connu pour xpath() en particulier.
8.14. Tableaux
PostgreSQL permet de dfinir des colonnes de table comme des tableaux multidimensionnels de longueur variable. Il est possible de crer des tableaux de n'importe quel type utilisateur : de base, compos, enum. Toutefois, les tableaux de domaines ne
sont pas encore supports.
(
text,
integer[],
text[][]
107
Types de donnes
Comme indiqu ci-dessus, un type de donnes tableau est nomm en ajoutant des crochets ([]) au type de donnes des lments
du tableau. La commande ci-dessus cre une table nomme sal_emp avec une colonne de type text (nom), un tableau une dimension de type integer (paye_par_semaine), reprsentant le salaire d'un employ par semaine et un tableau deux dimensions
de type text (planning), reprsentant le planning hebdomadaire de l'employ.
La syntaxe de CREATE TABLE permet de prciser la taille exacte des tableaux, par exemple :
CREATE TABLE tictactoe (
carres
integer[3][3]
);
Nanmoins, l'implantation actuelle ignore toute limite fournie pour la taille du tableau, c'est--dire que le comportement est identique celui des tableaux dont la longueur n'est pas prcise.
De plus, l'implantation actuelle n'oblige pas non plus dclarer le nombre de dimensions. Les tableaux d'un type d'lment particulier sont tous considrs comme tant du mme type, quels que soient leur taille ou le nombre de dimensions. Dclarer la taille
du tableau ou le nombre de dimensions dans CREATE TABLE n'a qu'un but documentaire. Le comportement de l'application
n'en est pas affect.
Une autre syntaxe, conforme au standard SQL via l'utilisation du mot cl ARRAY, peut tre employe pour les tableaux une dimension. paye_par_semaine peut tre dfini ainsi :
paye_par_semaine
integer ARRAY[4],
integer ARRAY,
Nanmoins, comme indiqu prcdemment, PostgreSQL n'impose aucune restriction sur la taille dans tous les cas.
planning
108
Types de donnes
-------+---------------------------+-------------------Bill
| {10000,10000,10000,10000} | {{rendez-vous,repas},{entrainement,prsentation}}
Carol | {20000,25000,25000,25000} |
{{petit-djeuner,consultation},{rendez-vous,repas}}
(2 rows)
Les tableaux multi-dimensionnels doivent avoir des chelles correspondantes pour chaque dimension. Une diffrence cause la leve d'une erreur. Par exemple :
INSERT INTO sal_emp
VALUES ('Bill',
'{10000, 10000, 10000, 10000}',
'{{"rendez-vous", "repas"}, {"rendez-vous"}}');
ERROR: multidimensional arrays must have array expressions with matching dimensions
La syntaxe du constructeur ARRAY peut aussi tre utilise :
INSERT INTO sal_emp
VALUES ('Bill',
ARRAY[10000, 10000, 10000, 10000],
ARRAY[['rendez-vous', 'repas'], ['entrainement','prsentation']]);
INSERT INTO sal_emp
VALUES ('Carol',
ARRAY[20000, 25000, 25000, 25000],
ARRAY[['petit-djeuner', 'consultation'], ['rendez-vous', 'repas']]);
Les lments du tableau sont des constantes SQL ordinaires ou des expressions ; par exemple, les chanes de caractres littrales
sont encadres par des guillemets simples au lieu de guillemets doubles comme cela est le cas dans un tableau littral. La syntaxe
du constructeur ARRAY est discute plus en profondeur dans la Section 4.2.12, Constructeurs de tableaux .
Types de donnes
nombre indiqu. Par exemple, [2] est traite comme [1:2], comme le montre cet exemple :
SELECT planning[1:2][2] FROM sal_emp WHERE nom = 'Bill';
planning
--------------------------{{rendez-vous,repas},{entrainement,prsentation}}
(1 row)
Pour viter la confusion avec le cas sans indice, il est meilleur d'utiliser la syntaxe avec indice pour toutes les dimensions,
c'est--dire [1:2][1:1] et non pas [2][1:1].
Une expression indice de tableau retourne NULL si le tableau ou une des expressions est NULL. De plus, NULL est renvoy si
un indice se trouve en dehors de la plage du tableau (ce cas n'amne pas d'erreur). Par exemple, si planning a les dimensions
[1:3][1:2], faire rfrence planning[3][3] donne un rsultat NULL. De la mme faon, une rfrence sur un tableau
avec une valeur d'indices incorrecte retourne une valeur NULL plutt qu'une erreur.
Une expression de dcoupage d'un tableau est aussi NULL si, soit le tableau, soit une des expressions indices est NULL. Nanmoins, dans certains cas particuliers comme la slection d'une partie d'un tableau compltement en dehors de la plage de ce dernier, l'expression de cette partie est un tableau vide (zro dimension) et non pas un tableau NULL. (Ceci ne correspond pas au
comportement sans indice, et est fait pour des raisons historiques.) Si la partie demande surcharge partiellement les limites du tableau, alors elle est rduite silencieusement la partie surcharge au lieu de renvoyer NULL.
Les dimensions actuelles de toute valeur de type tableau sont disponibles avec la fonction array_dims :
SELECT array_dims(planning) FROM sal_emp WHERE nom = 'Carol';
array_dims
-----------[1:2][1:2]
(1 row)
array_dims donne un rsultat de type text, ce qui est pratique lire mais peut s'avrer plus difficile interprter par les programmes. Les dimensions sont aussi rcuprables avec array_upper et array_lower, qui renvoient respectivement la limite
haute et et la limite basse du tableau prcis :
SELECT array_upper(planning, 1) FROM sal_emp WHERE nom = 'Carol';
array_upper
------------2
(1 row)
array_length renverra la longueur de la dimension indique pour le tableau :
SELECT array_length(planning, 1) FROM sal_emp WHERE nom = 'Carol';
array_length
-------------2
(1 row)
Types de donnes
111
Types de donnes
Un tableau peut aussi tre construit en utilisant les fonctions array_prepend, array_append ou array_cat. Les deux
premires ne supportent que les tableaux une dimension alors que array_cat supporte les tableaux multidimensionnels.
L'oprateur de concatnation vu plus haut est prfrable l'utilisation directe de ces fonctions. En fait, les fonctions existent principalement pour l'implantation de l'oprateur de concatnation. Nanmoins, elles peuvent tre directement utiles dans la cration
d'agrgats utilisateur. Quelques exemples :
SELECT array_prepend(1, ARRAY[2,3]);
array_prepend
--------------{1,2,3}
(1 row)
SELECT array_append(ARRAY[1,2], 3);
array_append
-------------{1,2,3}
(1 row)
SELECT array_cat(ARRAY[1,2], ARRAY[3,4]);
array_cat
--------------{1,2,3,4}
(1 row)
SELECT array_cat(ARRAY[[1,2],[3,4]], ARRAY[5,6]);
array_cat
--------------------{{1,2},{3,4},{5,6}}
(1 row)
SELECT array_cat(ARRAY[5,6], ARRAY[[1,2],[3,4]]);
array_cat
--------------------{{5,6},{1,2},{3,4}}
=
=
=
=
10000 OR
10000 OR
10000 OR
10000;
Ceci devient toutefois rapidement fastidieux pour les gros tableaux et n'est pas trs utile si la taille du tableau n'est pas connue.
Une autre mthode est dcrite dans la Section 9.21, Comparaisons de lignes et de tableaux . La requte ci-dessus est remplaable par :
SELECT * FROM sal_emp WHERE 10000 = ANY (paye_par_semaine);
De la mme faon, on trouve les lignes o le tableau n'a que des valeurs gales 10000 avec :
SELECT * FROM sal_emp WHERE 10000 = ALL (paye_par_semaine);
Sinon, la fonction generate_subscripts peut tre utilise. Par exemple :
SELECT * FROM
(SELECT paye_par_semaine,
generate_subscripts(paye_par_semaine, 1) AS s
FROM sal_emp) AS foo
WHERE paye_par_semaine[s] = 10000;
Cette fonction est dcrite dans Tableau 9.46, Fonctions de gnration d'indices .
Astuce
Les tableaux ne sont pas des ensembles ; rechercher des lments spcifiques dans un tableau peut tre un signe
112
Types de donnes
d'une mauvaise conception de la base de donnes. On utilise plutt une table spare avec une ligne pour chaque
lment faisant parti du tableau. Cela simplifie la recherche et fonctionne mieux dans le cas d'un grand nombre
d'lments.
Note
Toute ce qui est crit dans une commande SQL est d'abord interprt en tant que chane littrale puis en tant que tableau. Ceci double le nombre d'antislash ncessaire. Par exemple, pour insrer une valeur de tableau de type text
contenant un antislash et un guillemet double, il faut crire :
INSERT ... VALUES (E'{"\\\\","\\""}');
Le processeur de la chane d'chappement supprime un niveau d'antislash, donc l'analyseur de tableau reoit
{"\\","\""}. En consquence, les chanes remplissant l'entre du type de donnes text deviennent respective113
Types de donnes
ment \ et ". (Si la routine d'entre du type de donnes utilis traite aussi les antislash de manire spciale, bytea
par exemple, il peut tre ncessaire d'avoir jusqu' huit antislash dans la commande pour en obtenir un dans
l'lment stock.) Les guillemets dollar (voir Section 4.1.2.4, Constantes de chanes avec guillemet dollar )
peuvent tre utiliss pour viter de doubler les antislash.
Astuce
La syntaxe du constructeur ARRAY (voir Section 4.2.12, Constructeurs de tableaux ) est souvent plus facile
utiliser que la syntaxe de tableau littral lors de l'criture des valeurs du tableau en commandes SQL. Avec ARRAY,
les valeurs de l'lment individuel sont crites comme elles le seraient si elles ne faisaient pas partie d'un tableau.
Types de donnes
Pour crire une valeur composite comme une constante littrale, englobez les valeurs du champ dans des parenthses et sparezles par des virgules. Vous pouvez placer des guillemets doubles autour de chaque valeur de champ et vous devez le faire si elle
contient des virgules ou des parenthses (plus de dtails ci-dessous). Donc, le format gnral d'une constante composite est le suivant :
'( val1 , val2 , ... )'
Voici un exemple :
'("fuzzy dice",42,1.99)'
qui serait une valeur valide du type element_inventaire dfini ci-dessus. Pour rendre un champ NULL, n'crivez aucun caractre dans sa position dans la liste. Par exemple, cette constante spcifie un troisime champ NULL :
'("fuzzy dice",42,)'
Si vous voulez un champ vide au lieu d'une valeur NULL, saisissez deux guillemets :
'("",42,)'
Ici, le premier champ est une chane vide non NULL alors que le troisime est NULL.
(Ces constantes sont rellement seulement un cas spcial de constantes gnriques de type discutes dans la Section 4.1.2.7,
Constantes d'autres types . La constante est initialement traite comme une chane et passe la routine de conversion de
l'entre de type composite. Une spcification explicite de type pourrait tre ncessaire.)
La syntaxe d'expression ROW pourrait aussi tre utilise pour construire des valeurs composites. Dans la plupart des cas, ceci est
considrablement plus simple utiliser que la syntaxe de chane littrale car vous n'avez pas vous inquiter des multiples
couches de guillemets. Nous avons dj utilis cette mthode ci-dessus :
ROW('fuzzy dice', 42, 1.99)
ROW('', 42, NULL)
Le mot cl ROW est optionnel si vous avez plus d'un champ dans l'expression, donc ceci peut tre simplifi avec
('fuzzy dice', 42, 1.99)
('', 42, NULL)
La syntaxe de l'expression ROW est discute avec plus de dtails dans la Section 4.2.13, Constructeurs de lignes .
Types de donnes
42)'
l'espace blanc sera ignor si le type du champ est un entier, mais pas s'il s'agit d'un champ de type texte.
Comme indiqu prcdemment, lors de l'criture d'une valeur composite, vous pouvez utiliser des guillemets doubles autour de
chaque valeur de champ individuel. Vous devez le faire si la valeur du champ pourrait sinon gner l'analyseur de la valeur du
champ composite. En particulier, les champs contenant des parenthses, des virgules, des guillemets doubles ou des antislashs
doivent tre entre guillemets doubles. Pour placer un guillemet double ou un antislash dans la valeur d'un champ composite entre
guillemets, faites-le prcder d'un antislash. (De plus, une paire de guillemets doubles l'intrieur d'une valeur de champ guillemets doubles est pris pour reprsenter un caractre guillemet double, en analogie aux rgles des guillemets simples dans les
chanes SQL littrales.) Autrement, vous pouvez viter les guillemets et utiliser l'chappement par antislash pour protger tous les
caractres de donnes qui auraient t pris pour une syntaxe composite.
Une valeur de champ composite vide (aucun caractre entre les virgules ou parenthses) reprsente une valeur NULL. Pour crire
une valeur qui est une chane vide plutt qu'une valeur NULL, crivez "".
La routine de sortie composite placera des guillemets doubles autour des valeurs de champs s'ils sont des chanes vides ou s'ils
contiennent des parenthses, virgules, guillemets doubles, antislash ou espaces blancs. (Faire ainsi pour les espaces blancs n'est
pas essentiel mais aide la lecture.) Les guillemets doubles et antislashs dans les valeurs des champs seront doubls.
Note
Rappelez-vous que ce que vous allez saisir dans une commande SQL sera tout d'abord interprt comme une chane
littrale, puis comme un composite. Ceci double le nombre d'antislash dont vous avez besoin (en supposant que la
syntaxe d'chappement des chanes est utilise). Par exemple, pour insrer un champ text contenant un guillemet
double et un antislash dans une valeur composite, vous devez crire :
INSERT ... VALUES (E'("\\"\\\\")');
Le processeur des chanes littrales supprime un niveau d'antislash de faon ce qui arrive l'analyseur de valeurs
composites ressemble ("\"\\"). son tour, la chane remplie par la routine d'entre du type de donnes text
devient "\. (Si nous tions en train de travailler avec un type de donnes dont la routine d'entre traite aussi les antislashs spcialement, bytea par exemple, nous pourrions avoir besoin d'au plus huit antislashs dans la commande
pour obtenir un antislash dans le champ composite stock.) Le guillemet dollar (voir Section 4.1.2.4, Constantes
de chanes avec guillemet dollar ) pourrait tre utilis pour viter le besoin des antislashs doubls.
Astuce
La syntaxe du constructeur ROW est habituellement plus simple utiliser que la syntaxe du littrale composite lors
de l'criture de valeurs composites dans des commandes SQL. Dans ROW, les valeurs individuelles d'un champ sont
116
Types de donnes
Nom
Rfrence
Description
Exemple
oid
tous
564182
regproc
pg_proc
nom de fonction
sum
regprocedure
pg_proc
sum(int4)
regoper
pg_operator
nom d'oprateur
regoperator
pg_operator
*(integer,integer)
(NONE,integer)
regclass
pg_class
nom de relation
pg_type
regtype
pg_type
integer
regconfig
pg_ts_config
regdictionary
pg_ts_dict
ou
simple
Tous les types alias d'OID acceptent des noms qualifis par le schma, et affichent des noms prfixs par un schma si l'objet ne
peut tre trouv dans le chemin de recherche courant sans tre qualifi. Les types alias regproc et regoper n'acceptent que des
noms uniques en entre (sans surcharge), si bien qu'ils sont d'un usage limit ; dans la plupart des cas, regprocedure et regoperator
sont plus appropris. Pour regoperator, les oprateurs unaires sont identifis en crivant NONE pour les oprandes non utiliss.
Une proprit supplmentaire des types alias d'OID est la cration de dpendances. Si une constante d'un de ces types apparat
dans une expression stocke (telle que l'expression par dfaut d'une colonne ou une vue), elle cre une dpendance sur l'objet rfrenc. Par exemple, si une colonne a une expression par dfaut nextval('ma_seq'::regclass), PostgreSQL comprend
que l'expression par dfaut dpend de la squence ma_seq ; le systme ne permet alors pas la suppression de la squence si
l'expression par dfaut n'est pas elle-mme supprime au pralable.
Un autre type d'identifiant utilis par le systme est xid, ou identifiant de transaction (abrge xact). C'est le type de donnes des
colonnes systme xmin et xmax. Les identifiants de transactions sont stocks sur 32 bits.
117
Types de donnes
Un troisime type d'identifiant utilis par le systme est cid, ou identifiant de commande. C'est le type de donnes des colonnes
systmes cmin et cmax. Les identifiants de commandes sont aussi stocks sur 32 bits.
Le dernier type d'identifiant utilis par le systme est tid, ou identifiant de ligne (tuple). C'est le type de donnes des colonnes systme ctid. Un identifiant de tuple est une paire (numro de bloc, index de tuple dans le bloc) qui identifie l'emplacement physique de la ligne dans sa table.
Les colonnes systmes sont expliques plus en dtail dans la Section 5.4, Colonnes systme .
8.17. Pseudo-Types
Le systme de types de PostgreSQL contient un certain nombre de types usage spcial qui sont collectivement appels des
pseudo-types. Un pseudo-type ne peut tre utilis comme type d'une colonne de table, mais peut l'tre pour dclarer un argument
de fonction ou un type de rsultat. Tous les pseudo-types disponibles sont utiles dans des situations o une fonction ne se contente
pas d'accepter et retourner des valeurs d'un type de donnes SQL particulier. Le Tableau 8.24, Pseudo-Types liste les diffrents
pseudo-types.
Tableau 8.24. Pseudo-Types
Nom
Description
any
Indique qu'une fonction accepte tout type de donnes, quel qu'il soit.
anyarray
Indique qu'une fonction accepte tout type tableau (voir la Section 35.2.5, Types et fonctions
polymorphes ).
anyelement
Indique qu'une fonction accepte tout type de donnes (voir la Section 35.2.5, Types et fonctions polymorphes ).
anyenum
Indique que la fonction accepte tout type de donnes enum (voir Section 35.2.5, Types et fonctions polymorphes et Section 8.7, Types numration ).
anynonarray
Indique que la fonction accepte tout type de donnes non-array (voir Section 35.2.5, Types et fonctions polymorphes ).
cstring
Indique qu'une fonction accepte ou retourne une chane de caractres C (termine par un NULL).
internal
Indique qu'une fonction accepte ou retourne un type de donnes interne du serveur de bases de donnes.
language_handler Une fonction d'appel de langage procdural est dclare retourner un language_handler.
fdw_handler
Une fonction de gestion pour le wrapper de donnes distantes est dclare retourner un fdw_handler.
record
trigger
void
opaque
Un type de donnes obsolte qui servait prcdemment tous les usages cits ci-dessus.
Les fonctions codes en C (incluses ou charges dynamiquement) peuvent tre dclares comme acceptant ou retournant tout
pseudo-type. Il est de la responsabilit de l'auteur de la fonction de s'assurer du bon comportement de la fonction lorsqu'un pseudo-type est utilis comme type d'argument.
Les fonctions codes en langage procdural ne peuvent utiliser les pseudo-types que dans les limites imposes par l'implantation
du langage. ce jour, tous les langages procduraux interdisent l'usage d'un pseudo-type comme argument et n'autorisent que
void et record comme type de retours (plus trigger lorsque la fonction est utilise comme dclencheur). Certains supportent galement les fonctions polymorphes qui utilisent les types anyarray, anyelement, anyenum, anynonarray.
Le pseudo-type internal sert dclarer des fonctions qui ne sont appeles que par le systme en interne, et non pas directement par
une requte SQL. Si une fonction accepte au minimum un argument de type internal, alors elle ne peut tre appele depuis SQL.
Pour prserver la scurit du type de cette restriction, il est important de suivre la rgle de codage suivante : ne jamais crer de
fonction qui retourne un internal si elle n'accepte pas au moins un argument de type internal.
118
a AND b
a OR b
TRUE
TRUE
TRUE
TRUE
TRUE
FALSE
FALSE
TRUE
TRUE
NULL
NULL
TRUE
FALSE
FALSE
FALSE
FALSE
FALSE
NULL
FALSE
NULL
NULL
NULL
NULL
NULL
NOT a
TRUE
FALSE
FALSE
TRUE
NULL
NULL
Les oprateurs AND et OR sont commutatifs, la permutation des oprandes gauche et droit n'affecte pas le rsultat. Voir la Section 4.2.14, Rgles d'valuation des expressions pour plus d'informations sur l'ordre d'valuation des sous-expressions.
Oprateur
Description
<
infrieur
>
suprieur
<=
infrieur ou gal
>=
suprieur ou gal
gal
<> ou !=
diffrent de
119
Fonctions et oprateurs
Note
L'oprateur != est converti en <> au moment de l'analyse. Il n'est pas possible d'implanter des oprateurs != et <>
ralisant des oprations diffrentes.
Les oprateurs de comparaison sont disponibles pour tous les types de donnes pour lesquels cela a du sens. Tous les oprateurs de
comparaison sont des oprateurs binaires renvoyant des valeurs du type boolean ; des expressions comme 1 < 2 < 3 ne sont
pas valides (car il n'existe pas d'oprateur < de comparaison d'une valeur boolenne avec 3).
En plus des oprateurs de comparaison, on trouve la construction spciale BETWEEN.
a BETWEEN x AND y
est quivalent
a >= x AND a <= y
Notez que BETWEEN traite le point final comme inclut dans l'chelle des valeurs. NOT BETWEEN fait la comparaison inverse :
a NOT BETWEEN x AND y
est quivalent
a < x OR a > y
BETWEEN SYMMETRIC est identique BETWEEN sauf qu'il n'est pas ncessaire que l'argument gauche de AND soit plus petit
ou gal l'argument droite. SI ce n'est pas le cas, ces deux arguments sont automatiquement inverss, pour qu'une chelle non
vide soit toujours suppose.
Pour vrifier si une valeur est NULL ou non, on utilise les constructions
expression IS NULL
expression IS NOT NULL
ou la construction quivalente, non standard,
expression ISNULL
expression NOTNULL
On ne peut pas crire expression = NULL parce que NULL n'est pas gal NULL. (La valeur NULL reprsente une valeur inconnue et il est impossible de dire si deux valeurs inconnues sont gales.) Ce comportement est conforme au standard SQL.
Astuce
Il se peut que des applications s'attendent voir expression = NULL value vrai (true) si expression
s'value comme la valeur NULL. Il est chaudement recommand que ces applications soient modifies pour se
conformer au standard SQL. Nanmoins, si cela n'est pas possible, le paramtre de configuration transform_null_equals peut tre utilis. S'il est activ, PostgreSQL convertit les clauses x = NULL en x IS NULL.
Note
Si l'expression est une valeur de ligne, alors IS NULL est vrai quand l'expression mme de la ligne est NULL
ou quand tous les champs de la ligne sont NULL alors que IS NOT NULL est vrai quand l'expression mme de la
ligne est non NULL et que tous les champs de la ligne sont non NULL. cause de ce comportement, IS NULL et
IS NOT NULL ne renvoient pas toujours des rsultats inverss pour les expressions de lignes, c'est--dire une expression de ligne qui contient la fois des valeurs NULL et des valeurs non NULL retournera faux pour les deux
tests. Cette dfinition, conforme au standard SQL, est une modification du comportement incohrent des versions
de PostgreSQL antrieures la 8.2.
L'oprateur standard de comparaison renvoie NULL (ce qui signifie inconnu ) si l'une des entres est NULL, ni true ni false,
c'est--dire 7 = NULL renvoie NULL. Quand ce comportement n'est pas convenable, utilisez la syntaxe IS [NOT] DISTINCT FROM :
expression IS DISTINCT FROM expression
expression IS NOT DISTINCT FROM expression
Pour des entres non NULL, IS DISTINCT FROM est identique l'oprateur <>. Cependant, si les deux entres sont NULL,
alors cela retourne faux et si une des deux entres est NULL, alors cela retourne vrai. De la mme faon, IS NOT DISTINCT
120
Fonctions et oprateurs
FROM est identique = pour les entres non NULL mais il renvoie true si les deux entres sont NULL et false quand une seule est
NULL. Dans ces constructions, NULL n'est plus considr comme un tat inconnu mais comme une valeur.
Les valeurs boolennes peuvent aussi tre testes en utilisant les constructions
expression
expression
expression
expression
expression
expression
IS
IS
IS
IS
IS
IS
TRUE
NOT TRUE
FALSE
NOT FALSE
UNKNOWN
NOT UNKNOWN
Elles retournent toujours true ou false, jamais une valeur NULL, mme si l'oprande est NULL. Une entre NULL est traite
comme la valeur logique inconnue . IS UNKNOWN et IS NOT UNKNOWN sont rellement identiques IS NULL et IS NOT
NULL, respectivement, sauf que l'expression en entre doit tre de type boolen.
Oprateur
Description
Exemple
Rsultat
addition
2 + 3
soustraction
2 - 3
-1
multiplication
2 * 3
4 / 2
modulo (reste)
5 % 4
exposant
2.0 ^ 3.0
|/
racine carre
|/ 25.0
||/
racine cubique
||/ 27.0
factoriel
5 !
120
!!
!! 5
120
valeur absolue
@ -5.0
&
91 & 15
11
OR bit bit
32 | 3
35
17 # 5
20
~1
-2
<<
dcalage gauche
1 << 4
16
>>
dcalage droit
8 >> 2
Les oprateurs bit bit ne fonctionnent que sur les types de donnes entiers alors que les autres sont disponibles pour tous les
types de donnes numriques. Les oprateurs bit bit sont aussi disponibles pour les types de chanes de bits bit et bit varying
comme le montre le Tableau 9.10, Oprateurs sur les chanes de bits .
Le Tableau 9.3, Fonctions mathmatiques affiche les fonctions mathmatiques disponibles. Dans ce tableau, dp signifie
double precision. Beaucoup de ces fonctions sont fournies dans de nombreuses formes avec diffrents types d'argument. Sauf prcision contraire, toute forme donne d'une fonction renvoie le mme type de donnes que son argument. Les fonctions utilisant des
donnes de type double precision sont pour la plupart implantes avec la bibliothque C du systme hte ; la prcision et le comportement dans les cas particuliers peuvent varier en fonction du systme hte.
Tableau 9.3. Fonctions mathmatiques
Fonction
Type renvoy
Description
Exemple
Rsultat
abs(x)
(identique l'entre)
valeur absolue
abs(-17.4)
17.4
121
Fonctions et oprateurs
Fonction
Type renvoy
Description
Exemple
Rsultat
cbrt(dp)
dp
racine cubique
cbrt(27.0)
ceil(dp
ou (identique l'argument) plus petit entier suprieur ceil(-42.8)
numeric)
l'argument
-42
-95
degrees(dp) dp
degrees(0.5)
28.6478897565412
div(9,4)
exp(1.0)
2.71828182845905
exp(dp
ou (identique l'argument) exponentiel
numeric)
-43
ln(dp
ou (identique l'argument) logarithme
numeric)
ln(2.0)
0.69314718055994
5
log(dp
ou (identique l'argument) logarithme base 10
numeric)
log(100.0)
log(2.0, 64.0)
6.0000000000
logarithme en base b
mod(y, x)
mod(9,4)
pi()
dp
constante pi
pi()
3.14159265358979
power(a dp, dp
b dp)
a lev la puissance b
power(9.0, 3.0)
729
a lev la puissance b
power(9.0, 3.0)
729
radians(dp) dp
radians(45.0)
0.78539816339744
8
random()
dp
round(42.4)
42
round(42.4382,
2)
42.44
setseed(dp) void
sign(dp
ou (identique l'argument) signe de l'argument (-1, 0, +1)
numeric)
sign(-8.4)
-1
sqrt(dp
ou (identique l'argument) racine carr
numeric)
sqrt(2.0)
1.4142135623731
trunc(42.8)
42
trunc(42.4382,
2)
42.43
width_bucke int
t(oprande
numeric, b1
numeric, b2
Fonctions et oprateurs
Fonction
Type renvoy
Description
Exemple
Rsultat
leurs allant de b1 b2
numeric,
nombre int)
Pour finir, le Tableau 9.4, Fonctions trigonomtriques affiche les fonctions trigonomtriques disponibles. Toutes les fonctions
trigonomtriques prennent des arguments et renvoient des valeurs de type double precision. Les arguments des fonctions trigonomtriques sont exprims en radian. Voir les fonctions de transformation d'unit radians() et degrees() ci-dessus.
Tableau 9.4. Fonctions trigonomtriques
Fonction
Description
acos(x)
arccosinus
asin(x)
arcsinus
atan(x)
arctangente
atan2(y, x)
arctangente de y/x
cos(x)
cosinus
cot(x)
cotangente
sin(x)
sinus
tan(x)
tangente
Note
Avant PostgreSQL 8.3, ces fonctions acceptent silencieusement des valeurs de types de donnes diffrents de
chanes de caractres. Cela parce qu'existent des transtypages implicites de ces types en text. Ces forages ont t
supprims parce que leur comportement est souvent surprenant. Nanmoins, l'oprateur de concatnation de chane
(||) accepte toujours des lments qui ne sont pas du type chane de caractres, ds lors qu'au moins un des lments est de type chane, comme montr dans Tableau 9.5, Fonctions et oprateurs SQL pour le type chane .
Dans tous les autres cas, il faut insrer un transtypage explicite en text pour mimer le comportement prcdent.
Tableau 9.5. Fonctions et oprateurs SQL pour le type chane
Fonction
Type
Description
renvoy
Exemple
Rsultat
chane || chane
text
'Post' || 'greSQL'
PostgreSQL
chane
||
autre- text
que-chane ou autreque-chane || chane
bit_length(chane)
int
char_length(chane) ou int
cha
character_length(ne)
lower(chane)
text
Concatnation de chanes
Value: 42
32
bit_length('jose')
tom
123
Fonctions et oprateurs
Fonction
Type
Description
renvoy
octet_length(chane)
int
Exemple
Rsultat
cule
overlay(chane
pla- text
cing chane from int
[for int])
octet_length('jose') 4
Remplace la sous-chane
overlay('Txxxxas'
Thomas
placing 'hom' from 2
for 4)
position(sous-chane
in chane)
int
substring(chane
[from int] [for int])
text
substring(chane
modele)
from text
in 3
substring('Thomas'
from 2 for 3)
hom
mas
upper(chane)
text
'x'
from Tom
TOM
D'autres fonctions de manipulation de chanes sont disponibles et listes dans le Tableau 9.6, Autres fonctions de chane . Certaines d'entre elles sont utilises en interne pour implanter les fonctions de chane rpondant au standard SQL listes dans le Tableau 9.5, Fonctions et oprateurs SQL pour le type chane .
Tableau 9.6. Autres fonctions de chane
Fonction
Type
Description
renvoy
ascii(chane)
int
btrim(chane text
caracteres text])
chr(int)
[, text
text
Exemple
Rsultat
120
trim
124
Fonctions et oprateurs
Fonction
Type
Description
renvoy
Exemple
Rsultat
concat_ws(sparateur
text
text, chane "any" [,
chane "any" [, ...]
])
texte_en_utf8
reprsent dans le
codage LATIN1
convert_from(chane
text
bytea,
encodage_source nom)
texte_en_utf8
reprsent dans le
codage de la base
en cours
convert_to(chane
bytea
text,
encodage_destination nom)
decode(chane
format text)
encode(donnes
format text)
text, bytea
bytea, text
chaine_formata
text
format(ge
text
[,
chane "any" [, ...]
])
2, abcde222
\x3132330001
MTIzAAE=
%s, Hello
World
World,
Fonctions et oprateurs
Fonction
Type
Description
renvoy
Exemple
Rsultat
left(chane
int)
text,
text
Bonjour
mas
n text
ab
Nombre
chane
de length('jose')
xyxhi
trim
900150983cd24
fb0
d6963f7d28e17
f72
length(chane)
int
length(chane
encodage nom )
bytea, int
lpad(chane
text, text
longueur int [, remplissage text])
ltrim(chane text
caracteres text])
[, text
de
caractres
md5(chane)
text
pg_client_encoding()
name
quote_ident(chane
text)
text
"Foo bar"
Tho-
Fonctions et oprateurs
Fonction
Type
Description
renvoy
Exemple
Rsultat
text
'O''Reilly'
quote_literal(valeur
anyelement)
text
'42.5'
quote_nullable(chane
text)
text
quote_nullable(valeur
anyelement)
text
regexp_matches(chane setof
text, modle text [, text[]
drapeaux text])
Fonctions et oprateurs
Fonction
Type
Description
renvoy
Exemple
Rsultat
retext[]
c
h
a
n
gexp_split_to_array(e
text, modle text [,
drapeaux text ])
re{hello,world}
gexp_split_to_array(
'hello
world',
E'\\s+')
resetof text
c
h
a
n
gexp_split_to_table(e
text, modle text [,
drapeaux text])
rehello
gexp_split_to_table(
'hello
world', world
(2 rows)
E'\\s+')
text, text
repeat(chane
nombre int)
replace(chane
text, text
partirde text, vers
text)
text
reverse(chane)
right(chane
int)
text,
n text
rpad(chane
text, text
longueur int [, remplissage text])
rtrim(chane text
caracteres text])
[, text
split_part(chane
text
text,
dlimiteur
text, champ int)
strpos(chane,
sous- int
Rpte le texte
nombre fois
chane repeat('Pg', 4)
PgPgPgPg
reverse('abcde')
edcba
de
hixyx
trim
def
Fonctions et oprateurs
Fonction
Type
Description
renvoy
Exemple
Rsultat
chane)
substr(chane,
par- text
tirde [, nombre])
substring(chane 3, 2)
from
partirde
for
nombre))
ph
to_ascii(chane
text text
[, encodage text])
Karel
ou text
7fffffff
translate(chane
text
text, partirde text,
vers text)
a2x5
to_hex(number
bigint)
int
Voir aussi la fonction d'agrgat string_agg dans Section 9.18, Fonctions d'agrgat .
Tableau 9.7. Conversions intgres
Nom de la conversion a
Codage source
Codage destination
ascii_to_mic
SQL_ASCII
MULE_INTERNAL
ascii_to_utf8
SQL_ASCII
UTF8
big5_to_euc_tw
BIG5
EUC_TW
big5_to_mic
BIG5
MULE_INTERNAL
big5_to_utf8
BIG5
UTF8
euc_cn_to_mic
EUC_CN
MULE_INTERNAL
euc_cn_to_utf8
EUC_CN
UTF8
euc_jp_to_mic
EUC_JP
MULE_INTERNAL
euc_jp_to_sjis
EUC_JP
SJIS
euc_jp_to_utf8
EUC_JP
UTF8
euc_kr_to_mic
EUC_KR
MULE_INTERNAL
euc_kr_to_utf8
EUC_KR
UTF8
euc_tw_to_big5
EUC_TW
BIG5
euc_tw_to_mic
EUC_TW
MULE_INTERNAL
euc_tw_to_utf8
EUC_TW
UTF8
gb18030_to_utf8
GB18030
UTF8
gbk_to_utf8
GBK
UTF8
iso_8859_10_to_utf8
LATIN6
UTF8
iso_8859_13_to_utf8
LATIN7
UTF8
129
Fonctions et oprateurs
Nom de la conversion a
Codage source
Codage destination
iso_8859_14_to_utf8
LATIN8
UTF8
iso_8859_15_to_utf8
LATIN9
UTF8
iso_8859_16_to_utf8
LATIN10
UTF8
iso_8859_1_to_mic
LATIN1
MULE_INTERNAL
iso_8859_1_to_utf8
LATIN1
UTF8
iso_8859_2_to_mic
LATIN2
MULE_INTERNAL
iso_8859_2_to_utf8
LATIN2
UTF8
iso_8859_2_to_windows_1250
LATIN2
WIN1250
iso_8859_3_to_mic
LATIN3
MULE_INTERNAL
iso_8859_3_to_utf8
LATIN3
UTF8
iso_8859_4_to_mic
LATIN4
MULE_INTERNAL
iso_8859_4_to_utf8
LATIN4
UTF8
iso_8859_5_to_koi8_r
ISO_8859_5
KOI8R
iso_8859_5_to_mic
ISO_8859_5
MULE_INTERNAL
iso_8859_5_to_utf8
ISO_8859_5
UTF8
iso_8859_5_to_windows_1251
ISO_8859_5
WIN1251
iso_8859_5_to_windows_866
ISO_8859_5
WIN866
iso_8859_6_to_utf8
ISO_8859_6
UTF8
iso_8859_7_to_utf8
ISO_8859_7
UTF8
iso_8859_8_to_utf8
ISO_8859_8
UTF8
iso_8859_9_to_utf8
LATIN5
UTF8
johab_to_utf8
JOHAB
UTF8
koi8_r_to_iso_8859_5
KOI8R
ISO_8859_5
koi8_r_to_mic
KOI8R
MULE_INTERNAL
koi8_r_to_utf8
KOI8R
UTF8
koi8_r_to_windows_1251
KOI8R
WIN1251
koi8_r_to_windows_866
KOI8R
WIN866
koi8_u_to_utf8
KOI8U
UTF8
mic_to_ascii
MULE_INTERNAL
SQL_ASCII
mic_to_big5
MULE_INTERNAL
BIG5
mic_to_euc_cn
MULE_INTERNAL
EUC_CN
mic_to_euc_jp
MULE_INTERNAL
EUC_JP
mic_to_euc_kr
MULE_INTERNAL
EUC_KR
mic_to_euc_tw
MULE_INTERNAL
EUC_TW
mic_to_iso_8859_1
MULE_INTERNAL
LATIN1
mic_to_iso_8859_2
MULE_INTERNAL
LATIN2
mic_to_iso_8859_3
MULE_INTERNAL
LATIN3
mic_to_iso_8859_4
MULE_INTERNAL
LATIN4
mic_to_iso_8859_5
MULE_INTERNAL
ISO_8859_5
mic_to_koi8_r
MULE_INTERNAL
KOI8R
mic_to_sjis
MULE_INTERNAL
SJIS
mic_to_windows_1250
MULE_INTERNAL
WIN1250
mic_to_windows_1251
MULE_INTERNAL
WIN1251
mic_to_windows_866
MULE_INTERNAL
WIN866
130
Fonctions et oprateurs
Nom de la conversion a
Codage source
Codage destination
sjis_to_euc_jp
SJIS
EUC_JP
sjis_to_mic
SJIS
MULE_INTERNAL
sjis_to_utf8
SJIS
UTF8
tcvn_to_utf8
WIN1258
UTF8
uhc_to_utf8
UHC
UTF8
utf8_to_ascii
UTF8
SQL_ASCII
utf8_to_big5
UTF8
BIG5
utf8_to_euc_cn
UTF8
EUC_CN
utf8_to_euc_jp
UTF8
EUC_JP
utf8_to_euc_kr
UTF8
EUC_KR
utf8_to_euc_tw
UTF8
EUC_TW
utf8_to_gb18030
UTF8
GB18030
utf8_to_gbk
UTF8
GBK
utf8_to_iso_8859_1
UTF8
LATIN1
utf8_to_iso_8859_10
UTF8
LATIN6
utf8_to_iso_8859_13
UTF8
LATIN7
utf8_to_iso_8859_14
UTF8
LATIN8
utf8_to_iso_8859_15
UTF8
LATIN9
utf8_to_iso_8859_16
UTF8
LATIN10
utf8_to_iso_8859_2
UTF8
LATIN2
utf8_to_iso_8859_3
UTF8
LATIN3
utf8_to_iso_8859_4
UTF8
LATIN4
utf8_to_iso_8859_5
UTF8
ISO_8859_5
utf8_to_iso_8859_6
UTF8
ISO_8859_6
utf8_to_iso_8859_7
UTF8
ISO_8859_7
utf8_to_iso_8859_8
UTF8
ISO_8859_8
utf8_to_iso_8859_9
UTF8
LATIN5
utf8_to_johab
UTF8
JOHAB
utf8_to_koi8_r
UTF8
KOI8R
utf8_to_koi8_u
UTF8
KOI8U
utf8_to_sjis
UTF8
SJIS
utf8_to_tcvn
UTF8
WIN1258
utf8_to_uhc
UTF8
UHC
utf8_to_windows_1250
UTF8
WIN1250
utf8_to_windows_1251
UTF8
WIN1251
utf8_to_windows_1252
UTF8
WIN1252
utf8_to_windows_1253
UTF8
WIN1253
utf8_to_windows_1254
UTF8
WIN1254
utf8_to_windows_1255
UTF8
WIN1255
utf8_to_windows_1256
UTF8
WIN1256
utf8_to_windows_1257
UTF8
WIN1257
utf8_to_windows_866
UTF8
WIN866
utf8_to_windows_874
UTF8
WIN874
windows_1250_to_iso_8859_2
WIN1250
LATIN2
131
Fonctions et oprateurs
Nom de la conversion a
Codage source
Codage destination
windows_1250_to_mic
WIN1250
MULE_INTERNAL
windows_1250_to_utf8
WIN1250
UTF8
windows_1251_to_iso_8859_5
WIN1251
ISO_8859_5
windows_1251_to_koi8_r
WIN1251
KOI8R
windows_1251_to_mic
WIN1251
MULE_INTERNAL
windows_1251_to_utf8
WIN1251
UTF8
windows_1251_to_windows_866
WIN1251
WIN866
windows_1252_to_utf8
WIN1252
UTF8
windows_1256_to_utf8
WIN1256
UTF8
windows_866_to_iso_8859_5
WIN866
ISO_8859_5
windows_866_to_koi8_r
WIN866
KOI8R
windows_866_to_mic
WIN866
MULE_INTERNAL
windows_866_to_utf8
WIN866
UTF8
windows_866_to_windows_1251
WIN866
WIN
windows_874_to_utf8
WIN874
UTF8
euc_jis_2004_to_utf8
EUC_JIS_2004
UTF8
utf8_to_euc_jis_2004
UTF8
EUC_JIS_2004
shift_jis_2004_to_utf8
SHIFT_JIS_2004
UTF8
utf8_to_shift_jis_2004
UTF8
SHIFT_JIS_2004
euc_jis_2004_to_shift_jis_2004
EUC_JIS_2004
SHIFT_JIS_2004
shift_jis_2004_to_euc_jis_2004
SHIFT_JIS_2004
EUC_JIS_2004
Les noms des conversions suivent un schma de nommage standard : le nom officiel de l'encodage source avec tous les caractres non alpha-numriques remplacs par des tirets bas suivi de _to_ suivi
du nom de l'encodage cible ayant subit le mme traitement que le nom de l'encodage source. Il est donc possible que les noms varient par rapport aux noms d'encodage personnaliss.
Note
Les rsultats en exemple montrs ici supposent que le paramtre serveur bytea_output est configur escape
(le format traditionel de PostgreSQL).
Tableau 9.8. Fonctions et oprateurs SQL pour chanes binaires
Fonction
Type renvoy
cha
int
Description
Exemple
Rsultat
132
Fonctions et oprateurs
Fonction
Type renvoy
Description
Exemple
Rsultat
)
overlay(chane
bytea
placing
chane
from
int
[for
int])
Remplace
chane
position(sousint
chane
in
chane)
substring(chane bytea
[from int] [for
int])
Extrait la sous-chane
subh\000o
string(E'Th\\000omas'::
bytea from 2 for 3)
trim(E'\\000'::bytea
Tom
from
E'\\000Tom\\000'::bytea
)
trim([both]
tets
chane)
oc- bytea
from
une
sous- overT\\002\\003mas
lay(E'Th\\000omas'::byt
ea
placing
E'\\002\\003'::bytea
from 2 for 3)
Des fonctions supplmentaires de manipulations de chanes binaires sont listes dans le Tableau 9.9, Autres fonctions sur les
chanes binaires . Certaines sont utilises en interne pour coder les fonctions de chanes suivant le standard SQL et sont listes
dans le Tableau 9.8, Fonctions et oprateurs SQL pour chanes binaires .
Tableau 9.9. Autres fonctions sur les chanes binaires
Fonction
btrim(chane
tea, octets
tea)
Exemple
Rsultat
trim
decode(chane
bytea
text,
format
text)
encode(chane
text
bytea,
type
text)
get_bit(chane,
offset)
int
get_byte(chane, int
offset)
length(chane)
int
Extrait
chane
un
bit
d'une get_bit(E'Th\\000omas'::byt 1
ea, 45)
Fonctions et oprateurs
Fonction
Exemple
Rsultat
md5(chane)
text
set_bit(chane,
offset,
newvalue)
bytea
set_byte(chane, bytea
offset,
newvalue)
8ab2d3c9689aaf18
b4958c334c82d8b1
get_byte et set_byte prennent en compte le premier octet d'une chane binaire comme l'octet numro zro. get_bit et
set_bit comptent les bits partir de la droite pour chaque octet. Par exemple, le bit 0 est le bit le moins significatif du premier
octet et le bit 15 est le bit le plus significatif du second octet.
Oprateur
Description
Exemple
Rsultat
||
concatnation
B'10001' || B'011'
10001011
&
00001
OR bit bit
B'10001' | B'01101'
11101
B'10001' # B'01101'
11100
~ B'10001'
01110
<<
B'10001' << 3
01000
>>
B'10001' >> 2
00100
Les fonctions SQL suivantes fonctionnent sur les chanes de bits ainsi que sur les chanes de caractres : length, bit_length,
octet_length, position, substring, overlay.
Les fonctions suivantes fonctionnent sur les chanes de bits ainsi que sur les chanes binaires : get_bit, set_bit. En travaillant sur des chanes de bits, ces fonctions numrotent le premier bit (le plus gauche) comme le bit 0.
De plus, il est possible de convertir des valeurs intgrales vers ou depuis le type bit. Quelques exemples :
44::bit(10)
44::bit(3)
cast(-44 as bit(12))
'1110'::bit(4)::integer
0000101100
100
111111010100
14
Le transtypage bit signifie transtyper en bit(1) et, de ce fait, seul le bit de poids faible de l'entier est rendu.
Note
Avant PostgreSQL 8.0, la conversion d'un entier en bit(n) copiait les n bits les plus gauche de l'entier. Dsormais, ce sont les n bits les plus droite qui sont copis. De plus, la conversion d'un entier en une chane de bits plus
grande que l'entier lui-mme tend l'entier, avec signature, vers la gauche.
Fonctions et oprateurs
SIMILAR TO (ajout dans SQL:1999) et les expressions rationnelles de type POSIX. En dehors des oprateurs basiques du style
est-ce que cette chane correspond ce modle ? , les fonctions sont disponibles pour extraire ou remplacer des sous-chanes
correspondantes ou pour diviser une chane aux emplacements correspondants.
Astuce
Si un besoin de correspondances de motif va au-del, il faut considrer l'criture d'une fonction en Perl ou Tcl.
9.7.1. LIKE
chane LIKE motif [ESCAPE caractre d'chappement]
chane NOT LIKE motif [ESCAPE caractre d'chappement]
L'expression LIKE renvoie true si la chane est contenue dans l'ensemble de chanes reprsent par le motif. (L'expression
NOT LIKE renvoie false si LIKE renvoie true et vice versa. Une expression quivalente est NOT (chane LIKE motif).)
Si le motif ne contient ni signe pourcent ni tiret bas, alors il ne reprsente que la chane elle-mme ; dans ce cas, LIKE agit
exactement comme l'oprateur d'galit. Un tiret bas (_) dans motif correspond un seul caractre, un signe pourcent (%)
toutes les chanes de zro ou plusieurs caractres.
Quelques exemples :
'abc'
'abc'
'abc'
'abc'
LIKE
LIKE
LIKE
LIKE
'abc'
'a%'
'_b_'
'c'
true
true
true
false
Le modle LIKE correspond toujours la chane entire. Du coup, pour faire correspondre une squence l'intrieur d'une chane,
le motif doit donc commencer et finir avec un signe pourcent.
Pour faire correspondre un vrai tiret bas ou un vrai signe de pourcentage sans correspondance avec d'autres caractres, le caractre
correspondant dans motif doit tre prcd du caractre d'chappement. Par dfaut, il s'agit de l'antislash, mais un autre caractre
peut tre slectionn en utilisant la clause ESCAPE. Pour un correspondance avec le caractre d'chappement lui-mme, on crit
deux fois ce caractre.
Note
Si vous avez dsactiv standard_conforming_strings, tout antislash crit dans des chanes litrales devra tre doubl. Voir Section 4.1.2.1, Constantes de chanes pour plus d'informations.
Il est aussi possible de ne slectionner aucun caractre d'chappement en crivant ESCAPE ''. Ceci dsactive compltement le
mcanisme d'chappement, ce qui rend impossible la dsactivation de la signification particulire du tiret bas et du signe de pourcentage dans le motif.
Le mot cl ILIKE est utilis la place de LIKE pour faire des correspondances sans tenir compte de la casse mais en tenant
compte de la locale active. Ceci ne fait pas partie du standard SQL mais est une extension PostgreSQL.
L'oprateur ~~ est quivalent LIKE alors que ~~* correspond ILIKE. Il existe aussi les oprateurs !~~ et !~~* reprsentant
respectivement NOT LIKE et NOT ILIKE. Tous ces oprateurs sont spcifiques PostgreSQL.
Fonctions et oprateurs
les parenthses () peuvent tre utilises pour grouper des lments en un seul lment logique ;
une expression entre crochets [...] spcifie une classe de caractres, comme dans les expressions rationnelles POSIX.
Notez que le point (.) n'est pas un mta-caractre pour SIMILAR TO.
Comme avec LIKE, un antislash dsactive la signification spciale de tous les mta-caractres ; un autre caractre d'chappement
peut tre indiqu avec ESCAPE.
Quelques exemples :
'abc'
'abc'
'abc'
'abc'
SIMILAR
SIMILAR
SIMILAR
SIMILAR
TO
TO
TO
TO
'abc'
'a'
'%(b|d)%'
'(b|c)%'
true
false
true
false
La fonction substring avec trois paramtres, substring(chane from motif for caractre
d'chappement), fournit l'extraction d'une sous-chane correspondant un motif d'expression rationnelle SQL. Comme avec
SIMILAR TO, le motif fourni doit correspondre la chane de donnes entire, sinon la fonction choue et renvoie NULL. Pour
indiquer la partie du motif retourner en cas de succs, le motif doit contenir deux occurrences du caractre d'chappement suivi
d'un guillemet double ("). Le texte correspondant la portion du motif entre ces deux marqueurs est renvoy.
Quelques exemples, avec #" dlimitant la chane en retour :
substring('foobar' from '%#"o_b#"%' for '#')
oob
substring('foobar' from '#"o_b#"%' for '#')
NULL
Oprateur Description
Exemple
'thomas' ~ '.*thomas.*'
~*
'thomas' ~* '.*Thomas.*'
!~
!~*
Les expressions rationnelles POSIX sont un outil de correspondance de motifs plus puissant que les oprateurs LIKE et SIMILAR
TO. Beaucoup d'outils Unix comme egrep, sed ou awk utilisent un langage de correspondance de modles similaire celui dcrit
ici.
Une expression rationnelle est une squence de caractres reprsentant une dfinition abrge d'un ensemble de chanes (un ensemble rationnel). Une chane est dclare correspondre une expression rationnelle si elle est membre de l'ensemble rationnel
dcrit par l'expression rationnelle. Comme avec LIKE, les caractres du motif correspondent exactement aux caractres de le
chane sauf s'ils reprsentent des caractres spciaux dans le langage des expressions rationnelles -- mais les expressions rationnelles utilisent des caractres spciaux diffrents de ceux utiliss par LIKE. Contrairement aux motifs de LIKE, une expression
136
Fonctions et oprateurs
rationnelle peut avoir une correspondance en toute place de la chane, sauf si l'expression rationnelle est explicitement ancre au
dbut ou la fin de la chane.
Quelques exemples :
'abc'
'abc'
'abc'
'abc'
~
~
~
~
'abc'
'^a'
'(b|d)'
'^(b|c)'
true
true
true
false
oub
u
La fonction regexp_replace substitue un nouveau texte aux sous-chanes correspondantes des motifs d'expressions rationnelles. Elle a la syntaxe regexp_replace(source, motif, remplacement [, options ]). La chane source est renvoye non modifie s'il n'existe pas de correspondance avec motif. S'il existe une correspondance, la chane source est renvoye avec la chane remplacement substitue la sous-chane correspondante. La chane remplacement peut contenir \n,
avec n de 1 9, pour indiquer que la n-ime sous-chane source correspondante doit tre insre. Elle peut aussi contenir \& pour
indiquer que la sous-chane qui correspond au motif entier doit tre insre. On crit \\ pour placer un antislash littral dans le
texte de remplacement. Le paramtre options est une chane optionnelle de drapeaux (0 ou plus) d'une lettre qui modifie le
comportement de la fonction. Le drapeau i indique une recherche insensible la casse, le drapeau g un remplacement de chaque
sous-chane correspondante (pas uniquement la premire). Les autres options supportes sont dcrites dans Tableau 9.19, Lettres
d'option intgres une ERA .
Quelques exemples :
regexp_replace('foobarbaz', 'b..', 'X')
fooXbaz
regexp_replace('foobarbaz', 'b..', 'X', 'g')
fooXX
regexp_replace('foobarbaz', 'b(..)', E'X\\1Y', 'g')
fooXarYXazY
La fonction regexp_matches renvoie un tableau de texte contenant toutes les sous-chanes captures rsultant de la correspondance avec une expression rationnelle POSIX. Elle a la syntaxe : regexp_matches(chaine, modele [, options ]). La
fonction peut ne renvoyer aucune ligne, une ligne ou plusieurs lignes (voir le drapeau g ci-dessous). Si le motif ne correspond
pas, la fonction ne renvoie aucune ligne. Si le motif ne contient aucune sous-expressions entre parenthses, alors chaque ligne renvoye est un tableau de texte un seul lment contenant la sous-chane correspondant au motif complet. Si le motif contient des
sous-expressions entre parenthses, la fonction renvoie un tableau de texte dont l'lment n est la sous-chane en correspondance
avec la n-ime sous-expression entre parenthses du modle (sans compter les parenthses non capturantes ; voir ci-dessous
pour les dtails). Le paramtre options est une chane optionnelle contenant zro ou plus options d'une lettre, modifiant ainsi le
comportement de la fonction. L'option g indique que la fonction trouve chaque correspondance dans la chane, pas seulement la
premire, et renvoie une ligne pour chaque correspondance. Les autres options supportes sont dcrites dans Tableau 9.19,
Lettres d'option intgres une ERA .
Quelques exemples :
SELECT regexp_matches('foobarbequebaz', '(bar)(beque)');
regexp_matches
---------------{bar,beque}
(1 row)
SELECT regexp_matches('foobarbequebazilbarfbonk', '(b[^b]+)(b[^b]+)', 'g');
regexp_matches
---------------137
Fonctions et oprateurs
{bar,beque}
{bazil,barf}
(2 rows)
SELECT regexp_matches('foobarbequebaz', 'barbeque');
regexp_matches
---------------{barbeque}
(1 row)
Il est possible de forcer regexp_matches() toujours renvoyer une ligne en utilisant une sous-slection ; ceci est particulirement utile dans une liste cible SELECT lorsque vous voulez renvoyer toutes les lignes, y compris celles qui ne correspondent pas :
SELECT col1, (SELECT regexp_matches(col2, '(bar)(beque)')) FROM tab;
La fonction regexp_split_to_table divise une chane en utilisant une expression rationnelle POSIX comme dlimiteur.
Elle a la syntaxe suivante : regexp_split_to_table(chaine, modele [, options ]). S'il n'y a pas de correspondance
avec le modele, la fonction renvoie la chaine. S'il y a au moins une correspondance, pour chaque correspondance, elle renvoie
le texte partir de la fin de la dernire correspondance (ou le dbut de la chane) jusqu'au dbut de la correspondance. Quand il ne
reste plus de correspondance, elle renvoie le texte depuis la fin de la dernire correspondance jusqu' la fin de la chane. Le paramtre options est une chane optionnelle contenant zro ou plus options d'un caractre, modifiant ainsi le comportement de la
fonction. regexp_split_to_table supporte les options dcrites dans Tableau 9.19, Lettres d'option intgres une
ERA .
La fonction regexp_split_to_array se comporte de la mme faon que regexp_split_to_table, sauf que regexp_split_to_array renvoie son rsultat en tant que tableau de text. Elle a comme syntaxe
regexp_split_to_array(chaine, modele [, options ]). Les paramtres sont les mmes que pour regexp_split_to_table.
Quelques exemples :
SELECT foo FROM regexp_split_to_table('the quick brown fox jumped over the lazy dog',
E'\\s+') AS foo;
foo
-------the
quick
brown
fox
jumped
over
the
lazy
dog
(9 rows)
SELECT regexp_split_to_array('the quick brown fox jumped over the lazy dog', E'\\s+');
regexp_split_to_array
-----------------------------------------------{the,quick,brown,fox,jumped,over,the,lazy,dog}
(1 row)
SELECT foo FROM regexp_split_to_table('the quick brown fox', E'\\s*') AS foo;
foo
----t
h
e
q
u
i
c
k
b
r
138
Fonctions et oprateurs
o
w
n
f
o
x
(16 rows)
Comme le montre le dernier exemple, les fonctions de division des expressions rationnelles ignorent les correspondances de longueur nulle qui surviennent au dbut ou la fin de la chane ou immdiatement aprs une correspondance. C'est contraire la dfinition stricte de la correspondance des expressions rationnelles implante par regexp_matches, mais c'est habituellement le
comportement le plus pratique. Les autres systmes comme Perl utilisent des dfinitions similaires.
Note
PostgreSQL prsume toujours au dpart qu'une expression rationnelle suit les rgles ERA. Nanmoins, les rgles
ERE et BRE (plus limites) peuvent tre choisies en ajoutant au dbut une option d'imbrication sur le motif de
l'ER, comme dcrit dans Section 9.7.3.4, Mtasyntaxe des expressions rationnelles . Cela peut tre utile pour la
compatibilit avec les applications qui s'attendent suivre exactement les rgles POSIX.
Une expression rationnelle est dfinie par une ou plusieurs branches spares par des caractres |. Elle tablit une correspondance
avec tout ce qui correspond une des branches.
Une branche contient des atomes quantifis, ou contraintes, concatns. Elle tablit une correspondance pour le premier suivi
d'une correspondance pour le second, etc ; une branche vide tablit une correspondance avec une chane vide.
Un atome quantifi est un atome ventuellement suivi d'un quantificateur unique. Sans quantificateur, il tablit une correspondance avec l'atome. Avec un quantificateur, il peut tablir un certain nombre de correspondances avec l'atome. Un atome est une
des possibilits du Tableau 9.12, Atomes d'expressions rationnelles . Les quantificateurs possibles et leurs significations sont
disponibles dans le Tableau 9.13, quantificateur d'expressions rationnelles .
Une contrainte tablit une correspondance avec une chane vide, mais cette correspondance n'est tablie que lorsque des conditions spcifiques sont remplies. Une contrainte peut tre utilise l o un atome peut l'tre et ne peut pas tre suivie d'un quantificateur. Les contraintes simples sont affiches dans le Tableau 9.14, Contraintes des expressions rationnelles ; quelques
contraintes supplmentaires sont dcrites plus loin.
Tableau 9.12. Atomes d'expressions rationnelles
Atome
Description
(re)
(o re est toute expression rationnelle) tablit une correspondance avec re, la correspondance tant
conserve en vue d'un ventuel report
(?:re)
comme ci-dessus mais la correspondance n'est pas conserve pour report (un ensemble de parenthses
sans capture ) (seulement pour les ERA)
[caractres]
une expression entre crochets, qui tablit une correspondance avec tout caractre de caractres
(voir la Section 9.7.3.2, Expressions avec crochets pour plus de dtails)
\k
(o k n'est pas un caractre alpha-numrique) tablit une correspondance avec ce caractre, considr
comme caractre ordinaire. Par exemple, \\ tablit une correspondance avec un caractre antislash
\c
Fonctions et oprateurs
Atome
Description
ERB, tablit une correspondance avec c)
lorsqu'il est suivi d'un caractre autre qu'un chiffre, tablit une correspondance avec l'accolade ouvrante
{ ; suivi d'un chiffre, c'est le dbut d'une limite (voir ci-dessous)
o x est un caractre unique sans signification, tablit une correspondance avec ce caractre
Note
Si vous avez dsactiv standard_conforming_strings, tout antislash crit dans des chantes litrales devra tre doubl. Voir Section 4.1.2.1, Constantes de chanes pour plus d'informations.
Tableau 9.13. quantificateur d'expressions rationnelles
quantificateur
Correspondance
{m}
{m,}
{m,n}
*?
+?
??
{m}?
{m,}?
{m,n}?
Les formes qui utilisent {...} sont appeles limites. Les nombres m et n l'intrieur d'une limite sont des entiers non signs dont
les valeurs vont de 0 255 inclus.
Les quantificateurs non gourmands (disponibles uniquement avec les ERA) correspondent aux mme possibilits que leurs quivalents normaux (gourmand), mais prfrent le plus petit nombre de correspondances au plus grand nombre. Voir la Section 9.7.3.5, Rgles de correspondance des expressions rationnelles pour plus de dtails.
Note
Un quantificateur ne peut pas immdiatement suivre un autre quantificateur, autrement dit ** est invalide. Il ne
peut pas non plus dbuter une expression ou sous-expression ni suivre ^ ou |.
Tableau 9.14. Contraintes des expressions rationnelles
Contrainte
Description
(?=er)
positive lookahead (recherche positive) tablit une correspondance avec tout point o une sous-chane
qui correspond er dbute (uniquement pour les ERA)
(?!er)
negative lookahead (recherche ngative) tablit une correspondance avec tout point o aucune souschane qui correspond re ne dbute (uniquement pour les ERA)
Les contraintes lookahead ne doivent pas contenir de rfrences arrires (voir la Section 9.7.3.3, chappement d'expressions
140
Fonctions et oprateurs
rationnelles ), et toutes les parenthses contenues sont considres comme non capturantes.
Note
PostgreSQL n'a pas, ce jour, d'lments d'interclassement multi-caractres. L'information porte ici dcrit un
ventuel comportement futur.
Dans une expression entre crochets, un lment d'interclassement crit entre [= et =] est une classe d'quivalence qui reprsente
les squences de caractres de tous les lments d'interclassement quivalents celui-l, lui compris. (En l'absence d'lment
d'interclassement quivalent, le traitement correspond celui obtenu avec les dlimiteurs [. et .]). Par exemple, si o et ^ sont les
membres d'une classe d'quivalence, alors [[=o=]], [[=^=]] et [o^] sont tous synonymes. Une classe d'quivalence ne peut
pas tre borne d'une plage.
Dans une expression entre crochets, le nom d'une classe de caractres crit entre [: et :] reprsente la liste de tous les caractres
appartenant cette classe. Les noms de classes de caractres standard sont alnum, alpha, blank, cntrl, digit, graph,
lower, print, punct, space, upper, xdigit. Ils correspondent aux classes de caractres dfinies dans ctype(3). Une locale peut en fournir d'autres. Une classe de caractres ne peut pas tre utilise comme borne d'une plage.
Il existe deux cas spciaux d'expressions entre crochets : les expressions entre crochets [[:<:]] et [[:>:]] sont des
contraintes, qui tablissent une correspondance avec des chanes vides respectivement au dbut et la fin d'un mot. Un mot est dfini comme une squence de caractres de mot qui n'est ni prcde ni suivie de caractres de mot. Un caractre de mot est un caractre alnum (comme dfini par ctype(3)) ou un tiret bas. C'est une extension, compatible avec, mais non spcifie dans POSIX
1003.2, et devant tre utilise avec prcaution dans les logiciels conus pour tre portables sur d'autres systmes. Les chappements de contraintes dcrits ci-dessous sont gnralement prfrables (ils ne sont pas plus standard mais certainement plus simples
saisir).
141
Fonctions et oprateurs
Un chappement de contrainte (constraint escape) est une contrainte, qui correspond la chane vide sous certaines conditions,
crite comme un chappement. Ces chappements sont prsents dans le Tableau 9.17, chappements de contrainte dans les expressions rationnelles .
Une rtro-rfrence (back reference) (\n) correspond la mme chane que la sous-expression entre parenthses prcdente indique par le nombre n (voir le Tableau 9.18, Rtro-rfrences dans les expressions rationnelles ). Par exemple, ([bc])\1 peut
correspondre bb ou cc, mais ni bc ni cb. La sous-expression doit prcder compltement la rfrence dans l'ER. Les sousexpressions sont numrotes dans l'ordre des parenthses ouvrantes. Les parenthses non capturantes ne dfinissent pas de sousexpressions.
Note
Le symbole \ qui dbute une squence d'chappement doit tre obligatoirement doubl pour saisir le motif comme
une chane SQL constante. Par exemple :
'123' ~ E'^\\d{3}' true
chappement
Description
\a
\b
\B
\cX
(o X est un caractre quelconque) le caractre dont les cinq bits de poids faible sont les mmes que
ceux de X et dont tous les autres bits sont zro
\e
le caractre dont le nom de squence d'interclassement est ESC, ou le caractre de valeur octale 033
\f
\n
\r
\t
\uwxyz
(o wxyz reprsente exactement quatre chiffres hexadcimaux) le caractre UTF16 (Unicode, 16 bits)
U+wxyz dans l'ordre local des octets
\Ustuvwxyz
(o stuvwxyz reprsente exactement huit chiffres hexadcimaux) rserv pour une extension, hypothtique, de l'Unicode vers le 32 bits
\v
\xhhh
(o hhh reprsente toute squence de chiffres hexadcimaux) le caractre dont la valeur hexadcimale
est 0xhhh (un simple caractre, peu importe le nombre de chiffres hexadcimaux utiliss)
\0
\xy
(o xy reprsente exactement deux chiffres octaux et n'est pas une rtro-rfrence) le caractre dont la
valeur octale est 0xy
\xyz
(o xyz reprsente exactement trois chiffres octaux et n'est pas une rtro-rfrence) le caractre dont
la valeur octale est 0xyz
Les chiffres hexadcimaux sont 0-9, a-f et A-F. Les chiffres octaux sont 0-7.
Les chappements de caractre sont toujours pris comme des caractres ordinaires. Par exemple, \135 est ] en ASCII mais \135
ne termine pas une expression entre crochets.
Tableau 9.16. chappement de raccourcis de classes dans les expressions rationnelles
chappement
Description
\d
[[:digit:]]
\s
[[:space:]]
\w
Fonctions et oprateurs
chappement
Description
\D
[^[:digit:]]
\S
[^[:space:]]
\W
Dans les expressions entre crochets, \d, \s, et \w perdent leurs crochets externes et \D, \S et \W ne sont pas autoriss. (Ainsi,
par exemple, [a-c\d] est quivalent [a-c[:digit:]]. Mais [a-c\D], qui est quivalent [a-c^[:digit:]], est interdit.)
Tableau 9.17. chappements de contrainte dans les expressions rationnelles
chappement
Description
\A
n'tablit la correspondance qu'au dbut de la chane (voir la Section 9.7.3.5, Rgles de correspondance des expressions rationnelles pour comprendre la diffrence avec ^)
\m
\M
\y
\Y
\Z
n'tablit la correspondance qu' la fin d'une chane (voir la Section 9.7.3.5, Rgles de correspondance
des expressions rationnelles pour comprendre la diffrence avec $)
Un mot est dfini selon suivant la spcification de [[:<:]] et [[:>:]] donne ci-dessus. Les chappement de contrainte sont
interdits dans les expressions entre crochets.
Tableau 9.18. Rtro-rfrences dans les expressions rationnelles
chappement
Description
\m
\mnn
Note
Une ambigut persiste entre les chappements de caractre octal et les rtro-rfrences. Cette ambigut est rsolue
par les heuristiques suivantes, comme montr ci-dessus. Un zro en dbut de chane indique toujours un chappement octal. Un caractre seul diffrent de zro, qui n'est pas suivi d'un autre caractre, est toujours pris comme une
rtro-rfrence. Une squence plusieurs chiffres qui ne dbute pas par zro est prise comme une rfrence si elle
suit une sous-expression utilisable (c'est--dire que le nombre est dans la plage autorise pour les rtro-rfrences).
Dans le cas contraire, il est pris comme nombre octal.
Fonctions et oprateurs
Option
Description
dsactivation de la sensibilit la casse (voir la Section 9.7.3.5, Rgles de correspondance des expressions rationnelles ) (surcharge l'oprateur type)
activation de la sensibilit aux nouvelles lignes (voir la Section 9.7.3.5, Rgles de correspondance
des expressions rationnelles )
activation de la sensibilit partielle aux nouvelles lignes (voir la Section 9.7.3.5, Rgles de correspondance des expressions rationnelles )
le reste de l'ER est une chane littrale ( entre guillemets ), compos uniquement de caractres ordinaires
activation de la sensibilit partielle inverse aux nouvelles lignes ( trange ) (voir la Section 9.7.3.5,
Rgles de correspondance des expressions rationnelles )
Les options intgres prennent effet la ) qui termine la squence. Elles ne peuvent apparatre qu'au dbut d'une ERA (aprs le
directeur ***: s'il y en a un).
En plus de la syntaxe habituelle d'une ER (compacte), dans laquelle tous les caractres ont une signification, il existe une syntaxe
tendue, accessible en signifiant l'option intgre x. Avec la syntaxe tendue, les caractres espace dans l'ER sont ignors comme
le sont tous les caractres entre un # et le retour-chariot qui suit (ou la fin de l'ER). Ceci permet de mettre en paragraphe et de
commenter une ER complexe. Il existe trois exceptions cette rgle de base :
caractre espace et commentaires ne peuvent pas apparatre dans les symboles multi-caractres, tels que (?:
Pour cela, les caractres espace sont l'espace, la tabulation, le retour chariot et tout caractre appartenant la classe de caractre
space.
Enfin, dans une ERA, en dehors d'expressions entre crochets, la squence (?#ttt) (o ttt est tout texte ne contenant pas )) est
un commentaire, totalement ignor. L encore, cela n'est pas permis entre les caractres des symboles multi-caractres comme
(?:. De tels commentaires sont plus un artefact historique qu'une fonctionnalit utile et leur utilisation est obsolte ; on utilise
plutt la syntaxe tendue.
Aucune de ces extensions mtasyntaxique n'est disponible si un directeur initial ***= indique que la saisie utilisateur doit tre
traite comme une chane littrale plutt que comme une ER.
la plupart des atomes, et toutes les contraintes, n'ont pas d'attribut de gourmandise (parce qu'ils ne peuvent, en aucune faon,
tablir de correspondance avec des quantits variables de texte) ;
un atome quantifi avec un quantificateur rptition fixe ({m} ou {m}?) a la mme gourmandise (ventuellement aucune)
144
Fonctions et oprateurs
un atome quantifi avec d'autres quantificateurs standard (dont {m,n} avec m gal n) est gourmand (prfre la plus grande
correspondance) ;
un atome quantifi avec un quantificateur non gourmand (dont {m,n}? avec m gal n) n'est pas gourmand (prfre la plus
courte correspondance) ;
une branche -- c'est--dire une ER dpourvue d'oprateur | au sommet -- est aussi gourmande que le premier atome quantifi
qu'elle contient qui possde un attribut de gourmandise ;
une ER constitue au minimum de deux branches connectes par l'oprateur | est toujours gourmande.
Les rgles ci-dessus associent les attributs de gourmandise non seulement avec les atomes quantifis individuels, mais aussi avec
les branches et les ER compltes qui contiennent des atomes quantifis. Cela signifie que la correspondance est tablie de sorte
que la branche, ou l'ER complte, corresponde la sous-chane la plus longue ou la plus courte possible comme un tout. Une fois
la longueur de la correspondance complte dtermine, la partie de cette correspondance qui tablit une correspondance avec une
sous-expression particulire est dtermine sur la base de l'attribut de gourmandise de cette sous-expression, priorit tant donne
aux sous-expressions commenant le plus tt dans l'ER.
Exemple de signification de tout cela :
SELECT SUBSTRING('XY1234Z', 'Y*([0-9]{1,3})');
Resultat : 123
SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})');
Resultat : 1
Dans le premier cas, l'ER dans son intgralit est gourmande parce que Y* est gourmand. Il peut tablir une correspondance qui
dbute Y et correspondre la chane la plus longue partir de l, soit Y123. La sortie reprend la partie entre parenthses, soit
123. Dans le second cas, l'ER dans son ensemble n'est pas gourmande car Y*? ne l'est pas. Il peut tablir une correspondance qui
dbute Y et correspond la chane la plus courte partir de l, soit Y1. La sous-expression [0-9]{1,3} est gourmande mais
elle ne peut pas changer la dcision sur la longueur totale de la correspondance ; elle ne peut donc correspondre qu' 1.
En rsum, quand une ER contient la fois des sous-expressions gourmandes et non gourmandes, la longueur de la correspondance totale est soit aussi longue que possible soit aussi courte que possible, en fonction de l'attribut affect l'ER complte. Les
attributs assigns aux sous-expressions permettent uniquement de dterminer la partie de la correspondance qu'elles peuvent incorporer les unes par rapport aux autres.
Les quantificateurs {1,1} et {1,1}? peuvent tre utiliss pour forcer, respectivement, la prfrence la plus longue
(gourmandise) ou la plus courte (retenue), sur une sous-expression ou une ER complte.
Les longueurs de correspondance sont mesurs en caractres, et non en lments d'interclassement. Une chane vide est considre
plus grande que pas de correspondance du tout. Par exemple : bb* correspond aux trois caractres du milieu de abbbc ;
(week|wee)(night|knights) correspond aux dix caractres de weeknights ; lorsque une correspondance est recherche entre (.*).* et abc, la sous-expression entre parenthses correspond aux trois caractres ; et lorsqu'une correspondance
est recherche entre (a*)* et bc, la fois l'ER et la sous-expression entre parenthses correspondent une chane vide.
Lorsqu'il est prcis que la recherche de correspondance ne tient pas compte de la casse, cela revient considrer que toutes les
distinctions de casse ont disparu de l'alphabet. Quand un caractre alphabtique, pour lequel existent diffrentes casses, apparat
comme un caractre ordinaire en dehors d'une expression entre crochets, il est en fait transform en une expression entre crochets
contenant les deux casses, c'est--dire que x devient [xX]. Quand il apparat dans une expression entre crochets, toutes les transformations de casse sont ajoutes l'expression entre crochets, c'est--dire que [x] devient [xX] et que [^x] devient [^xX].
Si la sensibilit aux retours chariots est prcise, . et les expressions entre crochets utilisant ^ n'tablissent jamais de correspondance avec le caractre de retour la ligne (de cette faon, les correspondances ne franchissent jamais les retours chariots sauf si
l'ER l'explicite), et ^ et $ tablissent une correspondance avec la chane vide, respectivement aprs et avant un retour chariot, en
plus d'tablir une correspondance respectivement au dbut et la fin de la chane. Mais les chappements d'ERA \A et \Z
n'tablissent toujours de correspondance qu'au dbut ou la fin de la chane.
Si une sensibilit partielle aux retours chariot est indique, cela affecte . et les expressions entre crochets, comme avec la sensibilit aux retours chariot, mais pas ^ et $.
Si une sensibilit partielle inverse aux retours chariot est indique, cela affecte ^ et $, comme avec la sensibilit aux retours chariot, mais pas . et les sous-expressions. Ceci n'est pas trs utile mais est toutefois fourni pour des raisons de symtrie.
Fonctions et oprateurs
ER.
La seule fonctionnalit des ERA qui soit incompatible avec les ERE POSIX est le maintien de la signification spciale de \ dans
les expressions entre crochets. Toutes les autres fonctionnalits ERA utilisent une syntaxe interdite, effets indfinis ou non spcifis dans les ERE POSIX ; la syntaxe *** des directeurs ne figure pas dans la syntaxe POSIX pour les ERB et les ERE.
Un grand nombre d'extensions ERA sont empruntes Perl mais certaines ont t modifies et quelques extensions Perl ne sont
pas prsentes. Les incompatibilits incluent \b, \B, le manque de traitement spcial pour le retour la ligne en fin de chane,
l'ajout d'expressions entre crochets aux expressions affectes par les correspondances avec retour la ligne, les restrictions sur les
parenthses et les rfrences dans les contraintes et la smantique de correspondance chanes les plus longues/les plus courtes (au
lieu de la premire rencontre).
Deux incompatibilits importantes existent entre les syntaxes ERA et ERE reconnues par les versions antrieures
PostgreSQL 7.4 :
dans les ERA, \ suivi d'un caractre alphanumrique est soit un chappement soit une erreur alors que dans les versions prcdentes, c'tait simplement un autre moyen d'crire un caractre alphanumrique. Ceci ne devrait pas poser trop de problmes
car il n'y avait aucune raison d'crire une telle squence dans les versions plus anciennes ;
dans les ERA, \ reste un caractre spcial l'intrieur de [], donc un \ l'intrieur d'une expression entre crochets doit tre
crit \\.
Fonction
Type en retour
to_char(timestamp, text
text)
to_char(interval,
text)
text
Description
Exemple
to_char(double
precision, text)
text
to_char(numeric,
text)
text
to_date(text,
text)
date
to_number(text,
text)
numeric
to_date('05
Dec
'DD Mon YYYY')
2000',
Fonctions et oprateurs
Fonction
Type en retour
Description
Exemple
to_timestamp(text, timestamp
text)
zone
with
timestamp
pre- zone
with
(doubl
to_timestampe
cision)
Dans une chane de motif pour to_char, il existe certains motifs qui sont reconnus et remplacs avec des donnes correctement
formates bases sur la valeur. Tout texte qui n'est pas un motif est copi sans modification. De faon similaire, dans toute chane
de motif en entre (tout sauf to_char), les motifs identifient les valeurs fournir la chane de donnes en entre.
Le Tableau 9.21, Modles pour le formatage de champs de type date/heure affiche les motifs disponibles pour formater les valeurs de types date et heure.
Tableau 9.21. Modles pour le formatage de champs de type date/heure
Modle
Description
HH
HH12
HH24
MI
minute (00-59)
SS
seconde (00-59)
MS
milliseconde (000-999)
US
microseconde (000000-999999)
SSSS
AM ou am ou PM ou pm
A.M. ou a.m.
P.M. ou p.m.
YYYY
YYY
YY
IYYY
IYY
IY
BC, bc, AD ou ad
nom complet du mois en majuscules (espaces de compltement pour arriver neuf caractres)
Month
nom complet du mois en casse mixte (espaces de compltement pour arriver neuf caractres)
month
nom complet du mois en minuscules (espaces de compltement pour arriver neuf caractres)
MON
abrviation du nom du mois en majuscules (trois caractres en anglais, la longueur des versions localises peut varier)
Mon
abrviation du nom du mois avec la premire lettre en majuscule et les deux autres en minuscule (trois
caractres en anglais, la longueur des versions localises peut varier)
mon
abrviation du nom du mois en minuscules (trois caractres en anglais, la longueur des versions localises peut varier)
147
Fonctions et oprateurs
Modle
Description
MM
DAY
nom complet du jour en majuscules (espaces de compltement pour arriver neuf caractres)
Day
nom complet du jour avec la premire lettre en majuscule et les deux autres en minuscule (espaces de
compltement pour arriver neuf caractres)
day
nom complet du jour en minuscules (espaces de compltement pour arriver neuf caractres)
DY
abrviation du nom du jour en majuscules (trois caractres en anglais, la longueur des versions localises peut varier)
Dy
abrviation du nom du jour avec la premire lettre en majuscule et les deux autres en minuscule (trois
caractres en anglais, la longueur des versions localises peut varier)
dy
abrviation du nom du jour en minuscules (trois caractres en anglais, la longueur des versions localises peut varier)
DDD
IDDD
jour ISO de l'anne (001-371 ; le jour 1 de l'anne est le lundi de la premire semaine ISO.)
DD
ID
numro de semaine du mois, de 1 5 (la premire semaine commence le premier jour du mois)
WW
numro de la semaine dans l'anne, de 1 53 (la premire semaine commence le premier jour de
l'anne)
IW
numro ISO de la semaine dans l'anne (01 - 53 ; le premier jeudi de la nouvelle anne est dans la semaine 1)
CC
Jour dans le calendrier Julien (nombre de jours depuis le 24 novembre -4714 minuit)
RM
rm
TZ
tz
Les modificateurs peuvent tre appliqus tous les motifs pour en changer le comportement. Par exemple, FMMonth est le motif
Month avec le modificateur FM. Le Tableau 9.22, Modificateurs de motifs pour le formatage des dates/heures affiche les modificateurs de motifs pour le formatage des dates/heures.
Tableau 9.22. Modificateurs de motifs pour le formatage des dates/heures
Modificateur
Description
prfixe FM
mode remplissage (Fill Mode) (supprime les espaces et les zros de compltion en FMMonth
fin)
Exemple
suffixe TH
DDTH
suffixe th
DDth
prfixe FX
FX Month DD D
ay
prfixe TM
mode de traduction (affiche les noms des jours et mois localiss en fonction de TMMonth
lc_time)
suffixe SP
DDSP
FM supprime les zros de dbut et les espaces de fin qui, autrement, sont ajouts pour fixer la taille du motif de sortie ; Dans
148
Fonctions et oprateurs
PostgreSQL, FM modifie seulement la prochaine spcification alors qu'avec Oracle, FM affecte toutes les spcifications suivantes et des modificateurs FM rpts bascule l'activation du mode de remplissage.
to_timestamp et to_date ignorent les espaces multiples de la chane en entre si l'option FX n'est pas utilise. Par
exemple, to_timestamp('2000
JUN', 'YYYY MON') fonctionne mais to_timestamp('2000
JUN',
'FXYYYY MON') renvoie une erreur car to_timestamp n'attend qu'une seule espace ; FX doit tre indiqu comme premier lment du modle.
il est possible d'insrer du texte ordinaire dans les modles to_char. il est alors littralement remis en sortie. Une souschane peut tre place entre guillemets doubles pour forcer son interprtation en tant que libell mme si elle contient des
mots cls de motif. Par exemple, dans '"Hello Year "YYYY', les caractres YYYY sont remplacs par l'anne mais l'Y
isol du mot Year ne l'est pas ; Dans to_date, to_number et to_timestamp, les chanes entre guillemets doubles
ignorent le nombre de caractres en entre contenus dans la chane, par exemple "XX" ignorent les deux caractres en entre.
pour afficher un guillemet double dans la sortie, il faut le faire prcder d'un antislash. '\"YYYY Month\"', par exemple.
la conversion YYYY d'une chane en champ de type timestamp ou date comporte une restriction avec les annes plus de
quatre chiffres. Il faut alors utiliser un modle ou un caractre non-numrique aprs YYYY, sans quoi l'anne est toujours interprte sur quatre chiffres. Par exemple, pour l'anne 20000 : to_date('200001131', 'YYYYMMDD') est interprt
comme une anne quatre chiffres ; il faut alors utiliser un sparateur non dcimal aprs l'anne comme
to_date('20000-1131', 'YYYY-MMDD') ou to_date('20000Nov31', 'YYYYMonDD') ;
dans les conversions de chane en timestamp ou date, le champ CC (sicle) est ignor s'il y a un champ YYY, YYYY ou Y,YYY.
Si CC est utilis avec YY ou Y, alors l'anne est calcule comme (CC-1)*100+YY ;
Une date de semaine ISO (distinct de la date grgorienne) peut tre passe to_timestamp et to_date de deux faons :
Anne, semaine et jour de la semaine. Par exemple, to_date('2006-42-4', 'IYYY-IW-ID') renvoie la date
2006-10-19. En cas d'omission du jour de la semaine, lundi est utilis.
Anne et jour de l'anne. Par exemple, to_date('2006-291', 'IYYY-IDDD') renvoie aussi 2006-10-19.
Essayer de construire une date en utilisant un mlange de champs de semaine ISO et de date grgorienne n'a pas de sens et renverra du coup une erreur. Dans le contexte d'une anne ISO, le concept d'un mois ou du jour d'un mois n'a pas de signification. Dans le contexte d'une anne grgorienne, la semaine ISO n'a pas de signification. Les utilisateurs doivent viter de
mixer les spcifications grgoriennes et les dates ISO.
les valeurs en millisecondes (MS) et microsecondes (US) dans une conversion de chane en champ de type timestamp sont utilises comme partie dcimale des secondes. Par exemple, to_timestamp('12:3', 'SS:MS') n'est pas 3 millisecondes
mais 300 car la conversion le compte comme 12 + 0,3 secondes. Cela signifie que pour le format SS:MS, les valeurs d'entre
12:3, 12:30 et 12:300 indiquent le mme nombre de millisecondes. Pour obtenir trois millisecondes, il faut crire
12:003 que la conversion compte comme 12 + 0,003 = 12,003 secondes.
Exemple plus complexe : to_timestamp('15:12:02.020.001230', 'HH:MI:SS.MS.US') reprsente 15
heures, 12 minutes et (2 secondes + 20 millisecondes + 1230 microsecondes =) 2,021230 secondes ;
to_char(interval) formate HH et HH12 comme indiqu dans une horloge sur 12 heures, c'est--dire que l'heure 0 et
l'heure 36 sont affiches 12, alors que HH24 affiche la valeur heure complte, qui peut mme dpasser 23 pour les
Le Tableau 9.23, Motifs de modle pour le formatage de valeurs numriques affiche les motifs de modle disponibles pour le
formatage des valeurs numriques.
Tableau 9.23. Motifs de modle pour le formatage de valeurs numriques
Motif
Description
. (point)
point dcimal
, (virgule)
PR
Fonctions et oprateurs
Motif
Description
MI
PL
SG
RN
TH ou th
EEEE
un signe format l'aide de SG, PL ou MI n'est pas ancr au nombre ; par exemple, to_char(-12, 'S9999') produit
' -12' mais to_char(-12, 'MI9999') produit '- 12'. L'implantation Oracle n'autorise pas l'utilisation de MI
devant 9, mais requiert plutt que 9 prcde MI ;
9 est transform en valeur avec le mme nombre de chiffres qu'il y a de 9. Si un chiffre n'est pas disponible, il est remplac par
une espace ;
TH ne convertit pas les valeurs infrieures zro et ne convertit pas les nombres fractionnels ;
V multiplie effectivement les valeurs en entre par 10^n, o n est le nombre de chiffres qui suit V. to_char ne supporte pas
l'utilisation de V combin avec un point dcimal (donc 99.9V99 n'est pas autoris).
EEEE (notation scientifique) ne peut pas tre utilis en combinaison avec un des autres motifs de formatage ou avec un autre
modificateur, en dehors des motifs chiffre et de point dcimal, et doit tre plac la fin de la chane de format (par exemple,
9.99EEEE est valide).
Certains modificateurs peuvent tre appliqus un motif pour modifier son comportement. Par exemple, FM9999 est le motif
9999 avec le modificateur FM. Tableau 9.24, Modifications de motifs pour le formatage numrique affiche les motifs pour le
formatage numrique.
Tableau 9.24. Modifications de motifs pour le formatage numrique
Modificateur
Description
Exemple
prfixe FM
suffixe TH
suffixe th
Le Tableau 9.25, Exemples avec to_char affiche quelques exemples de l'utilisation de la fonction to_char.
Tableau 9.25. Exemples avec to_char
Expression
to_char(current_timestamp, 'Day, DD
Rsultat
HH12:MI:SS')
HH12:MI:SS')
'Tuesday
'Tuesday, 6
to_char(-0.1, '99.99')
'
to_char(-0.1, 'FM9.99')
'-.1'
to_char(0.1, '0.9')
' 0.1'
to_char(12, '9990999.9')
'
150
, 06
-.10'
0012.0'
05:39:18'
05:39:18'
Fonctions et oprateurs
Expression
Rsultat
to_char(12, 'FM9990999.9')
'0012.'
to_char(485, '999')
' 485'
to_char(-485, '999')
'-485'
' 4 8 5'
to_char(1485, '9,999')
' 1,485'
to_char(1485, '9G999')
' 1 485'
to_char(148.5, '999.999')
' 148.500'
to_char(148.5, 'FM999.999')
'148.5'
to_char(148.5, 'FM999.990')
'148.500'
to_char(148.5, '999D999')
' 148,500'
to_char(3148.5, '9G999D999')
' 3 148,500'
to_char(-485, '999S')
'485-'
to_char(-485, '999MI')
'485-'
to_char(485, '999MI')
'485 '
to_char(485, 'FM999MI')
'485'
to_char(485, 'PL999')
'+485'
to_char(485, 'SG999')
'+485'
to_char(-485, 'SG999')
'-485'
to_char(-485, '9SG99')
'4-85'
to_char(-485, '999PR')
'<485>'
to_char(485, 'L999')
'DM 485
to_char(485, 'RN')
'
to_char(485, 'FMRN')
'CDLXXXV'
to_char(5.2, 'FMRN')
'V'
to_char(482, '999th')
' 482nd'
to_char(12, '99V999')
' 12000'
to_char(12.4, '99V999')
' 12400'
to_char(12.45, '99V9')
' 125'
to_char(0.0004859, '9.99EEEE')
' 4.86e-04'
CDLXXXV'
Oprateur
Exemple
Rsultat
date '2001-10-05'
151
Fonctions et oprateurs
Oprateur
Exemple
Rsultat
time '04:00:00'
interval '-23:00:00'
interval '02:00:00'
time '03:00:00'
interval '00:15:00'
date '2001-09-24'
Fonction
Code de Description
retour
Exemple
Rsultat
age(timestamp, timestamp)
interval
age(timestamp
'2001-04-10',
timestamp
'1957-06-13')
43 years 9
mons
27
days
age(timestamp)
interval
43 years 8
mons 3 days
clock_timestamp()
current_date
date
current_time
current_timestamp
date_part(text, timestamp)
double
Obtenir
152
un
sous-champ date_part('hour' 20
Fonctions et oprateurs
Fonction
Code de Description
retour
Exemple
Rsultat
double
Obtenir un sous-champ date_part('month 3
precision (quivalent extract) ; ', interval '2
voir la Section 9.9.1, EX- years 3 months')
TRACT, date_part
date_trunc(text, timestamp)
date_trunc('hour 2001-02-16
',
timestamp 20:00:00
'2001-02-16
20:38:40')
double
Obtenir un sous-champ ; extract(month
3
precision voir la Section 9.9.1, EX- from interval '2
TRACT, date_part
years 3 months')
isfinite(date)
boolean
true
isfinite(timestamp)
boolean
true
isfinite(interval)
boolean
justify_days(interval)
interval
justify_hours(interval)
interval
justify_interval(interval)
interval
localtime
time
localtimestamp
now()
statement_timestamp()
isfitrue
nite(interval '4
hours')
5
justi29
days
fy_interval(inte 23:00:00
rval '1 mon -1
hour')
Fonctions et oprateurs
Fonction
Code de Description
retour
timeofday()
text
transaction_timestamp()
Exemple
Rsultat
Lors de l'ajout (ou de la soustraction) d'une valeur de type interval une valeur de type timestamp with time zone, le composant
jours incrmente (ou dcremente) la date du timestamp with time zone du nombre de jours indiqus. Avec les modifications occasionnes par les changements d'heure (avec un fuseau horaire de session qui reconnat DST), cela signifie qu'un interval '1
day' n'est pas forcment gal un interval '24 hours'. Par exemple, avec un fuseau horaire configur CST7CDT, timestamp with time zone '2005-04-02 12:00-07' + interval '1 day' produit un timestamp with
time zone '2005-04-03 12:00-06' alors qu'ajouter interval '24 hours' au timestamp with time zone initial
produit un timestamp with time zone '2005-04-03 13:00-06' parce qu'il y a un changement d'heure le
2005-04-03 02:00 pour le fuseau horaire CST7CDT.
Il peut y avoir une ambigut dans le nombre de months retourns par age car les mois n'ont pas tous le mme nombre de jours.
L'approche de PostgreSQL utilise le mois de la date la plus ancienne lors du calcul de mois partiels. Par exemple,
age('2004-06-01', '2004-04-30') utilise avril pour ramener 1 mon 1 day, alors qu'utiliser mai aurait ramener 1
mon 2 days car mai a 31 jours alors qu'avril n'en a que 30.
Fonctions et oprateurs
Le sicle.
SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13');
Rsultat : 20
SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40');
Rsultat : 21
Le premier sicle commence le 1er janvier de l'an 1 (0001-01-01 00:00:00 AD) bien qu'ils ne le savaient pas cette poque.
Cette dfinition s'applique tous les pays qui utilisent le calendrier Grgorien. Le sicle 0 n'existe pas. On passe de -1 sicle
1 sicle. En cas de dsaccord, adresser une plainte : Sa Saintet le Pape, Cathdrale Saint-Pierre de Rome, Vatican.
Les versions de PostgreSQL antrieures la 8.0 ne suivaient pas la numrotation conventionnelle des sicles mais renvoyaient uniquement le champ anne divise par 100.
day
Pour les valeurs de type timestamp, le champ du jour (du mois), donc entre 1 et 31 ; pour les valeurs de type interval, le
nombre de jours
SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40');
Rsultat : 16
SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute');
Result: 40
decade
Le champ anne divis par 10.
SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40');
Rsultat : 200
dow
Le jour de la semaine du dimanche (0) au samedi (6).
SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');
Rsultat : 5
Cette numrotation du jour de la semaine est diffrente de celle de la fonction to_char(..., 'D').
doy
Le jour de l'anne (de 1 365/366).
SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40');
Rsultat : 47
epoch
Pour les valeurs de type date et timestamp, le nombre de secondes depuis le 1er janvier 1970 (exactement depuis le
1970-01-01 00:00:00 UTC). Ce nombre peut tre ngatif. Pour les valeurs de type interval, il s'agit du nombre total de secondes dans l'intervalle.
SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08');
Rsultat :
982384720.12
SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours');
Rsultat :
442800
Convertir une valeur epoch en valeur de type date/heure :
SELECT TIMESTAMP WITH TIME ZONE 'epoch' + 982384720.12 * INTERVAL '1 second';
(La fonction to_timestamp encapsule la conversion ci-dessus.)
hour
Le champ heure (0 - 23).
SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
Rsultat : 20
isodow
155
Fonctions et oprateurs
Fonctions et oprateurs
Rsultat : 1
second
Le champs secondes, incluant la partie dcimale (0 - 591).
SELECT EXTRACT(SECOND FROM TIMESTAMP '2001-02-16 20:38:40');
Rsultat : 40
SELECT EXTRACT(SECOND FROM TIME '17:12:28.5');
Rsultat :
28.5
timezone
Le dcalage du fuseau horaire depuis UTC, mesur en secondes. Les valeurs positives correspondent aux fuseaux horaires
l'est d'UTC, les valeurs ngatives l'ouest d'UTC. (Techniquement, PostgreSQL utilise UT1 plutt que UTC car les secondes intercalaires ne sont pas gres.)
timezone_hour
Le composant heure du dcalage du fuseau horaire.
timezone_minute
Le composant minute du dcalage du fuseau horaire.
week
Le numro de la semaine dans l'anne, laquelle appartient le jour. Par dfinition (ISO 8601), les semaines commencent le
lundi et la premire semaine d'une anne contient le 4 janvier de cette anne. Autrement dit, le premier jeudi d'une anne se
trouve dans la premire semaine de cette anne.
Dans la dfinition ISO, il est possible que les premiers jours de janvier fassent partie de la semaine 52 ou 53 de l'anne prcdente. Il est aussi possibles que les derniers jours de dcembre fassent partie de la premire semaine de l'anne suivante. Par
exemple, 2005-01-01 fait partie de la semaine 53 de l'anne 2004 et 2006-01-01 fait partie de la semaine 52 de l'anne
2005, alors que 2012-12-31 fait partie de la premire semaine de 2013. Il est recommand d'utiliser le champ isoyear
avec week pour obtenir des rsultats cohrents.
SELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40');
Rsultat : 7
year
Le champ anne. Il n'y a pas de 0 AD, la soustraction d'annes BC aux annes AD ncessite donc une attention particulire.
SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40');
Rsultat :
2001
La fonction extract a pour but principal l'excution de calculs. Pour le formatage des valeurs date/heure en vue de leur affichage, voir la Section 9.8, Fonctions de formatage des types de donnes .
La fonction date_part est modele sur l'quivalent traditionnel Ingres de la fonction extract du standard SQL :
date_part('champ', source)
Le paramtre champ est obligatoirement une valeur de type chane et non pas un nom. Les noms de champ valide pour
date_part sont les mmes que pour extract.
SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');
Rsultat : 16
SELECT date_part('hour', INTERVAL '4 hours 3 minutes');
Rsultat : 4
9.9.2. date_trunc
La fonction date_trunc est conceptuellement similaire la fonction trunc pour les nombres.
date_trunc('champ', source)
source est une expression de type timestamp ou interval. (Les valeurs de type date et time sont converties automatiquement en,
1
60 si les secondes d'ajustement (leap second) sont implantes par le systme d'exploitation.
157
Fonctions et oprateurs
respectivement, timestamp ou interval). champ indique la prcision avec laquelle tronquer la valeur en entre. La valeur de retour
est de type timestamp ou interval avec tous les champs moins significatifs que celui slectionn positionns zro (ou un pour la
date et le mois).
Les valeurs valides pour champ sont :
microseconds
milliseconds
second
minute
hour
day
week
month
quarter
year
decade
century
millennium
Exemples :
SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');
Rsultat : 2001-02-16
20:00:00
SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40');
Rsultat : 2001-01-01
00:00:00
Expression
timestamp without time zone AT TIME timestamp with Traite l'estampille donne without time zone (sans fuZONE zone
time zone
seau), comme situe dans le fuseau horaire indiqu.
timestamp with time zone AT TIME ZONE timestamp wi- Convertit l'estampille donne with time zone (avec fuzone
thout time zone seau) dans le nouveau fuseau horaire, sans dsignation
du fuseau.
time with time zone AT TIME ZONE zone time with time Convertit l'heure donne with time zone (avec fuseau)
zone
dans le nouveau fuseau horaire.
Dans ces expressions, le fuseau horaire dsir zone peut tre indiqu comme une chane texte (par exemple, 'PST') ou comme
un intervalle (c'est--dire INTERVAL '-08:00'). Dans le cas textuel, un nom de fuseau peut tre indiqu de toute faon dcrite
dans Section 8.5.3, Fuseaux horaires .
Exemples (en supposant que le fuseau horaire local soit PST8PDT) :
SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'MST';
Rsultat : 2001-02-16
19:38:40-08
SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST';
Rsultat : 2001-02-16
18:38:40
Le premier exemple prend une estampille temporelle sans fuseau et l'interprte comme une date MST (UTC-7), qui est ensuite
convertie en PST (UTC-8) pour l'affichage. Le second exemple prend une estampille indique en EST (UTC-5) et la convertit en
heure locale, c'est--dire en MST (UTC-7).
La fonction timezone(zone, timestamp) est quivalente la construction conforme au standard SQL, timestamp AT
TIME ZONE zone.
158
Fonctions et oprateurs
Note
D'autres systmes de bases de donnes actualisent ces valeurs plus frquemment.
PostgreSQL fournit aussi des fonctions qui renvoient l'heure de dbut de l'instruction en cours, voire l'heure de l'appel de la
fonction. La liste complte des fonctions ne faisant pas partie du standard SQL est :
transaction_timestamp()
statement_timestamp()
clock_timestamp()
timeofday()
now()
transaction_timestamp() est un peu l'quivalent de CURRENT_TIMESTAMP mais est nomm ainsi pour expliciter
l'information retourne. statement_timestamp() renvoie l'heure de dbut de l'instruction en cours (plus exactement, l'heure
de rception du dernier message de la commande en provenance du client). statement_timestamp() et transaction_timestamp() renvoient la mme valeur pendant la premire commande d'une transaction, mais leurs rsultats peuvent
diffrer pour les commandes suivantes. clock_timestamp() renvoie l'heure courante, et, de ce fait, sa valeur change mme
l'intrieur d'une commande SQL unique. timeofday() est une fonction historique de PostgreSQL. Comme
159
Fonctions et oprateurs
clock_timestamp(), elle renvoie l'heure courante, mais celle-ci est alors formate comme une chane text et non comme une
valeur de type timestamp with time zone. now() est l'quivalent traditionnel PostgreSQL de CURRENT_TIMESTAMP.
Tous les types de donnes date/heure acceptent aussi la valeur littrale spciale now pour indiquer la date et l'heure courantes
(interprts comme l'heure de dbut de la transaction). De ce fait, les trois instructions suivantes renvoient le mme rsultat :
SELECT CURRENT_TIMESTAMP;
SELECT now();
SELECT TIMESTAMP 'now'; -- utilisation incorrecte avec DEFAULT
Astuce
La troisime forme ne doit pas tre utilise pour la spcification de la clause DEFAULT la cration d'une table. Le
systme convertirait now en valeur de type timestamp ds l'analyse de la constante. chaque fois que la valeur par
dfaut est ncessaire, c'est l'heure de cration de la table qui est alors utilise. Les deux premires formes ne sont
pas values avant l'utilisation de la valeur par dfaut, il s'agit d'appels de fonctions. C'est donc bien le comportement attendu, l'heure d'insertion comme valeur par dfaut, qui est obtenu.
Note
La rsolution relle de l'intervalle est spcifique la plateforme ; 0,01 seconde est une valeur habituelle. Le dlai
dure au minimum celui prcis. Il peut toutefois tre plus long du fait de certains facteurs tels que la charge serveur.
Avertissement
Il convient de s'assurer que la session courante ne dtient pas plus de verrous que ncessaires lors de l'appel
pg_sleep. Dans le cas contraire, d'autres sessions peuvent tre amenes attendre que le processus de retard courant ne termine, ralentissant ainsi tout le systme.
Fonction
Description
enum_first(anyenum)
Exemple
enum_last(anyenum)
enum_range(anyenum)
160
Rsultat de l'exemple
Fonctions et oprateurs
Fonction
Description
Exemple
Rsultat de l'exemple
enum_range(anyenum,
anyenum)
enum_range('orange':: {orange,jaune,vert}
couleurs,
'vert'::couleurs)
enum_range(NULL,
'vert'::couleurs)
{rouge,orange,jaune,v
ert}
enum_range('orange':: {orange,jaune,vert,bl
couleurs, NULL)
eu,violet}
En dehors de la forme deux arguments de enum_range, ces fonctions ne tiennent pas compte de la valeur qui leur est fournie ;
elles ne s'attachent qu'au type de donne dclar. NULL ou une valeur spcifique du type peut tre passe, le rsultat est le mme.
Il est plus commun d'appliquer ces fonctions la colonne d'une table ou l'argument d'une fonction qu' un nom de type en dur,
comme le suggrent les exemples.
Attention
L'oprateur identique , ~=, reprsente la notion habituelle d'galit pour les types point, box, polygon et circle.
Certains disposent galement d'un oprateur =, mais = ne compare que les galits d'aires. Les autres oprateurs de
comparaison scalaires (<= et autres) comparent de la mme faon des aires pour ces types.
Tableau 9.30. Oprateurs gomtriques
Oprateur
Description
Exemple
Translation
box
'((0,0),(1,1))'
'(2.0,0)'
point
Translation
box
'((0,0),(1,1))'
'(2.0,0)'
point
Mise l'chelle/rotation
box
'((0,0),(1,1))'
'(2.0,0)'
point
Mise l'chelle/rotation
box
'((0,0),(2,2))'
'(2.0,0)'
point
'((1,-1),(-1,1))'
'((1,1),(-1,-1))'
# '((1,0),(0,1),(-1,0))'
@-@
Longueur ou circonfrence
@@
Centre
@@ circle '((0,0),10)'
##
##
<->
Distance entre
<->
&&
<<
circle
'((0,0),1)'
'((5,0),1)'
<<
circle
>>
circle
'((5,0),1)'
'((0,0),1)'
>>
circle
&<
box
'((0,0),(1,1))'
'((0,0),(2,2))'
circle
'((0,0),1)'
'((5,0),1)'
161
lseg
&&
&<
circle
box
box
Fonctions et oprateurs
Oprateur
Description
Exemple
&>
box
'((0,0),(3,3))'
'((0,0),(2,2))'
&>
box
<<|
box
'((0,0),(3,3))'
'((3,4),(5,5))'
<<|
box
|>>
box
'((3,4),(5,5))'
'((0,0),(3,3))'
|>>
box
&<|
box
'((0,0),(1,1))'
'((0,0),(2,2))'
&<|
box
|&>
box
'((0,0),(3,3))'
'((0,0),(2,2))'
|&>
box
<^
circle
'((0,0),1)'
'((0,5),1)'
<^
circle
>^
circle
'((0,5),1)'
'((0,0),1)'
>^
circle
?#
Intersection ?
lseg
'((-1,0),(1,0))'
'((-2,-2),(2,2))'
?-
Horizontal ?
?- lseg '((-1,0),(1,0))'
?-
?|
Vertical ?
?| lseg '((-1,0),(1,0))'
?|
?-|
Perpendiculaires ?
lseg
'((0,0),(0,1))'
'((0,0),(1,0))'
?-|
lseg
?||
Parallles ?
lseg '((-1,0),(1,0))'
'((-1,2),(1,2))'
?||
lseg
@>
Contient ?
circle
'(1,1)'
<@
Contenu ou dessus ?
point
'(1,1)'
'((0,0),2)'
~=
Identique ?
'((0,0),2)'
?#
box
@>
<@
point
circle
Note
Avant PostgreSQL 8.2, les oprateurs @> et <@ s'appelaient respectivement ~ et @. Ces noms sont toujours disponibles mais, obsoltes, ils seront ventuellement supprims.
Tableau 9.31. Fonctions gomtriques
Fonction
Type de retour
Description
Exemple
area (object)
double precision
aire
area(box
'((0,0),(1,1))')
center (object)
point
centre
center(box
'((0,0),(1,2))')
diameter(circle)
double precision
diamtre du cercle
diameter(circle
'((0,0),2.0)')
height(box)
double precision
isclosed(path)
boolean
chemin ferm ?
isclosed(path
'((0,0),(1,1),(2,0))'
)
isopen(path)
boolean
chemin ouvert ?
isopen(path
162
Fonctions et oprateurs
Fonction
Type de retour
Description
Exemple
'[(0,0),(1,1),(2,0)]'
)
length(object)
double precision
longueur
length(path
'((-1,0),(1,0))')
npoints(path)
int
nombre de points
npoints(path
'[(0,0),(1,1),(2,0)]'
)
npoints(polygon)
int
nombre de points
npoints(polygon
'((1,1),(0,0))')
pclose(path)
path
popen(path)
path
radius(circle)
double precision
rayon du cercle
width(box)
double precision
taille horizontale
d'une bote
radius(circle
'((0,0),2.0)')
(largeur) width(box
'((0,0),(1,1))')
Fonction
Type de retour
Description
Exemple
box(circle)
box
box(circle
'((0,0),2.0)')
circle(box)
box
box(point
'(0,0)',
point '(1,1)')
box(polygon)
box
box(polygon
'((0,0),(1,1),(2,0))'
)
circle(box)
circle
circle(box
'((0,0),(1,1))')
circle(point '(0,0)',
2.0)
circle(polygon
'((0,0),(1,1),(2,0))'
)
circle(point,
precision)
double circle
circle(polygon)
circle
lseg(box)
lseg
lseg(point, point)
lseg
lseg(point '(-1,0)',
point '(1,0)')
path(polygon)
path
path(polygon
'((0,0),(1,1),(2,0))'
)
point de construction
point(23.4, -44.5)
point(double
sion, double
sion)
preci- point
preci-
point(box)
point
centre de la bote
point(box
'((-1,0),(1,0))')
point(circle)
point
centre du cercle
point(circle
'((0,0),2.0)')
point(lseg)
point
point(lseg
'((-1,0),(1,0))')
163
Fonctions et oprateurs
Fonction
Type de retour
Description
Exemple
point(polygon)
point
centre de polygone
point(polygon
'((0,0),(1,1),(2,0))'
)
polygon(box)
polygon
polygon(circle)
polygon
polygon
polygon(path
'((0,0),(1,1),(2,0))'
)
Il est possible d'accder aux deux composants d'un point comme si c'tait un tableau avec des index 0 et 1. Par exemple, si t.p est
une colonne de type point, alors SELECT p[0] FROM t rcupre la coordonne X et UPDATE t SET p[1] = ... modifie la coordonne Y. De la mme faon, une valeur de type box ou lseg peut tre traite comme un tableau de deux valeurs de type
point.
La fonction area est utilisable avec les types box, circle et path. Elle ne fonctionne avec le type de donnes path que s'il n'y a pas
d'intersection entre les points du path. Le path '((0,0),(0,1),(2,1),(2,2),(1,2),(1,0),(0,0))'::PATH, par
exemple,
ne
fonctionne
pas.
Le
path,
visuellement
identique,
'((0,0),(0,1),(1,1),(1,2),(2,2),(2,1),(1,1),(1,0),(0,0))'::PATH, quant lui, fonctionne. Si les
concepts de path avec intersection et sans intersection sont sources de confusion, dessiner les deux path ci-dessus cte--cte.
Oprateur
Description
Exemple
<
<=
est gal
>=
>
<>
<<
<<=
>>
contient
>>=
bitwise NOT
~ inet '192.168.1.6'
&
bitwise AND
bitwise OR
addition
inet '192.168.1.6' + 25
soustraction
inet '192.168.1.43' - 36
soustraction
Le Tableau 9.34, Fonctions cidr et inet affiche les fonctions utilisables avec les types cidr et inet. Les fonctions abbrev,
host, text ont principalement pour but d'offrir des formats d'affichage alternatifs.
164
Fonctions et oprateurs
Fonction
Type de retour
Description
Exemple
Rsultat
abbrev(inet)
text
format
textuel abbrev(inet
d'affichage raccourci
'10.1.0.0/16')
10.1.0.0/16
abbrev(cidr)
text
format
textuel abbrev(cidr
d'affichage raccourci
'10.1.0.0/16')
10.1/16
broadcast(inet)
inet
family(inet)
int
host(inet)
text
hostmask(inet)
inet
masklen(inet)
int
netmask(inet)
inet
network(inet)
cidr
set_masklen(inet inet
, int)
(cidr
set_masklen,
int)
cidr
text(inet)
text
192.168.1.5/32
Toute valeur cidr peut tre convertie en inet implicitement ou explicitement ; de ce fait, les fonctions indiques ci-dessus comme
oprant sur le type inet oprent aussi sur le type cidr. (Lorsque les fonctions sont spares pour les types inet et cidr, c'est que leur
comportement peut diffrer.) Il est galement permis de convertir une valeur inet en cidr. Dans ce cas, tout bit la droite du
masque rseau est silencieusement positionn zro pour crer une valeur cidr valide. De plus, une valeur de type texte peut tre
transtype en inet ou cidr l'aide de la syntaxe habituelle de transtypage : par exemple inet(expression) ou
nom_colonne::cidr.
Le Tableau 9.35, Fonctions macaddr affiche les fonctions utilsables avec le type macaddr. La fonction trunc(macaddr)
renvoie une adresse MAC avec les trois derniers octets initialiss zro. Ceci peut tre utilis pour associer le prfixe restant un
manufacturier.
Tableau 9.35. Fonctions macaddr
Fonction
Type de retour
Description
trunc(macaddr)
macaddr
165
Exemple
Rsultat
Fonctions et oprateurs
Le type macaddr supporte aussi les oprateurs relationnels standard (>, <=, etc.) de tri lexicographique.
Oprateur
Description
Exemple
Rsultat
@@
to_tsvector('fat cats t
ate
rats')
@@
to_tsquery('cat
&
rat')
@@@
synonym obsolte de @@
to_tsvector('fat cats t
ate
rats')
@@@
to_tsquery('cat
&
rat')
||
concatne tsvectors
'a:1
b:2'::tsvector 'a':1 'b':2,5 'c':3 'd':4
||
'c:1
d:2
b:3'::tsvector
&&
||
!!
!! 'cat'::tsquery
@>
'cat'::tsquery
@> f
'cat & rat'::tsquery
<@
'cat'::tsquery
<@ t
'cat & rat'::tsquery
!'cat'
Note
Les oprateurs de confinement de tsquery considrent seulement les lexmes lists dans les deux requtes, ignorant
les oprateurs de combinaison.
En plus des oprateurs prsents dans la table, les oprateurs de comparaison B-tree habituels (=, <, etc) sont dfinis pour les
types tsvector et tsquery. Ils ne sont pas trs utiles dans le cadre de la recherche plein texte mais permettent la construction d'index
d'unicit sur ces types de colonne.
Tableau 9.37. Fonctions de la recherche plein texte
Fonction
Type de retour
Description
Exemple
Rsultat
get_current_ts_c regconfig
onfig()
length(tsvector) integer
numnode(tsquery) integer
plain-
tsquery
& 5
|
'fat' & 'rat'
Fonctions et oprateurs
Fonction
Type de retour
to_tsquery([
config regconfig
,
]
requte
text)
querytree(requte tsquery)
text
settsvector
weight(tsvector,
"char")
strip(tsvector)
tsvector
Description
Exemple
Rsultat
ignorant la ponctuation
to_tsquery('engl
ish', 'The Fat
Rats')
'fat'
to_tsquery([
tsquery
config regconfig
,
]
requte
text)
to_tsvector([
tsvector
config regconfig
,
]
document
text)
ts_headline([
text
config
regconfig, ] document
text,
requte
tsquery [, options text ])
ts_rank([
poids float4
float4[], ] vecteur
tsvector,
requte
tsquery
[, normalization
integer ])
ts_rank_cd([
float4
weights
float4[], ] vector
tsvector,
requte
tsquery
[, normalization
integer ])
ts_rewrite(retsquery
qute
tsquery,
cible
tsquery,
substitution tsquery)
ts_rewrite(retsquery
qute
tsquery,
select text)
SELECT
'b' & ( 'foo' |
ts_rewrite('a
& 'bar' )
b'::tsquery, 'SELECT
t,s
FROM
aliases')
tsvectrigger
tor_update_trigg
er()
fonction
dclencheur
pour la mise jour automatique de colonne tsvector
CREATE
TRIGGER
...
tsvector_update_trigg
er(tsvcol,
'pg_catalog.swed
167
y x y <b>z</b>
ts_rank_cd('{0.1 2.01317
,
0.2,
0.4,
1.0}',
textsearch, query)
Fonctions et oprateurs
Fonction
Type de retour
Description
Exemple
Rsultat
fonction
dclencheur
pour la mise jour automatique de colonne tsvector
CREATE
TRIGGER
...
tsvector_update_trigg
er_column(tsvcol
,
configcol,
title, body)
Note
Toutes les fonctions de recherche plein texte qui acceptent un argument regconfig optionel utilisent la configuration
indiqe par default_text_search_config en cas d'omission de cet argument.
Les fonctions de Tableau 9.38, Fonctions de dbogage de la recherche plein texte sont listes sparment, car elles ne font pas
partie des fonctions utilises dans les oprations de recherche plein texte de tous les jours. Elles sont utiles pour le dveloppement
et le dbogage de nouvelles configurations de recherche plein texte.
Tableau 9.38. Fonctions de dbogage de la recherche plein texte
Fonction
Type de retour
Description
Exemple
Rsultat
ts_debug('englis
h', 'The Brightest
supernovaes')
(asciiword,"Word
,
all
ASCII",The,{englis
h_stem},english_
stem,{}) ...
teste un dictionnaire
ts_lexize('engli {star}
sh_stem',
'stars')
nom_ana
setof record
ts_parse(lyseur
text,
document
text, OUT tokid
integer, OUT token text)
teste un analyseur
oid_ana
setof record
ts_parse(lyseur
oid,
document
text,
OUT
id_jeton
integer, OUT jeton
text)
teste un analyseur
ts_parse(3722,
'foo - bar')
pa
setof record
rs
er
_n
am
ts_token_type(e
text, OUT tokid
integer,
OUT
ts_debug([
setof record
config
regconfig, ] document
text, OUT alias
text, OUT description
text,
OUT token text,
OUT dictionaries
regdictionary[],
OUT
dictionary
regdictionary,
OUT
lexemes
text[])
ts_lexize(dict
regdictionary,
jeton text)
text[]
168
(1,foo) ...
Fonctions et oprateurs
Fonction
alias text,
description
text)
Type de retour
Description
Exemple
Rsultat
OUT
oi
setof record
d_
an
al
ys
eu
ts_token_type(r
oid,
OUT
id_jeton
integer, OUT alias
text, OUT description text)
9.14.1.1. xmlcomment
xmlcomment(text)
La fonction xmlcomment cre une valeur XML contenant un commentaire XML avec, comme contenu, le texte indiqu. Le
texte ne peut pas contenir -- ou se terminer par un - de sorte que que la construction rsultante reprsente un commentaire XML valide. Si l'argument est NULL, le rsultat est NULL.
Exemple :
SELECT xmlcomment('bonjour');
xmlcomment
-------------<!--bonjour-->
9.14.1.2. xmlconcat
xmlconcat(xml[, ...])
La fonction xmlconcat concatne une liste de valeurs XML individuelles pour crer une valeur simple contenant un fragment
de contenu XML. Les valeurs NULL sont omises ; le rsultat est NULL seulement s'il n'y a pas d'arguments non NULL.
169
Fonctions et oprateurs
Exemple :
SELECT xmlconcat('<abc/>', '<bar>foo</bar>');
xmlconcat
---------------------<abc/><bar>foo</bar>
Les dclarations XML, si elles sont prsentes, sont combines come suit. Si toutes les valeurs en argument ont la mme dclaration de version XML, cette version est utilise dans le rsultat. Sinon aucune version n'est utilise. Si toutes les valeurs en argument ont la valeur de dclaration standalone yes , alors cette valeur est utilise dans le rsultat. Si toutes les valeurs en argument ont une valeur de dclaration standalone et qu'au moins l'une d'entre elles est no , alors cette valeur est utilise dans
le rsultat. Sinon le rsultat n'a aucune dclaration standalone . Si le rsultat ncessite une dclaration standalone sans dclaration de version, une dclaration de version 1.0 est utilise car le standard XML impose qu'une dclaration XML contienne
une dclaration de version. Les dclarations d'encodage sont ignores et supprimes dans tous les cas.
Exemple :
SELECT xmlconcat('<?xml version="1.1"?><foo/>', '<?xml version="1.1"
standalone="no"?><bar/>');
xmlconcat
----------------------------------<?xml version="1.1"?><foo/><bar/>
9.14.1.3. xmlelement
xmlelement(name nom [, xmlattributes(valeur [AS nom_attribut] [, ... ])] [, contenu,
...])
L'expression xmlelement produit un lment XML avec le nom, les attributs et le contenu donns.
Exemples :
SELECT xmlelement(name foo);
xmlelement
-----------<foo/>
SELECT xmlelement(name foo, xmlattributes('xyz' as bar));
xmlelement
-----------------<foo bar="xyz"/>
SELECT xmlelement(name foo, xmlattributes(current_date as bar), 'cont', 'ent');
xmlelement
------------------------------------<foo bar="2007-01-26">content</foo>
Les noms d'lment et d'attribut qui ne sont pas des noms XML valides sont modifis en remplaant les caractres indsirables par
une squence _xHHHH_, o HHHH est le codage Unicode du caractre en notation hexadcimal. Par exemple :
SELECT xmlelement(name "foo$bar", xmlattributes('xyz' as "a&b"));
xmlelement
---------------------------------<foo_x0024_bar a_x0026_b="xyz"/>
Un nom explicite d'attribut n'a pas besoin d'tre indiqu si la valeur de l'attribut est la rfrence d'une colonne, auquel cas le nom
de la colonne est utilis comme nom de l'attribut par dfaut. Dans tous les autres cas, l'attribut doit avoir un nom explicite. Donc,
170
Fonctions et oprateurs
9.14.1.4. xmlforest
xmlforest(contenu [AS nom] [, ...])
L'expression xmlforest produit un arbre XML (autrement dit une squence) d'lments utilisant les noms et le contenu donns.
Exemples :
SELECT xmlforest('abc' AS foo, 123 AS bar);
xmlforest
-----------------------------<foo>abc</foo><bar>123</bar>
SELECT xmlforest(table_name, column_name)
FROM information_schema.columns
WHERE table_schema = 'pg_catalog';
xmlforest
------------------------------------------------------------------------------------------<table_name>pg_authid</table_name><column_name>rolname</column_name>
<table_name>pg_authid</table_name><column_name>rolsuper</column_name>
...
Comme indiqu dans le second exemple, le nom de l'lment peut tre omis si la valeur du contenu est une rfrence de colonne,
auquel cas le nom de la colonne est utilis par dfaut. Sinon, un nom doit tre indiqu.
Les noms d'lments qui ne sont pas des noms XML valides sont chapps comme indiqu pour xmlelement ci-dessus. De
faon similaire, les donnes de contenu sont chappes pour rendre le contenu XML valide sauf s'il est dj de type xml.
Les arbres XML ne sont pas des documents XML valides s'ils sont constitus de plus d'un lment. Il peut donc s'avrer utile
d'emballer les expressions xmlforest dans xmlelement.
9.14.1.5. xmlpi
171
Fonctions et oprateurs
9.14.1.6. xmlroot
xmlroot(xml, version text | no value [, standalone yes|no|no value])
L'expression xmlroot modifie les proprits du nud racine d'une valeur XML. Si une version est indique, elle remplace la valeur dans la dclaration de version du nud racine. Si un paramtre standalone est spcifi, il remplace la valeur dans la dclaration standalone du nud racine.
SELECT xmlroot(xmlparse(document '<?xml version="1.1"?><content>abc</content>'),
version '1.0', standalone yes);
xmlroot
---------------------------------------<?xml version="1.0" standalone="yes"?>
<content>abc</content>
9.14.1.7. xmlagg
xmlagg(xml)
La fonction xmlagg est, la diffrence des fonctions dcrites ici, une fonction d'aggrgat. Elle concatne les valeurs en entre
pour les passer en argument la fonction d'aggrgat, comme le fait la fonction xmlconcat, sauf que la concatnation survient
entre les lignes plutt qu'entre les expressions d'une mme ligne. Voir Section 9.18, Fonctions d'agrgat pour plus
d'informations sur les fonctions d'agrgat.
Exemple :
CREATE
INSERT
INSERT
SELECT
172
Fonctions et oprateurs
9.14.2.1. IS DOCUMENT
xml IS DOCUMENT
L'expression IS DOCUMENT renvoie true si la valeur de l'argument XML est un document XML correct, false dans le cas
contraire (c'est--dire qu'il s'agit d'un fragment de document) ou NULL si l'argument est NULL. Voir la Section 8.13, Type
XML pour les diffrences entre documents et fragments de contenu.
9.14.2.2. XMLEXISTS
XMLEXISTS(text PASSING [BY REF] xml [BY REF])
La fonction xmlexists renvoie true si l'expression XPath dans le premier argument renvoie des nuds. Elle renvoie faux sinon.
(Si un des arguments est NULL, le rsultat est NULL.)
Exemple :
SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY REF
'<towns><town>Toronto</town><town>Ottawa</town></towns>');
xmlexists
-----------t
(1 row)
Les clauses BY REF n'ont pas d'effet dans PostgreSQL mais sont autorises pour se conformer au standard SQL et pour la compatibilit avec les autres implmentations. D'aprs le standard SQL, le premier BY REF est requis, le second est optionel. De plus,
notez que le standard SQL spcifie que la construction xmlexists prend une expression XQuery en premier argument mais
PostgreSQL supporte actuellement seulement XPath, qui est un sous-ensemble de XQuery.
9.14.2.3. xml_is_well_formed
xml_is_well_formed(text)
xml_is_well_formed_document(text)
xml_is_well_formed_content(text)
Ces fonctions vrifient si la chane text est du XML bien form et renvoient un rsultat boolen.
xml_is_well_formed_document vrifie si le document est bien form alors que xml_is_well_formed_content vrifie si le contenu est bien form. xml_is_well_formed est quivalent xml_is_well_formed_document si le paramtre de configuration xmloption vaut DOCUMENT et est quivalent xml_is_well_formed_content si le paramtre vaut
CONTENT. Cela signifie que xml_is_well_formed est utile pour savoir si une conversion au type xml va russir alors que les
deux autres sont utiles pour savoir si les variantes correspondantes de XMLPARSE vont russir.
Exemples :
SET xmloption TO DOCUMENT;
SELECT xml_is_well_formed('<>');
xml_is_well_formed
-------------------f
(1 row)
SELECT xml_is_well_formed('<abc/>');
173
Fonctions et oprateurs
xml_is_well_formed
-------------------t
(1 row)
SET xmloption TO CONTENT;
SELECT xml_is_well_formed('abc');
xml_is_well_formed
-------------------t
(1 row)
SELECT xml_is_well_formed_document('<pg:foo
xmlns:pg="http://postgresql.org/stuff">bar</pg:foo>');
xml_is_well_formed_document
----------------------------t
(1 row)
SELECT xml_is_well_formed_document('<pg:foo
xmlns:pg="http://postgresql.org/stuff">bar</my:foo>');
xml_is_well_formed_document
----------------------------f
(1 row)
Le dernier exemple monte que les vrifications incluent les correspondances d'espace de noms.
174
Fonctions et oprateurs
Fonctions et oprateurs
rassembler plus tard dans un document. Les fonctions pour produire du contenu XML discutes ci-dessus, en particulier xmlelement, peuvent tre utilises pour modifier les rsultats.
Les valeurs des donnes sont transformes de la mme faon que ce qui est dcrit ci-dessus pour la fonction xmlelement.
Le paramtre nulls dtermine si les valeurs NULL doivent tre incluses en sortie. true, les valeurs NULL dans les colonnes
sont reprsentes ainsi :
<columnname xsi:nil="true"/>
o xsi est le prfixe de l'espace de noms XML pour l'instance XML Schema. Une dclaration approprie d'un espace de noms est
ajoute la valeur du rsultat. false, les colonnes contenant des valeurs NULL sont simplement omises de la sortie.
Le paramtre targetns indique l'espace de noms souhait pour le rsultat. Si aucun espace de nom particulier n'est demand,
une chane vide doit tre passe.
Les fonctions suivantes renvoient des documents XML Schema dcrivant la transformation ralise par les fonctions ci-dessus.
table_to_xmlschema(tbl regclass, nulls boolean, tableforest boolean, targetns text)
query_to_xmlschema(query text, nulls boolean, tableforest boolean, targetns text)
cursor_to_xmlschema(cursor refcursor, nulls boolean, tableforest boolean, targetns
text)
Il est essentiel que les mmes paramtres soient passs pour obtenir les bonnes transformations de donnes XML et des documents
XML Schema.
Les fonctions suivantes ralisent la transformation des donnes XML et du XML Schema correspondant en un seul document (ou
arbre), lis ensemble. Elles sont utiles lorsque les rsultats doivent tre auto-contenus et auto-descriptifs.
table_to_xml_and_xmlschema(tbl regclass, nulls boolean, tableforest boolean, targetns
text)
query_to_xml_and_xmlschema(query text, nulls boolean, tableforest boolean, targetns
text)
De plus, les fonctions suivantes sont disponibles pour produire des transformations analogues de schmas complets ou de bases de
donnes compltes.
schema_to_xml(schema name, nulls boolean, tableforest boolean, targetns text)
schema_to_xmlschema(schema name, nulls boolean, tableforest boolean, targetns text)
schema_to_xml_and_xmlschema(schema name, nulls boolean, tableforest boolean, targetns
text)
database_to_xml(nulls boolean, tableforest boolean, targetns text)
database_to_xmlschema(nulls boolean, tableforest boolean, targetns text)
database_to_xml_and_xmlschema(nulls boolean, tableforest boolean, targetns text)
Elles peuvent produire beaucoup de donnes, qui sont construites en mmoire. Lors de transformations de gros schmas ou de
grosses bases, il peut tre utile de considrer la transformation spare des tables, parfois mme via un curseur.
Le rsultat de la transformation du contenu d'un schma ressemble ceci :
<nomschema>
transformation-table1
transformation-table2
...
</nomschema>
o le format de transformation d'une table dpend du paramtre tableforest comme expliqu ci-dessus.
Le rsultat de la transformation du contenu d'une base ressemble ceci :
<nombase>
<nomschema1>
176
Fonctions et oprateurs
...
</nomschema1>
<nomschema2>
...
</nomschema2>
...
</nombase>
avec une transformation du schma identique celle indique ci-dessus.
En exemple de l'utilisation de la sortie produite par ces fonctions, la Figure 9.1, Feuille de style XSLT pour convertir du SQL/
XML en HTML montre une feuille de style XSLT qui convertit la sortie de table_to_xml_and_xmlschema en un document HTML contenant un affichage en tableau des donnes de la table. D'une faon similaire, les donnes en rsultat de ces fonctions peuvent tre converties dans d'autres formats bass sur le XML.
Figure 9.1. Feuille de style XSLT pour convertir du SQL/XML en HTML
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.w3.org/1999/xhtml"
>
<xsl:output method="xml"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
doctype-public="-//W3C/DTD XHTML 1.0 Strict//EN"
indent="yes"/>
<xsl:template match="/*">
<xsl:variable name="schema" select="//xsd:schema"/>
<xsl:variable name="tabletypename"
select="$schema/xsd:element[@name=name(current())]/@type"/>
<xsl:variable name="rowtypename"
select="$schema/xsd:complexType[@name=$tabletypename]/xsd:sequence/xsd:element[@name='row']/
<html>
<head>
<title><xsl:value-of select="name(current())"/></title>
</head>
<body>
<table>
<tr>
<xsl:for-each
select="$schema/xsd:complexType[@name=$rowtypename]/xsd:sequence/xsd:element/@name">
<th><xsl:value-of select="."/></th>
</xsl:for-each>
</tr>
<xsl:for-each select="row">
<tr>
<xsl:for-each select="*">
<td><xsl:value-of select="."/></td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
177
Fonctions et oprateurs
Fonction
currval(regclass)
bigint
lastval()
bigint
nextval(regclass)
bigint
setval(regclass, bigint)
bigint
bigint
La squence traiter par l'appel d'une fonction de traitement de squences est identifie par un argument regclass, qui n'est autre
que l'OID de la squence dans le catalogue systme pg_class. Il n'est toutefois pas ncessaire de se proccuper de la recherche de
cet OID car le convertisseur de saisie du type de donnes regclass s'en charge. Il suffit d'crire le nom de la squence entre guillemets simples, de faon le faire ressembler un libell. Pour obtenir une compatibilit avec la gestion des noms SQL ordinaires,
la chane est convertie en minuscules, sauf si le nom de la squence est entour de guillemets doubles. Du coup :
nextval('foo')
nextval('FOO')
nextval('"Foo"')
Voir la Section 8.16, Types identifiant d'objet pour plus d'informations sur regclass.
Note
Avant la version 8.1 de PostgreSQL, les arguments des fonctions de traitement de squences taient du type text,
et non regclass. De ce fait, les conversions prcdemment dcrites d'une chane de caractres en valeur OID se produisaient chaque appel. Pour des raisons de compatibilit, cette fonctionnalit existe toujours. Mais, en interne, un
transtypage implicite est effectu entre text et regclass avant l'appel de la fonction.
Lorsque l'argument d'une fonction de traitement de squences est crit comme une simple chane de caractres, il
devient une constante de type regclass. Puisqu'il ne s'agit que d'un OID, il permet de suivre la squence originelle
mme en cas de renommage, changement de schma... Ce principe de lien fort est en gnral souhaitable lors de
rfrences la squence dans les vues et valeurs par dfaut de colonnes. Un lien faible est gnralement souhait lorsque la rfrence la squence est rsolue l'excution. Ce comportement peut tre obtenu en forant le stockage des constantes sous la forme de constantes text plutt que regclass :
nextval('foo'::text)
Le lien faible est le seul comportement accessible dans les versions de PostgreSQL antrieures 8.1. Il peut donc
tre ncessaire de le conserver pour maintenir la smantique d'anciennes applications.
L'argument d'une fonction de traitement de squences peut tre une expression ou une constante. S'il s'agit d'une
expression textuelle, le transtypage implicite impose une recherche l'excution.
Les fonctions squence disponibles sont :
nextval
178
Fonctions et oprateurs
Avance l'objet squence sa prochaine valeur et renvoie cette valeur. Ce fonctionnement est atomique : mme si de multiples
sessions excutent nextval concurrentiellement, chacune obtient sans risque une valeur de squence distincte.
Si un objet squence a t cr avec les paramtres par dfaut, les appels nextval sur celui-ci renvoient des valeurs successives partir de 1. D'autres comportements peuvent tre obtenus en utilisant des paramtres spciaux de la commande
CREATE SEQUENCE(7) ; voir la page de rfrence de la commande pour plus d'informations.
Important
Pour viter le blocage de transactions concurrentes qui obtiennent des nombres de la mme squence, une opration nextval n'est jamais annule ; c'est--dire qu'une fois la valeur rcupre, elle est considre utilise,
mme si la transaction qui excute nextval avorte par la suite. Cela signifie que les transactions annules
peuvent laisser des trous inutiliss dans la squence des valeurs assignes.
currval
Renvoie la valeur la plus rcemment retourne par nextval pour cette squence dans la session courante. (Une erreur est
rapporte si nextval n'a jamais t appele pour cette squence dans cette session.) Parce qu'elle renvoie une valeur locale
la session, la rponse est prvisible, que d'autres sessions aient excut ou non la fonction nextval aprs la session en
cours.
lastval
Renvoie la valeur la plus rcemment retourne par nextval dans la session courante. Cette fonction est identique currval, sauf qu'au lieu de prendre le nom de la squence comme argument, elle rcupre la valeur de la dernire squence utilise par nextval dans la session en cours. Si nextval n'a pas encore t appele dans la session en cours, un appel
lastval produit une erreur.
setval
Rinitialise la valeur du compteur de l'objet squence. La forme avec deux paramtres initialise le champ last_value de la
squence la valeur prcise et initialise le champ is_called true, signifiant que le prochain nextval avance la squence avant de renvoyer une valeur. La valeur renvoye par currval est aussi configur la valeur indique. Dans la
forme trois paramtres, is_called peut tre initialis true ou false. true a le mme effet que la forme deux
paramtres. Positionn false, le prochain nextval retourne exactement la valeur indique et l'incrmentation de la squence commence avec le nextval suivant. De plus, la valeur indique par currval n'est pas modifie dans ce cas. (Il
s'agit d'une modification du comportement des versions antrieures la 8.3.) Par exemple,
SELECT setval('foo', 42);
SELECT setval('foo', 42, true);
SELECT setval('foo', 42, false);
Important
Comme les squences sont non transactionnelles, les modifications ralises par setval ne sont pas annules
si la transaction est annule.
Astuce
S'il s'avre ncessaire d'aller au-del des possibilits offertes par les expressions conditionnelles, il faut considrer
l'criture d'une procdure stocke dans un langage de programmation plus expressif.
9.16.1. CASE
L'expression SQL CASE est une expression conditionnelle gnrique, similaire aux instructions if/else des autres langages de programmation :
CASE WHEN condition THEN rsultat
[WHEN ...]
[ELSE rsultat]
END
179
Fonctions et oprateurs
Les clauses CASE peuvent tre utilises partout o une expression est valide. Chaque condition est une expression qui renvoie
un rsultat de type boolean. Si le rsultat de la condition est vrai, alors la valeur de l'expression CASE est le rsultat qui suit la
condition. Si le rsultat de la condition n'est pas vrai, toutes les clauses WHEN suivantes sont parcourues de la mme faon. Si aucune condition WHEN n'est vraie, alors la valeur de l'expression CASE est le rsultat de la clause ELSE. Si la clause
ELSE est omise et qu'aucune condition ne correspond, alors le rsultat est nul.
Un exemple :
SELECT * FROM test;
a
--1
2
3
SELECT a,
CASE WHEN a=1 THEN 'un'
WHEN a=2 THEN 'deux'
ELSE 'autre'
END
FROM test;
a | case
---+------1 | un
2 | deux
3 | autre
Les types de donnes de toutes les expressions rsultat doivent tre convertibles dans un type de sortie unique. Voir la Section 10.5, Constructions UNION, CASE et constructions relatives pour plus de dtails.
L'expression CASE qui suit est une variante de la forme gnrale ci-dessus :
CASE expression
WHEN valeur THEN
rsultat
[WHEN ...]
[ELSE rsultat]
END
La premire expression est calcule et compare chacune des valeur des clauses WHEN jusqu' en trouver une gale. Si
aucune ne correspond, le rsultat de la clause ELSE (ou une valeur NULL) est renvoy(e). C'est similaire l'instruction
switch du langage C.
L'exemple ci-dessus peut tre rcrit en utilisant la syntaxe CASE simple :
SELECT a,
CASE a WHEN 1 THEN 'un'
WHEN 2 THEN 'deux'
ELSE 'autre'
END
FROM test;
a | case
---+------1 | un
2 | deux
3 | autre
Une expression CASE n'value pas les sous-expressions qui ne sont pas ncessaires pour dterminer le rsultat. Par exemple, une
faon possible d'viter une division par zro :
SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;
Note
Comme dcrit dans Section 35.6, Catgories de volatilit des fonctions , les fonctions et les oprateurs marqus
IMMUTABLE peuvent tre valus quand la requte est planifie plutt que quand elle est excute. Cela signifie
180
Fonctions et oprateurs
que les parties constantes d'une sous-expression qui n'est pas value durant l'excution de la requte pourrait toujours tre value pendant la planification de la requte.
9.16.2. COALESCE
COALESCE(valeur [, ...])
La fonction COALESCE renvoie le premier de ses arguments qui n'est pas nul. Une valeur NULL n'est renvoye que si tous les arguments sont nuls. Cette fonction est souvent utile pour substituer une valeur par dfaut aux valeurs NULL lorsque la donne est
rcupre pour affichage. Par exemple :
SELECT COALESCE(description, description_courte, '(aucune)') ...
l'instar d'une expression CASE, COALESCE n'value pas les arguments inutiles la dtermination du rsultat ; c'est--dire que
tous les arguments la droite du premier argument non nul ne sont pas valus. Cette fonction SQL standard fournit des fonctionnalits similaires NVL et IFNULL, qui sont utilises dans d'autres systmes de bases de donnes.
9.16.3. NULLIF
NULLIF(valeur1, valeur2)
La fonction NULLIF renvoie une valeur NULL si valeur1 et valeur2 sont gales ; sinon, elle renvoie valeur1.
On peut s'en servir pour effectuer l'opration inverse de l'exemple de COALESCE donn ci-dessus :
SELECT NULLIF(valeur, '(aucune)') ...
Dans cet exemple, si valeur vaut (aucune), la valeur NULL est renvoye, sinon la valeur de valeur est renvoye.
Oprateur
Description
Exemple
Rsultat
gal
ARRAY[1.1,2.1,3.1]::int[]
RAY[1,2,3]
<>
diffrent de
<
infrieur
>
suprieur
<=
>=
@>
contient
<@
181
AR- t
Fonctions et oprateurs
Oprateur
Description
Exemple
Rsultat
&&
||
{1,2,3,4,5,6}
||
concatnation de ARRAY[1,2,3]
tableaux
RAY[[4,5,6],[7,8,9]]
||
concatnation
3 || ARRAY[4,5,6]
d'un
lment
avec un tableau
{3,4,5,6}
||
concatnation
ARRAY[4,5,6] || 7
d'un tableau avec
un lment
{4,5,6,7}
||
AR- {{1,2,3},{4,5,6},{7,8,9}
}
Les comparaisons de tableaux comparent les contenus des tableaux lment par lment, en utilisant la fonction de comparaison
par dfaut du B-Tree pour le type de donnes de l'lment. Dans les tableaux multi-dimensionnels, les lments sont visits dans
l'ordre des colonnes ( row-major order , le dernier indice varie le plus rapidement). Si le contenu de deux tableaux est identique
mais que les dimensions sont diffrentes, la premire diffrence dans l'information de dimension dtermine l'ordre de tri. (Ce fonctionnement diffre de celui des versions de PostgreSQL antrieures la 8.2 : les anciennes versions indiquent que deux tableaux
de mme contenu sont identiques mme si le nombre de dimensions ou les chelles d'indices diffrent.)
Voir la Section 8.14, Tableaux pour plus de dtails sur le comportement des oprateurs.
Le Tableau 9.41, Fonctions pour les tableaux prsente les fonctions utilisables avec des types tableaux. Voir la Section 8.14,
Tableaux pour plus d'informations et des exemples d'utilisation de ces fonctions.
Tableau 9.41. Fonctions pour les tableaux
Fonction
Type de retour
array_append
anyarray
(anyarray, anyelement)
array_cat
(anyarray,
anyarray)
anyarray
(anya
int
array_ndimsrray)
array_dims
(anyarray)
text
(anyel
anyarray
array_fillement,
int[],
[,
int[]])
Description
Exemple
Rsultat
(any
array_lengtharray, int)
int
array_lower
(anyarray, int)
int
array_prepend
anyarray
Fonctions et oprateurs
Fonction
Type de retour
Description
Exemple
(anyelement,
anyarray)
ARRAY[2,3])
(
text
a
n
y
a
r
r
a
y
array_to_string,
text [, text])
ar1,2,3,*,5
ray_to_string(AR
RAY[1,
2,
3,
NULL, 5], ',',
'*')
array_upper
(anyarray, int)
int
Rsultat
(
text[]
t
e
x
t
string_to_array,
text [, text])
Dans string_to_array, si le dlimiteur vaut NULL, chaque caractre de la chane en entre deviendra un lment spar
dans le tableau rsultant. Si le dlimiteur est une chane vide, alors la chane entire est renvoye dans un tableau un lment.
Dans les autres cas, la chane en entre est divise chaque occurence du dlimiteur.
Dans string_to_array, si le paramtre chane_null est omis ou vaut NULL, aucune des sous-chanes en entre ne sera remplace par NULL. Dans array_to_string, si le paramtre chane_null est omis ou vaut NULL, tous les lments NULL du
tableau seront simplement ignors et non reprsents dans la chane en sortie.
Note
Il existe deux diffrences dans le comportement de string_to_array avec les versions de PostgreSQL antrieures la 9.1. Tout d'abord, il renverra un tableau vide ( zro lment) plutt que NULL quand la chane en entre est de taille zro. Ensuite, si le dlimiteur vaut NULL, la fonction divise l'entre en caractres individuels plutt que de renvoyer NULL comme avant.
Voir aussi Section 9.18, Fonctions d'agrgat propose la fonction d'agrgat array_agg utiliser avec les tableaux.
Fonction
Type d'argument
array_agg(expression) any
avg(expression)
smallint,
int,
bigint,
Type de retour
Description
Fonctions et oprateurs
Fonction
Type d'argument
Type de retour
Description
double precision, numeric ou type entier, double precision toutes les valeurs en entre
interval
pour tout argument en virgule
flottante, sinon identique au
type de donnes de l'argument
bit_and(expression)
bit_or(expression)
bool_and(expression)
bool
bool
bool_or(expression)
bool
bool
bigint
count(*)
count(expression)
tout type
bigint
every(expression)
bool
bool
quivalent bool_and
max(expression)
tout type array, numeric, string identique au type en argument valeur maximale de l'exou date/time
pression pour toutes les valeurs en entre
min(expression)
tout type array, numeric, string identique au type en argument valeur minimale de l'expresou date/time
sion pour toutes les valeurs
en entre
text
sum(expression)
smallint, int, bigint, real, bigint pour les arguments de somme de l'expression
double precision, numeric ou type smallint ou int, numeric pour toutes les valeurs en eninterval
pour les arguments de type bi- tre
gint, double precision pour les
arguments en virgule flottante,
sinon identique au type de donnes de l'argument
xmlagg(expression)
xml
xml
En dehors de count, ces fonctions renvoient une valeur NULL si aucune ligne n'est slectionne. En particulier, une somme
(sum) sur aucune ligne renvoie NULL et non zro, et array_agg renvoie NULL plutt qu'un tableau vide quand il n'y a pas de
lignes en entre. La fonction coalesce peut tre utilise pour substituer des zros ou un tableau vide aux valeurs NULL quand
cela est ncessaire.
Note
Les agrgats boolens bool_and et bool_or correspondent aux agrgats standard du SQL every et any ou
some. Pour any et some, il semble qu'il y a une ambigut dans la syntaxe standard :
SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;
Ici, ANY peut tre considr soit comme introduisant une sous-requte soit comme tant une fonction d'agrgat, si
la sous-requte renvoie une ligne avec une valeur boolenne si l'expression de slection ne renvoie qu'une ligne. Du
coup, le nom standard ne peut tre donn ces agrgats.
184
Fonctions et oprateurs
Note
Les utilisateurs habitus travailler avec d'autres systmes de gestion de bases de donnes SQL peuvent tre surpris par les performances de l'agrgat count lorsqu'il est appliqu la table entire. En particulier, une requte
identique
SELECT count(*) FROM ma_table;
est excut par PostgreSQL l'aide d'un parcours squentiel de la table entire.
Les fonctions d'agrgat array_agg, string_agg et xmlagg, ainsi que d'autres fonctions similaires d'agrgats dfinies par
l'utilisateur, produisent des valeurs de rsultats qui ont un sens diffrents, dpendant de l'ordre des valeurs en entre. Cet ordre
n'est pas prcis par dfaut mais peut tre contrl en ajoutant une clause ORDER BY comme indique dans Section 4.2.7,
Expressions d'agrgat . Une alternative revient fournir les valeurs partir d'une sous-requte trie fonctionnera gnralement.
Par exemple :
SELECT xmlagg(x) FROM (SELECT x FROM test ORDER BY y DESC) AS tab;
Mais cette syntaxe n'est pas autorise dans le standard SQL et n'est pas portable vers d'autres systmes de bases de donnes.
Tableau 9.43, Fonctions d'agrgats pour les statistiques prsente les fonctions d'agrgat typiquement utilises dans l'analyse
statistique. (Elles sont spares pour viter de grossir la liste des agrgats les plus utiliss.) L o la description mentionne N, cela
reprsente le nombre de lignes en entre pour lesquelles toutes les expressions en entre sont non NULL. Dans tous les cas, NULL
est renvoy si le calcul n'a pas de signification, par exemple si N vaut zro.
Tableau 9.43. Fonctions d'agrgats pour les statistiques
Fonction
Type de l'argument
Type renvoy
Description
corr(Y, X)
double precision
double precision
coefficient de corrlation
covar_pop(Y, X)
double precision
double precision
covariance de population
covar_samp(Y, X)
double precision
double precision
covariance exemple
regr_avgx(Y, X)
double precision
double precision
regr_avgy(Y, X)
double precision
double precision
regr_count(Y, X)
double precision
bigint
regr_intercept(Y, X)
double precision
double precision
regr_r2(Y, X)
double precision
double precision
regr_slope(Y, X)
double precision
double precision
regr_sxx(Y, X)
double precision
double precision
sum(X^2) - sum(X)^2 /
N ( somme des carrs de la
variable indpendante)
regr_sxy(Y, X)
double precision
double precision
sum(X*Y) - sum(X) *
sum(Y) / N ( somme des
produits de la variable indpendante multiplie par la variable dpendante)
regr_syy(Y, X)
double precision
double precision
sum(Y^2) - sum(Y)^2 /
N ( somme des carrs de la
variable dpendante)
185
Fonctions et oprateurs
Fonction
Type de l'argument
Type renvoy
Description
stddev(expression)
smallint, int, bigint, real, double precision pour les argu- alias historique pour stddouble precision ou numeric
ments en virgule flottante, nu- dev_samp
meric sinon
smallint, int, bigint, real, double precision pour les argu- dviation standard de la popudouble precision ou numeric
ments en virgule flottante, nu- lation pour les valeurs en enmeric sinon
tre
186
Fonctions et oprateurs
Fonction
Type de l'argument
Type renvoy
Description
)
stddev_samp(expression)
smallint, int, bigint, real, double precision pour les argu- exemple de dviation standard
double precision ou numeric
ments en virgule flottante, nu- pour les valeurs en entre
meric sinon
variance(expression)
smallint, int, bigint, real, double precision pour les argu- alias historique de var_samp
double precision ou numeric
ments en virgule flottante, numeric sinon
var_pop(expression)
smallint, int, bigint, real, double precision pour les argu- variance de la population pour
double precision ou numeric
ments en virgule flottante, nu- les valeurs en entre (carr de
meric sinon
la dviation standard de la population)
var_samp(expression)
smallint, int, bigint, real, double precision pour les argu- exemple de la variance des vadouble precision ou numeric
ments en virgule flottante, nu- leurs en entre (carr de la dmeric sinon
viation standard)
Fonction
Type renvoy
Description
row_number()
bigint
rank()
bigint
dense_rank()
bigint
percent_rank()
double precision
cume_dist()
double precision
ntile(num_buckets integer)
integer
187
Fonctions et oprateurs
Fonction
Type renvoy
Description
first_value(value any)
last_value(value any)
Toutes les fonctions listes dans Tableau 9.44, Fonctions Window gnralistes dpendent du tri indiqu par la clause ORDER
BY de la dfinition window associe. Les lignes qui ne sont pas distinctes dans le tri ORDER BY sont des pairs ; les quatre fonctions de rang sont dfinies de ce faon ce qu'elles donnent la mme rponse pour toutes les lignes pairs.
Notez que first_value, last_value et nth_value considrent seulement les lignes l'intrieur du frame window qui
contient par dfaut les lignes du dbut de la partition jusqu'au dernier pair de la ligne en cours. Cela risque de donenr des rsultats
peu intressants pour last_value et quelque fois aussi pour nth_value. Vous pouvez redfinir la frame en ajoutant une spcification convenable de frame (avec RANGE ou ROWS) dans la clause OVER. Voir Section 4.2.8, Appels de fonction de fentrage pour plus d'informations sur les spcifications de la frame.
Quand une fonction d'agrgat est utilise comme fonction window, il aggrge les lignes sur le frame window de la ligne en cours
de traitement. Pour obtenir un agrgat sur la partition complte, omettez ORDER BY ou utilisez ROWS BETWEEN UNBOUNDED
PRECEDING AND UNBOUNDED FOLLOWING. Un agrgat utilis avec ORDER BY et la dfinition de la frame window par dfaut produit un comportement de type somme en cours d'excution , qui pourrait ou ne pas tre souhait.
Note
Le standard SQL dfinit une option RESPECT NULLS ou IGNORE NULLS pour lead, lag, first_value,
last_value et nth_value. Ceci n'est pas implant dans PostgreSQL : le comportement est toujours le
mme que dans le comportement par dfaut du standard, nommment RESPECT NULLS. De la mme faon, les
options FROM FIRST ou FROM LAST pour nth_value ne sont pas implantes : seul le comportement FROM
FIRST est support par dfaut. (Vous pouvez obtenir le rsultat d'un FROM LAST en inversant l'ordre du ORDER
BY.)
9.20.1. EXISTS
EXISTS ( sous-requte )
L'argument d'EXISTS est une instruction SELECT arbitraire ou une sous-requte. La sous-requte est value pour dterminer si
elle renvoie des lignes. Si elle en renvoie au moins une, le rsultat d'EXISTS est vrai ( true ) ; si elle n'en renvoie aucune, le rsultat d'EXISTS est faux ( false ).
La sous-requte peut faire rfrence des variables de la requte englobante qui agissent comme des constantes chaque valuation de la sous-requte.
La sous-requte n'est habituellement pas excute plus qu'il n'est ncessaire pour dterminer si au moins une ligne est renvoye.
Elle n'est donc pas forcment excute dans son intgralit. Il est de ce fait fortement dconseill d'crire une sous-requte qui prsente des effets de bord (tels que l'appel de fonctions de squence) ; il est extrmement difficile de prdire si ceux-ci se produisent.
188
Fonctions et oprateurs
Puisque le rsultat ne dpend que d'un ventuel retour de lignes, et pas de leur contenu, la liste des champs retourns par la sousrequte n'a normalement aucun intrt. Une convention de codage habituelle consiste crire tous les tests EXISTS sous la forme
EXISTS(SELECT 1 WHERE ...). Il y a toutefois des exceptions cette rgle, comme les sous-requtes utilisant INTERSECT.
L'exemple suivant, simpliste, ressemble une jointure interne sur col2 mais il sort au plus une ligne pour chaque ligne de tab1,
mme s'il y a plusieurs correspondances dans les lignes de tab2 :
SELECT col1
FROM tab1
WHERE EXISTS(SELECT 1 FROM tab2 WHERE col2 = tab1.col2);
9.20.2. IN
expression IN (sous-requte)
Le ct droit est une sous-expression entre parenthses qui ne peut retourner qu'une seule colonne. L'expression de gauche est value et compare chaque ligne du rsultat de la sous-requte. Le rsultat de IN est vrai ( true ) si une ligne quivalente de la
sous-requte est trouve. Le rsultat est faux ( false ) si aucune ligne correspondante n'est trouve (ce qui inclut le cas spcial de
la sous-requte ne retournant aucune ligne).
Si l'expression de gauche est NULL ou s'il n'existe pas de correspondance avec les valeurs du ct droit et qu'au moins une ligne
du ct droit est NULL, le rsultat de la construction IN est NULL, et non faux. Ceci est en accord avec les rgles normales du
SQL pour les combinaisons boolennes de valeurs NULL.
Comme avec EXISTS, on ne peut pas assumer que la sous-requte est value compltement.
constructeur_ligne IN (sous-requte)
Le ct gauche de cette forme de IN est un constructeur de ligne comme dcrit dans la Section 4.2.13, Constructeurs de lignes .
Le ct droit est une sous-requte entre parenthses qui doit renvoyer exactement autant de colonnes qu'il y a d'expressions dans le
ct gauche. Les expressions ct gauche sont values et compares ligne ligne au rsultat de la sous-requte. Le rsultat de IN
est vrai ( true ) si une ligne quivalente de la sous-requte est trouve. Le rsultat est faux ( false ) si aucune ligne correspondante n'est trouve (ce qui inclut le cas spcial de la sous-requte ne retournant aucune ligne).
Comme d'habitude, les valeurs NULL dans les lignes sont combines suivant les rgles habituelles des expressions boolennes
SQL. Deux lignes sont considres gales si tous leurs membres correspondant sont non nuls et gaux ; les lignes diffrent si le
contenu de leurs membres sont non nuls et diffrents ; sinon le rsultat de la comparaison de la ligne est inconnu, donc nul. Si tous
les rsultats par lignes sont diffrents ou nuls, avec au moins un NULL, alors le rsultat de IN est nul.
9.20.3. NOT IN
expression NOT IN (sous-requte)
Le ct droit est une sous-requte entre parenthses, qui doit retourner exactement une colonne. L'expression de gauche est valu
et compare chaque ligne de rsultat de la sous-requte. Le rsultat de NOT IN n'est true que si des lignes diffrentes de la
sous-requte sont trouves (ce qui inclut le cas spcial de la sous-requte ne retournant pas de ligne). Le rsultat est false si
une ligne gale est trouve.
Si l'expression de gauche est nulle, ou qu'il n'y a pas de valeur gale droite et qu'au moins une ligne de droite est nulle, le rsultat
du NOT IN est nul, pas vrai. Cela concorde avec les rgles normales du SQL pour les combinaisons boulennes de valeurs nulles.
Comme pour EXISTS, on ne peut assumer que la sous-requte est value dans son intgralit.
constructeur_ligne NOT IN (sous-requte)
Le ct gauche de cette forme de NOT IN est un constructeur de lignes, comme dcrit dans la Section 4.2.13, Constructeurs de
lignes . Le ct droit est une sous-requte entre parenthses qui doit renvoyer exactement autant de colonnes qu'il y a
d'expressions dans la ligne de gauche. Les expressions de gauche sont values et compare ligne ligne au rsultat de la sousrequte. Le rsultat de NOT IN n'est vrai ( true ) que si seules des lignes diffrentes de la sous-requte sont trouves (ce qui inclut le cas spcial de la sous-requte ne retournant aucune ligne). Le rsultat est faux ( false ) si une ligne gale est trouve.
Comme d'habitude, les valeurs nulles des lignes sont combines en accord avec les rgles normales des expressions boulennes
SQL. Deux lignes sont considres gales si tous leurs membres correspondants sont non-nuls et gaux ; les lignes sont diffrentes
si les membres correspondants sont non-nuls et diffrents ; dans tous les autres cas, le rsultat de cette comparaison de ligne est inconnu (nul). Si tous les rsultats par ligne sont diffrents ou nuls, avec au minimum un nul, alors le rsultat du NOT IN est nul.
189
Fonctions et oprateurs
9.20.4. ANY/SOME
expression oprateur ANY (sous-requte)
expression oprateur SOME (sous-requte)
Le ct droit est une sous-requte entre parenthses qui ne doit retourner qu'une seule colonne. L'expression du ct gauche est
value et compare chaque ligne du rsultat de la sous-requte l'aide de l'oprateur indiqu, ce qui doit aboutir un rsultat boolen. Le rsultat de ANY est vrai ( true ) si l'un des rsultats est vrai. Le rsultat est faux ( false ) si aucun rsultat vrai
n'est trouv (ce qui inclut le cas spcial de la requte ne retournant aucune ligne).
SOME est un synonyme de ANY. IN est quivalent = ANY.
En l'absence de succs, mais si au moins une ligne du ct droit conduit NULL avec l'oprateur, le rsultat de la construction
ANY est nul et non faux. Ceci est en accord avec les rgles standard SQL pour les combinaisons boolenne de valeurs NULL.
Comme pour EXISTS, on ne peut assumer que la sous-requte est value entirement.
constructeur_ligne operator ANY (sous-requte)
constructeur_ligne operator SOME (sous-requte)
Le ct gauche de cette forme ANY est un constructeur de ligne, tel que dcrit dans la Section 4.2.13, Constructeurs de lignes .
Le ct droit est une sous-requte entre parenthses, qui doit renvoyer exactement autant de colonnes qu'il y a d'expressions dans
la ligne de gauche. Les expressions du ct gauche sont values et compares ligne ligne au rsultat de la sous-requte l'aide
de l'oprateur donn. Le rsultat de ANY est true si la comparaison renvoie true pour une ligne quelconque de la sousrequte. Le rsultat est false si la comparaison renvoie false pour chaque ligne de la sous-requte (ce qui inclut le cas spcial
de la sous-requte ne retournant aucune ligne). Le rsultat est NULL si la comparaison ne renvoie true pour aucune ligne, et renvoie NULL pour au moins une ligne.
Voir Section 9.21.5, Comparaison de lignes entires pour la signification dtaille d'une comparaison ligne ligne.
9.20.5. ALL
expression oprateur ALL
(sous-requte)
Le ct droit est une sous-requte entre parenthses qui ne doit renvoyer qu'une seule colonne. L'expression gauche est value et
compare chaque ligne du rsultat de la sous-requte l'aide de l'oprateur, ce qui doit renvoyer un rsultat boolen. Le rsultat de ALL est vrai ( true ) si toutes les lignes renvoient true (ce qui inclut le cas spcial de la sous-requte ne retournant aucune ligne). Le rsultat est faux ( false ) si un rsultat faux est dcouvert. Le rsultat est NULL si la comparaison ne renvoie
false pour aucune ligne, mais NULL pour au moins une ligne.
NOT IN est quivalent <> ALL.
Comme pour EXISTS, on ne peut assumer que la sous-requte est value entirement.
constructeur_ligne oprateur ALL (sous-requte)
Le ct gauche de cette forme de ALL est un constructeur de lignes, tel que dcrit dans la Section 4.2.13, Constructeurs de
lignes . Le ct droit est une sous-requte entre parenthses qui doit renvoyer exactement le mme nombre de colonnes qu'il y a
d'expressions dans la colonne de gauche. Les expressions du ct gauche sont values et compares ligne ligne au rsultat de la
sous-requte l'aide de l'oprateur donn. Le rsultat de ALL est true si la comparaison renvoie true pour toutes les lignes
de la sous-requte (ce qui inclut le cas spcial de la sous-requte ne retournant aucune ligne). Le rsultat est false si la comparaison renvoie false pour une ligne quelconque de la sous-requte. Le rsultat est NULL si la comparaison ne renvoie false pour
aucune ligne de la sous-requte, mais NULL pour au moins une ligne.
Voir Section 9.21.5, Comparaison de lignes entires pour la signification dtaille d'une comparaison ligne ligne.
190
Fonctions et oprateurs
9.21.1. IN
expression IN (valeur [, ...])
Le ct droit est une liste entre parenthses d'expressions scalaires. Le rsultat est vrai ( true ) si le ct gauche de l'expression
est gal une des expressions du ct droit. C'est une notation raccourcie de
expression = valeur1
OR
expression = valeur2
OR
...
Si l'expression du ct gauche renvoie NULL, ou s'il n'y a pas de valeur gale du ct droit et qu'au moins une expression du ct
droit renvoie NULL, le rsultat de la construction IN est NULL et non pas faux. Ceci est en accord avec les rgles du standard
SQL pour les combinaisons boolennes de valeurs NULL.
9.21.2. NOT IN
expression NOT IN (valeur [, ...])
Le ct droit est une liste entre parenthses d'expressions scalaires. Le rsultat est vrai ( true ) si le rsultat de l'expression du
ct gauche est diffrent de toutes les expressions du ct droit. C'est une notation raccourcie de
expression <> valeur1
AND
expression <> valeur2
AND
...
Si l'expression du ct gauche renvoie NULL, ou s'il existe des valeurs diffrentes du ct droit et qu'au moins une expression du
ct droit renvoie NULL, le rsultat de la construction NOT IN est NULL et non pas vrai. Ceci est en accord avec les rgles du
standard du SQL pour les combinaisons boolennes de valeurs NULL.
Astuce
x NOT IN y est quivalent NOT (x IN y) dans tout les cas. Nanmoins, les valeurs NULL ont plus de
chances de surprendre le novice avec NOT IN qu'avec IN. Quand cela est possible, il est prfrable d'exprimer la
condition de faon positive.
191
Fonctions et oprateurs
Note
Avant PostgreSQL 8.2, les cas <, <=, > et >= n'taient pas grs d'aprs les spcifications SQL. Une comparaison comme ROW(a,b) < ROW(c,d) tait code sous la forme a < c AND b < d alors que le bon comportement est quivalent a < c OR (a = c AND b < d).
constructeur_ligne IS DISTINCT FROM constructeur_ligne
Cette construction est similaire une comparaison de ligne <>, mais elle ne conduit pas un rsultat NULL pour des entres
NULL. Au lieu de cela, une valeur NULL est considre diffrente (distincte) d'une valeur non-NULL et deux valeurs NULL sont
considres gales (non distinctes). Du coup, le rsultat est toujours soit true soit false, jamais NULL.
constructeur_ligne IS NOT DISTINCT FROM constructeur_ligne
Cette construction est similaire une comparaison de lignes =, mais elle ne conduit pas un rsultat NULL pour des entres
NULL. Au lieu de cela, une valeur NULL est considre diffrente (distincte) d'une valeur non NULL et deux valeurs NULL sont
considres identiques (non distinctes). Du coup, le rsultat est toujours soit true soit false, jamais NULL.
Note
Le standard SQL requiert qu'une comparaison d'une ligne complte renvoie NULL si le rsultat dpend de la comparaison de deux valeurs NULL ou d'une valeur NULL et d'une valeur non NULL. PostgreSQL le fait en comparant le rsultat de deux constructeurs de lignes ou en comparant un constructeur de ligne avec le rsultat d'une sousrequte (comme dans Section 9.20, Expressions de sous-requtes ). Dans d'autres contextes o deux valeurs de
type composite sont compares, deux champs NULL sont considrs gaux, et un champ NULL est considr plus
grand qu'un champ non NULL. Ceci est ncessaire pour voir un comportement de tri et d'indexage cohrent pour
les types composites.
192
Fonctions et oprateurs
Fonction
Type
d'argument
Type de retour
Description
generate_series
fin)
setof int ou setof Produit une srie de valeurs, de dbut fin avec un
bigint
(mme incrment de un.
type que l' argument)
generate_series
fin, pas)
setof int ou setof Produit une srie de valeurs, de dbut fin avec un
bigint
(mme incrment de pas.
type
que
l'argument)
generate_series(dbut,
fin, pas interval)
timestamp ou ti- setof timestamp Gnre une srie de valeurs, allant de start stop
mestamp
with ou setof times- avec une taille pour chaque tape de pas
time zone
tamp with time
zone (identique
au
type
de
l'argument)
Quand pas est positif, aucune ligne n'est renvoye si dbut est suprieur fin. l'inverse, quand pas est ngatif, aucune
ligne n'est renvoye si dbut est infrieur fin. De mme, aucune ligne n'est renvoye pour les entres NULL. Une erreur est
leve si pas vaut zro.
Quelques exemples :
SELECT * FROM generate_series(2,4);
generate_series
----------------2
3
4
(3 rows)
SELECT * FROM generate_series(5,1,-2);
generate_series
----------------5
3
1
(3 rows)
SELECT * FROM generate_series(4,3);
generate_series
----------------(0 rows)
-- cet exemple se base sur l'oprateur date-plus-entier
SELECT current_date + s.a AS dates FROM generate_series(0,14,7) AS s(a);
dates
-----------2004-02-05
2004-02-12
2004-02-19
(3 rows)
SELECT * FROM generate_series('2008-03-01 00:00'::timestamp,
'2008-03-04 12:00', '10 hours');
generate_series
--------------------193
Fonctions et oprateurs
2008-03-01
2008-03-01
2008-03-01
2008-03-02
2008-03-02
2008-03-03
2008-03-03
2008-03-03
2008-03-04
(9 rows)
00:00:00
10:00:00
20:00:00
06:00:00
16:00:00
02:00:00
12:00:00
22:00:00
08:00:00
Nom
Type de retour
Description
generate_subscripts(array
anyarray, dim int)
setof int
generate_subscripts(array
setof int
anyarray, dim int, reverse
boolean)
generate_subscripts est une fonction qui gnre un ensemble d'indices valides pour la dimension indique du tableau
fourni. Aucune ligne n'est renvoye pour les tableaux qui n'ont pas la dimension requise ou pour les tableaux NULL (mais les indices valides sont renvoyes pour les lments d'un tableau NULL). Quelques exemples suivent :
-- usage basique
SELECT generate_subscripts('{NULL,1,NULL,2}'::int[], 1) AS s;
s
--1
2
3
4
(4 rows)
-- presenting an array, the subscript and the subscripted
-- value requires a subquery
SELECT * FROM arrays;
a
-------------------{-1,-2}
{100,200,300}
(2 rows)
SELECT a AS array, s AS subscript, a[s] AS value
FROM (SELECT generate_subscripts(a, 1) AS s, a FROM arrays) foo;
array
| subscript | value
---------------+-----------+------{-1,-2}
|
1 |
-1
{-1,-2}
|
2 |
-2
{100,200,300} |
1 |
100
{100,200,300} |
2 |
200
{100,200,300} |
3 |
300
(5 rows)
-- aplatir un tableau 2D
CREATE OR REPLACE FUNCTION unnest2(anyarray)
RETURNS SETOF anyelement AS $$
select $1[i][j]
from generate_subscripts($1,1) g1(i),
generate_subscripts($1,2) g2(j);
$$ LANGUAGE sql IMMUTABLE;
CREATE FUNCTION
postgres=# SELECT * FROM unnest2(ARRAY[[1,2],[3,4]]);
unnest2
--------194
Fonctions et oprateurs
1
2
3
4
(4 rows)
Nom
Type de retour
Description
current_catalog
name
current_database()
nom
current_query()
text
current_schema[()]
nom
current_schemas(boolean)
nom[]
current_user
nom
inet_client_addr()
inet
inet_client_port()
int
inet_server_addr()
inet
inet_server_port()
int
pg_backend_pid()
int
pg_conf_load_time()
pg_is_other_temp_schema(oid) boolean
pg_listening_channels()
setof text
pg_my_temp_schema()
oid
pg_postmaster_start_time()
session_user
name
user
name
quivalent current_user
version()
text
Note
current_catalog, current_schema, current_user, session_user, et user ont un statut syntaxique spcial en SQL : ils doivent tre appels sans parenthses droite (optionnel avec PostgreSQL dans le cas
de current_schema).
session_user est habituellement l'utilisateur qui a initi la connexion la base de donnes ; mais les superutilisateurs peuvent
modifier ce paramtrage avec SET SESSION AUTHORIZATION(7). current_user est l'identifiant de l'utilisateur, utilisable
pour les vrifications de permissions. Il est habituellement identique l'utilisateur de la session, mais il peut tre modifi avec
195
Fonctions et oprateurs
SET ROLE(7). Il change aussi pendant l'excution des fonctions comprenant l'attribut SECURITY DEFINER. En langage Unix,
l'utilisateur de la session est le real user (NdT : l'utilisateur rel) et l'utilisateur courant est l' effective user (NdT :
l'utilisateur effectif) .
current_schema renvoie le nom du premier schma dans le chemin de recherche (ou une valeur NULL si ce dernier est vide).
C'est le schma utilis pour toute cration de table ou autre objet nomm sans prcision d'un schma cible. current_schemas(boolean) renvoie un tableau qui contient les noms de tous les schmas du chemin de recherche. L'option
boolenne indique si les schmas systme implicitement inclus, comme pg_catalog, doivent tre inclus dans le chemin de recherche retourn.
Note
Le chemin de recherche est modifiable l'excution. La commande est :
SET search_path TO schema [, schema, ...]
pg_listening_channels renvoie un ensemble de noms de canaux que la session actuelle coute. Voir LISTEN(7) pour plus
d'informations.
inet_client_addr renvoie l'adresse IP du client courant et inet_client_port le numro du port. inet_server_addr renvoie l'adresse IP sur laquelle le serveur a accept la connexion courante et inet_server_port le numro du port. Toutes ces fonctions renvoient NULL si la connexion courante est tablie via une socket de domaine Unix.
pg_my_temp_schema renvoie l'OID du schma temporaire de la session courante, ou 0 s'il n'existe pas (parce qu'il n'y a pas eu
de cration de tables temporaires). pg_is_other_temp_schema renvoie true si l'OID donn est l'OID d'un schma temporaire d'une autre session. (Ceci peut tre utile pour exclure les tables temporaires d'autres sessions lors de l'affichage d'un catalogue, par exemple.)
pg_postmaster_start_time renvoie la date et l'heure (type timestamp with time zone) de dmarrage du serveur.
pg_conf_load_time renvoie timestamp with time zone indiquant quel moment les fichiers de configuration du serveur ont
t chargs. (Si la session en cours tait dj l ce moment, ce sera le moment o la sessions elle-mme a relu les fichiers de
configurations. Cela veut dire que ce que renvoie cette fonction peut varier un peu suivant les sessions. Sinon, c'est le temps o le
processus matre a relu les fichiers de configuration.)
version renvoie une chane qui dcrit la version du serveur PostgreSQL.
Le Tableau 9.48, Fonctions de consultation des privilges d'accs liste les fonctions qui permettent aux utilisateurs de consulter les privilges d'accs. Voir la Section 5.6, Droits pour plus d'informations sur les privilges.
Tableau 9.48. Fonctions de consultation des privilges d'accs
Nom
Type de retour
Description
use
has_any_column_privilege(r,
table, privilege)
boolean
tab
boolean
has_any_column_privilege(le,
privilege)
has_column_privilege(user,
table, column, privilege)
boolean
has_column_privilege(table,
column, privilege)
boolean
boolean
has_foreign_data_wrapper_pri boolean
vilege(user, fdw, privilege)
has_foreign_data_wrapper_pri boolean
vilege(fdw, privilege)
has_database_privilege
(base, privilge)
196
Fonctions et oprateurs
Nom
lisateur,
lge)
Type de retour
fonction,
Description
vilge sur fonction
priviboolean
boolean
has_schema_privilege(schma, boolean
privilge)
has_sequence_privilege(user, boolean
sequence, privilege)
has_sequence_privilege(sequence, privilege)
boolean
has_server_privilege(user,
server, privilege)
boolean
has_server_privilege(server, boolean
privilege)
has_table_privilege(utilisa- boolean
teur, table, privilge)
boolean
has_tablespace_privilege
boolean
(utilisateur,
tablespace,
privilge)
has_tablespace_privilege
(tablespace, privilge)
boolean
pg_has_role(utilisateur,
rle, privilge)
boolean
has_function_privilege
(fonction, privilge)
has_table_privilege(table,
privilege)
has_table_privilege vrifie si l'utilisateur possde un privilge particulier d'accs une table. L'utilisateur peut tre indiqu par son nom ou son OID (pg_authid.oid), public pour indiquer le pseudo-rle PUBLIC. Si l'argument est omis, current_user est utilis. La table peut tre indique par son nom ou par son OID. (Il existe donc six versions de
has_table_privilege qui se distinguent par le nombre et le type de leurs arguments.) Lors de l'indication par nom, il est
possible de prciser le schma. Les privilges possibles, indiqus sous la forme d'une chane de caractres, sont : SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES ou TRIGGER. En option, WITH GRANT OPTION peut tre ajout un
type de droit pour tester si le droit est obtenu avec l'option grant . De plus, plusieurs types de droit peuvent tre lists, spars
par des virgules, auquel cas le rsultat sera true si un des droits lists est obtenu. (la casse des droits n'a pas d'importance et les
espaces blancs supplmentaires sont autoriss entre mais pas dans le nom des droits.) Certains exemples :
SELECT has_table_privilege('myschema.mytable', 'select');
SELECT has_table_privilege('joe', 'mytable', 'INSERT, SELECT WITH GRANT OPTION');
has_sequence_privilege vrifie si un utilisateur peut accder une squence d'une faon ou d'une autre. Les arguments
sont analogues ceux de la fonction has_table_privilege. Le type de droit d'accs doit valoir soit USAGE, soit SELECT
soit UPDATE.
has_any_column_privilege vrifie si un utilisateur peut accder une colonne d'une table d'une faon particulire. Les
possibilits pour que ces arguments correspondent ceux de has_table_privilege, sauf que le type de droit d'accs dsir
doit tre valu une combinaison de SELECT, INSERT, UPDATE ou REFERENCES. Notez qu'avoir un droit au niveau de la
197
Fonctions et oprateurs
table le donne implicitement pour chaque colonne de la table, donc has_any_column_privilege renverra toujours true si
has_table_privilege le fait pour les mmes arguments. Mais has_any_column_privilege russit aussi s'il y a un
droit grant sur une colonne pour ce droit.
has_column_privilege vrifie si un utilisateur peut accder une colonne d'une faon particulire. Les possibilits pour ses
arguments sont analogues has_table_privilege, avec un supplment : la colonne doit tre indique soit par nom soit par
numro d'attribut. Le type de droit d'accs dsir doit tre une combinaison de SELECT, INSERT, UPDATE ou REFERENCES.
Notez qu'avoir un de ces droits au niveau table les donne implicitement pour chaque colonne de la table.
has_database_privilege vrifie si un utilisateur peut accder une base de donnes d'une faon particulire. Les possibilits pour ses arguments sont analogues has_table_privilege. Le type de droit d'accs dsir doit tre une combinaison
de CREATE, CONNECT, TEMPORARY ou TEMP (qui est quivalent TEMPORARY).
has_function_privilege vrifie si un utilisateur peut accder une fonction d'une faon particulire. Les possibilits pour
ses arguments sont analogues has_table_privilege. Lors de la spcification d'une fonction par une chane texte plutt
que par un OID, l'entre autorise est la mme que pour le type de donnes regprocedure (voir Section 8.16, Types identifiant
d'objet ). Le type de droit d'accs dsir doit tre EXECUTE. Voici un exemple :
SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute');
has_foreign_data_wrapper_privilege vrifie si un utilisateur peut accder un wrapper de donnes distantes d'une
faon particulire. Les possibilits pour ses arguments sont analogues has_table_privilege. Le type de droit d'accs dsir doit tre USAGE.
has_language_privilege vrifie si un utilisateur peut accder un langage de procdure d'une faon particulire. Les possibilits pour ses arguments sont analogues has_table_privilege. Le type de droit d'accs dsir doit tre USAGE.
has_schema_privilege vrifie si un utilisateur peut accder un schma d'une faon particulire. Les possibilits pour ses
arguments sont analogues has_table_privilege. Le type de droits d'accs dsir doit tre une combinaison de CREATE et
USAGE.
has_server_privilege vrifie si un utilisateur peut accder un serveur distant d'une faon particulire. Les possibilits
pour ses arguments sont analogues has_table_privilege. Le type de droit d'accs dsir doit tre USAGE.
has_tablespace_privilege vrifie si l'utilisateur possde un privilge particulier d'accs un tablespace. Ses arguments
sont analogues has_table_privilege. Le seul privilge possible est CREATE.
pg_has_role vrifie si l'utilisateur possde un privilge particulier d'accs un rle. Ses arguments sont analogues
has_table_privilege, sauf que public n'est pas autoris comme nom d'utilisateur. Le privilge doit tre une combinaison
de MEMBER et USAGE. MEMBER indique une appartenance directe ou indirecte au rle (c'est--dire le droit d'excuter SET ROLE)
alors que USAGE indique que les droits du rle sont immdiatement disponibles sans avoir excuter SET ROLE.
Le Tableau 9.49, Fonctions d'interrogation de visibilit dans les schmas affiche les fonctions qui permettent de savoir si un
objet particulier est visible dans le chemin de recherche courant. Une table est dite visible si son schma contenant est dans le chemin de recherche et qu'aucune table de mme nom ne la prcde dans le chemin de recherche. C'est quivalent au fait que la table
peut tre rfrence par son nom sans qualification explicite de schma. Par exemple, pour lister les noms de toutes les tables visibles :
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
Tableau 9.49. Fonctions d'interrogation de visibilit dans les schmas
Nom
Type de retour
Description
pg_collation_is_visible(collation_oid)
boolean
pg_conversion_is_visible (conversion_oid)
boolean
pg_function_is_visible (function_oid)
boolean
pg_opclass_is_visible(opclass_oid)
boolean
pg_operator_is_visible(operator_oid)
boolean
pg_table_is_visible(table_oid)
boolean
198
Fonctions et oprateurs
Nom
Type de retour
Description
recherche
pg_ts_config_is_visible(config_oid)
boolean
pg_ts_dict_is_visible(dict_oid)
boolean
pg_ts_parser_is_visible(parser_oid)
boolean
pg_ts_template_is_visible(template_oid)
boolean
pg_type_is_visible(type_oid)
boolean
Chaque fonction vrifie la visibilit d'un type d'objet de la base de donnes. pg_table_is_visible peut aussi tre utilise
avec des vues, index et squences, pg_type_is_visible avec les domaines. Pour les fonctions et les oprateurs, un objet est
visible dans le chemin de recherche si aucun objet de mme nom et prenant des arguments de mmes types de donnes n'est prcdemment prsent dans le chemin de recherche. Pour les classes d'oprateurs, on considre la fois le nom et la mthode d'accs
l'index associ.
Toutes ces fonctions ncessitent des OID pour identifier les objets vrifier. Pour tester un objet par son nom, il est prfrable
d'utiliser les types d'alias d'OID (regclass, regtype, regprocedure ou regoperator). Par exemple
SELECT pg_type_is_visible('mon_schema.widget'::regtype);
Il n'est pas trs utile de tester ainsi un nom non qualifi -- si le nom peut tre reconnu, c'est qu'il est visible.
Le Tableau 9.50, Fonctions d'information du catalogue systme liste les fonctions qui extraient des informations des catalogues systme.
Tableau 9.50. Fonctions d'information du catalogue systme
Nom
text
ob- text
pg_describe_object(catalog_id,
ject_id, object_sub_id)
pg_get_constraintdef(constraint_oid)
text
pg_get_constraintdef(constraint_oid,
pretty_bool)
text
pg_get_expr(pg_node_tree,
tion_oid)
rela- text
dcompile la forme interne d'une expression, en supposant que toutes les variables qu'elle contient font rfrence la relation indique par le second paramtre
pg_get_expr(pg_node_tree,
tion_oid, pretty_bool)
rela- text
dcompile la forme interne d'une expression, en supposant que toutes les variables qu'elle contient font rfrence la relation indique par le second paramtre
pg_get_functiondef(func_oid)
text
pg_get_function_arguments(func_oid)
text
pg_get_function_identity_arguments
(func_oid)
text
pg_get_function_result(func_oid)
text
pg_get_indexdef(index_oid)
text
setof record
199
Fonctions et oprateurs
Nom
pg_get_ruledef(rule_oid)
text
pg_get_serial_sequence(table_name,
column_name)
text
pg_get_triggerdef(trigger_oid)
text
pg_get_triggerdef(trigger_oid,
ty_bool)
pret- text
pg_get_userbyid(role_oid)
name
pg_get_viewdef(view_name)
text
pg_get_viewdef(view_name,
pretty_bool)
text
pg_get_viewdef(view_oid)
text
pg_options_to_table(reloptions)
setof record
pg_tablespace_databases(tablespace_oid)
setof oid
pg_typeof(any)
regtype
format_type renvoie le nom SQL d'un type de donnes identifi par son OID de type et ventuellement un modificateur de
type. On passe NULL pour le modificateur de type si aucun modificateur spcifique n'est connu.
pg_get_keywords renvoie un ensemble d'enregistrements dcrivant les mots cls SQL reconnus par le serveur. La colonne
word contient le mot cl. La colonne catcode contient un code de catgorie : U pour non rserv, C pour nom de colonne, T
pour nom d'un type ou d'une fonction et R pour rserv. La colonne catdesc contient une chane pouvant tre traduite dcrivant
la catgorie.
pg_get_constraintdef, pg_get_indexdef, pg_get_ruledef et pg_get_triggerdef reconstruisent respectivement la commande de cration d'une contrainte, d'un index, d'une rgle ou d'un dclencheur. (Il s'agit d'une reconstruction dcompile, pas du texte originale de la commande.) pg_get_expr dcompile la forme interne d'une expression individuelle, comme
la valeur par dfaut d'une colonne. Cela peut tre utile pour examiner le contenu des catalogues systme. Si l'expression contient
des variables, spcifiez l'OID de la relation laquelle elles font rfrence dans le second paramtre ; si aucune variable n'est attendue, zro est suffisant. pg_get_viewdef reconstruit la requte SELECT qui dfinit une vue. La plupart de ces fonctions
existent en deux versions, l'une d'elles permettant, optionnellement, d' afficher joliment le rsultat. Ce format est plus lisible,
mais il est probable que les futures versions de PostgreSQL continuent d'interprter le format par dfaut actuel de la mme
faon ; la version jolie doit tre vite dans les sauvegardes. Passer false pour le paramtre de jolie sortie conduit au
mme rsultat que la variante sans ce paramtre.
pg_get_functiondef renvoie une instruction CREATE OR REPLACE FUNCTION complte pour une fonction.
pg_get_function_arguments renvoie une liste des arguments d'un fonction, de la faon dont elle apparatrait dans
CREATE FUNCTION. pg_get_function_result renvoie de faon similaire la clause RETURNS approprie pour la fonction. pg_get_function_identity_arguments renvoie la liste d'arguments ncessaire pour identifier une fonction, dans
la forme qu'elle devrait avoir pour faire partie d'un ALTER FUNCTION, par exemple. Cette forme omet les valeurs par dfaut.
pg_get_serial_sequence renvoie le nom de la squence associe une colonne ou NULL si aucune squence n'est associe la colonne. Le premier argument en entre est un nom de table, ventuellement qualifi du schma. Le second paramtre est
un nom de colonne. Comme le premier paramtre peut contenir le nom du schma et de la table, il n'est pas trait comme un identifiant entre guillemets doubles, ce qui signifie qu'il est converti en minuscules par dfaut, alors que le second paramtre, simple
nom de colonne, est trait comme s'il tait entre guillemets doubles et sa casse est prserve. La fonction renvoie une valeur
convenablement formate pour tre traite par les fonctions de traitement des squences (voir Section 9.15, Fonctions de manipulation de squences ). Cette association peut tre modifie ou supprime avec ALTER SEQUENCE OWNED BY. (La fonction aurait probablement d s'appeler pg_get_owned_sequence ; son nom reflte le fait qu'elle est typiquement utilise avec
les colonnes serial et bigserial.)
pg_get_userbyid rcupre le nom d'un rle d'aprs son OID.
200
Fonctions et oprateurs
pg_options_to_table
renvoie
l'ensemble
de
paires
nom/valeur
des
options
de
(nom_option/valeur_option) quand lui est fourni pg_class.reloptions ou pg_attribute.attoptions.
stockage
pg_tablespace_databases autorise l'examen d'un tablespace. Il renvoie l'ensemble des OID des bases qui possdent des
objets stocks dans le tablespace. Si la fonction renvoie une ligne, le tablespace n'est pas vide et ne peut pas tre supprime. Pour
afficher les objets spcifiques peuplant le tablespace, il est ncessaire de se connecter aux bases identifies par
pg_tablespace_databases et de requter le catalogue pg_class.
pg_describe_object renvoie une description d'un objet de la base de donnes spcifie par l'OID du catalogue, l'OID de
l'objet et un identifiant de sous-objet (en option). C'est utile pour dterminer l'identit d'un objet tel qu'il est stock dans le catalogue pg_depend.
pg_typeof renvoie l'OID du type de donnes de la valeur qui lui est pass. Ceci est utile pour dpanner ou pour construire dynamiquement des requtes SQL. La fonction est dclare comme renvoyant regtype, qui est une type d'alias d'OID (voir Section 8.16, Types identifiant d'objet ) ; cela signifie que c'est la mme chose qu'un OID pour un bit de comparaison mais que cela s'affiche comme un nom de type. Par exemple :
SELECT pg_typeof(33);
pg_typeof
----------integer
(1 row)
SELECT typlen FROM pg_type WHERE oid = pg_typeof(33);
typlen
-------4
(1 row)
Les fonctions affiches dans Tableau 9.51, Fonctions d'informations sur les commentaires extraient les commentaires stockes
prcdemment avec la commande COMMENT(7). Une valeur NULL est renvoye si aucun commentaire ne correspond aux paramtres donns.
Tableau 9.51. Fonctions d'informations sur les commentaires
Nom
col_description(table_oid,
lumn_number)
obj_description
log_name)
(object_oid,
obj_description(object_oid)
shobj_description(object_oid,
log_name)
co- text
cata- text
text
cata- text
col_description renvoie le commentaire d'une colonne de table, la colonne tant prcise par l'OID de la table et son numro de colonne. obj_description ne peut pas tre utilise pour les colonnes de table car les colonnes n'ont pas d'OID propres.
La forme deux paramtres de obj_description renvoie le commentaire d'un objet de la base de donnes, prcis par son
OID et le nom du catalogue systme le contenant. Par exemple, obj_description(123456,'pg_class') rcupre le
commentaire pour la table d'OID 123456. La forme un paramtre de obj_description ne requiert que l'OID de l'objet. Elle
est maintenant obsolte car il n'existe aucune garantie que les OID soient uniques au travers des diffrents catalogues systme ; un
mauvais commentaire peut alors tre renvoy.
shobj_description est utilis comme obj_description, mais pour les commentaires des objets partags. Certains catalogues systmes sont globaux toutes les bases de donnes l'intrieur de chaque cluster et les descriptions des objets imbriqus
sont stockes globalement.
Les fonctions prsentes dans Tableau 9.52, ID de transaction et instantans remontent l'utilisateur des informations de transaction de niveau interne au serveur. L'usage principal de ces fonctions est de dterminer les transactions commites entre deux
instantans ( snapshots ).
201
Fonctions et oprateurs
Nom
Type retour
Description
txid_current()
bigint
txid_current_snapshot()
txid_snapshot
txid_snaps
txid_snapshot_xip(hot)
setof bigint
txid_snap
txid_snapshot_xmax(shot)
bigint
txid_snap
txid_snapshot_xmin(shot)
bigint
txid_visible_in_snapshot(bi- boolean
gint, txid_snapshot)
l'ID de transaction est-il visible dans l'instantan ? (ne pas utiliser les identifiants de sous-transactions)
Le type interne ID de transaction (xid) est sur 32 bits. Il boucle donc tous les 4 milliards de transactions. Cependant, ces fonctions
exportent au format 64 bits, tendu par un compteur epoch , de faon viter tout cycle sur la dure de vie de l'installation. Le
type de donnes utilis par ces fonctions, txid_snapshot, stocke l'information de visibilit des ID de transaction un instant particulier. Ces composants sont dcrits dans Tableau 9.53, Composants de l'instantan .
Tableau 9.53. Composants de l'instantan
Nom
Description
xmin
xmax
Premier txid non encore assign. Tous les txids plus grands ou gals celuici ne sont pas encore dmarrs ce moment de l'instantan, et donc invisibles.
xip_list
Nom
current_setting (nom_paramtre)
text
set_config
(nom_paramtre,
velle_valeur, est_local)
nou- text
La fonction current_setting renvoie la valeur courante du paramtre nom_paramtre. Elle correspond la commande
SQL SHOW. Par exemple :
SELECT current_setting('datestyle');
current_setting
202
Fonctions et oprateurs
----------------ISO, MDY
(1 row)
set_config positionne le paramtre nom_paramtre nouvelle_valeur. Si est_local vaut true, la nouvelle valeur s'applique uniquement la transaction en cours. Si la nouvelle valeur doit s'appliquer la session en cours, on utilise false.
La fonction correspond la commande SQL SET. Par exemple :
SELECT set_config('log_statement_stats', 'off', false);
set_config
-----------off
(1 row)
Les fonctions prsentes dans le Tableau 9.55, Fonctions d'envoi de signal au serveur envoient des signaux de contrle aux
autres processus serveur. L'utilisation de ces fonctions est restreinte aux superutilisateurs.
Tableau 9.55. Fonctions d'envoi de signal au serveur
Nom
boolean
pg_reload_conf()
boolean
pg_rotate_logfile()
boolean
pg_terminate_backend(pid int)
boolean
Nom
pg_create_restore_point(name text)
text
pg_current_xlog_insert_location()
text
pg_current_xlog_location()
text
Prparation de la sauvegarde chaud (restreint aux superutilisateurs et aux rles ayant l'attribut rplication)
pg_stop_backup()
text
Arrt de la sauvegarde chaud (restreint aux superutilisateurs et aux rles ayant l'attribut rplication)
pg_switch_xlog()
text
pg_xlogfile_name(location text)
text
Fonctions et oprateurs
Nom
pg_xlogfile_name_offset(location
text)
text, integer
pg_start_backup accepte un label utilisateur de la sauvegarde (typiquement, le nom du fichier d'enregistrement de la sauvegarde). La fonction crit un fichier de label (backup_label) dans le rpertoire de donnes du cluster, ralise un point de retournement, et renvoie la position du dbut de la sauvegarde dans le journal de transactions au format texte. Ce rsultat ne ncessite
pas qu'on s'y intresse, mais il est fourni dans cette ventualit.
postgres=# select pg_start_backup('le_label_ici');
pg_start_backup
----------------0/D4445B8
(1 row)
Il existe un second paramtre boolen optionnel. Si true, il prcise l'excution de pg_start_backup aussi rapidement que
possible. Cela force un point de retournement immdiat qui causera un pic dans les oprations d'entres/sorties, ralentissant toutes
les requtes excutes en parallle.
pg_stop_backup supprime le fichier de label cr par pg_start_backup et cre, la place, un fichier d'historique dans
l'aire de stockage des archives des journaux de transactions. Ce fichier contient le label pass pg_start_backup, les emplacements de dbut et de fin des journaux de transactions correspondant la sauvegarde et les heures de dbut et de fin de la sauvegarde. La valeur de retour est l'emplacement du journal de la transaction de fin de sauvegarde (de peu d'intrt, l encore). Aprs
notification de l'emplacement de fin, le point d'insertion courant du journal de transactions est automatiquement avanc au prochain journal de transactions, de faon ce que le journal de transactions de fin de sauvegarde puisse tre archiv immdiatement
pour terminer la sauvegarde.
pg_switch_xlog bascule sur le prochain journal de transactions, ce qui permet d'archiver le journal courant (en supposant que
l'archivage continu soit utilis). La fonction retourne l'emplacement de la transaction finale + 1 dans le journal ainsi termin. S'il
n'y a pas eu d'activit dans les journaux de transactions depuis le dernier changement de journal, pg_switch_xlog ne fait rien
et renvoie l'emplacement de fin du journal de transactions en cours.
pg_create_restore_point cre un enregistrement dans les journaux de transactions, pouvant tre utilis comme une cible
de restauration, et renvoie l'emplacement correspondant dans les journaux de transactions. Le nom donn peut ensuite tre utilis
avec recovery_target_name pour spcifier la fin de la restauration. vitez de crer plusieurs points de restauration ayant le mme
nom car la restauration s'arrtera au premier nom qui correspond la cible de restauration.
pg_current_xlog_location affiche la position d'criture du journal de transactions en cours dans le mme format que celui utilis dans les fonctions ci-dessus. De faon similaire, pg_current_xlog_insert_location affiche le point
d'insertion dans le journal de transactions courant. Le point d'insertion est la fin logique du journal de transactions tout instant alors que l'emplacement d'criture est la fin de ce qui a dj t crit partir des tampons internes du serveur. La position
d'criture est la fin de ce qui peut tre examin extrieurement au serveur. C'est habituellement l'information ncessaire qui souhaite archiver des journaux de transactions partiels. Le point d'insertion n'est donn principalement que pour des raisons de dbogage du serveur. Il s'agit l d'oprations de lecture seule qui ne ncessitent pas de droits superutilisateur.
pg_xlogfile_name_offset peut tre utilise pour extraire le nom du journal de transactions correspondant et le dcalage
en octets partir du rsultat de n'importe quelle fonction ci-dessus. Par exemple :
postgres=# SELECT * FROM pg_xlogfile_name_offset(pg_stop_backup());
file_name
| file_offset
--------------------------+------------00000001000000000000000D |
4039624
(1 row)
De faon similaire, pg_xlogfile_name n'extrait que le nom du journal de la transaction. Quand la position dans le journal de
la transaction donne est exactement sur une limite de journal, les deux fonctions renvoient le nom du journal prcdent. C'est gnralement le comportement souhait pour grer l'archivage des journaux, car le fichier prcdent est le dernier devoir tre archiv.
Pour les dtails sur le bon usage de ces fonctions, voir la Section 24.3, Archivage continu et rcupration d'un instantan
(PITR) .
Les fonctions affiches dans Tableau 9.57, Fonctions d'information sur la restauration fournissent des informations sur le statut
actuel du serveur en attente. Ces fonctions peuvent tre utilises lors d'une restauration mais aussi lors d'un fonctionnement normal.
204
Fonctions et oprateurs
Nom
Type du retour
Description
pg_is_in_recovery()
bool
pg_last_xlog_receive_locatio text
n()
text
Rcupre l'emplacement du dernier enregistrement WAL rejou lors de la restauration. Si la restauration est toujours en
cours, cela va augmenter progressivement.
Si la restauration s'est termine, alors cette
valeur restera statique et dpendera du
dernier enregistrement WAL reu et synchronis sur disque lors de cette restauration. Quand le serveur a t lanc sans
restauration de flux, la valeur renvoye
par la fonction sera NULL.
205
Fonctions et oprateurs
Nom
Type du retour
Description
()
pg_last_xact_replay_timestam timestamp with time zone
p()
laquelle
l'enregistrement du journal pour cette
transaction a t gnr sur le serveur
principal, que la transaction soit valide
ou annule. Si aucune transaction n'a t
rejoue pendant la restauration, cette fonction renvoie NULL. Sinon, si la restauration est toujours en cours, cette valeur
augmentera continuellement. Si la restauration s'est termine, alors cette valeur
restera statique et indiquera la valeur correspondant la dernire transaction rejoue pendant la restauration. Quand le
serveur a t dmarr normalement
(autrement dit, sans restauration), cette
fonction renvoie NULL.
Les fonctions affiches dans Tableau 9.58, Fonctions de contrle de la restauration contrlent la progression de la restauration.
Ces fonctions sont seulement excutables pendant la restauration.
Tableau 9.58. Fonctions de contrle de la restauration
Nom
Description
pg_is_xlog_replay_paused()
bool
pg_xlog_replay_pause()
void
pg_xlog_replay_resume()
void
Quand la restauration est en pause, aucune modification de la base n'est applique. Si le serveur se trouve en Hot Standby, toutes
les nouvelles requtes verront la mme image cohrente de la base et aucun conflit de requtes ne sera rapport jusqu' la remise
en route de la restauration.
Si la rplication en flux est dsactive, l'tat pause peut continuer indfiniment sans problme. Si elle est active, les enregistrements des journaux continueront tre reus, ce qui peut ventuellement finir par remplir l'espace disque disponible, suivant la
dure de la pause, le taux de gnration des journaux et l'espace disque disponible.
Les fonctions prsentes dans le Tableau 9.59, Fonctions de calcul de la taille des objets de la base de donnes calculent
l'utilisation de l'espace disque par les objets de la base de donnes.
Tableau 9.59. Fonctions de calcul de la taille des objets de la base de donnes
Nom
pg_column_size(any)
int
Nombre d'octets utiliss pour stocker une valeur particulire (ventuellement compresse)
pg_database_size(oid)
bigint
pg_database_size(name)
bigint
pg_indexes_size(regclass)
bigint
pg_relation_size(relation
fork text)
regclass, bigint
pg_relation_size(relation regclass)
bigint
206
Raccourci
pour
pg_relation_size(...,
Fonctions et oprateurs
Nom
pg_size_pretty(bigint)
text
pg_table_size(regclass)
bigint
pg_tablespace_size(oid)
bigint
pg_tablespace_size(name)
bigint
pg_total_relation_size(regclass)
bigint
Espace disque total utilis par la table spcifie, en incluant toutes les donnes TOAST et les index
Nom
Type en retour
Description
pg_relation_filenode(relation regclass)
oid
pg_relation_filepath(relation regclass)
text
pg_relation_filenode accepte l'OID ou le nom d'une table, d'un index, d'une squence ou d'une table TOAST. Elle renvoie le numro filenode qui lui est affect. Ce numro est le composant de base du nom de fichier utilis par la relation (voir
Section 55.1, Emplacement des fichiers de la base de donnes pour plus d'informations). Pour la plupart des tables, le rsultat
est identique pg_class.relfilenode mais pour certains catalogues systme, relfilenode vaut zro et cette fonction doit
tre utilise pour obtenir la bonne valeur. La fonction renvoie NULL si l'objet qui lui est fourni est une relation qui n'a pas de stockage, par exemple une vue.
207
Fonctions et oprateurs
pg_relation_filepath est similaire pg_relation_filenode mais elle renvoie le chemin complet vers le fichier
(relatif au rpertoire des donnes de l'instance, PGDATA) de la relation.
Les fonctions prsentes dans le Tableau 9.61, Fonctions d'accs gnrique aux fichiers fournissent un accs natif aux fichiers
situs sur le serveur. Seuls les fichiers contenus dans le rpertoire du cluster et ceux du rpertoire log_directory sont accessibles. On utilise un chemin relatif pour les fichiers contenus dans le rpertoire du cluster et un chemin correspondant la configuration du paramtre log_directory pour les journaux de trace. L'utilisation de ces fonctions est restreinte aux superutilisateurs.
Tableau 9.61. Fonctions d'accs gnrique aux fichiers
Nom
pg_ls_dir(nom_rpertoire text)
setof text
pg_stat_file(nom_fichier text)
record
pg_ls_dir renvoie tous les noms contenus dans le rpertoire indiqu, l'exception des entres spciales . et .. .
pg_read_file renvoie une partie d'un fichier texte, dbutant au dcalage indiqu, renvoyant au plus longueur octets
(moins si la fin du fichier est atteinte avant). Si le dcalage est ngatif, il est relatif la fin du fichier. Si offset et length
sont omis, le fichier entier est renvoy. Les octets lus partir de ce fichier sont interprts comme une chane dans l'encodage du
serveur. Une erreur est affiche si l'encodage est mauvais.
pg_read_binary_file est similaire pg_read_file, sauf que le rsultat est une valeur de type bytea ; du coup, aucune
vrification d'encodage n'est ralise. Avec la fonction convert_from, cette fonction peut tre utilise pour lire un fichier dans
un encodage spcifi :
SELECT convert_from(pg_read_binary_file('fichier_en_utf8.txt'), 'UTF8');
pg_stat_file renvoie un enregistrement contenant la taille du fichier, les date et heure de dernier accs, les date et heure de
dernire modification, les date et heure de dernier changement de statut (plateformes Unix seulement), les date et heure de cration (Windows seulement) et un boolen indiquant s'il s'agit d'un rpertoire. Les usages habituels incluent :
SELECT * FROM pg_stat_file('nomfichier');
SELECT (pg_stat_file('nomfichier')).modification;
Les fonctions prsentes dans Tableau 9.62, Fonctions de verrous consultatifs grent les verrous consultatifs. Pour les dtails
sur le bon usage de ces fonctions, voir Section 13.3.4, Verrous informatifs .
Tableau 9.62. Fonctions de verrous consultatifs
Nom
Type renvoy
Description
int, void
void
pg_advisory_lock_shared(key1 void
int, key2 int)
boolean
boolean
pg_advisory_lock(key1
key2 int)
pg_advisory_lock_shared(key
bigint)
pg_try_advisory_lock(key1
int, key2 int)
208
Fonctions et oprateurs
Nom
Type renvoy
Description
boolean
key bigint)
209
Fonctions et oprateurs
Nom
Type renvoy
Description
pg_advisory_unlock(key
gint)
pg_advisory_unlock_all()
void
ke
pg_advisory_unlock_shared(y
bigint)
boolean
ke
boolean
pg_advisory_unlock_shared(y1
int, key2 int)
pg_advisory_xact_lock(key
bigint)
void
pg_advisory_xact_lock(key1
int, key2 int)
void
pg_advisory_xact_lock_shared void
(key bigint)
pg_advisory_xact_lock_shared void
(key1 int, key2 int)
boolean
boolean
pg_try_advisory_lock(key1
int, key2 int)
210
Fonctions et oprateurs
Nom
Type renvoy
Description
boolean
key bigint)
211
Fonctions et oprateurs
Nom
Type renvoy
Description
boolean
ke
boolean
pg_try_advisory_xact_lock(y1
int, key2 int)
pg_try_advisory_xact_lock_sh boolean
ared(key bigint)
pg_try_advisory_xact_lock_sh boolean
ared(key1 int, key2 int)
pg_advisory_lock verrouille une ressource applicative qui peut tre identifie soit par une valeur de cl sur 64 bits soit par
deux valeurs de cl sur 32 bits (les deux espaces de cl ne se surchargent pas). Si une autre session dtient dj un verrou sur la
mme ressource, la fonction attend que la ressource devienne disponible. Le verrou est exclusif. Les demandes de verrou
s'empilent de sorte que, si une mme ressource est verrouille trois fois, elle doit tre dverrouille trois fois pour tre disponible
par les autres sessions.
pg_advisory_lock_shared fonctionne de faon identique pg_advisory_lock sauf que le verrou peut tre partag
avec d'autres sessions qui rclament des verrous partags. Seules les demandes de verrou exclusif sont bloques.
pg_try_advisory_lock est similaire pg_advisory_lock sauf que la fonction n'attend pas la disponibilit du verrou.
Si le verrou peut tre obtenu immdiatement, la fonction renvoie true, sinon, elle renvoie false.
pg_try_advisory_lock_shared fonctionne de la mme faon que pg_try_advisory_lock sauf qu'elle tente
d'acqurir un verrou partag au lieu d'un verrou exclusif.
pg_advisory_unlock relche un verrou exclusif prcdemment acquis au niveau session. Elle retourne true si le verrou est
relach avec succs. Si le verrou n'tait pas dtenu, false est renvoy et un message d'avertissement SQL est mis par le serveur.
pg_advisory_unlock_shared fonctionne de la mme faon que pg_advisory_unlock mais pour relcher un verrou
partag au niveau session.
pg_advisory_unlock_all relche tous les verrous consultatifs au niveau session dtenus par la session courante. (Cette
fonction est appele implicitement la fin de la session, mme si le client se dconnecte brutalement.)
pg_advisory_xact_lock fonctionne de la mme faon que pg_advisory_lock, sauf que le verrou est automatiquement
relch la fin de la transaction courante et ne peut pas tre relch de faon explicite.
pg_advisory_xact_lock_shared fonctionne de la mme faon que pg_advisory_lock_shared, sauf que le verrou
est automatiquement relch la fin de la transaction courante et ne peut pas tre relch de faon explicite.
pg_try_advisory_xact_lock fonctionne de la mme faon que pg_try_advisory_lock, sauf que le verrou, s'il est
acquis, est automatiquement relch la fin de la transaction courante et ne peut pas tre relch de faon explicite.
pg_try_advisory_xact_lock_shared fonctionne de la mme faon que pg_try_advisory_lock_shared, sauf
que le verrou, s'il est acquis, est automatiquement relch la fin de la transaction courante et ne peut pas tre relch de faon explicite.
Fonctions et oprateurs
ment modifis, utiliser ce trigger rendra la mise jour bien plus lente.
La fonction suppress_redundant_updates_trigger peut tre ajoute une table de cette faon :
CREATE TRIGGER z_min_update
BEFORE UPDATE ON tablename
FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger();
Dans la plupart des cas, vous voudrez dclencher ce tigger en dernier pour chaque ligne. Gardez en tte que les triggers sont dclenchs dans l'ordre alphabtique de leur nom, vous choisirez donc un nom de trigger qui vient apr_s le nom des autres triggers
que vous pourriez avoir sur la table.
Pour plus d'informations sur la cration des trigger, voir CREATE TRIGGER(7).
213
10.1. Aperu
SQL est un langage fortement typ. C'est--dire que chaque lment de donnes est associ un type de donnes qui dtermine
son comportement et son utilisation permise. PostgreSQL a un systme de types extensible qui est beaucoup plus gnral et
flexible que les autres implmentations de SQL. Par consquent, la plupart des comportements de conversion de types dans
PostgreSQL est rgie par des rgles gnrales plutt que par une heuristique ad hoc. Cela permet aux expressions de types
mixtes d'tre significatives mme avec des types dfinis par l'utilisateur.
L'analyseur de PostgreSQL divise les lments lexicaux en cinq catgories fondamentales : les entiers, les nombres non entiers, les chanes de caractres, les identifieurs et les mots-cl. Les constantes de la plupart des types non-numriques sont
d'abord classifies comme chanes de caractres. La dfinition du langage SQL permet de spcifier le nom des types avec une
chane et ce mcanisme peut tre utilis dans PostgreSQL pour lancer l'analyseur sur le bon chemin. Par exemple, la requte :
SELECT text 'Origin' AS "label", point '(0,0)' AS "value";
label | value
--------+------Origin | (0,0)
(1 row)
a deux constantes littrales, de type text et point. Si un type n'est pas spcifi pour une chane littrale, alors le type unknown est
assign initialement pour tre rsolu dans les tapes ultrieures comme dcrit plus bas.
Il y a quatre constructions SQL fondamentales qui exigent des rgles distinctes de conversion de types dans l'analyseur de PostgreSQL :
Les appels de fonctions
Une grande partie du systme de types de PostgreSQL est construit autour d'un riche ensemble de fonctions. Les fonctions peuvent avoir un ou plusieurs arguments. Puisque que PostgreSQL permet la surcharge des fonctions, le nom seul
de la fonction n'identifie pas de manire unique la fonction appeler ; l'analyseur doit slectionner la bonne fonction par
rapport aux types des arguments fournis.
Les oprateurs
PostgreSQL autorise les expressions avec des oprateurs de prfixe et de suffixe unaires (un argument) aussi bien que binaires (deux arguments). Comme les fonctions, les oprateurs peuvent tre surchargs. Du coup, le mme problme existe
pour slectionner le bon oprateur.
Le stockage des valeurs
Les instructions SQL INSERT et UPDATE placent le rsultat des expressions dans une table. Les expressions dans une
instruction doivent tre en accord avec le type des colonnes cibles et peuvent tre converties vers celles-ci.
Les constructions UNION, CASE et des constructions relatives
Comme toutes les requtes issues d'une instruction SELECT utilisant une union doivent apparatre dans un ensemble
unique de colonnes, les types de rsultats de chaque instruction SELECT doivent tre assortis et convertis en un ensemble
uniforme. De faon similaire, les expressions de rsultats d'une construction CASE doivent tre converties vers un type
commun de faon ce que l'ensemble de l'expression CASE ait un type de sortie connu. Cela est la mme chose pour les
constructions avec ARRAY et pour les fonctions GREATEST et LEAST.
Les catalogues systmes stockent les informations concernant l'existence de conversions entre certains types de donnes et la
faon d'excuter ces conversions. Les conversions sont appeles casts en anglais. Des conversions de types supplmentaires
peuvent tre ajoutes par l'utilisateur avec la commande CREATE CAST(7) (c'est habituellement ralis en conjonction avec la
dfinition de nouveaux types de donnes. L'ensemble des conversions entre les types prdfinis a t soigneusement choisi et le
mieux est de ne pas le modifier).
214
Conversion de types
Une heuristique supplmentaire est fournie dans l'analyseur pour permettre de meilleures estimations sur la bonne conversion de
type parmi un groupe de types qui ont des conversions implicites. Les types de donnes sont divises en plusieurs catgories de
type basiques, incluant boolean, numeric, string, bitstring, datetime, timespan, geometric, network et dfinis par l'utilisateur. (Pour
une liste, voir Tableau 45.49, Codes typcategory ; mais notez qu'il est aussi possible de crer des catgories de type personnalises.) l'intrieur de chaque catgorie, il peut y avoir une ou plusieurs types prfrs, qui sont slectionns quand il y a un
choix possible de types. Avec une slection attentive des types prfrs et des conversions implicites disponibles, il est possible de
s'assurer que les expressions ambigues (celles avec plusieurs solutions candidates) peuvent tre rsolus d'une faon utile.
Toutes les rgles de conversions de types sont crites en gardant l'esprit plusieurs principes :
Il n'y aura pas de surcharge depuis l'analyseur ou l'excuteur si une requte n'a pas besoin d'une conversion implicite de types.
C'est--dire que si une requte est bien formule et si les types sont dj bien distinguables, alors la requte devra s'excuter
sans perte de temps supplmentaire et sans introduire l'intrieur de celle-ci des appels des conversions implicites non ncessaires.
De plus, si une requte ncessite habituellement une conversion implicite pour une fonction et si l'utilisateur dfinit une nouvelle fonction avec les types des arguments corrects, l'analyseur devrait utiliser cette nouvelle fonction et ne fera plus des
conversions implicites en utilisant l'ancienne fonction.
10.2. Oprateurs
L'oprateur spcifique qui est rfrence par une expression d'oprateur est dtermin par la procdure ci-dessous. Notez que cette
procdure est indirectement affecte par l'ordre d'insertion des oprateurs car cela va dterminer les sous-expressions prises en entre des oprateurs. Voir la Section 4.1.6, Prcdence d'oprateurs pour plus d'informations.
Procdure 10.1. Rsolution de types pour les oprateurs
1.
Slectionner les oprateurs examiner depuis le catalogue systme pg_operator. Si un nom non-qualifi d'oprateur tait
utilis (le cas habituel), les oprateurs examins sont ceux avec un nom et un nombre d'arguments corrects et qui sont visibles
dans le chemin de recherche courant (voir la Section 5.7.3, Chemin de parcours des schmas ). Si un nom qualifi
d'oprateur a t donn, seuls les oprateurs dans le schma spcifi sont examins.
2.
Vrifier que l'oprateur accepte le type exact des arguments en entre. Si un oprateur existe (il peut en avoir uniquement un
qui corresponde exactement dans l'ensemble des oprateurs considrs), utiliser cet oprateur.
3.
Si un chemin de recherche trouve de nombreux oprateurs avec des types d'arguments identiques, seul sera examin celui apparaissant le plus tt dans le chemin. Mais les oprateurs avec des types d'arguments diffrents sont examins sur
une base d'galit indpendamment de leur position dans le chemin de recherche.
Si un argument lors d'une invocation d'oprateur binaire est de type unknown (NdT : inconnu), alors considrer pour ce
contrle que c'est le mme type que l'autre argument. Les invocations impliquant deux entres de type unknown, ou un
oprateur unitaire avec en entre une donne de type unknown ne trouveront jamais une correspondance ce niveau.
Se dbarrasser des oprateurs candidats pour lesquels les types en entre ne correspondent pas et qui ne peuvent pas tre
convertis (en utilisant une conversion implicite) dans le type correspondant. Le type unknown est suppos tre convertible vers tout. Si un candidat reste, l'utiliser, sinon aller la prochaine tape.
b.
Parcourir tous les candidats et garder ceux avec la correspondance la plus exacte par rapport aux types en entre (les domaines sont considrs de la mme faon que leur type de base pour cette tape). Garder tous les candidats si aucun n'a
de correspondance exacte. Si un seul candidat reste, l'utiliser ; sinon, aller la prochaine tape.
c.
Parcourir tous les candidats et garder ceux qui acceptent les types prfrs (de la catgorie des types de donnes en entre) aux positions o la conversion de types aurait t requise. Garder tous les candidats si aucun n'accepte les types
prfrs. Si seulement un candidat reste, l'utiliser ; sinon aller la prochaine tape.
d.
Si des arguments en entre sont inconnus, vrifier la catgorie des types accepts la position de ces arguments par les
candidats restants. chaque position, slectionner la catgorie chane de caractres si un des candidats accepte cette catgorie (cette prfrence vers les chanes de caractres est approprie car le terme type-inconnu ressemble une chane
de caractres). Dans le cas contraire, si tous les candidats restants acceptent la mme catgorie de types, slectionner
215
Conversion de types
cette catgorie. Dans le cas contraire, chouer car le choix correct ne peut pas tre dduit sans plus d'indices. Se dbarrasser maintenant des candidats qui n'acceptent pas la catgorie slectionne. De plus, si des candidats acceptent un type
prfr de cette catgorie, se dbarrasser des candidats qui acceptent, pour cet argument, les types qui ne sont pas prfrs.
e.
Il n'existe qu'un seul oprateur factoriel (! postfix) dfini dans le catalogue standard. Il prend un argument de type bigint. Le scanner affecte au dbut le type integer l'argument dans cette expression :
SELECT 40 ! AS "40 factorial";
40 factorial
-------------------------------------------------815915283247897734345611269596115894272000000000
(1 row)
L'analyseur fait donc une conversion de types sur l'oprande et la requte est quivalente
SELECT CAST(40 AS bigint) ! AS "40 factorial";
La syntaxe d'une chane de caractres est utilise pour travailler avec les types chanes mais aussi avec les types d'extensions complexes. Les chanes de caractres avec un type non spcifi sont compares avec les oprateurs candidats probables.
Un exemple avec un argument non spcifi :
SELECT text 'abc' || 'def' AS "text and unknown";
text and unknown
-----------------abcdef
(1 row)
Dans ce cas, l'analyseur cherche voir s'il existe un oprateur prenant text pour ses deux arguments. Comme il y en a, il suppose
que le second argument devra tre interprt comme un type text.
Voici une concatnation sur des types non spcifis :
SELECT 'abc' || 'def' AS "unspecified";
unspecified
------------abcdef
(1 row)
Dans ce cas, il n'y a aucune allusion initiale sur quel type utiliser puisqu'aucun type n'est spcifi dans la requte. Donc,
l'analyseur regarde pour tous les oprateurs candidats et trouve qu'il existe des candidats acceptant en entre la catgorie chane de
caractres (string) et la catgorie morceaux de chanes (bit-string). Puisque la catgorie chanes de caractres est prfre quand
elle est disponible, cette catgorie est slectionne. Le type prfr pour la catgorie chanes tant text, ce type est utilis comme
le type spcifique pour rsoudre les types inconnus.
Exemple 10.3. Rsolution de types pour les oprateurs de valeur absolue et de ngation
Le catalogue d'oprateurs de PostgreSQL a plusieurs entres pour l'oprateur de prfixe @. Ces entres implmentent toutes des
oprations de valeur absolue pour des types de donnes numriques varies. Une de ces entres est pour le type float8 (rel) qui
216
Conversion de types
est le type prfr dans la catgorie des numriques. Par consquent, PostgreSQL utilisera cette entre quand il sera en face d'un
argument de type unknown :
SELECT @ '-4.5' AS "abs";
abs
----4.5
(1 row)
Le systme a compris implicitement que le litral de type unknown est de type float8 (rel) avant d'appliquer l'oprateur choisi.
Nous pouvons vrifier que float8, et pas un autre type, a t utilis :
SELECT @ '-4.5e500' AS "abs";
ERROR:
D'un autre ct, l'oprateur prfixe ~ (ngation bit par bit) est dfini seulement pour les types entiers et non pas pour float8 (rel).
Ainsi, si nous essayons un cas similaire avec ~, nous obtenons :
SELECT ~ '20' AS "negation";
ERROR: operator is not unique: ~ "unknown"
HINT: Could not choose a best candidate operator. You might need to add explicit
type casts.
Ceci se produit parce que le systme ne peut pas dcider quel oprateur doit tre prfr parmi les diffrents oprateurs ~ possibles. Nous pouvons l'aider avec une conversion explicite :
SELECT ~ CAST('20' AS int8) AS "negation";
negation
----------21
(1 row)
10.3. Fonctions
La fonction spcifique rfrence par un appel de fonction est dtermine selon les tapes suivantes.
Procdure 10.2. Rsolution de types pour les fonctions
1.
2.
Slectionner les fonctions examiner depuis le catalogue systme pg_proc. Si un nom non-qualifi de fonction tait utilis,
les fonctions examines sont celles avec un nom et un nombre d'arguments corrects et qui sont visibles dans le chemin de recherche courant (voir la Section 5.7.3, Chemin de parcours des schmas ). Si un nom qualifi de fonctions a t donn,
seules les fonctions dans le schma spcifique sont examines.
a.
Si un chemin de recherche trouve de nombreuses fonctions avec des types d'arguments identiques, seule celle apparaissant le plus tt dans le chemin sera examine. Mais les fonctions avec des types d'arguments diffrents sont examines
sur une base d'galit indpendamment de leur position dans le chemin de recherche.
b.
Si une fonction est dclare avec un paramtre VARIADIC et que l'appel n'utilise pas le mot cl VARIADIC, alors la
fonction est traite comme si le paramtre tableau tait remplac par une ou plusieurs occurrences de son type lmentaire, autant que ncessaire pour correspondre l'appel. Aprs cette expansion, la fonction pourrait avoir des types
d'arguments identiques certaines fonctions non variadic. Dans ce cas, la fonction apparaissant plus tt dans le chemin
de recherche est utilise ou, si les deux fonctions sont dans le mme schma, celle qui n'est pas VARIADIC est prfre.
c.
Les fonctions qui ont des valeurs par dfaut pour les paramtres sont considrs comme correspondant un appel qui
omet zro ou plus des paramtres ayant des valeurs par dfaut. Si plus d'une fonction de ce type correspondent un appel, celui apparaissant en premier dans le chemin des schmas est utilis. S'il existe deux ou plus de ces fonctions dans
le mme schmas avec les mme types de paramtres pour les paramtres sans valeur par dfaut (ce qui est possible s'ils
ont des ensembles diffrents de paramtres par dfaut), le systme ne sera pas capable de dterminer laquelle slectionne, ce qui rsultera en une erreur ambiguous function call .
Vrifier que la fonction accepte le type exact des arguments en entre. Si une fonction existe (il peut en avoir uniquement une
qui correspond exactement dans tout l'ensemble des fonctions considres), utiliser cette fonction (les cas impliquant le type
unknown ne trouveront jamais de correspondance cette tape).
217
Conversion de types
3.
Si aucune correspondance n'est trouve, vrifier si l'appel la fonction apparat tre une requte spciale de conversion de
types. Cela arrive si l'appel la fonction a juste un argument et si le nom de la fonction est le mme que le nom (interne) de
certains types de donnes. De plus, l'argument de la fonction doit tre soit un type inconnu soit un type qui a une compatibilit binaire avec le type de donnes nomms, soit un type qui peut tre converti dans le type de donnes indiqu en appliquant
les fonctions d'entres/sorties du type (c'est--dire que la conversion est vers ou partir d'un type standard de chane). Quand
ces conditions sont rencontres, l'appel de la fonction est trait sous la forme d'une spcification CAST. 1
4.
Se dbarrasser des fonctions candidates pour lesquelles les types en entre ne correspondent pas et qui ne peuvent pas
tre convertis (en utilisant une conversion implicite) pour correspondre. Le type unknown est suppos tre convertible
vers n'importe quoi. Si un seul candidat reste, utiliser le ; sinon, aller la prochaine tape.
b.
Parcourir tous les candidats et garder ceux avec la correspondance la plus exacte par rapport aux types en entre (les domaines sont considrs de la mme faon que leur type de base pour cette tape). Garder tous les candidats si aucun n'a
de correspondance exacte. Si un seul candidat reste, utiliser le ; sinon, aller la prochaine tape.
c.
Parcourir tous les candidats et garder ceux qui acceptent les types prfrs (de la catgorie des types de donnes en entre) aux positions o la conversion de types aurait t requise. Garder tous les candidats si aucun n'accepte les types
prfrs. Si un seul candidat reste, utiliser le ; sinon, aller la prochaine tape.
d.
Si des arguments en entre sont unknown, vrifier les catgories de types acceptes la position de ces arguments par
les candidats restants. chaque position, slectionner la catgorie chane de caractres si un des candidats accepte cette
catgorie (cette prfrence envers les chanes de caractres est approprie depuis que le terme type-inconnu ressemble
une chane de caractres). Dans le cas contraire, si tous les candidats restants acceptent la mme catgorie de types, slectionner cette catgorie. Dans le cas contraire, chouer car le choix correct ne peut pas tre dduit sans plus d'indices.
Se dbarrasser maintenant des candidats qui n'acceptent pas la catgorie slectionne. De plus, si des candidats acceptent un type prfr dans cette catgorie, se dbarrasser des candidats qui acceptent, pour cet argument, les types qui
ne sont pas prfrs.
e.
Notez que les rgles de correspondance optimale sont identiques pour la rsolution de types concernant les oprateurs et les
fonctions. Quelques exemples suivent.
Exemple 10.4. Rsolution de types pour les arguments de la fonction arrondie
Il n'existe qu'une seule fonction round avec deux arguments (le premier est de type numeric, le second est de type integer). Ainsi,
la requte suivante convertie automatiquement le type du premier argument de integer vers numeric.
SELECT round(4, 4);
round
-------4.0000
(1 row)
La requte est en fait transforme par l'analyseur en
SELECT round(CAST (4 AS numeric), 4);
Puisque le type numeric est initialement assign aux constantes numriques avec un point dcimal, la requte suivante ne requirera pas une conversion de types et pourra par consquent tre un peu plus efficace :
SELECT round(4.0, 4);
Exemple 10.5. Rsolution de types pour les fonctions retournant un segment de chane
Il existe plusieurs fonctions substr, une d'entre elles prend les types text et integer. Si cette fonction est appele avec une
constante de chanes d'un type inconnu, le systme choisi la fonction candidate qui accepte un argument issu de la catgorie prfre string (c'est--dire de type text).
SELECT
substr('1234', 3);
1
La raison de cette tape est le support des spcifications de conversion au format fonction pour les cas o la vraie fonction de conversion n'existe pas. S'il existe une fonction de conversion, elle est habituellement nomme suivant le nom du type en sortie et donc il n'est pas ncessaire d'avoir un cas spcial. Pour plus d'informations, voir CREATE CAST(7).
218
Conversion de types
substr
-------34
(1 row)
Si la chane de caractres est dclare comme tant du type varchar (chane de caractres de longueur variable), ce qui peut tre le
cas si elle vient d'une table, alors l'analyseur essayera de la convertir en text :
SELECT substr(varchar '1234', 3);
substr
-------34
(1 row)
Ceci est transform par l'analyseur en
SELECT substr(CAST (varchar '1234' AS text), 3);
Note
L'analyseur apprend depuis le catalogue pg_cast que les types text et varchar ont une compatibilit binaire, ce qui
veut dire que l'un peut tre pass une fonction qui accepte l'autre sans avoir faire aucune conversion physique.
Par consquent, aucun appel de conversion de types n'est rellement insr dans ce cas.
Et si la fonction est appele avec un argument de type integer, l'analyseur essaie de le convertir en text :
SELECT substr(1234, 3);
ERROR: function substr(integer, integer) does not exist
HINT: No function matches the given name and argument types. You might need
to add explicit type casts.
Ceci ne fonctionne pas car integer n'a pas de conversion implicite vers text. Nanmoins, une conversion explicite fonctionnera :
SELECT substr(CAST (1234 AS text), 3);
substr
-------34
(1 row)
1.
2.
Dans le cas contraire, essayer de convertir l'expression vers le type cible. Cela russira s'il y a une conversion (cast) enregistre entre ces deux types. Si une expression est de type inconnu, le contenu de la chane littrale sera fourni l'entre de la
routine de conversion pour le type cible.
3.
Vrifier s'il y a une conversion de taille pour le type cible. Une conversion de taille est une conversion d'un type vers luimme. Si elle est trouve dans le catalogue pg_cast, appliquez-la l'expression avant de la stocker dans la colonne de destination. La fonction d'implmentation pour une telle conversion prend toujours un paramtre supplmentaire de type integer,
qui reoit la valeur atttypmod de la colonne de destination (en fait, sa valeur dclare ; l'interprtation de atttypmod varie pour les diffrents types de donnes). La fonction de conversion est responsable de l'application de toute smantique dpendante de la longueur comme la vrification de la taille ou une troncature.
219
Conversion de types
Pour une colonne cible dclare comme character(20), la dclaration suivante montre que la valeur stocke a la taille correcte :
CREATE TABLE vv (v character(20));
INSERT INTO vv SELECT 'abc' || 'def';
SELECT v, octet_length(v) FROM vv;
v
| octet_length
----------------------+-------------abcdef
|
20
(1 row)
Voici ce qui s'est rellement pass ici : les deux types inconnus sont rsolus en text par dfaut, permettant l'oprateur || de les
rsoudre comme une concatnation de text. Ensuite, le rsultat text de l'oprateur est converti en bpchar ( blank-padded char ,
le nom interne du type de donnes character (caractre)) pour correspondre au type de la colonne cible (comme la conversion de
text bpchar est compatible binairement, cette conversion n'insre aucun appel rel une fonction). Enfin, la fonction de taille
bpchar(bpchar, integer, boolean) est trouve dans le catalogue systme et applique au rsultat de l'oprateur et la
longueur de la colonne stocke. Cette fonction de type spcifique effectue le contrle de la longueur requise et ajoute des espaces
pour combler la chane.
1.
Si toutes les entres sont du mme type et qu'il ne s'agit pas du type unknown, rsoudre comme tant de ce type. Sinon, remplacer tous les types de domaine dans la liste avec les types de base sous-jacents.
2.
Si toutes les entres sont du type unknown, rsoudre comme tant du type text (le type prfr de la catgorie chane). Dans
le cas contraire, les entres unknown seront ignores.
3.
Si toutes les entres non-inconnues ne sont pas toutes de la mme catgorie, chouer.
4.
Choisir la premire entre non-inconnue qui est un type prfr dans sa catgorie, s'il y en a une.
5.
Sinon, choisir le dernier type en entre qui ne soit pas inconnu et qui permet toutes les entres prcdentes qui ne sont pas
inconnues tre implicitement converties. (Il y a toujours un type de ce genre car au moins le premier type dans la liste doit
satisfaire cette condition.)
6.
Convertir toutes les entres du type slectionn. choue s'il n'y a pas de conversion partir de l'entre donne vers le type slectionn.
220
Conversion de types
221
11.1. Introduction
Soit une table dfinie ainsi :
CREATE TABLE test1 (
id integer,
contenu varchar
);
et une application qui utilise beaucoup de requtes de la forme :
SELECT contenu FROM test1 WHERE id = constante;
Sans prparation, le systme doit lire la table test1 dans son intgralit, ligne par ligne, pour trouver toutes les lignes qui correspondent. S'il y a beaucoup de lignes dans test1, et que seules quelques lignes correspondent la requte (peut-tre mme zro ou
une seule), alors, clairement, la mthode n'est pas efficace. Mais si le systme doit maintenir un index sur la colonne id, alors il
peut utiliser une manire beaucoup plus efficace pour trouver les lignes recherches. Il se peut qu'il n'ait ainsi qu' parcourir
quelques niveaux d'un arbre de recherche.
Une approche similaire est utilise dans la plupart des livres autres que ceux de fiction : les termes et concepts frquemment recherchs par les lecteurs sont lists par ordre alphabtique la fin du livre. Le lecteur qui recherche un mot particulier peut facilement parcourir l'index, puis aller directement la page (ou aux pages) indique(s). De la mme faon que l'auteur doit anticiper les sujets que les lecteurs risquent de rechercher, il est de la responsabilit du programmeur de prvoir les index qui sont
utiles.
La commande suivante peut tre utilis pour crer un index sur la colonne id :
CREATE INDEX test1_id_index ON test1 (id);
Le nom test1_id_index peut tre choisi librement mais il est conseill de choisir un nom qui rappelle le but de l'index.
Pour supprimer l'index, on utilise la commande DROP INDEX. Les index peuvent tre ajouts et retirs des tables tout moment.
Une fois un index cr, aucune intervention supplmentaire n'est ncessaire : le systme met jour l'index lorsque la table est
modifie et utilise l'index dans les requtes lorsqu'il pense que c'est plus efficace qu'une lecture complte de la table. Il faut
nanmoins lancer la commande ANALYZE rgulirement pour permettre l'optimiseur de requtes de prendre les bonnes dcisions. Voir le Chapitre 14, Conseils sur les performances pour comprendre quand et pourquoi l'optimiseur dcide d'utiliser ou de
ne pas utiliser un index.
Les index peuvent aussi bnficier aux commandes UPDATE et DELETE conditions de recherche. De plus, les index
peuvent tre utiliss dans les jointures. Ainsi, un index dfini sur une colonne qui fait partie d'une condition de jointure peut aussi acclrer significativement les requtes avec jointures.
Crer un index sur une grosse table peut prendre beaucoup de temps. Par dfaut, PostgreSQL autorise la lecture (SELECT)
sur la table pendant la cration d'un index sur celle-ci, mais interdit les critures (INSERT, UPDATE, DELETE). Elles sont
bloques jusqu' la fin de la construction de l'index. Dans des environnements de production, c'est souvent inacceptable. Il est
possible d'autoriser les critures en parallle de la cration d'un index, mais quelques prcautions sont prendre. Pour plus
d'informations, voir la section intitule Construire des index en parallle .
Aprs la cration d'un index, le systme doit le maintenir synchronis avec la table. Cela rend plus lourdes les oprations de manipulation de donnes. C'est pourquoi les index qui sont peu, voire jamais, utiliss doivent tre supprims.
Index
<=
=
>=
>
Les constructions quivalentes des combinaisons de ces oprateurs, comme BETWEEN et IN, peuvent aussi tre implantes avec
une recherche par index B-tree. Une condition IS NULL ou IS NOT NULL sur une colonne indexe peut aussi tre utilis avec
un index B-tree.
L'optimiseur peut aussi utiliser un index B-tree pour des requtes qui utilisent les oprateurs de recherche de motif LIKE et ~ si le
motif est une constante et se trouve au dbut de la chane rechercher -- par exemple, col LIKE 'foo%' ou col ~
'^foo', mais pas col LIKE '%bar'. Toutefois, si la base de donnes n'utilise pas la locale C, il est ncessaire de crer
l'index avec une classe d'oprateur spciale pour supporter l'indexation correspondance de modles. Voir la Section 11.9,
Classes et familles d'oprateurs ci-dessous. Il est aussi possible d'utiliser des index B-tree pour ILIKE et ~*, mais seulement
si le modle dbute par des caractres non alphabtiques, c'est--dire des caractres non affects par les conversions majuscules/
minuscules.
Les index B-tree peuvent aussi tre utiliss pour rcuprer des donnes tries. Ce n'est pas toujours aussi rapide qu'un simple parcours squentiel suivi d'un tri mais c'est souvent utile.
Les index hash ne peuvent grer que des comparaisons d'galit simple. Le planificateur de requtes considre l'utilisation d'un index hash quand une colonne indexe est implique dans une comparaison avec l'oprateur =. La commande suivante est utilise
pour crer un index hash :
CREATE INDEX nom ON table USING hash (column);
Attention
Les oprations sur les index de hachage ne sont pas traces par les journaux de transactions. Il est donc gnralement ncessaire de les reconstruire avec REINDEX aprs un arrt brutal de la base de donnes si des modifications
n'ont pas t crites. De plus, les modifications dans les index hash ne sont pas rpliques avec la rplication Warm
Standby aprs la sauvegarde de base initiale, donc ces index donneront de mauvaises rponses aux requtes qui les
utilisent. Pour ces raisons, l'utilisation des index hash est actuellement dconseille.
Les index GiST ne constituent pas un unique type d'index, mais plutt une infrastructure l'intrieur de laquelle plusieurs stratgies d'indexage peuvent tre implantes. De cette faon, les oprateurs particuliers avec lesquels un index GiST peut tre utilis
varient en fonction de la stratgie d'indexage (la classe d'oprateur). Par exemple, la distribution standard de PostgreSQL inclut
des classes d'oprateur GiST pour plusieurs types de donnes gomtriques deux dimensions, qui supportent des requtes indexes utilisant ces oprateurs :
<<
&<
&>
>>
<<|
&<|
|&>
|>>
@>
<@
~=
&&
Voir la Section 9.11, Fonctions et oprateurs gomtriques pour connatre la signification de ces oprateurs. De plus, une
condition IS NULL sur une colonne d'index peut tre utilise avec un index GiST. Beaucoup de classes d'oprateur GiST sont
disponibles dans l'ensemble des contrib ou comme projet spar. Pour plus d'informations, voir Chapitre 53, Index GiST.
Les index GiST sont aussi capables d'optimiser des recherches du type voisin-le-plus-proche (nearest-neighbor), comme par
exemple :
SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
qui trouve les dix places les plus proches d'une cible donne. Cette fonctionnalit dpend de nouveau de la classe d'oprateur utilise.
Les index GIN sont des index inverss qui peuvent grer des valeurs contenant plusieurs cls, les tableaux par exemple. Comme
GiST, GIN supporte diffrentes stratgies d'indexation utilisateur. Les oprateurs particuliers avec lesquels un index GIN peut tre
223
Index
utilis varient selon la stratgie d'indexation. Par exemple, la distribution standard de PostgreSQL inclut des classes d'oprateurs
GIN pour des tableaux une dimension qui supportent les requtes indexes utilisant ces oprateurs :
<@
@>
=
&&
Voir Section 9.17, Fonctions et oprateurs de tableaux pour la signification de ces oprateurs. Beaucoup d'autres classes
d'oprateurs GIN sont disponibles dans les modules contrib ou dans des projets spars. Pour plus d'informations, voir Chapitre 54, Index GIN.
Index
Index
Section 11.3, Index multicolonnes , il est pratiquement inutile pour les requtes n'impliquant que y. Il ne peut donc pas tre le
seul index. Une combinaison de l'index multi-colonnes et d'un index spar sur y est une solution raisonnable. Pour les requtes
qui n'impliquent que x, l'index multi-colonnes peut tre utilis, bien qu'il soit plus large et donc plus lent qu'un index sur x seul.
La dernire alternative consiste crer les trois index, mais cette solution n'est raisonnable que si la table est lue bien plus frquemment qu'elle n'est mise jour et que les trois types de requte sont communs. Si un des types de requte est bien moins courant que les autres, il est prfrable de ne crer que les deux index qui correspondent le mieux aux types communs.
Note
La mthode la plus approprie pour ajouter une contrainte une table est ALTER TABLE ... ADD
CONSTRAINT. L'utilisation des index pour vrifier les contraintes d'unicit peut tre considre comme un dtail
d'implantation qui ne doit pas tre utilis directement. Il n'est pas ncessaire de crer manuellement un index sur les
colonnes uniques. Cela duplique l'index cr automatiquement.
226
Index
Soit l'enregistrement d'un journal d'accs un serveur web dans une base de donnes. La plupart des accs proviennent de classes
d'adresses IP internes l'organisation, mais certaines proviennent de l'extrieur (des employs connects par modem, par
exemple). Si les recherches par adresses IP concernent essentiellement les accs extrieurs, il est inutile d'indexer les classes
d'adresses IP qui correspondent au sous-rseau de l'organisation.
Si la table ressemble :
CREATE TABLE access_log (
url varchar,
client_ip inet,
...
);
Pour crer un index partiel qui corresponde l'exemple, il faut utiliser une commande comme celle-ci :
CREATE INDEX access_log_client_ip_ix ON access_log (client_ip)
WHERE NOT (client_ip > inet '192.168.100.0' AND
client_ip < inet '192.168.100.255');
Une requte typique qui peut utiliser cet index est :
SELECT *
FROM access_log
WHERE url = '/index.html' AND client_ip = inet '212.78.10.32';
Une requte qui ne peut pas l'utiliser est :
SELECT *
FROM access_log
WHERE client_ip = inet '192.168.100.23';
Ce type d'index partiel ncessite que les valeurs courantes soient prdtermines, de faon ce que ce type d'index soit mieux utilis avec une distribution des donnes qui ne change pas. Les index peuvent tre recrs occasionnellement pour s'adapter aux
nouvelles distributions de donnes, mais cela ajoute de la maintenance.
Une autre utilisation possible d'index partiel revient exclure des valeurs de l'index qui ne correspondent pas aux requtes courantes ; ceci est montr dans l'Exemple 11.2, Mettre en place un index partiel pour exclure les valeurs inintressantes . Cette
mthode donne les mmes avantages que la prcdente mais empche l'accs par l'index aux valeurs sans intrt . videmment,
mettre en place des index partiels pour ce genre de scnarios ncessite beaucoup de soin et d'exprimentation.
Exemple 11.2. Mettre en place un index partiel pour exclure les valeurs inintressantes
Soit une table qui contient des commandes factures et des commandes non factures, avec les commandes non factures qui ne
prennent qu'une petite fraction de l'espace dans la table, et qu'elles sont les plus accdes. Il est possible d'amliorer les performances en crant un index limit aux lignes non factures. La commande pour crer l'index ressemble :
CREATE INDEX index_commandes_nonfacturees ON commandes (no_commande)
WHERE facturee is not true;
La requte suivante utilise cet index :
SELECT * FROM commandes WHERE facturee is not true AND no_commande < 10000;
227
Index
Nanmoins, l'index peut aussi tre utilis dans des requtes qui n'utilisent pas no_commande, comme :
SELECT * FROM commandes WHERE facturee is not true AND montant > 5000.00;
Ceci n'est pas aussi efficace qu'un index partiel sur la colonne montant, car le systme doit lire l'index en entier. Nanmoins, s'il
y a assez peu de commandes non factures, l'utilisation de cet index partiel pour trouver les commandes non factures peut tre
plus efficace.
La requte suivante ne peut pas utiliser cet index :
SELECT * FROM commandes WHERE no_commande = 3501;
La commande 3501 peut faire partie des commandes factures ou non factures.
L'Exemple 11.2, Mettre en place un index partiel pour exclure les valeurs inintressantes illustre aussi le fait que la colonne indexe et la colonne utilise dans le prdicat ne sont pas ncessairement les mmes. PostgreSQL supporte tous les prdicats sur
les index partiels, tant que ceux-ci ne portent que sur des champs de la table indexe. Nanmoins, il faut se rappeler que le prdicat
doit correspondre aux conditions utilises dans les requtes qui sont supposes profiter de l'index. Pour tre prcis, un index partiel
ne peut tre utilis pour une requte que si le systme peut reconnatre que la clause WHERE de la requte implique mathmatiquement le prdicat de l'index. PostgreSQL n'a pas de mthode sophistique de dmonstration de thorme pour reconnatre que
des expressions apparemment diffrentes sont mathmatiquement quivalentes. (Non seulement une telle mthode gnrale de dmonstration serait extrmement complexe crer mais, en plus, elle serait probablement trop lente pour tre d'une quelconque utilit). Le systme peut reconnatre des implications d'ingalits simples, par exemple x < 1 implique x < 2 ; dans les autres
cas, la condition du prdicat doit correspondre exactement une partie de la clause WHERE de la requte, sans quoi l'index ne peut
pas tre considr utilisable. La correspondance prend place lors de l'excution de la planification de la requte, pas lors de
l'excution. ce titre, les clauses de requtes paramtres ne fonctionnent pas avec un index partiel. Par exemple, une requte
prpare avec un paramtre peut indiquer x < ? qui n'implique jamais x < 2 pour toutes les valeurs possibles du paramtre.
Un troisime usage possible des index partiels ne ncessite pas que l'index soit utilis dans des requtes. L'ide ici est de crer un
index d'unicit sur un sous-ensemble de la table, comme dans l'Exemple 11.3, Mettre en place un index d'unicit partiel . Cela
permet de mettre en place une unicit parmi le sous-ensemble des lignes de la table qui satisfont au prdicat, sans contraindre les
lignes qui n'y satisfont pas.
Exemple 11.3. Mettre en place un index d'unicit partiel
Soit une table qui dcrit des rsultats de tests. On souhaite s'assurer qu'il n'y a qu'une seule entre succs (succes) pour chaque
combinaison de sujet et de rsultat, alors qu'il peut y avoir un nombre quelconque d'entres echec . Une faon de procder :
CREATE TABLE tests (
sujet text,
resultat text,
succes boolean,
...
);
CREATE UNIQUE INDEX contrainte_tests_reussis ON tests (sujet, resultat)
WHERE succes;
C'est une mthode trs efficace quand il y a peu de tests russis et beaucoup de tests en chec.
Enfin, un index partiel peut aussi tre utilis pour surcharger les choix de plan d'excution de requte du systme. De plus, des
jeux de donnes distribution particulire peuvent inciter le systme utiliser un index alors qu'il ne devrait pas. Dans ce cas, on
peut mettre en place l'index de telle faon qu'il ne soit pas utilis pour la requte qui pose problme. Normalement, PostgreSQL
fait des choix d'usage d'index raisonnables. Par exemple, il les vite pour rechercher les valeurs communes, si bien que l'exemple
prcdent n'conomise que la taille de l'index, il n'est pas ncessaire pour viter l'utilisation de l'index. En fait, les choix de plan
d'excution incorrects doivent tre traits comme des bogues, et tre transmis l'quipe de dveloppement.
Mettre en place un index partiel indique une connaissance au moins aussi tendue que celle de l'analyseur de requtes, en particulier, savoir quand un index peut tre profitable. Une telle connaissance ncessite de l'exprience et une bonne comprhension du
fonctionnement des index de PostgreSQL. Dans la plupart des cas, les index partiels ne reprsentent pas un gros gain par rapport aux index classiques.
Plus d'informations sur les index partiels est disponible dans Stonebraker, M, 1989b, olson93 et Seshardri, 1995.
Index
La classe d'oprateurs identifie les oprateurs que l'index doit utiliser sur cette colonne. Par exemple, un index B-tree sur une colonne de type int4 utilise la classe int4_ops. Cette classe d'oprateurs comprend des fonctions de comparaison pour les valeurs
de type int4. En pratique, la classe d'oprateurs par dfaut pour le type de donnes de la colonne est gnralement suffisante. Les
classes d'oprateurs sont utiles pour certains types de donnes, pour lesquels il peut y avoir plus d'un comportement utile de
l'index. Par exemple, une donne de type nombre complexe peut tre classe par sa valeur absolue, ou par sa partie entire. Cela
peut s'obtenir en dfinissant deux classes d'oprateurs pour ce type de donnes et en slectionnant la bonne classe la cration de
l'index. La classe d'oprateur dtermine l'ordre de tri basique (qui peut ensuite tre modifi en ajoutant des options de tri comme
COLLATE, ASC/DESC et/ou NULLS FIRST/NULLS LAST).
Il y a quelques classes d'oprateurs en plus des classes par dfaut :
Les classes d'oprateurs text_pattern_ops, varchar_pattern_ops et bpchar_pattern_ops supportent les index B-tree sur les types text, varchar et char, respectivement. la diffrence des classes d'oprateurs par dfaut, les valeurs
sont compares strictement caractre par caractre plutt que suivant les rgles de tri spcifiques la localisation. Cela rend
ces index utilisables pour des requtes qui utilisent des recherches sur des motifs (LIKE ou des expressions rgulires POSIX)
quand la base de donnes n'utilise pas la locale standard C . Par exemple, on peut indexer une colonne varchar comme ceci :
CREATE INDEX test_index ON test_table (col varchar_pattern_ops);
Il faut crer un index avec la classe d'oprateurs par dfaut pour que les requtes qui utilisent une comparaison <, <=, > ou >=
ordinaire utilisent un index. De telles requtes ne peuvent pas utiliser les classes d'oprateurs xxx_pattern_ops. Nanmoins, des comparaisons d'galit ordinaires peuvent utiliser ces classes d'oprateur. Il est possible de crer plusieurs index sur
la mme colonne avec diffrentes classes d'oprateurs. Si la locale C est utilise, les classes d'oprateur xxx_pattern_ops
ne sont pas ncessaires, car un index avec une classe d'oprateurs par dfaut est utilisable pour les requtes de correspondance
de modles dans la locale C.
Index
L'index utilise automatiquement le collationnement de la colonne sous-jacente. Donc une requte de la forme
SELECT * FROM test1c WHERE content > constant;
peut utiliser l'index car la comparaison utilisera par dfaut le collationnement de la colonne. Nanmoins, cet index ne peut pas acclrer les requtes qui impliquent d'autres collationnements. Donc, pour des requtes de cette forme
SELECT * FROM test1c WHERE content > constant COLLATE "y";
un index supplmentaire, supportant le collationnement "y" peut tre ajout ainsi :
CREATE INDEX test1c_content_y_index ON test1c (content COLLATE "y");
La premire chose faire est de lancer ANALYZE(7). Cette commande collecte les informations sur la distribution des valeurs dans la table. Cette information est ncessaire pour estimer le nombre de lignes retournes par une requte. L'optimiseur
de requtes en a besoin pour donner des cots ralistes aux diffrents plans de requtes possibles. En l'absence de statistiques
relles, le systme utilise quelques valeurs par dfaut, qui ont toutes les chances d'tre inadaptes. Examiner l'utilisation des index par une application sans avoir lanc ANALYZE au pralable est, de ce fait, peine perdue. Voir Section 23.1.3,
Maintenir les statistiques du planificateur et Section 23.1.5, Le dmon auto-vacuum pour plus d'informations.
Utiliser des donnes relles pour l'exprimentation. Utiliser des donnes de test pour mettre en place des index permet de trouver les index utiles pour les donnes de test, mais c'est tout.
Il est particulirement nfaste d'utiliser des jeux de donnes trs rduits. Alors qu'une requte slectionnant 1000 lignes parmi
100000 peut utiliser un index, il est peu probable qu'une requte slectionnant 1 ligne dans une table de 100 le fasse, parce que
les 100 lignes tiennent probablement dans une seule page sur le disque, et qu'il n'y a aucun plan d'excution qui puisse aller
plus vite que la lecture d'une seule page.
tre vigilant en crant des donnes de test. C'est souvent invitable quand l'application n'est pas encore en production. Des valeurs trs similaires, compltement alatoires, ou insres dj tries peuvent modifier la distribution des donnes et fausser les
statistiques.
Quand les index ne sont pas utiliss, il peut tre utile pour les tests de forcer leur utilisation. Certains paramtres d'excution
du serveur peuvent interdire certains types de plans (voir la Section 18.7.1, Configuration de la mthode du planificateur ).
Par exemple, en interdisant les lectures squentielles de tables enable_seqscan) et les jointures boucles imbriques
(enable_nestloop), qui sont les deux plans les plus basiques, on force le systme utiliser un plan diffrent. Si le systme continue nanmoins choisir une lecture squentielle ou une jointure boucles imbriques, alors il y a probablement une
raison plus fondamentale qui empche l'utilisation de l'index ; la condition peut, par exemple, ne pas correspondre l'index.
(Les sections prcdentes expliquent quelles sortes de requtes peuvent utiliser quelles sortes d'index.)
Si l'index est effectivement utilis en forant son utilisation, alors il y a deux possibilits : soit le systme a raison et
l'utilisation de l'index est effectivement inapproprie, soit les cots estims des plans de requtes ne refltent pas la ralit. Il
faut alors comparer la dure de la requte avec et sans index. La commande EXPLAIN ANALYZE peut tre utile pour cela.
S'il apparat que les estimations de cots sont fausses, il y a de nouveau deux possibilits. Le cot total est calcul partir du
cot par ligne de chaque nud du plan, multipli par l'estimation de slectivit du nud de plan. Le cot estim des nuds de
plan peut tre ajust avec des paramtres d'excution (dcrits dans la Section 18.7.2, Constantes de cot du planificateur ).
Une estimation de slectivit inadapte est due des statistiques insuffisantes. Il peut tre possible de les amliorer en optimisant les paramtres de collecte de statistiques. Voir ALTER TABLE(7).
Si les cots ne peuvent tre ajusts une meilleure reprsentation de la ralit, alors il faut peut-tre forcer l'utilisation de
l'index explicitement. Il peut aussi s'avrer utile de contacter les dveloppeurs de PostgreSQL afin qu'ils examinent le problme.
230
Aucun support linguistique, mme pour l'anglais. Les expressions rationnelles ne sont pas suffisantes car elles ne peuvent
pas grer facilement les mots drives, par exemple satisfait et satisfaire. Vous pouvez laisser passer des documents qui contiennent satisfait bien que vous souhaiteriez quand mme les trouver avec une recherche sur satisfaire. Il est possible d'utiliser OR pour rechercher plusieurs formes drives mais cela devient complexe et augmente le
risque d'erreur (certains mots peuvent avoir des centaines de variantes).
Ils ne fournissent aucun classement (score) des rsultats de la recherche, ce qui les rend inefficaces quand des centaines de
documents correspondants sont trouvs.
Ils ont tendance tre lent car les index sont peu supports, donc ils doivent traiter tous les documents chaque recherche.
L'indexage pour la recherche plein texte permet au document d'tre pr-trait et qu'un index de ce pr-traitement soit sauvegard
pour une recherche ultrieure plus rapide. Le pr-traitement inclut :
Analyse des documents en jetons. Il est utile d'identifier les diffrentes classes de jetons, c'est--dire nombres, mots, mots
complexes, adresses email, pour qu'ils puissent tre traits diffremment. En principe, les classes de jeton dpendent de
l'application mais, dans la plupart des cas, utiliser un ensemble prdfinie de classes est adquat. PostgreSQL utilise un
analyseur pour raliser cette tape. Un analyseur standard est fourni, mais des analyseurs personnaliss peuvent tre crits
pour des besoins spcifiques.
Conversion des jetons en lexemes. Un lexeme est une chane, identique un jeton, mais elle a t normalise pour que diffrentes formes du mme mot soient dcouvertes. Par exemple, la normalisation inclut pratiquement toujours le remplacement
des majuscules par des minuscules, ainsi que la suppression des suffixes (comme s ou es en anglais). Ceci permet aux recherches de trouver les variantes du mme mot, sans avoir besoin de saisir toutes les variantes possibles. De plus, cette tape
limine typiquement les termes courants, qui sont des mots si courants qu'il est inutile de les rechercher. Donc, les jetons
sont des fragments bruts du document alors que les lexemes sont des mots supposs utiles pour l'indexage et la recherche.
PostgreSQL utilise des dictionnaires pour raliser cette tape. Diffrents dictionnaires standards sont fournis et des dictionnaires personnaliss peuvent tre crs pour des besoins spcifiques.
Stockage des documents pr-traits pour optimiser la recherche . Chaque document peut tre reprsent comme un tableau
tri de lexemes normaliss. Avec ces lexemes, il est souvent souhaitable de stocker des informations de position utiliser
pour obtenir un score de proximit, pour qu'un document qui contient une rgion plus dense des mots de la requte se
voit affect un score plus important qu'un document qui en a moins.
Les dictionnaires autorisent un contrle fin de la normalisation des jetons. Avec des dictionnaires appropris, vous pouvez :
Un type de donnes tsvector est fourni pour stocker les documents pr-traits, avec un type tsquery pour reprsenter les requtes
traites (Section 8.11, Types de recherche plein texte ). Il existe beaucoup de fonctions et d'oprateurs disponibles pour ces
types de donnes (Section 9.13, Fonctions et oprateurs de la recherche plein texte ), le plus important tant l'oprateur de
correspondance @@, dont nous parlons dans la Section 12.1.2, Correspondance de base d'un texte . Les recherches plein texte
peuvent tre acclres en utilisant des index (Section 12.9, Types d'index GiST et GIN ).
231
SELECT m.titre || ' ' || m.auteur || ' ' || m.resume || ' ' || d.corps AS document
FROM messages m, docs d
WHERE mid = did AND mid = 12;
Note
En fait, dans ces exemples de requtes, coalesce devrait tre utilis pour empcher un rsultat NULL pour le document entier cause d'une seule colonne NULL.
Une autre possibilit est de stocker les documents dans de simples fichiers texte du systme de fichiers. Dans ce cas, la base est
utilise pour stocker l'index de recherche plein texte et pour excuter les recherches, et un identifiant unique est utilis pour retrouver le document sur le systme de fichiers. Nanmoins, retrouver les fichiers en dehors de la base demande les droits d'un superutilisateur ou le support de fonctions spciales, donc c'est habituellement moins facile que de conserver les donnes dans PostgreSQL. De plus, tout conserver dans la base permet un accs simple aux mta-donnes du document pour aider l'indexage et
l'affichage.
Dans le but de la recherche plein texte, chaque document doit tre rduit au format de pr-traitement, tsvector. La recherche et le
calcul du score sont raliss entirement partir de la reprsentation tsvector d'un document -- le texte original n'a besoin d'tre retrouv que lorsque le document a t slectionn pour tre montr l'utilisateur. Nous utilisons souvent tsvector pour le document
mais, bien sr, il ne s'agit que d'une reprsentation compacte du document complet.
Observez que cette correspondance ne russit pas si elle est crite ainsi :
SELECT 'fat cats ate fat rats'::tsvector @@ to_tsquery('fat & rat');
?column?
---------f
car ici aucune normalisation du mot rats n'interviendra. Les lments d'un tsvector sont des lexemes, qui sont supposs dj normaliss, donc rats ne correspond pas rat.
L'oprateur @@ supporte aussi une entre de type text, permettant l'oubli de conversions explicites de text vers tsvector ou tsquery
dans les cas simples. Les variantes disponibles sont :
tsvector @@ tsquery
tsquery @@ tsvector
text @@ tsquery
text @@ text
Nous avons dj vu les deux premires. La forme text @@ tsquery est quivalent to_tsvector(x) @@ y. La forme text @@
text est quivalente to_tsvector(x) @@ plainto_tsquery(y).
12.1.3. Configurations
Les exemples ci-dessus ne sont que des exemples simples de recherche plein texte. Comme mentionn prcdemment, la recherche plein texte permet de faire beaucoup plus : ignorer l'indexation de certains mots (termes courants), traiter les synonymes
et utiliser une analyse sophistique, c'est--dire une analyse base sur plus qu'un espace blanc. Ces fonctionnalits sont contrles
par les configurations de recherche plein texte. PostgreSQL arrive avec des configurations prdfinies pour de nombreux langages et vous pouvez facilement crer vos propres configurations (la commande \dF de psql affiche toutes les configurations disponibles).
Lors de l'installation, une configuration approprie est slectionne et default_text_search_config est configur dans postgresql.conf pour qu'elle soit utilise par dfaut. Si vous utilisez la mme configuration de recherche plein texte pour le cluster entier, vous pouvez utiliser la valeur de postgresql.conf. Pour utiliser diffrentes configurations dans le cluster mais avec la
mme configuration pour une base, utilisez ALTER DATABASE ... SET. Sinon, vous pouvez configurer default_text_search_config dans chaque session.
Chaque fonction de recherche plein texte qui dpend d'une configuration a un argument regconfig en option, pour que la configuration utilise puisse tre prcise explicitement. default_text_search_config est seulement utilis quand cet argument
est omis.
Pour rendre plus facile la construction de configurations de recherche plein texte, une configuration est construite partir d'objets
de la base de donnes. La recherche plein texte de PostgreSQL fournit quatre types d'objets relatifs la configuration :
Les analyseurs de recherche plein texte cassent les documents en jetons et classifient chaque jeton (par exemple, un mot ou un
nombre).
Les dictionnaires de recherche plein texte convertissent les jetons en une forme normalise et rejettent les termes courants.
Les modles de recherche plein texte fournissent les fonctions ncessaires aux dictionnaires. (Un dictionnaire spcifie uniquement un modle et un ensemble de paramtres pour ce modle.)
Les configurations de recherche plein texte slectionnent un analyseur et un ensemble de dictionnaires utiliser pour normaliser les jetons produit par l'analyseur.
Les analyseurs de recherche plein texte et les modles sont construits partir de fonctions bas niveau crites en C ; du coup, le dveloppement de nouveaux analyseurs ou modles ncessite des connaissances en langage C, et les droits superutilisateur pour les
installer dans une base de donnes. (Il y a des exemples d'analyseurs et de modles en addon dans la partie contrib/ de la distribution PostgreSQL.) Comme les dictionnaires et les configurations utilisent des paramtres et se connectent aux analyseurs et
modles, aucun droit spcial n'est ncessaire pour crer un nouveau dictionnaire ou une nouvelle configuration. Les exemples de
cration de dictionnaires et de configurations personnaliss seront prsents plus tard dans ce chapitre.
Il est possible de faire des recherches plein texte sans index. Une requte qui ne fait qu'afficher le champ title de chaque ligne
contenant le mot friend dans son champ body ressemble ceci :
SELECT title
FROM pgweb
WHERE to_tsvector('english', body) @@ to_tsquery('english', 'friend');
Ceci trouve aussi les mots relatifs comme friends et friendly car ils ont tous la mme racine, le mme lexeme normalis.
La requte ci-dessus spcifie que la configuration english doit tre utilise pour analyser et normaliser les chanes. Nous pouvons aussi omettre les paramtres de configuration :
SELECT title
FROM pgweb
WHERE to_tsvector(body) @@ to_tsquery('friend');
Cette requte utilisera l'ensemble de configuration indiqu par default_text_search_config.
Un exemple plus complexe est de slectionner les dix documents les plus rcents qui contiennent les mots create et table
dans les champs title ou body :
SELECT title
FROM pgweb
WHERE to_tsvector(title || ' ' || body) @@ to_tsquery('create & table')
ORDER BY last_mod_date DESC LIMIT 10;
Pour plus de claret, nous omettons les appels la fonction coalesce qui est ncessaire pour rechercher les lignes contenant
NULL dans un des deux champs.
Bien que ces requtes fonctionnent sans index, la plupart des applications trouvent cette approche trop lente, sauf peut-tre pour
des recherches occasionnelles. Une utilisation pratique de la recherche plein texte rclame habituellement la cration d'un index.
234
Une autre approche revient crer une colonne tsvector spare pour contenir le rsultat de to_tsvector. Cet exemple est une
concatnation de title et body, en utilisant coalesce pour s'assurer qu'un champ est toujours index mme si l'autre vaut
NULL :
ALTER TABLE pgweb ADD COLUMN textsearchable_index_col tsvector;
UPDATE pgweb SET textsearchable_index_col =
to_tsvector('english', coalesce(title,'') || ' ' || coalesce(body,''));
Puis nous crons un index GIN pour acclrer la recherche :
CREATE INDEX textsearch_idx ON pgweb USING gin(textsearchable_index_col);
Maintenant, nous sommes prt pour des recherches plein texte rapides :
SELECT title
FROM pgweb
WHERE textsearchable_index_col @@ to_tsquery('create & table')
ORDER BY last_mod_date DESC
LIMIT 10;
Lors de l'utilisation d'une colonne spare pour stocker la reprsentation tsvector, il est ncessaire d'ajouter un trigger pour obtenir
une colonne tsvector jour tout moment suivant les modifications de title et body. La Section 12.4.3, Triggers pour les
mises jour automatiques explique comment le faire.
Un avantage de l'approche de la colonne spare sur un index par expression est qu'il n'est pas ncessaire de spcifier explicitement la configuration de recherche plein texte dans les requtes pour utiliser l'index. Comme indiqu dans l'exemple ci-dessus, la
requte peut dpendre de default_text_search_config. Un autre avantage est que les recherches seront plus rapides car
il n'est plus ncessaire de refaire des appels to_tsvector pour vrifier la correspondance de l'index. (Ceci est plus important
lors de l'utilisation d'un index GiST par rapport un index GIN ; voir la Section 12.9, Types d'index GiST et GIN .) Nanmoins, l'approche de l'index par expression est plus simple configurer et elle rclame moins d'espace disque car la reprsentation
tsvector n'est pas rellement stocke.
dans une recherche. Dans notre exemple, il s'agissait de a, on et it. Si aucun dictionnaire de la liste ne reconnat le jeton, il est
aussi ignor. Dans cet exemple, il s'agit du signe de ponctuation - car il n'existe aucun dictionnaire affect ce type de jeton
(Space symbols), ce qui signifie que les jetons espace ne seront jamais indexs. Le choix de l'analyseur, des dictionnaires et
des types de jetons indexer est dtermin par la configuration de recherche plein texte slectionn (Section 12.7, Exemple de
configuration ). Il est possible d'avoir plusieurs configurations pour la mme base, et des configurations prdfinies sont disponibles pour diffrentes langues. Dans notre exemple, nous avons utilis la configuration par dfaut, savoir english pour
l'anglais.
La fonction setweight peut tre utilis pour ajouter un label aux entres d'un tsvector avec un poids donn. Ce poids consiste
en une lettre : A, B, C ou D. Elle est utilise typiquement pour marquer les entres provenant de diffrentes parties d'un document,
comme le titre et le corps. Plus tard, cette information peut tre utilise pour modifier le score des rsultats.
Comme to_tsvector(NULL) renvoie NULL, il est recommand d'utiliser coalesce quand un champ peut tre NULL. Voici
la mthode recommande pour crer un tsvector partir d'un document structur :
UPDATE tt SET ti =
setweight(to_tsvector(coalesce(title,'')), 'A')
||
setweight(to_tsvector(coalesce(keyword,'')), 'B') ||
setweight(to_tsvector(coalesce(abstract,'')), 'C') ||
setweight(to_tsvector(coalesce(body,'')), 'D');
Ici nous avons utilis setweight pour ajouter un label au source de chaque lexeme dans le tsvector final, puis assembl les valeurs tsvector en utilisant l'oprateur de concatnation des tsvector, ||. (La Section 12.4.1, Manipuler des documents donne
des dtails sur ces oprations.)
237
Si plus d'un bit de drapeau est indiqu, les transformations sont appliques dans l'ordre indiqu.
Il est important de noter que les fonctions de score n'utilisent aucune information globale donc il est impossible de produire une
normalisation de 1% ou 100%, comme c'est parfois demand. L'option de normalisation 32 (score/(score+1)) peut
s'appliquer pour chelonner tous les scores dans une chelle de zro un mais, bien sr, c'est une petite modification cosmtique,
donc l'ordre des rsultats ne changera pas.
Voici un exemple qui slectionne seulement les dix correspondances de meilleur score :
SELECT title, ts_rank_cd(textsearch, query) AS rank
FROM apod, to_tsquery('neutrino|(dark & matter)') query
WHERE query @@ textsearch
ORDER BY rank DESC
LIMIT 10;
title
|
rank
-----------------------------------------------+---------Neutrinos in the Sun
|
3.1
The Sudbury Neutrino Detector
|
2.4
A MACHO View of Galactic Dark Matter
| 2.01317
Hot Gas and Dark Matter
| 1.91171
The Virgo Cluster: Hot Plasma and Dark Matter | 1.90953
Rafting for Solar Neutrinos
|
1.9
NGC 4650A: Strange Galaxy and Dark Matter
| 1.85774
Hot Gas and Dark Matter
|
1.6123
Ice Fishing for Cosmic Neutrinos
|
1.6
Weak Lensing Distorts the Universe
| 0.818218
Voici le mme exemple en utilisant un score normalis :
SELECT title, ts_rank_cd(textsearch, query, 32 /* rank/(rank+1) */ ) AS rank
FROM apod, to_tsquery('neutrino|(dark & matter)') query
WHERE query @@ textsearch
ORDER BY rank DESC
LIMIT 10;
title
|
rank
-----------------------------------------------+------------------Neutrinos in the Sun
| 0.756097569485493
The Sudbury Neutrino Detector
| 0.705882361190954
A MACHO View of Galactic Dark Matter
| 0.668123210574724
Hot Gas and Dark Matter
| 0.65655958650282
The Virgo Cluster: Hot Plasma and Dark Matter | 0.656301290640973
Rafting for Solar Neutrinos
| 0.655172410958162
NGC 4650A: Strange Galaxy and Dark Matter
| 0.650072921219637
Hot Gas and Dark Matter
| 0.617195790024749
238
| 0.615384618911517
| 0.450010798361481
Le calcul du score peut consommer beaucoup de ressources car il demande de consulter le tsvector de chaque document correspondant, ce qui est trs consommateur en entres/sorties et du coup lent. Malheureusement, c'est presque impossible viter car
les requtes intressantes ont un grand nombre de correspondances.
StartSel, StopSel : les chanes qui permettent de dlimiter les mots de la requte parmi le reste des mots. Vous devez
mettre ces chanes entre guillemets doubles si elles contiennent des espaces ou des virgules.
MaxWords, MinWords : ces nombres dterminent les limites minimum et maximum des rsums afficher.
ShortWord : les mots de cette longueur et les mots plus petits seront supprims au dbut et la fin d'un rsum. La valeur
par dfaut est de trois pour liminer les articles anglais communs.
HighlightAll : boolen ; si true, le document complet sera utilis pour le surlignage, en ignorant les trois paramtres
prcdents.
MaxFragments : nombre maximum d'extraits ou de fragments de texte afficher. La valeur par dfaut, 0, slectionne une
mthode de gnration d'extraits qui n'utilise pas les fragments. Une valeur positive et non nulle slectionne la gnration
d'extraits base sur les fragments. Cette mthode trouve les fragments de texte avec autant de mots de la requte que possible
et restreint ces fragments autour des mots de la requte. Du coup, les mots de la requte se trouvent au milieu de chaque fragment et ont des mots de chaque ct. Chaque fragment sera au plus de MaxWords et les mots auront une longueur maximum
de ShortWord. Si tous les mots de la requte ne sont pas trouvs dans le document, alors un seul fragment de MinWords
sera affich.
FragmentDelimiter : quand plus d'un fragment est affich, alors les fragments seront spars par ce dlimiteur.
tsvector || tsvector
L'oprateur de concatnation tsvector renvoie un vecteur qui combine les lexemes et des informations de position pour les
deux vecteurs donns en argument. Les positions et les labels de poids sont conservs lors de la concatnation. Les positions
apparaissant dans le vecteur droit sont dcals par la position la plus large mentionne dans le vecteur gauche, pour que le rsultat soit pratiquement quivalent au rsultat du traitement de to_tsvector sur la concatnation des deux documents originaux. (L'quivalence n'est pas exacte car tout terme courant supprim de la fin de l'argument gauche n'affectera pas le rsultat alors qu'ils auraient affect les positions des lexemes dans l'argument droit si la concatnation de texte avait t utilise.)
Un avantage de l'utilisation de la concatnation au format vecteur, plutt que la concatnation de texte avant d'appliquer
to_tsvector, est que vous pouvez utiliser diffrentes configurations pour analyser les diffrentes sections du document.
De plus, comme la fonction setweight marque tous les lexemes du secteur donn de la mme faon, il est ncessaire
d'analyser le texte et de lancer setweight avant la concatnation si vous voulez des labels de poids diffrents sur les diffrentes parties du document.
setweight(vector tsvector, weight "char") returns tsvector
Cette fonction renvoie une copie du vecteur en entre pour chaque position de poids weight, soit A, soit B, soit C soit D. (D
est la valeur par dfaut pour les nouveaux vecteurs et, du coup, n'est pas affich en sortie.) Ces labels sont conservs quand les
vecteurs sont concatns, permettant aux mots des diffrentes parties d'un document de se voir attribuer un poids diffrent par
les fonctions de score.
Notez que les labels de poids s'appliquent seulement aux positions, pas aux lexemes. Si le vecteur en entre se voit supprimer
les positions, alors setweight ne pourra rien faire.
length(vector tsvector) returns integer
Renvoie le nombre de lexemes enregistrs dans le vecteur.
240
La famille de fonctions ts_rewrite cherche dans un tsquery donn les occurrences d'une sous-requte cible et remplace chaque
occurrence avec une autre sous-requte de substitution. En fait, cette opration est une version spcifique tsquery d'un remplacement de sous-chane. Une combinaison cible et substitut peut tre vu comme une rgle de r-criture de la requte. Un ensemble
de rgles de r-criture peut tre une aide puissante la recherche. Par exemple, vous pouvez tendre la recherche en utilisant des
synonymes (new york, big apple, nyc, gotham) ou restreindre la recherche pour diriger l'utilisateur vers des thmes en
vogue. Cette fonctionnalit n'est pas sans rapport avec les thsaurus (Section 12.6.4, Dictionnaire thsaurus ). Nanmoins, vous
pouvez modifier un ensemble de rgles de r-criture directement, sans r-indexer, alors que la mise jour d'un thsaurus ncessite un r-indexage pour tre pris en compte.
l'exemple ci-dessous, nous slectionnons seulement les rgles qui peuvent correspondre avec la requte originale :
SELECT ts_rewrite('a & b'::tsquery,
'SELECT t,s FROM aliases WHERE ''a & b''::tsquery @> t');
ts_rewrite
-----------'b' & 'c'
Si weights est prcis, seules les occurrences d'un de ces poids sont comptabilises.
Par exemple, pour trouver les dix mots les plus frquents dans un ensemble de document :
SELECT * FROM ts_stat('SELECT vector FROM apod')
ORDER BY nentry DESC, ndoc DESC, word
LIMIT 10;
De la mme faon, mais en ne comptant que les occurrences de poids A ou B :
SELECT * FROM ts_stat('SELECT vector FROM apod', 'ab')
ORDER BY nentry DESC, ndoc DESC, word
LIMIT 10;
12.5. Analyseurs
Les analyseurs de recherche plein texte sont responsable du dcoupage d'un document brut en jetons et d'identifier le type des jetons. L'ensemble des types possibles est dfini par l'analyseur lui-mme. Notez qu'un analyseur ne modifie pas le texte -- il identifie les limites plausibles des mots. Comme son domaine est limit, il est moins important de pouvoir construire des analyseurs personnaliss pour une application. Actuellement, PostgreSQL fournit un seul analyseur interne qui s'est rvl utile pour un ensemble vari d'applications.
L'analyseur interne est nomm pg_catalog.default. Il reconnait 23 types de jeton, dont la liste est disponible dans Tableau 12.1, Types de jeton de l'analyseur par dfaut .
Tableau 12.1. Types de jeton de l'analyseur par dfaut
Alias
Description
Exemple
asciiword
elephant
word
maana
numword
beta1
asciihword
up-to-date
hword
lgico-matemtica
244
Alias
Description
Exemple
numhword
postgresql-beta1
hword_asciipart
hword_part
Partie d'un mot compos, toutes les lettres lgico ou matemtica dans le
contexte lgico-matemtica
hword_numpart
Adresse email
foo@example.com
protocol
En-tte de protocole
http://
url
URL
example.com/stuff/index.html
host
Hte
example.com
url_path
Chemin URL
/stuff/index.html,
contexte d'une URL
file
Fichier ou chemin
/usr/local/foo.txt, en dehors du
contexte d'une URL
sfloat
Notation scientifique
-1.234e56
float
Notation dcimale
-1.234
int
Entier sign
-1234
uint
1234
version
Numro de version
8.3.0
tag
Balise XML
<a href="dictionaries.html">
entity
Entit XML
&
blank
Symboles espaces
dans
le
Note
La notion de l'analyseur d'une lettre est dtermine par la configuration de la locale sur la base de donnes, spcifiquement par lc_ctype. Les mots contenant seulement des lettres ASCII basiques sont reports comme un
type de jeton spar car il est parfois utile de les distinguer. Dans la plupart des langues europennes, les types de
jeton word et asciiword doivent toujours tre traits de la mme faon.
email ne supporte pas tous les caractres email valides tels qu'ils sont dfinis par la RFC 5322. Spcifiquement, les seuls caractres non-alphanumriques supports sont le point, le tiret et le tiret bas.
Il est possible que l'analyseur produise des jetons qui concident partir du mme texte. Comme exemple, un mot compos peut
tre report la fois comme un mot entier et pour chaque composante :
SELECT alias, description, token FROM ts_debug('foo-bar-beta1');
alias
|
description
|
token
-----------------+------------------------------------------+--------------numhword
| Hyphenated word, letters and digits
| foo-bar-beta1
hword_asciipart | Hyphenated word part, all ASCII
| foo
blank
| Space symbols
| hword_asciipart | Hyphenated word part, all ASCII
| bar
blank
| Space symbols
| hword_numpart
| Hyphenated word part, letters and digits | beta1
Ce comportement est souhaitable car il autorise le bon fonctionnement de la recherche sur le mot compos et sur les composants.
Voici un autre exemple instructif :
SELECT alias, description, token FROM ts_debug('http://example.com/stuff/index.html');
alias
| description |
token
----------+---------------+-----------------------------protocol | Protocol head | http://
245
url
| URL
host
| Host
url_path | URL path
| example.com/stuff/index.html
| example.com
| /stuff/index.html
12.6. Dictionnaires
Les dictionnaires sont utiliss pour liminer des mots qui ne devraient pas tre considrs dans une recherche (termes courants), et
pour normaliser des mots pour que des formes drives de ce mme mot tablissent une correspondance. Un mot normalis avec
succs est appel un lexeme. En dehors d'amliorer la qualit de la recherche, la normalisation et la suppression des termes courants rduisent la taille de la reprsentation d'un document en tsvector, et donc amliorent les performances. La normalisation n'a
pas toujours une signification linguistique et dpend habituellement de la smantique de l'application.
Quelques exemples de normalisation :
Linguistique - les dictionnaires ispell tentent de rduire les mots en entre en une forme normalise ; les dictionnaires stemmer
suppriment la fin des mots
Les URL peuvent tre rduites pour tablir certaines correspondance :
http://www.pgsql.ru/db/mw/index.html
http://www.pgsql.ru/db/mw/
http://www.pgsql.ru/db/../db/mw/index.html
Les noms de couleur peuvent tre remplacs par leur valeur hexadcimale, par exemple red, green, blue, magenta
-> FF0000, 00FF00, 0000FF, FF00FF
En cas d'indexation de nombre, nous pouvons supprimer certains chiffres fraction pour rduire les nombres possibles, donc
par exemple 3.14159265359, 3.1415926, 3.14 seront identiques aprs normalisation si seuls deux chiffres sont conservs aprs
le point dcimal.
un tableau de lexemes si le jeton en entre est connu dans le dictionnaire (notez qu'un jeton peut produire plusieurs lexemes)
un unique lexeme avec le drapeau TSL_FILTER configur, pour remplacer le jeton original avec un nouveau jeton passer
aux dictionnaires suivants (un dictionnaire de ce type est appel un dictionnaire filtrant)
un tableau vide si le dictionnaire connat le jeton mais que ce dernier est un terme courant
NULL si le dictionnaire n'a pas reconnu le jeton en entre
PostgreSQL fournit des dictionnaires prdfinis pour de nombreuses langues. Il existe aussi plusieurs modles prdfinis qui
peuvent tre utiliss pour crer de nouveaux dictionnaires avec des paramtres personnaliss. Chaque modle prdfini de dictionnaire est dcrit ci-dessous. Si aucun modle ne convient, il est possible d'en crer de nouveaux ; voir le rpertoire contrib/ de
PostgreSQL pour des exemples.
Une configuration de recherche plein texte lie un analyseur avec un ensemble de dictionnaires pour traiter les jetons en sortie de
l'analyseur. Pour chaque type de jeton que l'analyseur peut renvoyer, une liste spare de dictionnaires est indique par la configuration. Quand un jeton de ce type est trouve par l'analyseur, chaque dictionnaire de la liste est consult jusqu' ce qu'un dictionnaire le reconnaisse comme un mot connu. S'il est identifi comme un terme courant ou si aucun dictionnaire ne le reconnait, il sera ignor et non index. Normalement, le premier dictionnaire qui renvoie une sortie non NULL dtermine le rsultat et tout dictionnaire restant n'est pas consult ; par contre, un dictionnaire filtrant peut remplacer le mot donn avec un autre mot qui est ensuite pass aux dictionnaires suivants.
La rgle gnrale pour la configuration de la liste des dictionnaires est de placer en premier les dictionnaires les plus prcis, les
plus spcifiques, puis les dictionnaires gnralistes, en finissant avec un dictionnaire le plus gnral possible, comme par exemple
un stemmer Snowball ou simple, qui reconnait tout. Par exemple, pour une recherche en astronomie (configuration
astro_en), vous pouvez lier le type de jeton asciiword (mot ASCII) vers un dictionnaire des synonymes des termes de
l'astronomie, un dictionnaire anglais gnraliste et un stemmer Snowball anglais :
ALTER TEXT SEARCH CONFIGURATION astro_en
ADD MAPPING FOR asciiword WITH astrosyn, english_ispell, english_stem;
Un dictionnaire filtrant peut tre plac n'importe o dans la liste. Cependant, le placer la fin n'a aucun intrt. Les dictionnaires
filtrants sont utiles pour normaliser partiellement les mots, ce qui permet de simplifier la tche aux dictionnaires suivants. Par
exemple, un dictionnaire filtrant peut tre utilis pour supprimer les accents des lettres accentus. C'est ce que fait le module unaccent.
Les termes courants sont des mots trs courants, apparaissant dans pratiquement chaque document et n'ont donc pas de valeur discriminatoire. Du coup, ils peuvent tre ignors dans le contexte de la recherche plein texte. Par exemple, tous les textes anglais
contiennent des mots comme a et the, donc il est inutile de les stocker dans un index. Nanmoins, les termes courants n'affectent
pas les positions dans tsvector, ce qui affecte le score :
SELECT to_tsvector('english','in the list of stop words');
to_tsvector
---------------------------'list':3 'stop':5 'word':6
Les positions 1, 2, 4 manquantes sont des aux termes courants. Les scores calculs pour les documents avec et sans termes courants sont vraiment diffrents :
SELECT ts_rank_cd (to_tsvector('english','in the list of stop words'), to_tsquery('list
& stop'));
ts_rank_cd
-----------0.05
SELECT ts_rank_cd (to_tsvector('english','list stop words'), to_tsquery('list &
stop'));
ts_rank_cd
-----------0.1
C'est au dictionnaire de savoir comment traiter les mots courants. Par exemple, les dictionnaires Ispell normalisent tout d'abord
les mots puis cherchent les termes courants alors que les stemmers Snowball vrifient d'abord leur liste de termes courants. La
raison de leur comportement diffrent est qu'ils tentent de rduire le bruit.
247
Attention
La plupart des types de dictionnaires se basent sur des fichiers de configuration, comme les fichiers de termes courants. Ces fichiers doivent tre dans l'encodage UTF-8. Ils seront traduit vers l'encodage actuelle de la base de donnes, si elle est diffrente, quand ils seront lus.
Attention
Habituellement, une session lira un fichier de configuration du dictionnaire une seule fois, lors de la premire utilisation. Si vous modifiez un fichier de configuration et que vous voulez forcer la prise en compte des modifications
par les sessions en cours, excutez une commande ALTER TEXT SEARCH DICTIONARY sur le dictionnaire.
Cela peut tre une mise jour vide , donc sans rellement modifier des valeurs.
Un astrisque (*) peut tre plac la fin d'un synonyme dans le fichier de configuration. Ceci indique que le synonyme est un prfixe. L'astrisque est ignor quand l'entre est utilise dans to_tsvector(), mais quand il est utilis dans to_tsquery(), le
rsultat sera un lment de la requte avec le marqueur de correspondance du prfixe (voir Section 12.3.2, Analyser des requtes ). Par exemple, supposons que nous avons ces entres dans $SHAREDIR/tsearch_data/synonym_sample.syn :
postgres
postgresql
postgre pgsql
gogle
googl
indices index*
pgsql
pgsql
le faire connatre au sous-dictionnaire. Vous pouvez placer une astrisque (*) devant un mot index pour ignorer l'utilisation du
sous-dictionnaire mais tous les mots doivent tre connus du sous-dictionnaire.
Le dictionnaire thsaurus choisit la plus grande correspondance s'il existe plusieurs phrases correspondant l'entre.
Les mots spcifiques reconnus par le sous-dictionnaire ne peuvent pas tre prciss ; la place, utilisez ? pour marquer tout emplacement o un terme courant peut apparatre. Par exemple, en supposant que a et the sont des termes courants d'aprs le sousdictionnaire :
? one ? two : swsw
correspond a one the two et the one a two. Les deux pourraient tre remplacs par swsw.
Comme un dictionnaire thsaurus a la possibilit de reconnatre des phrases, il doit se rappeler son tat et interagir avec
l'analyseur. Un dictionnaire thsaurus utilise ces assignements pour vrifier s'il doit grer le mot suivant ou arrter l'accumulation.
Le dictionnaire thsaurus doit tre configur avec attention. Par exemple, si le dictionnaire thsaurus s'occupe seulement du type
de jeton asciiword, alors une dfinition du dictionnaire thsaurus comme one 7 ne fonctionnera pas car le type de jeton
uint n'est pas affect au dictionnaire thsaurus.
Attention
Les thsaurus sont utiliss lors des indexages pour que toute modification dans les paramtres du dictionnaire thsaurus ncessite un rindexage. Pour la plupart des autres types de dictionnaire, de petites modifications comme
l'ajout ou la suppression de termes courants ne demandent pas un rindexage.
Maintenant, il est possible de lier le dictionnaire du thsaurus thesaurus_simple aux types de jeton dsirs dans une configuration, par exemple :
ALTER TEXT SEARCH CONFIGURATION russian
ALTER MAPPING FOR asciiword, asciihword, hword_asciipart WITH thesaurus_simple;
compoundwords
controlled z
Note
MySpell ne supporte pas les mots composs. Hunspell a un support sophistiqu des mots composs. Actuellement,
PostgreSQL implmente seulement les oprations basiques de Hunspell pour les mots composs.
pg
pg
pg
nous
allons
la
stocker
dans
TEMPLATE = synonym,
SYNONYMS = pg_dict
);
Ensuite, nous enregistrons le dictionnaire Ispell english_ispell qui a ses propres fichiers de configuration :
CREATE TEXT SEARCH DICTIONARY english_ispell (
TEMPLATE = ispell,
DictFile = english,
AffFile = english,
StopWords = english
);
Maintenant, nous configurons la correspondance des mots dans la configuration pg :
ALTER TEXT SEARCH CONFIGURATION pg
ALTER MAPPING FOR asciiword, asciihword, hword_asciipart,
word, hword, hword_part
WITH pg_dict, english_ispell, english_stem;
Nous choisissons de ne pas indexer certains types de jeton que la configuration par dfaut peut grer :
ALTER TEXT SEARCH CONFIGURATION pg
DROP MAPPING FOR email, url, url_path, sfloat, float;
Maintenant, nous pouvons tester notre configuration :
SELECT * FROM ts_debug('public.pg', '
PostgreSQL, the highly scalable, SQL compliant, open source object-relational
database management system, is now undergoing beta testing of the next
version of our software.
');
La prochaine tape est d'initialiser la session pour utiliser la nouvelle configuration qui tait cre dans le schma public :
=> \dF
List of text search configurations
Schema | Name | Description
---------+------+------------public | pg
|
SET default_text_search_config = 'public.pg';
SET
SHOW default_text_search_config;
default_text_search_config
---------------------------public.pg
dictionary
|
lexemes
-----------+-----------------+-------------+-------------------------------+---------------asciiword | Word, all ASCII | The
| {english_ispell,english_stem} |
english_ispell | {}
blank
| Space symbols
|
| {}
|
|
asciiword | Word, all ASCII | Brightest
| {english_ispell,english_stem} |
english_ispell | {bright}
blank
| Space symbols
|
| {}
|
|
asciiword | Word, all ASCII | supernovaes | {english_ispell,english_stem} |
english_stem
| {supernova}
Dans cet exemple, le mot Brightest a t reconnu par l'analyseur comme un mot ASCII (alias asciiword). Pour ce type
de jeton, la liste de dictionnaire est english_ispell et english_stem. Le mot a t reconnu par english_ispell, qui
l'a rduit avec le mot bright. Le mot supernovaes est inconnu dans le dictionnaire english_ispell donc il est pass au
dictionnaire suivant et, heureusement, est reconnu (en fait, english_stem est un dictionnaire Snowball qui reconnat tout ; c'est
pourquoi il est plac en dernier dans la liste des dictionnaires).
Le mot The est reconnu par le dictionnaire english_ispell comme tant un terme courant (Section 12.6.1, Termes courants ) et n'est donc pas index. Les espaces sont aussi ignors car la configuration ne fournit aucun dictionnaire pour eux.
Vous pouvez rduire le volume en sortie en spcifiant explicitement les colonnes que vous voulez voir :
SELECT alias, token, dictionary, lexemes
FROM ts_debug('public.english','The Brightest supernovaes');
alias
|
token
|
dictionary
|
lexemes
-----------+-------------+----------------+------------asciiword | The
| english_ispell | {}
blank
|
|
|
asciiword | Brightest
| english_ispell | {bright}
blank
|
|
|
asciiword | supernovaes | english_stem
| {supernova}
255
ts_token_type renvoie une table qui dcrit chaque type de jeton que l'analyseur indiqu peut reconnatre. Pour chaque type de
jeton, la table donne l'entier tokid que l'analyseur utilise pour labeliser un jeton de ce type, l'alias qui nomme le type de jeton
dans les commandes de configuration et une courte description. Par exemple :
SELECT * FROM ts_token_type('default');
tokid |
alias
|
description
-------+-----------------+-----------------------------------------1 | asciiword
| Word, all ASCII
2 | word
| Word, all letters
3 | numword
| Word, letters and digits
4 | email
| Email address
5 | url
| URL
6 | host
| Host
7 | sfloat
| Scientific notation
8 | version
| Version number
9 | hword_numpart
| Hyphenated word part, letters and digits
10 | hword_part
| Hyphenated word part, all letters
11 | hword_asciipart | Hyphenated word part, all ASCII
12 | blank
| Space symbols
13 | tag
| XML tag
14 | protocol
| Protocol head
15 | numhword
| Hyphenated word, letters and digits
16 | asciihword
| Hyphenated word, all ASCII
17 | hword
| Hyphenated word, all letters
18 | url_path
| URL path
19 | file
| File or path name
20 | float
| Decimal notation
21 | int
| Signed integer
22 | uint
| Unsigned integer
23 | entity
| XML entity
Note
La fonction ts_lexize attend un seul jeton, pas du texte. Voici un cas o cela peut devenir source de confusion :
SELECT ts_lexize('thesaurus_astro','supernovae stars') is null;
?column?
---------t
Le dictionnaire thsaurus thesaurus_astro connat la phrase supernovae stars mais ts_lexize
choue car il ne peut pas analyser le texte en entre mais le traite bien en tant que simple jeton. Utilisez plain256
Les recherches par index GIN sont environ trois fois plus rapides que celles par index GiST.
Les index GIN prennent trois fois plus de temps se contruire que les index GiST.
Les index GIN sont un peu plus lents mettre jour que les index GiST, mais dix fois plus lent si le support de la mise jour
rapide a t dsactiv (voir Section 54.3.1, Technique GIN de mise jour rapide pour les dtails)
Les index GIN sont entre deux et trois fois plus gros que les index GiST.
En rgle gnrale, les index GIN sont meilleurs pour des donnes statiques car les recherches sont plus rapides. Pour des donnes
dynamiques, les index GiST sont plus rapides mettre jour. Autrement dit, les index GiST sont trs bons pour les donnes dynamiques et rapides si le nombre de mots uniques (lexemes) est infrieur 100000 alors que les index GIN greront plus de 100000
lexemes plus facilement mais sont plus lents mettre jour.
Notez que le temps de construction de l'index GIN peut souvent tre amlior en augmentant maintenance_work_mem alors qu'un
index GiST n'est pas sensible ce paramtre.
Le partitionnement de gros ensembles et l'utilisation intelligente des index GIN et GiST autorise l'implmentation de recherches
trs rapides avec une mise jour en ligne. Le partitionnement peut se faire au niveau de la base en utilisant l'hritage, ou en distribuant les documents sur des serveurs et en rcuprant les rsultats de la recherche en utilisant le module contrib/dblink. Ce
dernier est possible car les fonctions de score utilisent les informations locales.
257
Liste les dictionnaires de recherche plein texte (ajouter + pour plus de dtails).
=> \dFd
version
word
(23 rows)
| Version number
| Word, all letters
\dFt[+] [MODLE]
Liste les modles de recherche plein texte (ajouter + pour plus de dtails).
=> \dFt
List of text search templates
Schema
|
Name
|
Description
------------+-----------+----------------------------------------------------------pg_catalog | ispell
| ispell dictionary
pg_catalog | simple
| simple dictionary: just lower case and check for stopword
pg_catalog | snowball | snowball stemmer
pg_catalog | synonym
| synonym dictionary: replace word by its synonym
pg_catalog | thesaurus | thesaurus dictionary: phrase by phrase substitution
12.11. Limites
Les limites actuelles de la recherche plein texte de PostgreSQL sont :
Pour comparaison, la documentation de PostgreSQL 8.1 contient 10441 mots uniques, un total de 335420 mots, et le mot le plus
frquent, postgresql , est mentionn 6127 fois dans 655 documents.
Un autre exemple -- les archives de la liste de discussion de PostgreSQL contenait 910989 mots uniques avec 57491343
lexemes dans 461020 messages.
Certaines fonctions ont t renommes ou ont profit de petits ajustements dans leur listes d'arguments. Elles sont toutes dans
le schma pg_catalog alors que, dans une installation prcdente, elles auraient fait partie de public ou d'un autre schma utilisateur. Il existe une nouvelle version de tsearch2 qui fournit une couche de compatibilit permettant de rsoudre la majorit des problmes connus.
Les anciennes fonctions et les autres objets de tsearch2 doivent tre supprims lors du chargement d'une sauvegarde pg_dump
provenant d'une version antrieure la 8.3. Bien que beaucoup des objets ne sont pas chargs de toute faon, certains le sont et
peuvent causer des problmes. La faon la plus simple de grer ceci est de charger seulement le module tsearch2 avant la restauration de la sauvegarde ; cela bloquera la restauration des anciens objets.
Le paramtrage de la configuration de la recherche plein texte est compltement diffrent maintenant. Au lieu d'insrer manuellement des lignes dans les tables de configuration, la recherche se configure avec des commandes SQL spcialises indiques dans tout ce chapitre. Il n'existe pas de support automatis pour convertir une configuration personnalise existante pour
la 8.3. Vous devez vous en occuper manuellement.
Le plupart des types de dictionnaires repose sur certains fichiers de configuration en dehors de la base de donnes. Ils sont largement compatibles pour une utilisation pre-8.3, mais notez malgr tout les diffrences qui suivent :
Les fichiers de configuration doivent tre placs dans le rpertoire $SHAREDIR/tsearch_data, et doivent avoir une
extension spcifique dpendant du type de fichier, comme indiqu prcdemment dans les descriptions des diffrents types
de dictionnaires. Cette restriction a t ajoute pour viter des problmes de scurit.
Les fichiers de configuration doivent tre encods en UTF-8, quelque soit l'encodage utilis par la base de donnes.
Dans les fichiers de configuration du thsaurus, les termes courants doivent tre marqus avec ?.
260
261
13.1. Introduction
PostgreSQL fournit un ensemble d'outils pour les dveloppeurs qui souhaitent grer des accs simulatns aux donnes. En interne, la cohrence des donnes est obtenue avec l'utilisation d'un modle multiversion (Multiversion Concurrency Control,
MVCC). Ceci signifie que, lors de l'envoi d'une requte la base de donnes, chaque transaction voit une image des donnes
(une version de la base de donnes) telle qu'elles taient quelque temps auparavant, quel que soit l'tat actuel des donnes sousjacentes. Ceci protge la transaction de donnes incohrentes, causes par des mises jour effectues par une (autre) transaction
simultane sur les mmes lignes de donnes, fournissant ainsi une isolation des transactions pour chaque session de la base de
donnes. MVCC, en vitant les mthodes des verrous des systmes de bases de donnes traditionnels, minimise la dure des
verrous pour permettre des performances raisonnables dans des environnements multiutilisateurs.
Le principal avantage de l'utilisation du modle MVCC pour le contrle des accs simultans, contrairement au verrouillage, est
que, dans les verrous acquis par MVCC pour rcuprer (en lecture) des donnes, aucun conflit n'intervient avec les verrous acquis pour crire des donnes. Du coup, lire ne bloque jamais l'criture et crire ne bloque jamais la lecture. PostgreSQL maintient cette garantie mme quand il fournit le niveau d'isolation le plus strict au moyen d'un niveau Serializable Snapshot Isolation (SSI) innovant.
Des possibilits de verrouillage des tables ou des lignes sont aussi disponibles dans PostgreSQL pour les applications qui
n'ont pas besoin en gnral d'une isolation complte des transactions et prfrent grer explicitement les points de conflits particuliers. Nanmoins, un bon usage de MVCC fournira gnralement de meilleures performances que les verrous. De plus, les
verrous informatifs dfinis par l'utilisateur fournissent un mcanisme d'acquisition de verrous qui n'est pas li une transaction.
Niveau d'isolation
Lecture sale
Possible
Possible
Possible
Possible
262
Impossible
Niveau d'isolation
Lecture sale
Impossible
Impossible
Possible
Impossible
Impossible
Impossible
Dans PostgreSQL, vous pouvez demander un des quatre niveaux standards d'isolation de transaction. Mais, en interne, il existe
seulement trois niveaux distincts d'isolation, qui correspondent aux niveaux Read Committed et Repeatable Read, and Serializable. Lorsque vous slectionnez le niveau Read Uncommitted, vous obtenez rellement Read Committed, et les lectures fantmes
ne sont pas possibles dans l'implmentation PostgreSQL de Repeatable Read. Le niveau d'isolation actuel pourrait donc tre
plus strict que ce que vous slectionnez. Ceci est permis par le standard SQL. Les quatre niveaux d'isolation dfinissent seulement
quel phnomne ne doit pas survenir, ils ne dfinissent pas ce qui doit arriver. La raison pour laquelle PostgreSQL fournit seulement trois niveaux d'isolation est qu'il s'agit de la seule faon raisonnable de faire correspondre les niveaux d'isolation standards
avec l'architecture de contrle des accs simultans multiversion. Le comportement des niveaux standards d'isolation est dtaill
dans les sous-sections suivantes.
Pour initialiser le niveau d'isolation d'une transaction, utilisez la commande SET TRANSACTION(7).
13.2.1. Niveau d'isolation Read committed (lecture uniquement des donnes valides)
Read Committed est le niveau d'isolation par dfaut dans PostgreSQL. Quand une transaction utilise ce niveau d'isolation, une
requte SELECT (sans clause FOR UPDATE/SHARE) voit seulement les donnes valides avant le dbut de la requte ; il ne
voit jamais les donnes non valides et les modifications valides pendant l'excution de la requte par des transactions excutes
en parallle. En effet, une requte SELECT voit une image de la base de donnes datant du moment o l'excution de la requte
commence. Nanmoins, SELECT voit les effets de mises jour prcdentes excutes dans sa propre transaction, mme si cellesci n'ont pas encore t valides. De plus, notez que deux commandes SELECT successives peuvent voir des donnes diffrentes,
mme si elles sont excutes dans la mme transaction si d'autres transactions valident des modifications pendant l'excution du
premier SELECT.
Les commandes UPDATE, DELETE, SELECT FOR UPDATE et SELECT FOR SHARE se comportent de la mme faon
que SELECT en ce qui concerne la recherche des lignes cibles : elles ne trouveront que les lignes cibles qui ont t valides avant
le dbut de la commande. Nanmoins, une telle ligne cible pourrait avoir dj t mise jour (ou supprime ou verrouille) par
une autre transaction concurrente au moment o elle est dcouverte. Dans ce cas, le processus de mise jour attendra que la premire transaction soit valide ou annule (si elle est toujours en cours). Si la premire mise jour est annule, alors ses effets sont
nis et le deuxime processus peut excuter la mise jour des lignes originellement trouves. Si la premire mise jour est valide, la deuxime mise jour ignorera la ligne si la premire mise jour l'a supprime, sinon elle essaiera d'appliquer son opration
la version mise jour de la ligne. La condition de la recherche de la commande (la clause WHERE) est r-value pour savoir si
la version mise jour de la ligne correspond toujours la condition de recherche. Dans ce cas, la deuxime mise jour continue
son opration en utilisant la version mise jour de la ligne. Dans le cas des commandes SELECT FOR UPDATE et SELECT
FOR SHARE, cela signifie que la version mise jour de la ligne est verrouille et renvoye au client.
cause de la rgle ci-dessus, une commande de mise jour a la possibilit de voir une image non cohrente : elle peut voir les effets de commandes de mises jour concurrentes sur les mmes lignes que celles qu'elle essaie de mettre jour mais elle ne voit
pas les effets de ces commandes sur les autres lignes de la base de donnes. Ce comportement rend le mode de lecture valide non
convenable pour les commandes qui impliquent des conditions de recherche complexes ; nanmoins, il est intressant pour les cas
simples. Par exemple, considrons la mise jour de balances de banque avec des transactions comme :
BEGIN;
UPDATE comptes SET balance = balance + 100.00 WHERE no_compte = 12345;
UPDATE comptes SET balance = balance - 100.00 WHERE no_compte = 7534;
COMMIT;
Si deux transactions comme celle-ci essaient de modifier en mme temps la balance du compte 12345, nous voulons clairement
que la deuxime transaction commence partir de la version mise jour de la ligne du compte. Comme chaque commande
n'affecte qu'une ligne prdtermine, la laisser voir la version mise jour de la ligne ne cre pas de soucis de cohrence.
Des utilisations plus complexes peuvent produire des rsultats non dsirs dans le mode Read Committed. Par exemple, considrez une commande DELETE oprant sur des donnes qui sont la fois ajoutes et supprimes du critre de restriction par une
autre commande. Supposons que website est une table sur deux lignes avec website.hits valant 9 et 10 :
BEGIN;
UPDATE website SET hits = hits + 1;
-- excut par une autre session : DELETE FROM website WHERE hits = 10;
COMMIT;
263
La commande DELETE n'aura pas d'effet mme s'il existe une ligne website.hits = 10 avant et aprs la commande UPDATE. Cela survient parce que la valeur 9 de la ligne avant mise jour est ignore et que lorsque l'UPDATE termine et que DELETE obtient un verrou, la nouvelle valeur de la ligne n'est plus 10, mais 11, ce qui ne correspond plus au critre.
Comme le mode Read Committed commence chaque commande avec une nouvelle image qui inclut toutes les transactions valides jusqu' cet instant, les commandes suivantes dans la mme transaction verront les effets de la transaction valide en parallle
dans tous les cas. Le problme en question est de savoir si une seule commande voit une vue absolument cohrente ou non de la
base de donnes.
L'isolation partielle des transactions fournie par le mode Read Committed est adquate pour de nombreuses applications, et ce
mode est rapide et simple utiliser. Nanmoins, il n'est pas suffisant dans tous les cas. Les applications qui excutent des requtes
et des mises jour complexes pourraient avoir besoin d'une vue plus rigoureusement cohrente de la base de donnes, une vue que
le mode Read Committed ne fournit pas.
parce qu'une transaction srialisable ne peut pas modifier ou verrouiller les lignes changes par d'autres transactions aprs que la
transaction srialisable ait commenc.
Quand une application reoit ce message d'erreurs, elle devrait annuler la transaction actuelle et r-essayer la transaction complte.
La seconde fois, la transaction voit les modifications dj valides comme faisant partie de sa vue initiale de la base de donnes,
donc il n'y a pas de conflit logique en utilisant la nouvelle version de la ligne comme point de dpart pour la mise jour de la nouvelle transaction.
Notez que seules les transactions de modifications ont besoin d'tre tentes de nouveau ; les transactions en lecture seule n'auront
jamais de conflits de srialisation.
Le mode Repeatable Repeatable fournit une garantie rigoureuse que chaque transaction voit un tat compltement stable de la base
de donnes. Toutefois cette vue ne sera pas ncessairement toujours cohrente avec l'excution srielle (un la fois) de transactions concurrentes du mme niveau d'isolation. Par exemple, mme une transaction en lecture seule ce niveau pourrait voire un
enregistrement de contrle mis jour pour indiquer qu'un traitement par lot a t termin mais ne pas voir un des enregistrements
de dtail qui est une partie logique du traitement par lot parce qu'il a lu une ancienne version de l'enregistrement de contrle.
L'implmentation correcte de rgles de gestion par des transactions s'excutant ce niveau d'isolation risque de ne pas marcher
correctement sans une utilisation prudente de verrouillages explicites qui bloquent les transactions en conflits.
Avant la version 9.1 de PostgreSQL, une demande d'isolation de transaction Serializable fournissait exactement le comportement dcrit ici. Pour maintenir l'ancien niveau Serializable, il faudra maintenant demander Repeatable Read.
comme pour le niveau Repeatable Read, les applications utilisant ce niveau d'isolation doivent tre prtes rpter leurs transactions en cas d'chec de srialisation. En fait, ce niveau d'isolation fonctionne exactement comme Repeatable Read, except qu'il
surveille les conditions qui pourraient amener l'excution d'un jeu de transactions concurrentes se comporter d'une manire incomptible avec les excutions srielles (une la fois) de toutes ces transactions. Cette surveillance n'introduit aucun blocage supplmentaire par rapport repeatable read, mais il y a un cot cette surveillance, et la dtection des conditions pouvant amener
une anomalie de srialisation dclenchera un chec de srialisation.
Comme exemple, considrez la table ma_table, contenant initialement
classe | valeur
--------+------1 |
10
1 |
20
2 |
100
2 |
200
Supposons que la transaction srialisable A traite
SELECT SUM(valeur) FROM ma_table WHERE classe = 1;
puis insre le rsultat (30) comme valeur dans une nouvelle ligne avec classe = 2. Simultanment, la transaction serialisable
B traite
SELECT SUM(valeur) FROM ma_table WHERE classe = 2;
et obtient le rsultat 300, qu'il insre dans une nouvelle ligne avec classe = 1. ce moment l les deux transactions essayent
de valider. Si l'une des transactions fonctionnait au niveau d'isolation Repeatable Read, les deux seraient autorises valider; mais
puisqu'il n'y a pas d'ordre d'excution sriel cohrent avec le rsultat, l'utilisation de transactions Serializable permettra une des
deux transactions de valider, et annulera l'autre avec ce message:
ERREUR:
C'est parce que si A a t excut avant B, B aurait trouv la somme 330, et non pas 300. De faon similaire, l'autre ordre aurait eu
comme rsultat une somme diffrente pour le calcul par A.
Pour garantir une vraie srialisation PostgreSQL utilise le verrouillage de prdicats, ce qui signifie qu'il conserve des verrous
qui permettent de dterminer quand une criture aurait eu un impact sur le rsultat d'une lecture antrieure par une transaction
concurrente, si elle s'tait excute d'abord. Dans PostgreSQL, ces verrous ne causent pas de blocage et ne peuvent donc pas
jouer un rle dans l'avnement d'un verrou mortel (deadlock). Ils sont utiliss pour identifier et marquer les dpendances entre des
transactions srialisables concurrentes qui dans certaines combinaisons peuvent entrainer des anomalies de srialisation. Par
contraste, une transaction Read Committed ou Repeatable Read qui voudrait garantir la cohrence des donnes devra prendre un
verrou sur la table entire, ce qui pourrait bloquer d'autres utilisateurs voulant utiliser cette table, ou pourrait utiliser SELECT
FOR UPDATE ou SELECT FOR SELECT qui non seulement peut bloquer d'autres transactions, mais entrane un accs au
disque.
Les verrous de prdicats dans PostgreSQL, comme dans la plupart des autres systmes de bases de donnes, s'appuient sur les
donnes rellement accdes par une transaction. Ils seront visibles dans la vue systme pg_locks avec un mode de SIReadLock. Les verrous acquis pendant l'excution d'une requte dpendront du plan utilis par la requte, et plusieurs verrous fins (par
exemple, des verrous d'enregistrement) pourraient tre combins en verrous plus grossiers (par exemple, des verrous de page) pendant le droulement de la transaction afin d'viter d'puiser la mmoire utilise pour suivre les verrous. Une transaction READ
ONLY pourra librer ses verrous SIRead avant sa fin, si elle dtecte qu'aucun conflit ne peut encore se produire pouvant potentiellement entrainer une anomalie de srialisation. En fait, les transaction READ ONLY seront souvent capable d'tablir ce fait au moment de leur dmarrage, et ainsi viter de prendre des verrous de prdicat. Si vous demandez explicitement une transaction SERIALIZABLE READ ONLY DEFERRABLE, elle bloquera jusqu' ce qu'elle puisse tablir ce fait. (C'est le seul cas o_une transaction Serializable bloque mais pas une transaction Repeatable Read.) D'autre part, les verrous SIRead doivent souvent tre gards aprs la fin d'une transaction, jusqu' ce que toutes les lectures-critures s'tant droules simultanment soient termines.
L'utilisation systmatique de transactions Serializable peut simplifier le dveloppement. La garantie que n'importe quel jeu de
transactions concurrentes aura le mme effet que si elles s'excutent une seule la fois signifie que si vous pouvez dmontrer
qu'une transaction seule, comme elle est crite, effectuera ce qui est attendu quand elle est excute seule, vous pouvez tre sr
qu'elle effectuera ce qui est attendu quelques soient les autres transactions serializable qui s'excutent en mme temps, mme sans
aucune information sur ce que ces autres transactions pourraient faire. Il est important qu'un environnement qui utilise cette technique ait une faon gnralise de traiter les erreurs de srialisation (qui retournent toujours un SQLSTATE valant '40001'), parce
qu'il sera trs difficile de prdire exactement quelles transactions pourraient contribuer des dpendances lecture/criture et auront
besoin d'tre annules pour viter les anomalies de srialisation. La surveillance des dpendances lecture/criture a un cot, tout
comme l'chec, mais mis en face du cot et du blocage entrains par les verrous explicites et SELECT FOR UPDATE ou SELECT FOR SHARE, les transactions serializable sont le meilleur choix en termes de performances pour certains environnements.
Pour une performance optimale quand on s'appuie sur les transactions Serializable pour le contrle de la concurrence, ces points
265
Contrler le nombre de connexions actives, en utilisant un pool de connexions si ncessaire. C'est toujours un point important
pour les performances, mais cela peut tre particulirement important pour un systme charg qui utilise des transactions Serializable.
Ne mettez jamais plus dans une transaction seule qu'il n'est ncessaire dans un but d'intgrit.
Ne laissez pas des connexions trainer en idle in transaction plus longtemps que ncessaire.
Supprimez les verrous explicites, SELECT FOR UPDATE, et SELECT FOR SHARE qui ne sont plus ncessaires grce aux
protections fournies automatiquement par les transactions Serializable.
Quand le systme est forc combiner plusieurs verrous de prdicat au niveau page en un seul verrou de prdicat au niveau relation (si la table des verrous de prdicat est court de mmoire), une augmentation du taux d'checs de srialisation peut survenir. Vous pouvez viter ceci en augmentant max_pred_locks_per_transaction.
Un parcours squentiel ncessitera toujours un verrou de prdicat au niveau relation. Ceci peut rsulter en un taux plus important d'checs de srialisation. Il peut tre utile d'encourager l'utilisation de parcours d'index en diminuant random_page_cost
et/ou en augmentant cpu_tuple_cost. Assurez-vous de bien mesurer toute diminution du nombre d'annulation de transactions et
restarts against any overall change in query execution time.
Avertissement
Le support pour le niveau d'isolation Serializable n'a pas encore t ajout aux cibles de rplication Hot Standby
(dcrites dans Section 25.5, Hot Standby ). Bien que les critures permanentes dans la base effectues dans des
transactions Serializable sur le matre garantiront que toutes les standbys atteindront un tat cohrent, une transaction Repeatable Read sur la standby pourra quelquefois voir un tat transitoire qui sera incohrent avec une excution srielle sur le matre.
ACCESS SHARE
En conflit avec le mode verrou ACCESS EXCLUSIVE.
266
Les commandes SELECT acquirent un verrou de ce mode avec les tables rfrences. En gnral, tout requte lisant seulement une table et ne la modifiant pas obtient ce mode de verrou.
ROW SHARE
En conflit avec les modes de verrous EXCLUSIVE et ACCESS EXCLUSIVE.
La commande SELECT FOR UPDATE et SELECT FOR SHARE acquirent un verrou de ce mode avec la table cible (en
plus des verrous ACCESS SHARE des autres tables rfrences mais pas slectionnes FOR UPDATE/FOR SHARE).
ROW EXCLUSIVE
En conflit avec les modes de verrous SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE et ACCESS EXCLUSIVE.
Les commandes UPDATE, DELETE et INSERT acquirent ce mode de verrou sur la table cible (en plus des verrous ACCESS SHARE sur toutes les autres tables rfrences). En gnral, ce mode de verrouillage sera acquis par toute commande
modifiant des donnes de la table.
SHARE UPDATE EXCLUSIVE
En conflit avec les modes de verrous SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE et
ACCESS EXCLUSIVE. Ce mode protge une table contre les modifications simultanes de schma et l'excution d'un VACUUM.
Acquis par VACUUM (sans FULL), ANALYZE, CREATE INDEX CONCURRENTLY, and some forms of ALTER
TABLE.
SHARE
En conflit avec les modes de verrous ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE ROW EXCLUSIVE,
EXCLUSIVE et ACCESS EXCLUSIVE. Ce mode protge une table contre les modifications simultanes des donnes.
Acquis par CREATE INDEX (sans CONCURRENTLY).
SHARE ROW EXCLUSIVE
En conflit avec les modes de verrous ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE et ACCESS EXCLUSIVE. Ce mode protge une table contre les modifications concurrentes de donnes,
et est en conflit avec elle-mme, afin qu'une seule session puisse le possder un moment donn.
Ce mode de verrouillage n'est pas acquis automatiquement par une commande PostgreSQL.
EXCLUSIVE
En conflit avec les modes de verrous ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE
ROW EXCLUSIVE, EXCLUSIVE et ACCESS EXCLUSIVE. Ce mode autorise uniquement les verrous ACCESS SHARE
concurrents, c'est--dire que seules les lectures partir de la table peuvent tre effectues en parallle avec une transaction
contenant ce mode de verrouillage.
Ce mode de verrouillage n'est acquis automatiquement sur des tables par aucune commande PostgreSQL.
ACCESS EXCLUSIVE
Entre en conflit avec tous les modes (ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE,
SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE et ACCESS EXCLUSIVE). Ce mode garantit que le dtenteur est la
seule transaction accder la table de quelque faon que ce soit.
Acquis par les commandes ALTER TABLE, DROP TABLE, TRUNCATE, REINDEX, CLUSTER et VACUUM FULL.
C'est aussi le mode de verrou par dfaut des instructions LOCK TABLE qui ne spcifient pas explicitement de mode de verrouillage.
Astuce
Seul un verrou ACCESS EXCLUSIVE bloque une instruction SELECT (sans FOR UPDATE/SHARE).
Une fois acquis, un verrou est normalement dtenu jusqu' la fin de la transaction. Mais si un verrou est acquis aprs
l'tablissement d'un point de sauvegarde, le verrou est relch immdiatement si le point de sauvegarde est annul. Ceci est cohrent avec le principe du ROLLBACK annulant tous les effets des commandes depuis le dernier point de sauvegarde. Il se passe la
mme chose pour les verrous acquis l'intrieur d'un bloc d'exception PL/pgSQL : un chappement d'erreur partir du bloc lche
les verrous acquis dans le bloc.
Tableau 13.2. Modes de verrou conflictuels
267
SHARE
EXCLUROW EX- SIVE
CLUSIVE
ACCESS
SHARE
ACCESS
EXCLUSIVE
X
ROW
SHARE
ROW EXCLUSIVE
SHARE UPDATE EXCLUSIVE
SHARE
SHARE
ROW EXCLUSIVE
EXCLUSIVE
ACCESS
EXCLUSIVE
Avertissement
Ce niveau de protection de protection de l'intgrit en utilisant des transactions Serializable ne s'tend pour le moment pas jusqu'au mode standby (Section 25.5, Hot Standby ). Pour cette raison, les utilisateurs du hot standby
voudront peut-tre utiliser Repeatable Read et un verrouillage explicite sur le matre.
dans PostgreSQL vous devez rellement modifier l'enregistrement, mme si vous n'avez pas besoin de modifier une valeur. SELECT FOR UPDATE empche temporairement les autres transactions d'acqurir le mme verrou ou d'excuter un UPDATE ou
DELETE qui modifierait l'enregistrement verrouill, mais une fois que la transaction possdant ce verrou valide ou annule, une
transaction bloque pourra continuer avec son opration en conflit sauf si un rel UPDATE de l'enregistement a t effectu pendant que le verrou tait possd.
Les verrifications globales de validit demandent davantage de rflexion sous un MVCC non srialisable. Par exemple, une application bancaire pourrait vouloir vrifier que la somme de tous les crdits d'une table est gale la somme de tous les dbits d'une
autre, alors que les deux tables sont en cours de mise jour. La comparaison des rsultas de deux SELECT sum(...) successifs
ne fonctionnera pas correctement en mode Read Committed, puisque la seconde requte incluera probablement les rsultats de
transactions pas prises en compte dans la premire. Effectuer les deux sommes dans une seule transaction repeatable read donnera
une image prcise des effets d'uniquement les transactions qui ont valid avant le dbut de la transaction repeatable read $mdash;
mais on pourrait lgitimement se demander si la rponse est toujours valide au moment o elle est fournie. Si la transaction repeatable read a elle mme effectu des modifications avant d'effectuer le test de cohrence, l'utilit de la vrification devient encore
plus sujette caution, puisque maintenant elle inclut des modifications depuis le dbut de la transaction, mais pas toutes. Dans ce
genre de cas, une personne prudente pourra vouloir verrouiller toutes les tables ncessaires la vrification, afin d'avoir une vision
incontestable de la ralit courante. Un mode SHARE (ou plus lev) garantit qu'il n'y a pas de changements non valids dans la
table verrouille, autres que ceux de la transaction courante.
Notez aussi que si on se fie au verrouillage explicite pour empcher les mises jour concurrentes, on devrait soit utiliser Read
Committed, soit utiliser Repeatable Read et faire attenion obtenir les verrous avant d'effectuer les requtes. Un verrou obtenu par
une transaction repeatable read guarantit qu'aucune autre transaction modifiant la table n'est en cours d'excution, mais si
l'instantan vu par la transaction est antrieur l'obtention du verrou, il pourrait aussi prcder des modifications maintenant valides dans la table. Un instantan de transaction repeatable read est en fait fig l'excution de sa premire requte ou commande
de modification de donnes (SELECT, INSERT, UPDATE, ou DELETE), il est donc possible d'obtenir les verrous explicitement
avant que l'instantan ne soit fig.
271
Cot estim du lancement (temps pass avant que l'affichage de la sortie ne commence, c'est--dire pour faire le tri dans un
nud de tri) ;
Cot total estim (si toutes les lignes doivent tre rcupres, ce qui pourrait ne pas tre le cas : par exemple une requte
avec une clause LIMIT ne paiera pas le cot total du nud d'entre du nud du plan Limit) ;
Nombre de lignes estim en sortie par ce nud de plan (encore une fois, seulement si excut jusqu'au bout) ;
Largeur moyenne estime (en octets) des lignes en sortie par ce nud de plan.
Les cots sont mesurs en units arbitraires dtermines par les paramtres de cot du planificateur (voir Section 18.7.2,
Constantes de cot du planificateur ). La pratique habituelle est de mesurer les cots en unit de rcupration de pages
disque ; autrement dit, seq_page_cost est initialis 1.0 par convention et les autres paramtres de cot sont relatifs cette valeur. Les exemples de cette section sont excuts avec les paramtres de cot par dfaut.
Il est important de noter que le cot d'un nud de haut niveau inclut le cot de tous les nuds fils. Il est aussi important de raliser que le cot reflte seulement les lments d'importance pour le planificateur. En particulier, le cot ne considre pas le temps
dpens dans la transmission des lignes de rsultat au client, ce qui pourrait tre un facteur important dans le temps rel pass ;
mais le planificateur l'ignore parce qu'il ne peut pas le changer en modifiant le plan (chaque plan correct sortira le mme ensemble de lignes).
La valeur rows est un peu difficile car il ne s'agit pas du nombre de lignes traites ou parcourues par le plan de nuds. C'est habituellement moins, refltant la slectivit estime des conditions de la clause WHERE qui sont appliques au nud. Idalement,
les estimations des lignes de haut niveau sera une approximation des nombres de lignes dj renvoyes, mises jour, supprimes par la requte.
Pour revenir notre exemple :
EXPLAIN SELECT * FROM tenk1;
1
Les exemples dans cette section sont rcuprs de la base de donnes des tests de rgression aprs avoir lanc un VACUUM ANALYZE, en utilisant les sources de la version 8.2. Vous devriez tre
capable d'obtenir des rsultats similaires si vous essayez vous-mme les exemples mais vos cots estims et les nombres de lignes varieront probablement lgrement car les statistiques d'ANALYZE
se font partir de valeurs prises au hasard.
272
QUERY PLAN
------------------------------------------------------------Seq Scan on tenk1 (cost=0.00..458.00 rows=10000 width=244)
C'est aussi direct que ce que nous obtenons. Si vous fates :
SELECT relpages, reltuples FROM pg_class WHERE relname = 'tenk1';
vous trouverez que tenk1 a 358 pages disque et 10000 lignes. Le cot estim est calcul avec (nombre de pages lues *
seq_page_cost) + (lignes parcourues * cpu_tuple_cost). Par dfaut, seq_page_cost vaut 1.0 et cpu_tuple_cost vaut 0.01.
Donc le cot estim est de (358 * 1.0) + (10000 * 0.01), soit 458.
Maintenant, modifions la requte originale pour ajouter une condition WHERE :
EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 7000;
QUERY PLAN
-----------------------------------------------------------Seq Scan on tenk1 (cost=0.00..483.00 rows=7033 width=244)
Filter: (unique1 < 7000)
Notez que l'affichage d'EXPLAIN montre la clause WHERE applique comme une condition de filtre ; ceci signifie que le
nud de plan vrifie la condition pour chaque ligne qu'il parcourt et ne conserve que celles qui satisfont la condition. L'estimation
des lignes en sortie a baiss cause de la clause WHERE. Nanmoins, le parcours devra toujours visiter les 10000 lignes, donc le
cot n'a pas baiss ; en fait, il a un peu augment (par 10000 * cpu_operator_cost pour tre exact) dans le but de reflter le temps
CPU supplmentaire dpens pour vrifier la condition WHERE.
Le nombre rel de lignes que cette requte slectionnera est 7000 mais l'estimation rows est approximative. Si vous tentez de dupliquer cette exprience, vous obtiendrez probablement une estimation lgrement diffrente ; de plus, elle changera aprs chaque
commande ANALYZE parce que les statistiques produites par ANALYZE sont prises partir d'un extrait au hasard de la table.
Maintenant, rendons la condition plus restrictive :
EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100;
QUERY PLAN
-----------------------------------------------------------------------------Bitmap Heap Scan on tenk1 (cost=2.37..232.35 rows=106 width=244)
Recheck Cond: (unique1 < 100)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..2.37 rows=106 width=0)
Index Cond: (unique1 < 100)
Ici, le planificateur a dcid d'utiliser un plan en deux tapes : le nud en bas du plan visite un index pour trouver l'emplacement
des lignes correspondant la condition de l'index, puis le nud du plan du dessus rcupre rellement ces lignes de la table. Rcuprer sparment les lignes est bien plus coteux que de les lire squentiellement mais comme toutes les pages de la table n'ont
pas tre visites, cela revient toujours moins cher qu'un parcours squentiel (la raison de l'utilisation d'un plan deux niveaux est
que le nud du plan du dessus trie les emplacements des lignes identifis par l'index dans l'ordre physique avant de les lire pour
minimiser les cots des rcuprations spars. Le bitmap mentionn dans les noms de nuds est le mcanisme qui s'occupe du
tri).
Si la condition WHERE est assez slective, le planificateur pourrait basculer vers un plan de parcours d'index simple :
EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 3;
QUERY PLAN
-----------------------------------------------------------------------------Index Scan using tenk1_unique1 on tenk1 (cost=0.00..10.00 rows=2 width=244)
Index Cond: (unique1 < 3)
Dans ce cas, les lignes de la table sont rcupres dans l'ordre de l'index, ce qui les rend encore plus coteuses lire mais elles
sont si peu nombreuses que le cot supplmentaire de triage des emplacements de lignes ne vaut pas le coup. Vous verrez plus frquemment ce type de plan pour les requtes qui rcuprent une seule ligne et pour les requtes qui ont une condition ORDER BY
correspondant l'ordre de l'index.
Ajoutez une autre condition la clause WHERE :
EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 3 AND stringu1 = 'xxx';
QUERY PLAN
------------------------------------------------------------------------------Index Scan using tenk1_unique1 on tenk1 (cost=0.00..10.01 rows=1 width=244)
273
QUERY PLAN
-------------------------------------------------------------------------------------------Nested Loop (cost=2.37..553.11 rows=106 width=488) (actual time=1.392..12.700
rows=100 loops=1)
-> Bitmap Heap Scan on tenk1 t1 (cost=2.37..232.35 rows=106 width=244) (actual
time=0.878..2.367 rows=100 loops=1)
Recheck Cond: (unique1 < 100)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..2.37 rows=106 width=0)
(actual time=0.546..0.546 rows=100 loops=1)
Index Cond: (unique1 < 100)
-> Index Scan using tenk2_unique2 on tenk2 t2 (cost=0.00..3.01 rows=1 width=244)
(actual time=0.067..0.078 rows=1 loops=100)
Index Cond: (unique2 = t1.unique2)
Total runtime: 14.452 ms
Notez que les valeurs temps rel sont en millisecondes alors que les estimations de cot sont exprimes dans des units arbitraires ; donc il y a peu de chances qu'elles correspondent. L'important est de vrifier si les ratios temps rel et cots estims correspondent.
Dans certains plans de requte, il est possible qu'un nud de sous-plan soit excut plus d'une fois. Par exemple, le parcours
d'index interne est excut une fois par ligne externe dans le plan de boucle imbrique ci-dessus. Dans de tels cas, la valeur
loops renvoie le nombre total d'excution du nud, et le temps rel et les valeurs des lignes affiches sont une moyenne par excution. Ceci est fait pour que les nombres soient comparables avec la faon dont les estimations de cots sont affiches. Multipliez
par la valeur de loops pour obtenir le temps total rellement pass dans le nud.
Le Total runtime (temps total d'excution) affich par EXPLAIN ANALYZE inclut les temps de lancement et d'arrt de
l'excuteur, mais pas le temps pass pour l'analyse, la rcriture ou la planification. Pour les commandes INSERT, UPDATE et
DELETE, le temps pass appliquer les modifications est comptabilis sur le nud de haut-niveau Insert, Update ou Delete. (Les
nuds du plan sous ce nud reprsentent le travail de recherche des anciennes lignes et/ou de calcul des anciennes.) Le temps
pass excuter les triggers BEFORE (s'ils sont prsents) est comptabilis dans le nud relatif (Insert, Update ou Delete). Par
contre, ce n'est pas le cas pour les triggers AFTER. Le temps pass dans chaque trigger (BEFORE ou AFTER) est aussi affich sparment et est inclus dans le temps d'excution total. Notez cependant que les triggers de contraintes diffrs ne seront pas excuts avant la fin de la transaction. Du coup, ils ne sont pas affichs par EXPLAIN ANALYZE.
Il existe deux raisons importantes pour lesquelles les temps d'excution mesurs par EXPLAIN ANALYZE peuvent dvier de
l'excution normale de la mme requte. Tout d'abord, comme aucune ligne n'est rellement envoye au client, les cots de transmission rseau et les cots de formatage des entres/sorties ne sont pas inclus. Ensuite, la surcharge gnr par la commande EXPLAIN ANALYZE peut tre importante, tout spcialement sur les machines dont les appels la fonction gettimeofday()
sont particulirement lents.
Il est bon de noter que les rsultats de EXPLAIN ne devraient pas tre extrapols pour des situations autres que celles de vos tests
en cours ; par exemple, les rsultats sur une petite table ne peuvent tre appliqus des tables bien plus importantes. Les estimations de cot du planificateur ne sont pas linaires et, du coup, il pourrait bien choisir un plan diffrent pour une table plus petite
275
ou plus grande. Un exemple extrme est celui d'une table occupant une page disque. Vous obtiendrez pratiquement toujours un
parcours squentiel que des index soient disponibles ou non. Le planificateur ralise que cela va ncessiter la lecture d'une seule
page disque pour traiter la table dans ce cas, il n'y a donc pas d'intrt tendre des lectures de pages supplmentaires pour un index.
la table road (alled=t), et une autre incluant seulement la table road elle-mme (alled=f).
Le nombre d'informations stockes dans pg_statistic par ANALYZE, en particulier le nombre maximum d'lments dans les tableaux most_common_vals et histogram_bounds pour chaque colonne, peut tre initialis sur une base colonnepar-colonne en utilisant la commande ALTER TABLE SET STATISTICS ou globalement en initialisant la variable de configuration default_statistics_target. La limite par dfaut est actuellement de cent entres. Augmenter la limite pourrait permettre des
estimations plus prcises du planificateur, en particulier pour les colonnes ayant des distributions de donnes irrgulires, au prix
d'un plus grand espace consomm dans pg_statistic et en un temps plus long pour calculer les estimations. En revanche, une limite
plus basse pourrait tre suffisante pour les colonnes distributions de donnes simples.
Le Chapitre 57, Comment le planificateur utilise les statistiques donne plus de dtails sur l'utilisation des statistiques par le planificateur.
portant de tables.
Pour forcer le planificateur suivre l'ordre de jointure demand par les JOIN explicites, initialisez le paramtre en excution
join_collapse_limit 1 (d'autres valeurs possibles sont discutes plus bas).
Vous n'avez pas besoin de restreindre l'ordre de jointure pour diminuer le temps de recherche car il est bien d'utiliser les oprateurs JOIN dans les lments d'une liste FROM. Par exemple, considrez :
SELECT * FROM a CROSS JOIN b, c, d, e WHERE ...;
Avec join_collapse_limit = 1, ceci force le planificateur joindre A B avant de les joindre aux autres tables mais sans
restreindre ses choix. Dans cet exemple, le nombre d'ordres de jointures possibles est rduit par un facteur de cinq.
Restreindre la recherche du planificateur de cette faon est une technique utile pour rduire les temps de planification et pour diriger le planificateur vers un bon plan de requtes. Si le planificateur choisit un mauvais ordre de jointure par dfaut, vous pouvez le
forcer choisir un meilleur ordre via la syntaxe JOIN -- en supposant que vous connaissiez un meilleur ordre. Une exprimentation est recommande.
Un problme trs proche et affectant le temps de planification est le regroupement de sous-requtes dans leurs requtes parents.
Par exemple, considrez :
SELECT *
FROM x, y,
(SELECT * FROM a, b, c WHERE quelquechose) AS ss
WHERE quelquechosedautre;
Cette requte pourrait survenir suite l'utilisation d'une vue contenant une jointure ; la rgle SELECT de la vue sera insre la
place de la rfrence de la vue, demande une requte plutt identique celle ci-dessus. Normalement, le planificateur essaiera de
regrouper la sous-requte avec son parent, donnant :
SELECT * FROM x, y, a, b, c WHERE quelquechose AND quelquechosedautre;
Ceci rsulte habituellement en un meilleur plan que de planifier sparment la sous-requte (par exemple, les conditions WHERE
externes pourraient tre telles que joindre X A limine en premier lieu un bon nombre de lignes de A, vitant ainsi le besoin de
former la sortie complte de la sous-requte). Mais en mme temps, nous avons accru le temps de planification ; ici, nous avons
une problme de jointure cinq tables remplaant un problme de deux jointures spares trois tables. cause de l'augmentation
exponentielle du nombre de possibilits, ceci fait une grande diffrence. Le planificateur essaie d'viter de se retrouver coinc
dans des problmes de recherche de grosses jointures en ne regroupant pas une sous-requte sur plus de
from_collapse_limit lments sont la rsultante de la requte parent. Vous pouvez comparer le temps de planification avec
la qualit du plan en ajustant ce paramtre en excution.
from_collapse_limit et join_collapse_limit sont nomms de faon similaire parce qu'ils font pratiquement la mme chose : l'un
d'eux contrle le moment o le planificateur aplatira les sous-requtes et l'autre contrle s'il y a aplatissement des jointures explicites. Typiquement, vous initialiserez join_collapse_limit comme from_collapse_limit (de faon ce que les
jointures explicites et les sous-requtes agissent de la mme faon) ou vous initialiserez join_collapse_limit 1 (si vous
voulez contrler l'ordre de jointure des jointures explicites). Mais vous pourriez les initialiser diffremment si vous tentez de
configurer finement la relation entre le temps de planification et le temps d'excution.
Si vous ne pouvez pas utiliser COPY, utiliser PREPARE(7) pourrait vous aider crer une instruction prpare INSERT, puis
utilisez EXECUTE autant de fois que ncessaire. Ceci vite certaines surcharges lors d'une analyse et d'une planification rptes
de commandes INSERT. Diffrentes interfaces fournissent cette fonctionnalit de plusieurs faons ; recherchez instructions prpares dans la documentation de l'interface.
Notez que charger un grand nombre de lignes en utilisant COPY est pratiquement toujours plus rapide que d'utiliser INSERT,
mme si PREPARE ... INSERT est utilis lorsque de nombreuses insertions sont groupes en une seule transaction.
COPY est plus rapide quand il est utilis dans la mme transaction que la commande CREATE TABLE ou TRUNCATE prcdente. Dans ce cas, les journaux de transactions ne sont pas impacts car, en cas d'erreur, les fichiers contenant les donnes nouvellement charges seront supprims de toute faon. Nanmoins, cette considration ne s'applique que quand wal_level vaut minimal, car toutes les commandes doivent crire dans les journaux de transaction dans ce cas.
transactions, le faire rendrait certaines commandes plus rapides parce qu'elles sont conues pour ne pas crire du tout dans les
journaux de transactions si wal_level vaut minimal. (Elles peuvent garantir la sret des donnes de faon moins coteuse
en excutant un fsync la fin plutt qu'en crivant les journaux de transactions :
CREATE INDEX (et les variantes telles que ALTER TABLE ADD PRIMARY KEY)
CLUSTER
COPY FROM, quand la table cible vient d'tre cre ou vide auparavant dans la transaction
Configurez des valeurs appropries (c'est--dire plus importante que la normale) pour maintenance_work_mem et
checkpoint_segments.
Si vous utilisez l'archivage des journaux de transactions ou la rplication en flux, considrez leur dsactivation lors de la restauration. Pour faire cela, configurez archive_mode off, wal_level minimal et max_wal_senders zro
avant de charger le script de sauvegarde. Aprs coup, remettez les anciennes valeurs et effectuez une nouvelle sauvegarde de
base.
Demandez-vous si la sauvegarde complte doit tre restaure dans une seule transaction. Pour cela, passez l'option -1 ou -single-transaction psql pi pg_restore. Lors de l'utilisation de ce mode, mme les erreurs les plus petites annuleront
la restauration complte, peut-tre en annulant des heures de traitement. Suivant quel point les donnes sont en relation, il
peut tre prfrable de faire un nettoyage manuel. Les commandes COPY s'excuteront plus rapidement si vous utilisez une
transaction simple et que vous avez dsactiv l'archivage des journaux de transaction.
Si plusieurs processeurs sont disponibles sur le serveur, pensez utiliser l'option --jobs de pg_restore. Cela permet la paralllisation du chargement des donnes et de la cration des index.
Une sauvegarde des donnes seules utilise toujours COPY mais elle ne supprime ni ne recre les index et elle ne touche gnralement pas les cls trangres. 2 Donc, lorsque vous chargez une sauvegarde ne contenant que les donnes, c'est vous de supprimer
et recrer les index et cls trangres si vous souhaitez utiliser ces techniques. Il est toujours utile d'augmenter checkpoint_segments lors du chargement des donnes mais ne vous embtez pas augmenter maintenance_work_mem ; en
fait, vous le ferez lors d'une nouvelle cration manuelle des index et des cls trangres. Et n'oubliez pas ANALYZE une fois que
vous avez termin ; voir Section 23.1.3, Maintenir les statistiques du planificateur et Section 23.1.5, Le dmon auto-vacuum pour plus d'informations.
Vous pouvez obtenir l'effet de dsactivation des cls trangres en utilisant l'option --disable-triggers -- mais ralisez que cela limine, plutt que repousse, la validation des cls trangres et
qu'il est du coup possible d'insrer des donnes mauvaises si vous l'utilisez.
280
Placer le rpertoire des donnes dans un systme de fichiers en mmoire (par exemple un disque RAM). Ceci limine toutes
les entres/sorties disque de la base de donnes. Cela limite aussi la quantit de mmoire disponible (et peut-tre aussi du
swap).
Dsactiver fsync ; il n'est pas ncessaire d'crire les donnes sur disque.
Dsactiver full_page_writes ; il n'est pas ncessaire de se prmunir contre les critures de pages partielles.
Augmenter checkpoint_segments et checkpoint_timeout ; cela rduit les frquences des CHECKPOINT mais augmente
l'espace disque ncessaire dans pg_xlog.
Dsactiver synchronous_commit ; il n'est pas forcment ncessaire d'crire les journaux de transactions (WAL) chaque validation de transactions. Ce paramtre engendre un risque de perte de transactions (mais pas de corruption de donnes) dans le
cas d'un crash de la base de donnes seule.
281
15.2. Prrequis
En gnral, les plateformes style unix modernes sont capables d'excuter PostgreSQL. Les plateformes sur lesquelles des tests
ont t effectus sont listes dans la Section 15.8, Plateformes supportes ci-aprs. Dans le rpertoire doc de la distribution,
il y a plusieurs FAQ spcifiques des plateformes particulires consulter en cas de difficults.
Les logiciels suivants sont ncessaires pour compiler PostgreSQL :
GNU make version 3.80 (ou une version plus rcente) est ncessaire ; les autres programmes make ou les versions plus anciennes de GNU make ne fonctionnent pas. GNU make est souvent install sous le nom gmake ; ce document y fait toujours rfrence sous ce nom (sur certains systme, GNU make est l'outil par dfaut et est nomm make). Pour connatre la
version utilise, saisir
gmake --version
Il est ncessaire d'avoir un compilateur C ISO/ANSI (au minimum compatible avec C89). Une version rcente de GCC est
recommande mais PostgreSQL est connu pour tre compilable avec de nombreux compilateurs de divers vendeurs.
tar est requis pour dballer la distribution des sources, associ gzip ou bzip2.
La bibliothque GNU Readline est utilise par dfaut. Elle permet psql (l'interprteur de ligne de commandes SQL de
PostgreSQL) de se souvenir de chaque commande saisie, et permet d'utiliser les touches de flches pour rappeler et diter les
commandes prcdentes. C'est trs pratique et fortement recommand. Pour ne pas l'utiliser, il faut prciser -without-readline au moment de l'excution de la commande configure. Une alternative possible est l'utilisation
de la bibliothqe libedit sous license BSD, dveloppe au dbut sur NetBSD. La bibliothque libedit est compatible GNU Readline et est utilise si cette dernire n'est pas trouve ou si --with-libedit-preferred est utilis
sur la ligne de commande de configure. Lorsqu'une distribution Linux base de paquets est utilise, si les paquets
readline et readline-devel sont spars, il faut imprativement installer les deux.
La bibliothque de compression zlib est utilise par dfaut. Pour ne pas l'utiliser, il faut prciser --without-zlib
configure. Cela a pour consquence de dsactiver le support des archives compresses dans pg_dump et pg_restore.
Les paquets suivants sont optionnels. S'ils ne sont pas obligatoires lors d'une compilation par dfaut de PostgreSQL, ils le deviennent lorsque certaines options sont utilises, comme cela est expliqu par la suite.
Pour installer le langage procdural PL/Perl, une installation complte de Perl, comprenant la bibliothque libperl et
les fichiers d'en-tte, est ncessaire.
Comme PL/Perl est une bibliothque partage, la bibliothque libperl doit aussi tre partage sur la plupart des plateformes. C'est dsormais le choix par dfaut dans les versions rcentes de Perl, mais ce n'tait pas le cas dans les versions
283
Pour compiler le langage de programmation serveur PL/Python, il faut que Python soit install avec les fichiers d'en-tte et
le module distutils. La version requise minimum est Python 2.2. Python 3 est support s'il s'agit d'une version 3.1 ou ultrieure ; voir la documentation de PL/Python Section 42.1, Python 2 et Python 3 lors de l'utilisation de Python 3.
Puisque PL/Python doit tre une bibliothque partage, la bibliothque libpython doit l'tre aussi sur la plupart des plateformes. Ce n'est pas le cas des installations par dfaut de Python. Si, aprs la compilation et l'installation de PostgreSQL, il
existe un fichier nomm plpython.so (des extensions diffrentes sont possibles), tout va bien. Sinon, il est fort probable
qu'un avertissement semblable celui qui suit soit apparu :
*** Cannot build PL/Python because libpython is not a shared library.
*** You might have to rebuild your Python installation. Refer to
*** the documentation for details.
Ce qui signifie qu'il faut recompiler (une partie de) Python pour crer cette bibliothque partage.
En cas de problmes, on peut excuter le configure de Python 2.3 ou ultrieur en utilisant le commutateur -enable-shared. Sur certains systmes d'exploitation, il n'est pas ncessaire de construire une bibliothque partage, mais
il faut en convaincre le systme de construction de PostgreSQL. Le fichier Makefile du rpertoire src/pl/plpython
donne des dtails complmentaires.
Pour construire le langage procdural PL/Tcl, Tcl doit tre install. Si une version antrieure la version 8.4 de Tcl, est
utilise, on s'assurera qu'il a t construit sans le support du multi-thread.
Pour activer le support de langage natif (NLS), qui permet d'afficher les messages d'un programme dans une langue autre que
l'anglais, une implantation de l'API Gettext est ncessaire. Certains systmes d'exploitation l'intgrent (par exemple, Linux,
NetBSD, Solaris). Pour les autres systmes, un paquet additionnel peut tre tlcharg sur
http://www.gnu.org/software/gettext/. Pour utiliser l'implantation Gettext des bibliothques C GNU, certains utilitaires ncessitent le paquet GNU Gettext. Il n'est pas ncessaire dans les autres implantations.
Vous avez besoin de Kerberos, OpenSSL, OpenLDAP ou PAM pour bnficier de l'authentification ou du chiffrement en
utilisant ces services.
En cas de compilation partir d'une arborescence Git et non d'un paquet de sources publi, ou pour faire du dveloppement au niveau serveur, les paquets suivants seront galement ncessaires :
GNU Flex et Bison sont ncessaires pour compiler partir d'un export du Git ou lorsque les fichiers de dfinition de
l'analyseur ou du scanner sont modifis. Les versions ncessaires sont Flex 2.5.31 ou ultrieure et Bison 1.875 ou ultrieure. Les autres programmes lex et yacc ne peuvent pas tre utiliss.
Perl 5.8 ou ultrieur est aussi ncessaire pour construire les sources du Git, ou lorsque les fichiers en entre pour n'importe laquelle des tapes de construction qui utilisent des scripts Perl ont t modifis. Sous Windows, Perl est ncessaire dans tous les
cas.
sur
un
site
miroir
de
GNU
(voir
Il est important de vrifier qu'il y a suffisamment d'espace disque disponible. 100 Mo sont ncessaires pour la compilation et
20 Mo pour le rpertoire d'installation. Un groupe de bases de donnes vide ncessite 35 Mo ; les fichiers des bases prennent cinq
fois plus d'espace que des fichiers texte contenant les mmes donnes. Si des tests de rgression sont prvus, 150 Mo supplmentaires sont temporairement ncessaires. On peut utiliser la commande df pour vrifier l'espace disque disponible.
Configuration
La premire tape de la procdure d'installation est de configurer l'arborescence systme et de choisir les options intressantes. Ce qui est fait en excutant le script configure. Pour une installation par dfaut, entrer simplement
./configure
Ce script excutera de nombreux tests afin de dterminer les valeurs de certaines variables dpendantes du systme et de dtecter certains alas relatifs au systme d'exploitation. Il crera divers fichiers dans l'arborescence de compilation pour enregistrer ce qui a t trouv. configure peut aussi tre excut partir d'un rpertoire hors de l'arborescence des sources
pour conserver l'arborescence de compilation spar. Cette procdure est aussi appel une construction a VPATH build. Voici
comment la faire :
mkdir build_dir
cd build_dir
/path/to/source/tree/configure [les options vont ici]
gmake
La configuration par dfaut compilera le serveur et les utilitaires, aussi bien que toutes les applications clientes et interfaces
qui requirent seulement un compilateur C. Tous les fichiers seront installs par dfaut sous /usr/local/pgsql.
Les processus de compilation et d'installation peuvent tre personnaliss par l'utilisation d'une ou plusieurs options sur la
ligne de commande aprs configure :
--prefix=PREFIX
Installe tous les fichiers dans le rpertoire PREFIX au lieu du rpertoire /usr/local/pgsql. Les fichiers actuels seront
installs dans divers sous-rpertoires ; aucun fichier ne sera directement install sous PREFIX.
Pour satisfaire des besoins spcifiques, les sous-rpertoires peuvent tre personnaliss l'aide des options qui suivent. Toutefois, en laissant les options par dfaut, l'installation est dplaable, ce qui signifie que le rperoire peut tre dplac aprs installation. (Cela n'affecte pas les emplacements de man et doc.)
Pour les installations dplaables, on peut utiliser l'option --disable-rpath de configure. De plus, il faut indiquer au
systme d'exploitation comment trouver les bibliothques partages.
--exec-prefix=EXEC-PREFIX
Les fichiers qui dpendent de l'architecture peuvent tre installs dans un rpertoire diffrent, EXEC-PREFIX, de celui donn
par PREFIX. Ce qui peut tre utile pour partager les fichiers dpendant de l'architecture entre plusieurs machines. S'il est
omis, EXEC-PREFIX est gal PREFIX et les fichiers dpendant seront installs sous la mme arborescence que les fichiers
indpendants de l'architecture, ce qui est probablement le but recherch.
--bindir=REPERTOIRE
Prcise le rpertoire des
usr/local/pgsql/bin.
excutables.
Par
dfaut,
il
s'agit
de
EXEC-PREFIX/bin,
ce
qui
signifie
--sysconfdir=REPERTOIRE
Prcise le rpertoire de divers fichiers de configuration. Par dfaut, il s'agit de PREFIX/etc.
--libdir=REPERTOIRE
Prcise le rpertoire d'installation des bibliothques et des modules chargeables dynamiquement. Par dfaut, il s'agit de
EXEC-PREFIX/lib.
285
--includedir=REPERTOIRE
Prcise le rpertoire d'installation des en-ttes C et C++. Par dfaut, il s'agit de PREFIX/include.
--datarootdir=REPERTOIRE
Indique le rpertoire racine de diffrents types de fichiers de donnes en lecture seule. Cela ne sert qu' paramtrer des valeurs
par dfaut pour certaines des options suivantes. La valeur par dfaut est PREFIX/share.
--datadir=REPERTOIRE
Indique le rpertoire pour les fichiers de donnes en lecture seule utiliss par les programmes installs. La valeur par dfaut
est DATAROOTDIR. Cela n'a aucun rapport avec l'endroit o les fichiers de base de donnes seront placs.
--localedir=REPERTOIRE
Indique le rpertoire pour installer les donnes locales, en particulier les fichiers catalogues de traductions de messages. La
valeur par dfaut est DATAROOTDIR/locale.
--mandir=REPERTOIRE
Les pages man fournies avec PostgreSQL seront installes sous ce rpertoire, dans leur sous-rpertoire manx respectif. Par
dfaut, il s'agit de DATAROOTDIR/man.
--docdir=RPERTOIRE
Configure le rpertoire racine pour installer les fichiers de documentation, sauf les pages man . Ceci ne positionne la valeur par dfaut que pour les options suivantes. La valeur par dfaut pour cette option est DATAROOTDIR/
doc/postgresql.
--htmldir=RPERTOIRE
La documentation formate en HTML pour PostgreSQL sera installe dans ce rpertoire. La valeur par dfaut est DATAROOTDIR.
Note
Une attention toute particulire a t prise afin de rendre possible l'installation de PostgreSQL dans des rpertoires partags (comme /usr/local/include) sans interfrer avec des noms de fichiers relatifs au
reste du systme. En premier lieu, le mot /postgresql est automatiquement ajout aux rpertoires datadir, sysconfdir et docdir, moins que le nom du rpertoire partir de la racine contienne dj le
mot postgres ou pgsql . Par exemple, si /usr/local est choisi comme prfixe, la documentation sera installe dans /usr/local/doc/postgresql, mais si le prfixe est /opt/postgres, alors il
sera dans /opt/postgres/doc. Les fichiers d'en-tte publiques C de l'interface cliente seront installs
sous includedir et sont indpendants des noms de fichiers relatifs au reste du systme. Les fichiers
d'en-tte privs et les fichiers d'en-tte du serveur sont installs dans des rpertoires privs sous
includedir. Voir la documentation de chaque interface pour savoir comment obtenir ces fichiers d'en-tte.
Enfin, un rpertoire priv sera aussi cr si ncessaire sous libdir pour les modules chargeables dynamiquement.
--with-includes=REPERTOIRES
REPERTOIRES est une liste de rpertoires spars par des caractres deux points (:) qui sera ajoute la liste de recherche
des fichiers d'en-tte. Si vous avez des paquetages optionnels (tels que Readline GNU) installs dans des rpertoires non
conventionnels, vous pouvez utiliser cette option et certainement l'option --with-libraries correspondante.
Exemple : --with-includes=/opt/gnu/include:/usr/sup/include.
--with-libraries=REPERTOIRES
REPERTOIRES est une liste de recherche de rpertoires de bibliothques spars par des caractres deux points (:). Si des paquets sont installs dans des rpertoires non conventionnels, il peut s'avrer ncessaire d'utiliser cette option (et l'option correspondante --with-includes).
Exemple : --with-libraries=/opt/gnu/lib:/usr/sup/lib.
--enable-nls[=LANGUES]
Permet de mettre en place le support des langues natives (NLS). C'est la possibilit d'afficher les messages des programmes
dans une langue autre que l'anglais. LANGUES est une liste, optionnelle, des codes des langues que vous voulez supporter spars par un espace. Par exemple, --enable-nls='de fr' (l'intersection entre la liste et l'ensemble des langues traduites actuellement sera calcule automatiquement). En l'absence de liste, toutes les traductions disponibles seront installes.
Pour utiliser cette option, une implantation de l'API Gettext est ncessaire ; voir ci-dessous.
286
--with-pgport=NUMERO
Positionne NUMERO comme numro de port par dfaut pour le serveur et les clients. La valeur par dfaut est 5432. Le port
peut toujours tre chang ultrieurement mais, prcis ici, les excutables du serveur et des clients auront la mme valeur par
dfaut, ce qui est vraiment trs pratique. Habituellement, la seule bonne raison de choisir une valeur autre que celle par dfaut
est l'excution de plusieurs serveurs PostgreSQL sur la mme machine.
--with-perl
Permet l'utilisation du langage de procdures PL/Perl ct serveur.
--with-python
Permet la compilation du langage de procdures PL/Python.
--with-tcl
Permet la compilation du langage de procdures PL/Tcl.
--with-tclconfig=REPERTOIRE
Tcl installe les fichiers tclConfig.sh, contenant certaines informations de configuration ncessaires pour compiler le module d'interfaage avec Tcl. Ce fichier est trouv automatiquement mais, si pour utiliser une version diffrente de Tcl, il faut
indiquer le rpertoire o le trouver.
--with-gssapi
Construire avec le support de l'authentification GSSAPI. Sur de nombreux systmes, GSSAPI (qui fait habituellement partie
d'une installation Kerberos) n'est pas install dans un emplacement recherch par dfaut (c'est--dire /usr/include, /
usr/lib), donc vous devez utiliser les options --with-includes et --with-libraries en plus de cette option.
configure vrifiera les fichiers d'en-ttes ncessaires et les bibliothques pour s'assurer que votre installation GSSAPI est
suffisante avant de continuer.
--with-krb5
Compile le support d'authentification de Kerberos 5. Sur beaucoup de systmes, le systme Kerberos n'est pas install un
emplacement recherch par dfaut (c'est--dire /usr/include, /usr/lib), donc vous devez utiliser les options -with-includes et --with-libraries en plus de cette option. configure vrifiera les fichiers d'en-tte et les bibliothques requis pour s'assurer que votre installation Kerberos est suffisante avant de continuer
--with-krb-srvnam=NOM
Le nom par dfaut du service principal de Kerberos (aussi utilis par GSSAPI). postgres est pris par dfaut. Il n'y a habituellement pas de raison de le changer sauf dans le cas d'un environnement Windows, auquel cas il doit tre mis en majuscule,
POSTGRES.
--with-openssl
Compile le support de connexion SSL (chiffrement). Le paquetage OpenSSL doit tre install. configure vrifiera que
les fichiers d'en-tte et les bibliothques soient installs pour s'assurer que votre installation d'OpenSSL est suffisante avant
de continuer.
--with-pam
Compile le support PAM (Modules d'Authentification Pluggable).
--with-ldap
Demande l'ajout du support de LDAP pour l'authentification et la recherche des paramtres de connexion (voir la documentation sur l'authentification des clients et libpqSection 31.16, Recherches LDAP des paramtres de connexion et Section 19.3.8, Authentification LDAP ). Sur Unix, cela requiert l'installation du paquet OpenLDAP. Sur Windows, la bibliothque WinLDAP est utilise par dfaut. configure vrifiera l'existence des fichiers d'en-tte et des bibliothques requis pour s'assurer que votre installation d'OpenLDAP est suffisante avant de continuer.
--without-readline
vite l'utilisation de la bibliothque Readline (et de celle de libedit). Cela dsactive l'dition de la ligne de commande et
l'historique dans psql, ce n'est donc pas recommand.
--with-libedit-preferred
Favorise l'utilisation de la bibliothque libedit (sous licence BSD) plutt que Readline (GPL). Cette option a seulement un
sens si vous avez install les deux bibliothques ; dans ce cas, par dfaut, Readline est utilis.
--with-bonjour
Compile le support de Bonjour. Ceci requiert le support de Bonjour dans votre systme d'exploitation. Recommand sur Mac
OS X.
--with-ossp-uuid
Construit les composants en utilisant la bibliothque OSSP UUID. Autrement dit, construit le module uuid-ossp uuid-ossp,
287
Autorise le succs de la construction y compris lorsque PostgreSQL n'a pas le support spinlock du CPU pour la plateforme.
Ce manque de support rsultera en des performances faibles ; du coup, cette option devra seulement tre utilise si la
construction choue et vous informe du manque de support de spinlock sur votre plateforme. Si cette option est requise pour
construire PostgreSQL sur votre plateforme, merci de rapporter le problme aux dveloppeurs de PostgreSQL.
--disable-thread-safety
Dsactive la sret des threads pour les bibliothques clients. Ceci empche les threads concurrents dans les programmes
libpq et ECPG de contrler avec sret leur pointeurs de connexion privs.
--with-system-tzdata=RPERTOIRE
PostgreSQL inclut sa propre base de donnes des fuseaux horaires, ncessaire pour les oprations sur les dates et les heures.
Cette base de donnes est en fait compatible avec la base de fuseaux horaires zoneinfo fournie par de nombreux systmes
d'exploitation comme FreeBSD, Linux et Solaris, donc ce serait redondant de l'installer une nouvelle fois. Quand cette option
est utilise, la base des fuseaux horaires, fournie par le systme, dans RPERTOIRE est utilise la place de celle inclus dans
la distribution des sources de PostgreSQL. RPERTOIRE doit tre indiqu avec un chemin absolu. /
usr/share/zoneinfo est un rpertoire trs probable sur certains systmes d'exploitation. Notez que la routine
d'installation ne dtectera pas les donnes de fuseau horaire diffrentes ou errones. Si vous utilisez cette option, il vous est
conseill de lancer les tests de rgression pour vrifier que les donnes de fuseau horaire que vous pointez fonctionnent correctement avec PostgreSQL.
Cette option a pour cible les distributeurs de paquets binaires qui connaissent leur systme d'exploitation. Le principal avantage d'utiliser cette option est que le package PostgreSQL n'aura pas besoin d'tre mis jour chaque fois que les rgles des
fuseaux horaires changent. Un autre avantage est que PostgreSQL peut tre cross-compil plus simplement si les fichiers des
fuseaux horaires n'ont pas besoin d'tre construit lors de l'installation.
--without-zlib
vite l'utilisation de la bibliothque Zlib. Cela dsactive le support des archives compresses dans pg_dump et pg_restore.
Cette option est seulement l pour les rares systmes qui ne disposent pas de cette bibliothque.
--enable-debug
Compile tous les programmes et bibliothques en mode de dbogage. Cela signifie que vous pouvez excuter les programmes
via un dbogueur pour analyser les problmes. Cela grossit considrablement la taille des excutables et, avec des compilateurs autres que GCC, habituellement, cela dsactive les optimisations du compilateur, provoquant des ralentissements. Cependant, mettre ce mode en place est extrmement utile pour reprer les problmes. Actuellement, cette option est recommande pour les installations en production seulement si vous utilisez GCC. Nanmoins, vous devriez l'utiliser si vous dveloppez
ou si vous utilisez une version bta.
--enable-coverage
Si vous utilisez GCC, les programmes et bibliothques sont compils avec de l'instrumentation de test de couverture de code.
Quand ils sont excuts, ils gnrent des fichiers dans le rpertoire de compilation avec des mtriques de couverture de code.
Voir Section 30.4, Examen de la couverture du test pour davantage d'informations. Cette option ne doit tre utilise
qu'avec GCC et uniquement en phase de dveloppement.
--enable-profiling
En cas d'utilisation de GCC, tous les programmes et bibliothques sont compils pour qu'elles puissent tre profiles. la
sortie du processus serveur, un sous-rpertoire sera cr pour contenir le fichier gmon.out utiliser pour le profilage. Cette
option est utiliser seulement avec GCC lors d'un dveloppement.
--enable-cassert
Permet la vrification des assertions par le serveur qui teste de nombreux cas de conditions impossibles . Ce qui est inestimable dans le cas de dveloppement, mais les tests peuvent ralentir sensiblement le systme. Activer cette option n'influe pas
sur la stabilit de votre serveur ! Les assertions vrifies ne sont pas classes par ordre de svrit et il se peut qu'un bogue
anodin fasse redmarrer le serveur s'il y a un chec de vrification. Cette option n'est pas recommande dans un environnement de production mais vous devriez l'utiliser lors de dveloppement ou pour les versions bta.
--enable-depend
Active la recherche automatique des dpendances. Avec cette option, les fichiers makefile sont appels pour recompiler les fichiers objet ds qu'un fichier d'en-tte est modifi. C'est pratique si vous faites du dveloppement, mais inutile si vous ne voulez que compiler une fois et installer. Pour le moment, cette option ne fonctionne qu'avec GCC.
--enable-dtrace
Compile PostgreSQL avec le support de l'outil de trace dynamique, DTrace. Voir Section 27.4, Traces dynamiques
pour plus d'informations.
Pour pointer vers le programme dtrace, la variable d'environnement DTRACE doit tre configure. Ceci sera souvent ncessaire car dtrace est typiquement install sous /usr/sbin, qui pourrait ne pas tre dans le chemin.
289
Des options supplmentaires en ligne de commande peuvent tre indiques dans la variable d'environnement DTRACEFLAGS
pour le programme dtrace. Sur Solaris, pour inclure le support de DTrace dans un excutable 64-bit, ajoutez l'option DTRACEFLAGS="-64" pour configure. Par exemple, en utilisant le compilateur GCC :
./configure CC='gcc -m64' --enable-dtrace DTRACEFLAGS='-64' ...
En utilisant le compilateur de Sun :
./configure CC='/opt/SUNWspro/bin/cc -xtarget=native64' --enable-dtrace
DTRACEFLAGS='-64' ...
Si vous prfrez utiliser un compilateur C diffrent de ceux lists par configure, positionnez la variable d'environnement
CC pour qu'elle pointe sur le compilateur de votre choix. Par dfaut, configure pointe sur gcc s'il est disponible, sinon il
utilise celui par dfaut de la plateforme (habituellement cc). De faon similaire, vous pouvez repositionner les options par
dfaut du compilateur l'aide de la variable CFLAGS.
Les variables d'environnement peuvent tre indiques sur la ligne de commande configure, par exemple :
./configure CC=/opt/bin/gcc CFLAGS='-O2 -pipe'
Voici une liste des variables importantes qui sont configurables de cete faon :
BISON
programme Bison
CC
compilateur C
CFLAGS
options passer au compilateur C
CPP
prprocesseur C
CPPFLAGS
options passer au prprocesseur C
DTRACE
emplacement du programme dtrace
DTRACEFLAGS
options passer au programme dtrace
FLEX
programme Flex
LDFLAGS
options utiliser lors de l'dition des liens des excutables et des bibliothques partages
LDFLAGS_EX
options supplmentaires valables uniquement lors de l'dition des liens des excutables
LDFLAGS_SL
options supplmentaires valables uniquement lors de l'dition des liens des bibliothques partages
MSGFMT
programme msgfmt pour le support des langues
PERL
chemin complet vers l'interprteur Perl. Il sera utilis pour dterminer les dpendances pour la construction de PL/Perl.
PYTHON
chemin complet vers l'interprteur Python. Il sera utilis pour dterminer les dpendances pour la construction de PL/Python.
De plus, si Python 2 ou 3 est spcifi ici (ou implicitement choisi), il dtermine la variante de PL/Python qui devient disponible. Voir la documentation PL/Python Section 42.1, Python 2 et Python 3 pour plus d'informations.
TCLSH
chemin complet vers l'interprteur Tcl. Il sera utilis pour dterminer les dpendances pour la construction de PL/Tcl, et il sera substitu dans des scripts Tcl.
290
XML2_CONFIG
programme xml2-config utilis pour localiser l'installation de libxml.
2.
Compilation
Pour dmarrer la compilation, saisissez
gmake
(Rappelez-vous d'utiliser GNU make). La compilation prendra quelques minutes, selon votre matriel. La dernire ligne affiche devrait tre
All of PostgreSQL is successfully made. Ready to install.
Si vous voulez construire tout ce qui peut tre construit, ceci incluant la documentation (HTML et pages man) et les modules
supplmentaires (contrib), saisissez la place :
gmake world
La dernire ligne affiche doit tre :
PostgreSQL, contrib and HTML documentation successfully made. Ready to install.
3.
Tests de rgression
Si vous souhaitez tester le serveur nouvellement compil avant de l'installer, vous pouvez excuter les tests de rgression ce
moment. Les tests de rgression sont une suite de tests qui vrifient que PostgreSQL fonctionne sur votre machine tel que
les dveloppeurs l'esprent. Saisissez
gmake check
(cela ne fonctionne pas en tant que root ; faites-le en tant qu'utilisateur sans droits). Le fichier src/
test/regress/README et la documentation contiennentLe Chapitre 30, Tests de rgression contient des dtails sur
l'interprtation des rsultats de ces tests. Vous pouvez les rpter autant de fois que vous le voulez en utilisant la mme commande.
4.
Note
Si vous mettez jour une version existante, assurez-vous d'avoir bien lu la documentation Section 17.6,
Mise jour d'une instance PostgreSQL qui donne les instructions sur la mise jour d'un cluster.
Pour installer PostgreSQL, saisissez
gmake install
Cela installera les fichiers dans les rpertoires spcifis dans l'tape 1. Assurez-vous d'avoir les droits appropris pour crire
dans ces rpertoires. Normalement, vous avez besoin d'tre superutilisateur pour cette tape. Une alternative consiste crer
les rpertoires cibles l'avance et leur donner les droits appropries.
Pour installer la documentation (HTML et pages man), saisissez :
gmake install-docs
Si vous construisez tout, saisissez ceci la place :
gmake install-world
Cela installe aussi la documentation.
Vous pouvez utiliser gmake install-strip en lieu et place de gmake install pour dpouiller l'installation des
excutables et des bibliothques. Cela conomise un peu d'espace disque. Si vous avez effectu la compilation en mode de
dbogage, ce dpouillage l'enlvera, donc ce n'est faire seulement si ce mode n'est plus ncessaire. install-strip essaie d'tre raisonnable en sauvegardant de l'espace disque mais il n'a pas une connaissance parfaite de la faon de dpouiller
un excutable de tous les octets inutiles. Ainsi, si vous voulez sauvegarder le maximum d'espace disque, vous devrez faire le
291
travail la main.
L'installation standard fournit seulement les fichiers en-ttes ncessaires pour le dveloppement d'applications clientes ainsi
que pour le dveloppement de programmes ct serveur comme des fonction personnelles ou des types de donnes crits en
C (avant PostgreSQL 8.0, une commande gmake install-all-headers spare tait ncessaire pour ce dernier
point mais cette tape a t intgre l'installation standard).
Installation du client uniquement : Si vous voulez uniquement installer les applications clientes et les bibliothques
d'interface, alors vous pouvez utilisez ces commandes :
gmake
gmake
gmake
gmake
-C
-C
-C
-C
src/bin install
src/include install
src/interfaces install
doc install
src/bin comprend quelques excutables utiliss seulement par le serveur mais ils sont petits.
Enregistrer eventlog sur Windows : Pour enregistrer une bibliothque eventlog sur Windows grce au systme d'exploitation,
excutez cette commande aprs l'installation :
regsvr32 pgsql_library_directory/pgevent.dll
Ceci cre les entres du registre utilises par le visualisateur d'vnements.
Dsinstallation : Pour dsinstaller, utilisez la commande gmake uninstall. Cependant, cela ne supprimera pas les rpertoires
crs.
Nettoyage : Aprs l'installation, vous pouvez librer de l'espace en supprimant les fichiers issus de la compilation des rpertoires
sources l'aide de la commande gmake clean. Cela conservera les fichiers crs par la commande configure, ainsi vous pourrez
tout recompiler ultrieurement avec gmake. Pour remettre l'arborescence source dans l'tat initial, utilisez gmake distclean. Si
vous voulez effectuer la compilation pour diverses plateformes partir des mmes sources vous devrez d'abord refaire la configuration chaque fois (autrement, utilisez un rpertoire de construction spar pour chaque plateforme, de faon ce que le rpertoire des sources reste inchang).
Si vous avez compil et que vous vous tes rendu compte que les options de configure sont fausses ou si vous changez quoi que
ce soit que configure prenne en compte (par exemple, la mise jour d'applications), alors faire un gmake distclean avant de reconfigurer et recompiler est une bonne ide. Sans a, vos changements dans la configuration ne seront pas rpercuts partout o il
faut.
15.6. Dmarrer
La suite est un rsum rapide de la faon de faire fonctionner PostgreSQL une fois l'installation termine. La documentation
principale contient plus d'informations.
1.
Crer un compte utilisateur pour le serveur PostgreSQL. C'est cet utilisateur qui fera dmarrer le serveur. Pour un usage en
production, vous devez crer un compte sans droits ( postgres est habituellement utilis). Si vous n'avez pas les accs superutilisateur ou si vous voulez juste regarder, votre propre compte utilisateur est suffisant. Mais, utiliser le compte superutilisateur pour dmarrer le serveur est risqu (au point de vue scurit) et ne fonctionnera pas.
adduser postgres
2.
Faire l'installation de la base de donnes avec la commande initdb. Pour excuter initdb, vous devez tre connect sur votre
serveur avec le compte PostgreSQL. Cela ne fonctionnera pas avec le compte superutilisateur.
root# mkdir /usr/local/pgsql/data
root# chown postgres /usr/local/pgsql/data
root# su - postgres
postgres$ /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
L'option -D spcifie le rpertoire o les donnes seront stockes. Vous pouvez utiliser le chemin que vous voulez, il n'a pas
tre sous le rpertoire de l'installation. Avant de lancer initdb, assurez-vous que le compte serveur peut crire dans ce rpertoire (ou le crer s'il n'existe pas), comme c'est montr ici.
293
3.
ce moment, si vous n'utilisez pas l'option -A de initdb, vous devez modifier le fichier pg_hba.conf pour contrler les
accs en local du serveur avant de le lancer. La valeur par dfaut est de faire confiance tous les utilisateurs locaux.
4.
L'tape initdb prcdente vous a indiqu comment dmarrer le serveur de base. Maintenant, faites-le. La commande doit ressembler :
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
Cela dmarrera le serveur en avant-plan. Pour le mettre en arrire plan faites quelque chose comme :
nohup /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data \
</dev/null >>server.log 2>&1 </dev/null &
Pour arrter le serveur fonctionnant en arrire-plan, vous pouvez saisir :
kill `cat /usr/local/pgsql/data/postmaster.pid`
5.
15.7. Et maintenant ?
La distribution de PostgreSQL comprend un document comprhensible que vous devriez lire de temps en temps. Aprs
l'installation, le document peut tre lu en faisant pointer votre navigateur internet sur /
usr/local/pgsql/doc/html/index.html, except si vous avez chang les rpertoires d'installation.
Le premier chapitre de la documentation est un tutoriel qui devrait tre votre premire lecture si vous tes nouveau dans le
monde des bases de donnes SQL. Si vous tes familier avec les concepts des bases de donnes, alors vous devriez commencer
avec la partie administration du serveur qui contient des informations sur la faon de mettre en place le serveur de base, les
bases des utilisateurs et l'authentification.
Normalement, vous voudrez faire en sorte que le serveur de base dmarre automatiquement au boot de la machine. Pour ce
faire, quelques suggestions se trouvent dans la documentation.
Faire les tests de rgression sur le serveur install (en utilisant gmake installcheck). Si vous ne l'avez pas fait auparavant,
vous devriez dfinitivement le faire maintenant. C'est aussi expliqu dans la documentation.
Par dfaut, PostgreSQL est configur pour fonctionner sur un matriel mimimal. Ceci lui permet de fonctionner sur pratiquement toutes les configurations matrielles. Nanmoins, la configuration par dfaut n'est pas conue pour des performances
optimales. Pour disposer des meilleures performances, plusieurs paramtres serveurs doivent tre ajusts, les deux plus communs tant shared_buffers et work_mem. Les autres paramtres mentionns dans la documentation affectent aussi les
performances.
15.9.1. AIX
PostgreSQL fonctionne sur AIX, mais russir l'installer correctement peut s'avrer difficile. Les versions AIX de la 4.3.3 la 6.1
sont considres comme supportes en thorie. Vous pouvez utiliser GCC ou le compilateur natif IBM xlc. En gnral, utiliser des
versions rcentes d'AIX et PostgreSQL rend la tche plus simple. Vrifiez la ferme de compilation pour avoir des informations
jour sur les versions d'AIX connues pour tre compatibles.
Les niveaux minimums recommands de correctifs pour les versions supportes de AIX sont :
AIX 4.3.3
Maintenance Level 11 + post ML11 bundle
AIX 5.1
Maintenance Level 9 + post ML9 bundle
AIX 5.2
Technology Level 10 Service Pack 3
AIX 5.3
Technology Level 7
AIX 6.1
Base Level
Pour vrifier votre niveau de correctif, utilisez oslevel -r de AIX 4.3.3 AIX 5.2 ML 7, et oslevel -s pour les versions ultrieures.
Utilisez les options de configure en plus de vos propres options si vous avez install Readline ou libz dans /usr/local : -with-includes=/usr/local/include --with-libraries=/usr/local/lib.
295
Supprimer IPv6 des services rseau. Le fichier /etc/netsvc.conf sur AIX est en gros quivalent /
etc/nsswitch.conf sur Solaris/Linux. La valeur par dfaut, sur AIX, est donc :
hosts=local,bind
Remplacez ceci avec :
hosts=local4,bind4
pour dsactiver la recherche des adresses IPv6.
Avertissement
Ceci est en ralit un contournement des problmes relatifs l'immaturit du support IPv6, qui a amlior la visibilit pour les versions 5.3 d'AIX. Cela a fonctionn avec les versions 5.3 d'AIX mais n'en fait pas pour autant une
solution lgante ce problme. Certaines personnes ont indiqu que ce contournement est non seulement inutile,
mais pose aussi des problmes sur AIX 6.1, o le support IPv6 est beaucoup plus mature.
On a un autre exemple avec les erreurs 'out of memory' dans les traces du serveur PostgreSQL, avec toute allocation de mmoire
proche ou suprieure 256 Mo qui choue.
La cause gnrale de ces problmes est le nombre de bits et le modle mmoire utilis par le processus serveur. Par dfaut, tous
les binaires compils sur AIX sont 32-bits. Cela ne dpend pas du matriel ou du noyau en cours d'utilisation. Ces processus
296
Large Program Support . AIX Documentation: General Programming Concepts: Writing and Debugging Programs.
Program Address Space Overview . AIX Documentation: General Programming Concepts: Writing and Debugging Programs.
Performance Overview of the Virtual Memory Manager (VMM) . AIX Documentation: Performance Management Guide.
Page Space Allocation . AIX Documentation: Performance Management Guide.
Paging-space thresholds tuning . AIX Documentation: Performance Management Guide.
Developing and Porting C and C++ Applications on AIX. IBM Redbook.
15.9.2. Cygwin
PostgreSQL peut tre construit avec Cygwin, un environnement similaire Linux pour Windows, mais cette mthode est infrieure la version native Windows (voir Chapitre 16, Installation partir du code source sur Windows) et faire tourner un serveur sur Cygwin n'est plus recommand.
Quand vous compilez partir des sources, suivant la procdure normale d'installation (c'est--dire ./configure; make;
etc...), notez les diffrences suivantes spcifiques Cygwin :
Positionnez le path pour utiliser le rpertoire binaire Cygwin avant celui des utilitaires Windows. Cela permettra d'viter des
problmes avec la compilation.
La commande adduser n'est pas supporte ; utilisez les outils appropris de gestion d'utilisateurs sous Windows NT, 2000 ou
XP. Sinon, sautez cette tape.
La commande su n'est pas supporte ; utilisez ssh pour simuler la commande su sous Windows NT, 2000 ou XP. Sinon, sautez
cette tape.
Dmarrez cygserver pour le support de la mmoire partage. Pour cela, entrez la commande /usr/sbin/cygserver &.
Ce programme doit fonctionner chaque fois que vous dmarrez le serveur PostgreSQL ou que vous initialisez un cluster de
bases de donnes (initdb). La configuration par dfaut de cygserver pourrait ncessiter des changements (par exemple, augmenter SEMMNS) pour viter PostgreSQL d'chouer en raison d'un manque de ressources systme.
297
Il se peut que la construction choue sur certains systme quand une locale autre que C est utilise. Pour rsoudre ce problme,
positionnez la locale C avec la commande export LANG=C.utf8 avant de lancer la construction, et ensuite, une fois que
vous avez install PostgreSQL, repositionnez-l son ancienne valeur.
Les tests de rgression en parallle (make check) peuvent gnrer des checs de tests de rgression alatoires en raison d'un
dpassement de capacit de la file d'attente de listen() qui cause des erreurs de connexion refuse ou des blocages. Vous
pouvez limiter le nombre de connexion en utilisant la variable de make MAX_CONNECTIONS comme ceci :
make MAX_CONNECTIONS=5 check
(Sur certains systmes, vous pouvez avoir jusqu' 10 connexions simultanes).
Il est possible d'installer cygserver et le serveur PostgreSQL en tant que services Windows NT. Pour plus d'informations sur comment le faire, veuillez vous rfrer au document README inclus avec le package binaire PostgreSQL sur Cygwin. Il est install
dans le rpertoire /usr/share/doc/Cygwin.
15.9.3. HP-UX
PostgreSQL 7.3 et plus devraient fonctionner sur les machines PA-RISC Sries 700/800 sous HP-UX 10.X ou 11.X, si les correctifs appropris sur le systme et les outils de compilation sont bien appliqus. Au moins un dveloppeur teste de faon rgulire
sur HP-UX 10.20, et nous avons des rapports d'installations russies sur HP-UX 11.00 et 11.11.
En plus de la distribution source de PostgreSQL, vous aurez besoin de GNU make (le make HP ne fonctionnera pas) et soit GCC
soit le compilateur ANSI HP. Si vous avez l'intention de compiler partir des sources Git plutt que d'une distribution tar, vous
aurez aussi besoin de Flex (les GNU) et Bison (yacc GNU). Nous vous recommandons aussi de vous assurer que vous tes assez
jour sur les correctifs HP. Au minimum, si vous compilez des binaires 64 bits sur HP-UX 11.11, vous aurez probablement besoin
de PHSS_30966 (11.11) ou d'un correctif suprieur, sinon initdb pourrait bloquer :
PHSS_30966 s700_800 ld(1) and linker tools cumulative patch
De faon gnrale, vous devriez tre jour sur les correctifs libc et ld/dld, ainsi que sur les correctifs du compilateur si vous utilisez le compilateur C de HP. Voir les sites de support HP comme http://itrc.hp.com et ftp://us-ffs.external.hp.com/ pour tlcharger
gratuitement leurs derniers correctifs.
Si vous compilez sur une machine PA-RISC 2.0 et que vous voulez avoir des binaires 64 bits en utilisant GCC, vous devez utiliser
la version 64 bits de GCC. Des binaires GCC pour HP-UX PA-RISC et Itanium sont disponibles sur http://www.hp.com/go/gcc.
N'oubliez pas de rcuprer et d'installer les binutils en mme temps.
Si vous compilez sur une machine PA-RISC 2.0 et que vous voulez que les binaires compils fonctionnent sur une machine PARISC 1.1, vous devez spcifier +DAportable comme CFLAGS.
Si vous compilez sur une machine HP-UX Itanium, vous aurez besoin du dernier compilateur C ANSI HP avec les correctifs qui
en dpendent :
PHSS_30848 s700_800 HP C Compiler (A.05.57)
PHSS_30849 s700_800 u2comp/be/plugin library Patch
Si vous avez la fois le compilateur C HP et celui de GCC, vous voudrez peut tre spcifier explicitement le compilateur utiliser
quand vous excuterez configure :
./configure CC=cc
pour le compilateur HP, ou
./configure CC=gcc
pour GCC. Si vous omettez ce paramtre, configure choisira gcc s'il en a la possibilit.
Le rpertoire par dfaut d'installation est /usr/local/pgsql, que vous voudrez peut tre remplacer par quelque chose dans /
opt. Si c'est le cas, utilisez l'option --prefix de configure.
Dans les tests de rgression, il pourrait y avoir des diffrences dans les chiffres les moins significatifs des tests de gomtrie, qui
varient suivant les versions de compilateur et de bibliothque mathmatique utilises. Toute autre erreur est suspecte.
15.9.4. IRIX
298
15.9.6.1. Skunkware
Vous aurez besoin de votre copie du CD SCO Skunkware. Le CD Skunkware est inclus avec UnixWare 7 et les versions actuelles
d'OpenServer 5. Skunkware inclut des versions prtes l'installation de nombreux programmes populaires qui sont disponibles sur
Internet. Par exemple, sont inclus gzip, gunzip, GNU Make, Flex et Bison. Pour UnixWare 7.1, ce CD est maintenant appel
299
15.9.6.3. Readline
La bibliothque Readline est disponible sur le CD Skunkware, mais pas sur le CD Skunkware d'UnixWare 7.1. Si vous avez UnixWare 7.0.0 ou 7.0.1, vous pouvez installer partir du CD, sinon essayez http://www.sco.com/skunkware/.
Par dfaut, Readline s'installe dans /usr/local/lib et /usr/local/include. Toutefois, le programme configure de
PostgreSQL ne la trouvera pas l sans aide. Si vous avez install Readline, alors utilisez les options suivantes avec configure :
./configure --with-libraries=/usr/local/lib --with-includes=/usr/local/include
MANPATH=/usr/lib/scohelp/%L/man:/usr/dt/man:/usr/man:/usr/share/man:scohelp:/usr/local/man:/
Sur OpenServer, un effort supplmentaire devra tre fait pour rendre les man pages utilisables, parce que le systme man est un
peu diffrent de celui des autres plateformes. l'heure actuelle, PostgreSQL ne les installera pas du tout.
15.9.7. Solaris
PostgreSQL est bien support sous Solaris. Plus le systme d'exploitation est jour, moins de problmes vous aurez ; les dtails
300
src/backend/libpq/crypt.c
src/backend/libpq/password.c
src/interfaces/libpq/fe-auth.c
src/interfaces/libpq/fe-connect.c
C'est en raison d'un conflit d'espace de nom entre l'en-tte standard /usr/include/crypt.h et les fichiers d'en-tte fournis
par OpenSSL.
La mise jour de l'installation d'OpenSSL vers la version 0.9.6a rsout ce problme. Solaris 9 et suprieurs ont une version plus
rcente d'OpenSSL.
302
16.1.1. Pr-requis
Les outils supplmentaires suivants sont requis pour construire PostgreSQL. Utilisez le fichier config.pl pour indiquer les
rpertoires o se trouvent les bibliothques.
Microsoft Platform SDK
Il est recommand de mettre jour avec la dernire version supporte du Microsoft Platform SDK (actuellement la version
7.0), tlchargeable sur http://www.microsoft.com/downloads/.
Vous devez toujours inclure la partie Windows Headers and Libraries du SDK. Si vous installez le Platform SDK incluant
les compilateurs (Visual C++ Compilers), vous n'avez pas de Visual Studio.
ActiveState Perl
ActiveState Perl est requis pour excuter les scripts de construction. Le Perl de MinGW et de Cygwin ne fonctionnera pas. Il
doit aussi tre prsent dans le PATH. Les binaires de cet outil sont tlchargeables partir de http://www.activestate.com
(Note : la version 5.8 ou ultrieure est requise, la distribution standard libre est suffisante).
Les produits suivants ne sont pas ncessaires pour commencer, mais sont requis pour installer la distribution complte. Utilisez le
fichier config.pl pour indiquer les rpertoires o sont places les bibliothques.
ActiveState TCL
Requis pour construire PL/TCL (Note : la version 8.4 est requise, la distribution standard libre est suffisante).
Bison et Flex
Bison et Flex sont requis pour construire partir d'une extraction du Git, mais ils ne sont pas ncessaires si vous utilisez une
version package. Notez que seul Bison 1.875 ou les versions 2.2 et ultrieures fonctionneront. De plus, Flex version 2.5.31
ou une version ultrieure est requise. Bison est tlchargeable partir de http://gnuwin32.sourceforge.net. Flex est disponible
sur http://www.postgresql.org/ftp/misc/winflex/.
Note
La distribution Bison de GnuWin32 a apparemment un bug qui cause des disfonctionnements de Bison lorsqu'il est install dans un rpertoire dont le nom contient des espaces, tels que l'emplacement par dfaut dans les
installations en Anglais : C:\Program Files\GnuWin32. Installez donc plutt dans C:\GnuWin32.
Diff
Diff est ncessaire pour excuter les tests de rgression, et peut tre tlcharg partir de http://gnuwin32.sourceforge.net.
Gettext
Gettext est requis pour construire le support NLS, et peut tre tlcharg partir de http://gnuwin32.sourceforge.net. Notez
que les binaires, dpendances et fichiers dveloppeurs sont tous ncessaires.
MIT Kerberos
Requis
pour
le
support
de
l'authentification
http://web.mit.edu/Kerberos/dist/index.html.
Kerberos.
MIT
Kerberos
est
tlchargeable
sur
libxml2 et libxslt
Requis pour le support du XML. Les binaires sont disponibles sur http://zlatkovic.com/pub/libxml et les sources sur
http://xmlsoft.org. Notez que libxml2 ncessite iconv, qui est disponible sur le mme site web.
openssl
Requis
pour
le
support
de
SSL.
Les
binaires
peuvent
tre
tlchargs
partir
de
http://www.slproweb.com/products/Win32OpenSSL.html alors que les sources sont disponibles sur http://www.openssl.org.
ossp-uuid
Requis pour le support d'UUID-OSSP (seulement en contrib). Les sources peuvent tre rcupres sur le site ossp.org.
Python
Requis pour la construction de PL/Python. Les binaires sont tlchargeables sur http://www.python.org.
zlib
304
16.1.3. Construction
Pour construire tout PostgreSQL dans la configuration par dfaut, excutez la commande :
build
build DEBUG
Pour construire un seul projet, par exemple psql, excutez les commandes :
build psql
build DEBUG psql
Pour modifier la configuration de construction par dfaut, placez ce qui suit dans le fichier buildenv.pl :
Il est aussi possible de construire partir de l'interface de Visual Studio. Dans ce cas, vous devez excuter :
perl mkvcbuild.pl
partir de l'invite, puis ouvrir le fichier pgsql.sln gnr (dans le rpertoire racine des sources) dans Visual Studio.
install c:\destination\directory
vcregress check
vcregress installcheck
vcregress plcheck
vcregress contribcheck
Pour modifier la planification utilise (en parallle par dfaut), ajoutez-la la ligne de commande, comme :
Pour plus d'informations sur les tests de rgression, voir Chapitre 30, Tests de rgression.
307
Astuce
Comme alternative l'option -d, vous pouvez initialiser la variable d'environnement pgdata.
Autrement, vous pouvez excuter initdb via le programme pg_ctl(1) ainsi :
$ pg_ctl -D /usr/local/pgsql/data initdb
C'est peut-tre plus intuitif si vous utilisez dj pg_ctl pour dmarrer et arrter le serveur (voir Section 17.3, Lancer le serveur
de bases de donnes pour les dtails). Un gros intrt est de ne connatre que cette seule commande pour grer l'instance du
serveur de bases de donnes.
initdb tentera de crer le rpertoire que vous avez spcifi si celui-ci n'existe pas dj. Il est possible qu'il n'ait pas le droit de le
faire (si vous avez suivi notre conseil et cr un compte sans droits). Dans ce cas, vous devez crer le rpertoire vous-mme (en
tant que root) et modifier le propritaire pour qu'il corresponde l'utilisateur PostgreSQL. Voici comment raliser ceci :
root# mkdir /usr/local/pgsql/data
root# chown postgres /usr/local/pgsql/data
root# su postgres
postgres$ initdb -D /usr/local/pgsql/data
initdb refusera de s'excuter si le rpertoire des donnes semble tre dj initialis.
308
Comme le rpertoire des donnes contient toutes les donnes stockes par le systme de bases de donnes, il est essentiel qu'il soit
scuris par rapport des accs non autoriss. Du coup, initdb supprimera les droits d'accs tout le monde sauf l'utilisateur PostgreSQL.
Nanmoins, bien que le contenu du rpertoire soit scuris, la configuration d'authentification du client par dfaut permet tout
utilisateur local de se connecter la base de donnes et mme devenir le super-utilisateur de la base de donnes. Si vous ne faites
pas confiance aux utilisateurs locaux, nous vous recommandons d'utiliser une des options -w ou --pwprompt de la commande
initdb pour affecter un mot de passe au super-utilisateur de la base de donnes . De plus, spcifiez -a md5 ou -a
mot_de_passe de faon ce que la mthode d'authentification trust par dfaut ne soit pas utilise ; ou modifiez le fichier
pg_hba.conf gnr aprs l'excution d'initdb (d'autres approches raisonnables incluent l'utilisation de l'authentification peer
ou les droits du systme de fichiers pour restreindre les connexions. Voir le Chapitre 19, Authentification du client pour plus
d'informations).
initdb initialise aussi la locale par dfaut du groupe de bases de donnes. Normalement, elle prends seulement le paramtrage local dans l'environnement et l'applique la base de donnes initialise. Il est possible de spcifier une locale diffrente pour la base
de donnes ; la Section 22.1, Support des locales propose plus d'informations l-dessus. L'ordre de tri utilis par dfaut pour ce
cluster de bases de donnes est initialis par initdb et, bien que vous pouvez crer de nouvelles bases de donnes en utilisant des
ordres de tris diffrents, l'ordre utilis dans les bases de donnes modle que initdb a cr ne peut pas tre modifi sans les supprimer et les re-crer. Cela a aussi un impact sur les performances pour l'utilisation de locales autres que c ou posix. Du coup, il est
important de faire ce choix correctement la premire fois.
initdb configure aussi le codage par dfaut de l'ensemble de caractres pour le groupe de bases de donnes. Normalement, cela
doit tre choisi pour correspondre au paramtrage de la locale. Pour les dtails, voir la Section 22.3, Support des jeux de caractres .
tique sont spcifiques au systme d'exploitation. Certains sont distribus avec PostgreSQL dans le rpertoire contrib/
start-scripts. En installer un demandera les droits de root.
Diffrents systmes ont diffrentes conventions pour lancer les dmons au dmarrage. La plupart des systmes ont un fichier /
etc/rc.local ou /etc/rc.d/rc.local. D'autres utilisent les rpertoires init.d ou rc.d. Quoi que vous fassiez, le
serveur doit tre excut par le compte utilisateur PostgreSQL et non pas par root ou tout autre utilisateur. Donc, vous devriez
probablement former vos commandes en utilisant su postgres -c '...' . Par exemple :
su postgres -c 'pg_ctl start -D /usr/local/pgsql/data -l serverlog'
Voici quelques suggestions supplmentaires par systme d'exploitation (dans chaque cas, assurez-vous d'utiliser le bon rpertoire
d'installation et le bon nom de l'utilisateur o nous montrons des valeurs gnriques).
Sur netbsd, vous pouvez utiliser les scripts de lancement de freebsd ou de linux suivant vos prfrences.
Tant que le serveur est lanc, son pid est stock dans le fichier postmaster.pid du rpertoire de donnes. C'est utilis pour
empcher plusieurs instances du serveur d'tre excutes dans le mme rpertoire de donnes et peut aussi tre utilis pour arrter
le processus le serveur.
ment que PostgreSQL essaie de crer (4011376640 octets dans cet exemple). Ou il pourrait signifier que vous n'avez pas du tout
configur le support de la mmoire partage de type System-V dans votre noyau. Comme contournement temporaire, vous pouvez
essayer de lancer le serveur avec un nombre de tampons plus petit que la normale (shared_buffers). ventuellement, vous pouvez
reconfigurer votre noyau pour accrotre la taille de mmoire partage autorise. Vous pourriez voir aussi ce message en essayant
d'excuter plusieurs serveurs sur la mme machine si le total de l'espace qu'ils requirent dpasse la limite du noyau.
Une erreur du type
FATAL: could not create semaphores: No space left on device
DETAIL: Failed system call was semget(5440126, 17, 03600).
ne signifie pas qu'il vous manque de l'espace disque. Elle signifie que la limite de votre noyau sur le nombre de smaphores system v est infrieure au nombre que PostgreSQL veut crer. Comme ci-dessus, vous pouvez contourner le problme en lanant
le serveur avec un nombre rduit de connexions autorises (max_connections) mais vous voudrez ventuellement augmenter la limite du noyau.
Si vous obtenez une erreur illegal system call , il est probable que la mmoire partage ou les smaphores ne sont pas du tout
supports par votre noyau. Dans ce cas, votre seule option est de reconfigurer le noyau pour activer ces fonctionnalits.
Des dtails sur la configuration des capacits ipc System V sont donns dans la Section 17.4.1, Mmoire partage et smaphore .
adquats du noyau sont nomms de faon cohrente parmi les diffrents systmes ; le Tableau 17.1, Paramtres system v
ipc donne un aperu. Nanmoins, les mthodes pour les obtenir varient. Les suggestions pour quelques plateformes sont donnes
ci-dessous.
Tableau 17.1. Paramtres system v ipc
Nom
Description
Valeurs raisonnables
shmmax
shmmin
shmall
shmseg
nombre maximum de segments de mmoire partage par pro- seul un segment est ncessaire mais la valeur par
cessus
dfaut est bien plus importante
shmmni
nombre maximum de segments de mmoire partage pour tout comme shmseg plus la place pour les autres aple systme
plications
semmni
semmns
ceil((max_connections
+
autovacuum_max_workers = 4) / 16) * 17
plus la place pour les autres applications
semmsl
au moins 17
semmap
voir le texte
semvmx
le paramtre de mmoire partag le plus important est shmmax, la taille maximum, en octets, d'un segment de mmoire partage.
Si vous obtenez un message d'erreur partir de shmget comme invalid argument , il est possible que cette limite soit dpasse. La taille du segment de mmoire partage requis dpend de plusieurs paramtres de configuration de PostgreSQL, comme
indiqu dans le Tableau 17.2, Usage de la mmoire partage PostgreSQL (tout message d'erreur obtenu incluera la taille
exacte utilise dans la requte d'allocation qui a chou). Temporairement, vous pouvez baisser certains de ces paramtres pour
viter un chec. Alors qu'il est possible d'obtenir de PostgreSQL qu'il fonctionne avec un shmmax de 2 Mo, vous avez besoin
de bien plus pour obtenir des performances acceptables. Les paramtrages dsirables sont plutt de l'ordre de centaines de Mo
quelques Go.
Certains systmes ont aussi une limite sur le nombre total de mmoire partage dans le systme (shmall). Assurez-vous que cela
soit suffisamment important pour PostgreSQL et quelque autres applications utilisant des segments de mmoire partage (notez
que shmall est mesur en pages plutt qu'en octets sur beaucoup de systmes).
La taille minimum des segments de mmoire partage (shmmin) est moins sensible aux problmes. Elle devrait tre au plus environ 500 Ko pour PostgreSQL (il est habituellement 1). Le nombre maximum de segments au travers du systme (shmmni)
ou par processus (shmseg) a peu de chances de causer un problme sauf s'ils sont configurs zro sur votre systme.
PostgreSQL utilise un smaphore par connexion autorise (max_connections) et par processus autovacuum autoris (autovacuum_max_workers), le tout par ensemble de 16. Chacun de ces ensembles contiendra aussi un 17 smaphore qui contient un
nombre magique pour dtecter la collision avec des ensembles de smaphore utiliss par les autres applications. Le nombre
maximum de smaphores dans le systme est initialis par semmns, qui en consquence doit tre au moins aussi haut que
max_connections plus autovacuum_max_workers plus un extra de chacune des 16 connexions autorises et des processus autovacuum (voir la formule dans le Tableau 17.1, Paramtres system v ipc ). Le paramtre semmni dtermine la limite
sur le nombre d'ensembles de smaphores qui peuvent exister sur le systme un instant prcis. Donc, ce paramtre doit tre au
moins gal ceil((max_connections + autovacuum_max_workers + 4) / 16). Baisser le nombre de
connexions autorises est un contournement temporaire pour les checs qui sont habituellement indiqus par le message no
space left on device , partir de la fonction semget.
Dans certains cas, il pourrait tre ncessaire d'augmenter semmap pour tre au moins dans l'ordre de semmns. Ce paramtre dfinit la taille de la carte de ressources de smaphores, dans laquelle chaque bloc contig de smaphores disponibles ont besoin d'une
entre. Lorsqu'un ensemble de smaphores est libr ou qu'il est enregistr sous une nouvelle entre de carte. Si la carte est pleine,
les smaphores librs sont perdus (jusqu'au redmarrage). La fragmentation de l'espace des smaphores pourrait amener dans le
temps moins de smaphores disponibles.
La paramtre semmsl, qui dtermine le nombre de smaphores dans un ensemble, pourrait valoir au moins 17 pour
312
.
D'autres paramtres en relation avec l' annulation de smaphores , tels que semmnu et semume, n'affectent pas PostgreSQL.
AIX
partir de la version 5.1, il ne doit plus tre ncessaire de faire une configuration spciale pour les paramtres tels que SHMMAX, car c'est configur de faon ce que toute la mmoire puisse tre utilise en tant que mmoire partage. C'est le type de
configuration habituellement utilise pour d'autres bases de donnes comme DB/2.
Nanmoins, il pourrait tre ncessaire de modifier l'information globale ulimit dans /etc/security/limits car les limites en dur par dfaut pour les tailles de fichiers (fsize) et les nombres de fichiers (nofiles) pourraient tre trop bas.
bsd/os
Mmoire partage. Par dfaut, seulement 4 Mo de mmoire partage est supporte. Gardez en tte que la mmoire partage
n'est pas paginable ; elle est verrouille en RAM. Pour accrotre la mmoire partage supporte par votre systme, ajoutez ce
qui suit la configuration de votre noyau. Une valeur de 1024 pour shmall reprsente 4 mo de mmoire partage. Pour argumenter la mmoire partage supporte par votre systme, ajoutez quelque chose comme ceci votre configuration du
noyau :
options "SHMALL=8192"
options "SHMMAX=\(SHMALL*PAGE_SIZE\)"
shmall est mesur en pages de 4 Ko, donc une valeur de 1024 reprsente 4 Mo de mmoire partage. Du coup, la configuration ci-dessus augmente l'aire de mmoire partage 32 Mo. Pour ceux utilisant une version 4.3 ou ultrieure, vous aurez probablement besoin d'augmenter kernel_virtual_mb au-dessus de la valeur par dfaut, 248. Une fois tous les changements effectus, recompilez le noyau et redmarrez.
Smaphores. Vous voudrez probablement aussi augmenter le nombre de smaphores ; la somme totale par dfaut du systme
(60) n'autorisera seulement que 50 connexions PostgreSQL. Initialisez les valeurs que vous souhaitez dans le fichier de
configuration du noyau :
options "SEMMNI=40"
options "SEMMNS=240"
freebsd
Les paramtres par dfaut sont seulement acceptables pour de petites installations (par exemple, la valeur par dfaut de shmmax est de 32 mo). Les modifications se font via les interfaces sysctl ou loader. Les paramtres suivants peuvent tre configurs en utilisant sysctl :
$ sysctl -w kern.ipc.shmall=32768
$ sysctl -w kern.ipc.shmmax=134217728
$ sysctl -w kern.ipc.semmap=256
Pour que ces paramtres persistent aprs les redmarrages, modifiez /etc/sysctl.conf.
Les paramtres restant, concernant les smaphores, sont en lecture seule en ce qui concerne sysctl mais peuvent tre modifis
avant le redmarrage en utilisant l'invite loader :
(loader) set kern.ipc.semmni=256
(loader) set kern.ipc.semmns=512
(loader) set kern.ipc.semmnu=256
De faon similaire, ils peuvent tre sauvegards entre les redmarrages dans /boot/loader.conf.
Vous pourriez aussi vouloir configurer votre noyau pour verrouiller la mmoire partage en RAM et l'empcher d'tre envoy
dans la swap. Ceci s'accomplit en utilisant le paramtre kern.ipc.shm_use_phys de sysctl.
En cas d'excution dans une cage FreeBSD en activant security.jail.sysvipc_allowed de sysctl, les postmaster
excuts dans diffrentes cages devront tre excuts par diffrents utilisateurs du systme d'exploitation. Ceci amliore la scurit car cela empche les utilisateurs non root d'interfrer avec la mmoire partage ou les smaphores d'une cage diffrente
et cela permet au code de nettoyage des IPC PostgreSQL de fonctionner correctement (dans FreeBSD 6.0 et ultrieurs, le code
de nettoyage IPC ne dtecte pas proprement les processus des autres cages, empchant les postmaster en cours d'excution
d'utiliser le mme port dans diffrentes cages).
Les FreeBSD, avant la 4.0, fonctionnent comme OpenBSD (voir ci-dessous).
NetBSD
Avec NetBSD 5.0 et ultrieur, les paramtres IPC peuvent tre ajusts en utilisant sysctl. Par exemple :
313
$ sysctl -w kern.ipc.shmmax=16777216
Pour que ce paramtrage persiste aprs un redmarrage, modifiez le fichier /etc/sysctl.conf.
Vous pourriez aussi vouloir configurer votre noyau pour verrouiller la mmoire partage en RAM et l'empcher d'tre mise
dans le swap. Cela peut se faire en utilisant le paramtre kern.ipc.shm_use_phys de sysctl.
Les versions de NetBSD antrieures la 5.0 fonctionnent comme OpenBSD (voir ci-dessous), sauf que les paramtres
doivent tre configurs avec le mot cl options, et non pas option.
OpenBSD
Les options sysvshm et sysvsem doivent tre actives la compilation du noyau (ils le sont par dfaut). La taille maximum de mmoire partage est dtermine par l'option shmmaxpgs (en pages). Ce qui suit montre un exemple de
l'initialisation des diffrents paramtres :
option
option
option
SYSVSHM
SHMMAXPGS=4096
SHMSEG=256
option
option
option
option
option
SYSVSEM
SEMMNI=256
SEMMNS=512
SEMMNU=256
SEMMAP=256
Vous pourriez aussi vouloir configurer votre noyau pour verrouiller la mmoire partage en RAM et l'empcher d'tre pagine
en swap. Ceci se fait en utilisant le paramtre kern.ipc.shm_use_phys de sysctl.
hp-ux
Les paramtres par dfaut tendent suffire pour des installations normales. Sur hp-ux 10, la valeur par dfaut de semmns
est 128, qui pourrait tre trop basse pour de gros sites de bases de donnes.
Les paramtres ipc peuvent tre initialiss dans system administration manager (sam) sous kernel configuration configurable Parameters. Allez sur create a new kernel une fois termine.
linux
La taille maximale du segment par dfaut est de 32 Mo, ce qui n'est adquat que pour les trs petites installations de PostgreSQL. La taille totale maximale par dfaut est de 2097152 pages. Une page quivaut pratiquement toujours 4096 octets sauf
pour certaines configurations inhabituelles du noyau comme huge pages (utilisez getconf PAGE_SIZE pour vrifier).
Cela donne une limite par dfaut de 8 Go, ce qui est souvent suffisant.
La configuration de la taille de mmoire partage peut tre modifie avec l'interface propose par la commande sysctl. Par
exemple, pour permettre l'utilisation de 16 Go :
$ sysctl -w kernel.shmmax=17179869184
$ sysctl -w kernel.shmall=4194304
De plus, ces paramtres peuvent tre prservs entre des redmarrages dans le fichier /etc/sysctl.conf. Il est recommand de le faire.
Les anciennes distributions pourraient ne pas avoir le programme sysctl mais des modifications quivalentes peuvent se faire
en manipulant le systme de fichiers /proc :
$ echo 17179869184 >/proc/sys/kernel/shmmax
$ echo 4194304 >/proc/sys/kernel/shmall
Les valeurs par dfaut restantes sont tailles de faon assez gnreuses pour ne pas ncessiter de modifications.
Mac OS X
La mthode recommande pour configurer la mmoire partage sous OS X est de crer un fichier nomm /
etc/sysctl.conf contenant des affectations de variables comme :
kern.sysv.shmmax=4194304
kern.sysv.shmmin=1
kern.sysv.shmmni=32
kern.sysv.shmseg=8
kern.sysv.shmall=1024
314
Notez que, dans certaines versions d'OS X, les cinq paramtres de mmoire partage doivent tre configurs dans /
etc/sysctl.conf, sinon les valeurs seront ignores.
Attention au fait que les versions rcentes d'OS X ignorent les tentatives de configuration de SHMMAX une valeur qui n'est
pas un multiple exact de 4096.
SHMALL est mesur en page de 4 Ko sur cette plateforme.
Dans les anciennes versions d'OS X, vous aurez besoin de redmarrer pour que les modifications de la mmoire partage
soient prises en considration. partir de la version 10.5, il est possible de tous les modifier en ligne sauf SHMMNI, grce
sysctl. Mais il est toujours prfrable de configurer vos valeurs prfres dans /etc/sysctl.conf, pour que les nouvelles
valeurs soient conserves aprs un redmarrage.
Le fichier /etc/sysctl.conf est seulement honor partir de la version 1.0.3.9 de OS X. Si vous utilisez une version
antrieure, vous devez modifier le fichier /etc/rc et changer les valeurs dans les commandes suivantes :
sysctl
sysctl
sysctl
sysctl
sysctl
-w
-w
-w
-w
-w
kern.sysv.shmmax
kern.sysv.shmmin
kern.sysv.shmmni
kern.sysv.shmseg
kern.sysv.shmall
Notez que /etc/rc est habituellement cras lors de mises jour systmes d'OS X, donc vous devez vous attendre les
modifier manuellement aprs chaque mise jour.
En
10.2
et
avant
cette
version,
modifiez
ces
commandes
tem/Library/StartupItems/SystemTuning/SystemTuning.
dans
le
fichier
/Sys-
sco openserver
Dans la configuration par dfaut, seuls 512 Ko de mmoire partage par segment est autoris. Pour augmenter ce paramtrage, allez tout d'abord dans le rpertoire /etc/conf/cf.d. Pour afficher la valeur courante de shmmax, lancez :
./configure -y SHMMAX
Pour configurer une nouvelle valeur de shmmax, lancez :
./configure SHMMAX=valeur
o value est la nouvelle valeur que vous voulez utiliser (en octets). Aprs avoir configur shmmax, reconstruisez le noyau :
./link_unix
et redmarrez.
solaris 2.6 2.9 (Solaris 6 Solaris 9)
La taille maximale par dfaut d'un segment de mmoire partage est trop bas pour PostgreSQL. La configuration est modifiable dans /etc/system, par exemple :
set
set
set
set
shmsys:shminfo_shmmax=0x2000000
shmsys:shminfo_shmmin=1
shmsys:shminfo_shmmni=256
shmsys:shminfo_shmseg=256
set
set
set
set
semsys:seminfo_semmap=256
semsys:seminfo_semmni=512
semsys:seminfo_semmns=512
semsys:seminfo_semmsl=32
Vous
avez
besoin
de
redmarrer
pour
que
les
modifications
prennent
effet.
Voir
aussi
http://sunsite.uakom.sk/sunworldonline/swol-09-1997/swol-09-insidesolaris.html pour des informations sur la configuration
de la mmoire partage sur des versions plus anciennes de Solaris.
Solaris 2.10 (Solaris 10), OpenSolaris
Dans Solaris 10 et OpenSolaris, la configuration de la mmoire partage et des smaphores par dfaut sont suffisamment
bonnes pour la majorit des configurations de PostgreSQL. La valeur par dfaut de Solaris pour SHMMAX correspond maintenant un quart de la mmoire disponible sur le systme. Si vous avez besoin d'augmenter cette configuration pour obtenir
un paramtrage lgrement suprieur, vous devez utiliser une configuration de projet associ l'utilisateur postgres. Par
exemple, excutez ce qui suit en tant qu'utilisateur root :
315
Usage
Connexions
Processus
travailleurs
l'autovacuum
Transactions prpares
Tampons WAL
(wal_block_size + 8) * wal_buffers
770 kB
:openfiles-cur=256:\
...
(-cur est la limite douce. Ajoutez -max pour configurer la limite dure.)
Les noyaux peuvent aussi avoir des limites sur le systme complet pour certaines ressources.
Sur linux, /proc/sys/fs/file-max dtermine le nombre maximum de fichiers ouverts que le noyau supportera. Ce
nombre est modifiable en crivant un autre nombre dans le fichier ou en ajoutant une affectation dans /etc/sysctl.conf.
La limite des fichiers par processus est fixe lors de la compilation du noyau ; voir /
usr/src/linux/documentation/proc.txt pour plus d'informations.
Le serveur PostgreSQL utilise un processus par connexion de faon ce que vous puissiez fournir au moins autant de processus
que de connexions autorises, en plus de ce dont vous avez besoin pour le reste de votre systme. Ceci n'est habituellement pas un
problme mais si vous excutez plusieurs serveurs sur une seule machine, cela pourrait devenir troit.
La limite par dfaut des fichiers ouverts est souvent initialise pour tre amicalement sociale , pour permettre de nombreux
utilisateurs de coexister sur une machine sans utiliser une fraction inapproprie des ressources du systme. Si vous lancez un grand
nombre de serveurs sur une machine, cela pourrait tre quelque chose que vous souhaitez mais sur les serveurs ddis, vous pourriez vouloir augmenter cette limite.
D'un autre ct, certains systmes autorisent l'ouverture d'un grand nombre de fichiers des processus individuels ; si un plus
grand nombre le font, alors les limites du systme peuvent facilement tre dpasses. Si vous rencontrez ce cas et que vous ne
voulez pas modifier la limite du systme, vous pouvez initialiser le paramtre de configuration max_files_per_process de PostgreSQL pour limiter la consommation de fichiers ouverts.
endroit o placer ce code. Si vous le faites, vous pourriez aussi souhaiter construire PostgreSQL avec l'option -DLINUX_OOM_ADJ=0 ajoute CPPFLAGS. Cela fera en sorte que les processus enfants de postmaster seront excuts avec la valeur oom_adj normale de zro, pour que OOM puisse les cibler si ncessaire.
Note
Quelques noyaux 2.4 de vendeurs ont des pr-versions de l'overcommit du 2.6. Nanmoins, configurer
vm.overcommit_memory 2 sur un noyau 2.4 qui n'a pas le code correspondant rendra les choses pires
qu'elles n'taient. Il est recommand d'inspecter le code source du noyau (voir la fonction vm_enough_memory
dans le fichier mm/mmap.c) pour vrifier ce qui est support dans votre noyau avant d'essayer ceci avec une installation 2.4. La prsence du fichier de documentation overcommit-accounting ne devrait pas tre pris
comme une preuve de la prsence de cette fonctionnalit. En cas de doute, consultez un expert du noyau ou le vendeur de votre noyau.
Important
Il vaux mieux de ne pas utiliser sigkill pour arrter le serveur. Le faire empchera le serveur de librer la mmoire partage et les smaphores, ce qui pourrait devoir tre fait manuellement avant qu'un nouveau serveur ne soit
lanc. De plus, SIGKILL tue le processus postgres sans que celui-ci ait le temps de relayer ce signal ses sousprocessus, donc il sera aussi ncessaire de tuer les sous-processus individuels la main.
Pour terminer une session individuelle tout en permettant aux autres de continuer, utilisez pg_terminate_backend() (voir
Tableau 9.55, Fonctions d'envoi de signal au serveur ) ou envoyez un signal SIGTERM au processus fils associ cette session.
la deuxime version mineure de la 8.4. Les versions mineures ne modifient jamais le format de stockage interne et sont donc compatibles avec les versions antrieures et ultrieures de la mme version majeure. Par exemple, le format 8.4.2 est compatible avec
le format des versions 8.4, 8.4.1 et 8.4.6. Pour mettre jour entre des versions compatibles, vous devez simplement remplacer les
binaires une fois le serveur arrt, puis redmarrer le serveur. Le rpertoire des donnes ne doit pas tre modifi. Les mises jour
de versions mineures sont aussi simples que a.
Pour les versions majeures de PostgreSQL, le format de stockage interne des donnes est sujet modification, ce qui complique
les mises jour. La mthode traditionnelle de migration des donnes vers une nouvelle version majeure est de sauvegarder puis recharger la base de donnes. D'autres mthodes sont disponibles, ce qui est expliqu ci-dessous.
De plus, les nouvelles versions majeures introduisent gnralement des incompatibilits qui impactent les utilisateurs. Du coup,
des modifications peuvent tre ncessaires sur les applications clientes. Tous les changements visibles par les utilisateurs sont lists dans les notes de version (Annexe E, Notes de version). Soyez particulirement attentif la section Migration. Si vous mettez
jour en passant plusieurs versions majeures, assurez-vous de lire les notes de version de chaque version majeure que vous passez.
Les utilisateurs prcautionneux testeront leur applications clientes sur la nouvelle version avant de basculer compltement. Du
coup, il est souvent intressant de mettre en place des installations parallles des ancienne et nouvelle versions. Lors d'un test
d'une mise jour majeure de PostgreSQL, pensez aux diffrentes catgories suivantes :
Administration
Les fonctionnalits disponibles pour les administrateurs pour surveiller et contrler le serveur s'amliorent frquemment
chaque nouvelle version.
SQL
Cela inclut gnralement les nouvelles commandes ou clauses SQL, et non pas des changements de comportement sauf si
c'est spcifiquement prcis dans les notes de version.
API
Les bibliothques comme libpq se voient seulement ajouter de nouvelles fonctionnalits, sauf encore une fois si le contraire
est mentionn dans les notes de version.
Catalogues systmes
Les modifications dans les catalogues systmes affectent seulement les outils de gestion des bases de donnes.
API serveur pour le langage C
Ceci implique des modifications dans l'API des fonctions du moteur qui est crit en C. De telles modifications affectent le
code qui fait rfrence des fonctions du moteur.
Si vous faites une sauvegarde, assurez-vous que votre base de donnes n'est pas en cours de modification. Cela n'affectera pas
l'intgrit de la sauvegarde mais les donnes modifies ne seront videmment pas incluses. Si ncessaire, modifiez les droits
dans le fichier /usr/local/pgsql/data/pg_hba.conf (ou quivalent) pour interdire l'accs tout le monde sauf
vous. Voir Chapitre 19, Authentification du client pour plus d'informations sur le contrle des accs.
Pour sauvegarder votre installation, excutez la commande suivante :
pg_dumpall > fichier_en_sortie
Si vous devez conserver les OID (parce que vous les utilisez en tant que cls trangres, par exemple), utilisez l'option -o
lors de l'excution de pg_dumpall.
Pour faire la sauvegarde, vous pouvez utiliser la commande pg_dumpall de la version en cours d'excution. Nanmoins, pour
de meilleurs rsultats, essayez d'utiliser la commande pg_dumpall provenant de la version 9.1.14 de PostgreSQL, car cette
319
version contient des corrections de bugs et des amliorations par rapport aux anciennes version. Bien que ce conseil peut
sembler tonnant, tant donn que vous n'avez pas encore t la nouvelle version, il est conseill de le suivre si vous souhaitez installer la nouvelle version en parallle de l'ancienne. Dans ce cas, vous pouvez terminer l'installation normalement et
transfrer les donnes plus tard. Cela diminuera aussi le temps d'immobilisation.
2.
3.
Lors de la restauration de la sauvegarde, renommez ou supprimez l'ancien rpertoire d'installation. Il est prfrable de le renommer car, en cas de problme, vous pourrez le rcuprer. Garder en tte que le rpertoire peut prendre beaucoup d'espace
disque. Pour renommer le rpertoire, utilisez une commande comme celle-ci :
mv /usr/local/pgsql /usr/local/pgsql.old
(Assurez-vous de dplacer le rpertoire en un seul coup, pour que les chemins relatifs restent inchangs.)
4.
Installez la nouvelle version de PostgreSQL comme indiqu dans la section suivante Section 15.4, Procdure
d'installation .
5.
Crez une nouvelle instance de bases de donnes si ncessaire. Rappelez-vous que vous devez excuter ces commandes une
fois connect en tant que l'utilisateur de bases de donnes (que vous devez dj avoir si vous faites une mise jour).
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
6.
7.
Dmarrez le serveur de bases de donnes, en utilisant encore une fois l'utilisateur de bases de donnes :
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
8.
Il est possible de parvenir une immobilisation moins longue en installant le nouveau serveur dans un autre rpertoire et en excutant l'ancien et le nouveau serveur, en parallle, sur des ports diffrents. Vous pouvez ensuite utiliser quelque chose comme :
pg_dumpall -p 5432 | psql -d postgres -p 5433
pour transfrer vos donnes.
320
321
Note
Il est possible d'avoir une authentification sans le chiffrement en utilisant les algorithmes NULL-SHA ou NULLMD5. Nanmoins, une attaque du type man-in-the-middle pourrait lire et passer les communications entre client et
serveur. De plus, le temps pris par le chiffrement est minimal compar celui pris par l'authentification. Pour ces
raisons, les algorithmes NULL ne sont pas recommands.
Pour dmarrer le mode SSL, les fichiers server.crt et server.key doivent exister dans le rpertoire de donnes du serveur.
Ces fichiers doivent contenir, respectivement, le certificat et la cl prive du serveur. Sur les systmes Unix, les droits de server.key doivent interdire l'accs au groupe et au reste du monde ; cela se fait avec la commande chmod 0600 server.key. Si la
cl prive est protge par une phrase de passe, le serveur la demandera et ne se lancera pas tant qu'elle n'aura pas t saisie.
Dans certains cas, le certificat du serveur peut tre sign par une autorit intermdiaire de certificats, plutt que par un qui soit
directement de confiance par les clients. Pour utiliser un tel certificat, ajoutez le certificat de l'autorit signataire au fichier server.crt, puis le certificat de l'autorit parente, et ainsi de suite jusqu' l'autorit racine qui est accepte par les clients. Le certificat racine doit tre inclus dans chaque cas o server.crt contient plus d'un certificat.
des clients. En principe, il n'a pas besoin de lister l'autorit de certificats qui a sign le certificat du serveur bien que dans la plupart des cas, cette autorit sera aussi de confiance pour les certificats de clients.
Si vous configurez les certificats de clients, vous pouvez utiliser la mthode d'authentification cert, de faon ce que les certificats soient aussi utiliss pour contrler l'authentification de l'utilisateur, tout en fournissant une scurit de connexion. Voir Section 19.3.10, Authentification de certificat pour les dtails.
Fichier
Contenu
Effet
$PGDATA/server.crt
certificat du serveur
$PGDATA/server.key
cl prive du serveur
$PGDATA/root.crt
$PGDATA/root.crl
certificats rvoqus par les autorits de le certificat du client ne doit pas tre sur
confiance
cette liste
Les fichiers server.key, server.crt, root.crt et root.crl sont seulement examins au dmarrage du serveur ; donc
vous devez dmarrer le serveur pour que les changements prennent effet.
ceci fournit une connexion rseau scurise, y compris pour les clients non SSL.
Tout d'abord, assurez-vous qu'un serveur ssh est en cours d'excution sur la mme machine que le serveur PostgreSQL et que
vous pouvez vous connecter via ssh en tant qu'un utilisateur quelconque. Ensuite, vous pouvez tablir un tunnel scuris avec une
commande comme ceci sur la machine cliente :
ssh -L 63333:localhost:5432 joe@foo.com
Le premier numro de l'argument -l, 63333, est le numro de port de votre bout du tunnel ; il peut tre choisi parmi tous les ports
non utiliss. (IANA rserve les ports 49152 65535 pour une utilisation prive.) Le second numro, 5432, est le bout distant du
tunnel : le numro de port que votre serveur utilise. Le nom ou l'adresse entre les numros de port est l'hte disposant du serveur
de bases de donnes auquel vous souhaitez vous connecter, comme vu partir de l'hte o vous vous connectez, qui est foo.com
dans cet exemple. Pour vous connecter au serveur en utilisant ce tunnel, vous vous connectez au port 63333 de la machine locale :
psql -h localhost -p 63333 postgres
Sur le serveur de bases de donnes, il semblera que vous tes rellement l'utilisateur joe sur l'hte foo.com en vous connectant
localhost dans ce contexte, et il utilisera la procdure d'authentification configure pour les connexions de cet utilisateur et
de cet hte. Notez que le serveur ne pensera pas que la connexion est chiffre avec SSL car, en effet, elle n'est pas chiffre entre le
serveur SSH et le serveur PostgreSQL. Cela ne devrait pas poser un risque de scurit supplmentaire si les deux serveurs sont
sur la mme machine.
Pour russir la configuration du tunnel, vous devez tre autoris pour vous connecter via ssh sur joe@foo.com, comme si vous
aviez tent d'utiliser ssh pour crer une session de terminal.
Vous pouvez aussi configurer la translation de port de cette faon :
ssh -L 63333:foo.com:5432 joe@foo.com
mais alors le serveur de la base de donnes verra la connexion venir de son interface foo.com qui n'est pas ouverte par son paramtrage par dfaut listen_addresses = 'localhost'. Ceci n'est pas habituellement ce que vous tes.
Si vous devez vous connecter au serveur de bases de donnes via un hte de connexion, une configuration possible serait :
ssh -L 63333:db.foo.com:5432 joe@shell.foo.com
Notez que de cette faon la connexion de shell.foo.com db.foo.com ne sera pas chiffre par le tunnel SSH. SSH offre
un certain nombre de possibilits de configuration quand le rseau est restreint. Merci de vous rfrer la documentation de SSH
pour les dtails.
Astuce
Plusieurs autres applications existantes peuvent fournir des tunnels scuriss en utilisant une procdure similaire
dans le concept celle que nous venons de dcrire.
324
Configuration du serveur
(Cela fonctionne pour toute application client fonde sur libpq, et non pas seulement pour psql.) Cela ne fonctionne pas pour les
paramtres fixs au dmarrage du serveur ou qui doivent tre prciss dans postgresql.conf.
De plus, il est possible d'affecter un ensemble de paramtres un utilisateur ou une base de donnes. Quand une session est lance, les paramtres par dfaut de l'utilisateur et de la base de donnes impliqus sont chargs. Les commandes ALTER ROLE(7)
et ALTER DATABASE(7) sont respectivement utilises pour configurer ces paramtres. Les paramtres par base de donnes surchargent ceux passs sur la ligne de commande de postgres ou du fichier de configuration et sont leur tour surchargs par ceux
de l'utilisateur ; les deux sont surchargs par les paramtres de session.
Quelques paramtres peuvent tre modifis dans les sessions SQL individuelles avec la commande SET(7), par exemple :
SET ENABLE_SEQSCAN TO OFF;
Si SET est autoris, il surcharge toutes les autres sources de valeurs pour le paramtre. Quelques paramtres ne peuvent pas tre
changs via SET : s'ils contrlent un comportement qui ne peut pas tre modifi sans relancer le serveur PostgreSQL, par
exemple. De plus, quelques paramtres peuvent tre modifis via SET ou ALTER par les superutilisateurs.
La commande SHOW(7) permet d'inspecter les valeurs courantes de tous les paramtres.
La table virtuelle pg_settings autorise aussi l'affichage et la mise jour de paramtres de session l'excution ; voir Section 45.62,
pg_settings pour les dtails et une description des diffrents types de variable et de comment ils peuvent tre changs.
pg_settings est quivalente SHOW et SET mais peut tre plus facile utiliser parce qu'elle peut tre jointe avec d'autres tables
et que ses lignes peuvent tre slectionnes en utilisant des conditions personnalises. Elle contient aussi davantage d'informations
sur les valeurs autorises pour les paramtres.
Configuration du serveur
config_file, hba_file et/ou ident_file. config_file ne peut tre indiqu que sur la ligne de commande de
postgres mais les autres peuvent tre placs dans le fichier de configuration principal. Si les trois paramtres et data_directory sont configurs explicitement, alors il n'est pas ncessaire d'indiquer -D ou PGDATA.
Lors de la configuration de ces paramtres, un chemin relatif est interprt d'aprs le rpertoire d'o est lanc postgres.
Configuration du serveur
unix_socket_permissions (integer)
Configure les droits d'accs au socket de domaine Unix. Ce socket utilise l'ensemble habituel des droits du systme de fichiers
Unix. Ce paramtre doit tre indiqu sous une forme numrique telle qu'accepte par les appels systme chmod et umask
(pour utiliser le format octal, ce nombre doit commencer avec un 0 (zro)).
Les droits par dfaut sont 0777, signifiant que tout le monde peut se connecter. Les alternatives raisonnables sont 0770
(utilisateur et groupe uniquement, voir aussi unix_socket_group) et 0700 (utilisateur uniquement) (pour un socket de
domaine Unix, seul le droit d'accs en criture importe ; il n'est donc pas ncessaire de donner ou de rvoquer les droits de
lecture ou d'excution).
Ce mcanisme de contrle d'accs est indpendant de celui dcrit dans le Chapitre 19, Authentification du client.
Ce paramtre ne peut tre configur qu'au lancement du serveur.
Ce paramtre n'a aucun intrt sous Windows car ce systme n'a pas de sockets domaine Unix.
bonjour (boolean)
Active la promotion de l'existence du serveur via le protocole Bonjour. Dsactiv par dfaut, ce paramtre ne peut tre
configur qu'au lancement du serveur.
bonjour_name (string)
Indique le nom du service Bonjour. Le nom de l'ordinateur est utilis si ce paramtre est configur avec une chane vide (ce
qui est la valeur par dfaut). Ce paramtre est ignor si le serveur n'est pas compil avec le support Bonjour. Ce paramtre
ne peut tre configur qu'au lancement du serveur.
Ce paramtre n'a pas de sens sur certains systmes, notamment Solaris depuis la version 10, qui ignore compltement les
droits sur les sockets. Il est possible d'arriver au mme rsultat en faisant pointer unix_socket_directory vers un rpertoire ayant des droits limits pour une audience particulire. Ce paramtre est aussi inutile pour Windows qui ne dispose
pas des sockets de domaine Unix.
tcp_keepalives_idle (integer)
Indique le nombre de secondes avant l'envoi d'un paquet keepalive sur une connexion qui semble inutilise. Une valeur de 0
revient utiliser la valeur systme par dfaut. Ce paramtre est seulement support par les systmes qui supportent les symboles TCP_KEEPIDLE ou TCP_KEEPALIVE et sur Windows ; sur les autres systmes, ce paramtre doit valoir zro. Pour
les sessions connectes via une socket de domaine Unix, ce paramtre est ignor et vaut toujours zro.
Note
Sur Windows, une valeur de 0 configurera ce paramtre deux heures car Windows ne fournit pas un moyen
de lire la valeur par dfaut du systme.
tcp_keepalives_interval (integer)
Indique le nombre de secondes entre chaque envoi d'un paquet keepalives sur une connexion qui semble inutilise. Une valeur
de 0 revient utiliser la valeur systme par dfaut. Ce paramtre est seulement support par les systmes qui supportent le
symbole TCP_KEEPINTVL et sur Windows ; sur les autres systmes, ce paramtre doit valoir zro. Pour les sessions connectes via une socket de domaine Unix, ce paramtre est ignor et vaut toujours zro.
Note
Sur Windows, une valeur de 0 configurera ce paramtre une seconde car Windows ne fournit pas un moyen
de lire la valeur par dfaut du systme.
tcp_keepalives_count (integer)
Indique le nombre de paquets TCP keepalive packets envoyer sur une connexion qui semble inutilise. Une valeur de 0 revient utiliser la valeur systme par dfaut. Ce paramtre est seulement support par les systmes qui supportent le symbole
TCP_KEEPCNT ; sur les autres systmes, ce paramtre doit valoir zro. Pour les sessions connectes via une socket de domaine Unix, ce paramtre est ignor et vaut toujours zro.
Note
Ce paramtre n'est pas support sur Windows et doit donc valoir zro.
328
Configuration du serveur
Note
SSL libraries from before November 2009 are insecure when using SSL renegotiation, due to a vulnerability in
the SSL protocol. As a stop-gap fix for this vulnerability, some vendors shipped SSL libraries incapable of
doing renegotiation. If any such libraries are in use on the client or server, SSL renegotiation should be disabled.
password_encryption (boolean)
Ce paramtre dtermine si un mot de passe, indiqu dans CREATE USER(7) ou ALTER ROLE(7) sans qu'il soit prcis ENCRYPTED ou UNENCRYPTED, doit tre chiffr. Actif par dfaut (chiffre le mot de passe).
krb_server_keyfile (string)
Configure l'emplacement du fichier contenant la cl secrte du serveur Kerberos. Voir la Section 19.3.5, Authentification
Kerberos et la Section 19.3.3, Authentification GSSAPI pour les dtails. Ce paramtre ne peut tre configur que dans le
fichier postgresql.conf ou indiqu sur la ligne de commande.
krb_srvname (string)
Configure le nom du service Kerberos. Voir la Section 19.3.5, Authentification Kerberos pour les dtails. Ce paramtre ne
peut tre configur que dans le fichier postgresql.conf ou indiqu sur la ligne de commande.
krb_caseins_users (boolean)
Indique si les noms des utilisateurs Kerberos et GSSAPI doivent tre traits en respectant la casse. Dsactiv par dfaut
(insensible la casse, valeur off), Ce paramtre ne peut tre configur que dans le fichier postgresql.conf ou indiqu
sur la ligne de commande.
db_user_namespace (boolean)
Active les noms d'utilisateur par base de donnes. Dsactiv par dfaut, ce paramtre ne peut tre configur que dans le fichier postgresql.conf ou indiqu sur la ligne de commande.
Si ce paramtre est activ, les utilisateurs doivent tre crs sous la forme nomutilisateur@nom_base. Quand nomutilisateur est pass par un client se connectant, @ et le nom de la base de donnes sont ajouts au nom de l'utilisateur et
ce nom d'utilisateur spcifique la base est recherch par le serveur. Lorsque des utilisateurs dont le nom contient un @ sont
crs dans l'environnement SQL, ce nom doit tre plac entre guillemets.
db_user_namespace permet aux reprsentations des noms d'utilisateurs du client et du serveur de diffrer. Les vrifications sont toujours faites avec les noms d'utilisateurs du serveur, ce qui fait que les mthodes d'authentification doivent tre
configures pour le nom d'utilisateur du serveur, pas pour celui du client. Comme md5 utilise le nom d'utilisateur comme sel
la fois sur le client et le serveur, md5 ne peut pas tre utilis conjointement avec db_user_namespace.
329
Configuration du serveur
Ce paramtre activ, il reste possible de crer des utilisateurs globaux ordinaires. Il suffit pour cela d'ajouter @ au nom du
client, e.g. joe@. Le @ est supprim avant que le serveur ne recherche ce nom.
Note
Cette fonctionnalit, temporaire, sera supprime lorsqu'une solution complte sera trouve.
Configuration du serveur
Indique la quantit de mmoire que les oprations de tri interne et les tables de hachage peuvent utiliser avant de basculer sur
des fichiers disque temporaires. La valeur par dfaut est de 1 Mo. Pour une requte complexe, il peut y avoir plusieurs oprations de tri ou de hachage excutes en parallle ; chacune peut utiliser de la mmoire hauteur de cette valeur avant de commencer placer les donnes dans des fichiers temporaires. De plus, de nombreuses sessions peuvent excuter de telles oprations simultanment. La mmoire totale utilise peut, de ce fait, atteindre plusieurs fois la valeur de work_mem ; il est ncessaire de garder cela l'esprit lors du choix de cette valeur. Les oprations de tri sont utilises pour ORDER BY, DISTINCT et
les jointures de fusion. Les tables de hachage sont utilises dans les jointures de hachage, les agrgations et le traitement des
sous-requtes IN fonds sur le hachage.
maintenance_work_mem (integer)
Indique la quantit maximale de mmoire que peuvent utiliser les oprations de maintenance telles que VACUUM,
CREATE INDEX et ALTER TABLE ADD FOREIGN KEY. La valeur par dfaut est de 16 Mo. Puisque seule une de ces
oprations peut tre excute la fois dans une session et que, dans le cadre d'un fonctionnement normal, peu d'oprations de
ce genre sont excutes concurrentiellement sur une mme installation, il est possible d'initialiser cette variable une valeur
bien plus importante que work_mem. Une grande valeur peut amliorer les performances des oprations VACUUM et de la
restauration des sauvegardes.
Quand autovacuum fonctionne, un maximum de autovacuum_max_workers fois cette quantit de mmoire peut tre utilis. Il
convient donc de s'assurer de ne pas configurer la valeur par dfaut de faon trop importante.
max_stack_depth (integer)
Indique la profondeur maximale de la pile d'excution du serveur. La configuration idale pour ce paramtre est la limite
relle de la pile assure par le noyau (configure par ulimit -s ou quivalent local) laquelle est soustraite une marge de
scurit d'un Mo environ. La marge de scurit est ncessaire parce que la profondeur de la pile n'est pas vrifie dans chaque
routine du serveur mais uniquement dans les routines cls potentiellement rcursives telles que l'valuation d'une expression.
Le paramtrage par dfaut est de 2 Mo, valeur faible qui implique peu de risques. Nanmoins, elle peut s'avrer trop petite
pour autoriser l'excution de fonctions complexes. Seuls les superutilisateurs peuvent modifier ce paramtre.
Configurer ce paramtre une valeur plus importante que la limite relle du noyau signifie qu'une fonction rcursive peut occasionner un arrt brutal d'un processus serveur particulier. Sur les plateformes o PostgreSQL peut dterminer la limite du
noyau, il interdit de positionner cette variable une valeur inadquate. Nanmoins, toutes les plateformes ne fournissent pas
cette information, et une grande attention doit tre porte au choix de cette valeur.
Note
Sur un hte Windows, le prchargement d'une bibliothque au lancement du serveur ne rduit pas le temps ncessaire au lancement de chaque nouveau processus serveur ; chaque processus serveur recharge toutes les bi331
Configuration du serveur
bliothques dj charges. Nanmoins, shared_preload_libraries est toujours utile sur les htes
Windows car certaines bibliothques partages peuvent ncessiter des oprations qui ne peuvent avoir lieu
qu'au lancement du serveur (par exemple, une bibliothque partage peut rserver des verrous lgers ou de la
mmoire partage, ce qui ne peut tre fait une fois le serveur dmarr).
Si une bibliothque indique est introuvable, le dmarrage du serveur choue.
Chaque bibliothque supporte par PostgreSQL possde un bloc magique qui est vrifi pour garantir la compatibilit.
Pour cette raison, seules les bibliothques PostgreSQL peuvent tre charges de cette faon.
Note
Certaines oprations dtiennent des verrous critiques et doivent donc se terminer le plus vite possible. Les reports
de VACUUM en fonction du cot ne surviennent pas pendant ces oprations. De ce fait, il est possible que le cot
cumul soit bien plus important que la limite indique. Pour viter des dlais inutilement longs dans de tels cas, le
dlai rel est calcul de la faon suivante : vacuum_cost_delay * accumulated_balance / vacuum_cost_limit avec un maximum de vacuum_cost_delay * 4.
332
Configuration du serveur
Configuration du serveur
Voir aussi la Section 29.4, Configuration des journaux de transaction pour les dtails concernant l'optimisation des WAL.
18.5.1. Paramtres
wal_level (enum)
wal_level dtermine la quantit d'informations crite dans les journaux de transactions. La valeur par dfaut est
minimal, ce qui permet d'crire seulement les informations ncessaires pour survivre un arrt brutal ou un arrt immdiat. archive ajoute quelques enregistrements supplmentaires pour permettre l'archivage des journaux de transactions.
hot_standby en ajoute encore plus pour permettre l'excution de requtes en lecture seule sur le serveur en attente. Ce paramtre peut seulement tre configur au lancement du serveur.
Au niveau minimal, certains enregistrements dans les journaux de transactions peuvent tre vits, ce qui peut rendre ces
oprations plus rapides (voir Section 14.4.7, Dsactiver l'archivage des journaux de transactions et la rplication en flux ).
Les oprations concernes par cette optimisation incluent :
CREATE TABLE AS
CREATE INDEX
CLUSTER
COPY dans des tables qui ont t cres ou tronques dans la mme transaction
Mais, du coup, les journaux au niveau minimal ne contiennent pas suffisamment d'informations pour reconstruire les donnes
partir d'une sauvegarde de base et des journaux de transactions. Donc, les niveaux archive ou hot_standby doivent
tre utiliss pour activer l'archivage des journaux de transactions (archive_mode) et la rplication en flux.
Au niveau hot_standby, en plus des informations que trace dj le niveau archive, plus d'informations sont ncessaires
pour reconstruire le statut des transactions en cours partir du journal de transactions. Pour activer les requtes en lecture
seule sur un serveur en attente, wal_level doit tre configur hot_standby sur le serveur principal et hot_standby doit
tre activ sur le serveur en attente. Il existe une diffrence mesurable de performances entre l'utilisation des niveaux
hot_standby et archive, donc un retour d'exprience serait apprci si l'impact est ressenti en production.
fsync (boolean)
Si ce paramtre est activ, le serveur PostgreSQL tente de s'assurer que les mises jour sont crites physiquement sur le
disque l'aide d'appels systme fsync() ou de mthodes quivalentes (voir wal_sync_method). Cela permet de s'assurer
que le cluster de bases de donnes peut revenir un tat cohrent aprs une panne matrielle ou du systme d'exploitation.
Bien que dsactiver fsync amliore frquemment les performances, cela peut avoir pour consquence une corruption des
donnes non rcuprables dans le cas d'une perte de courant ou d'un crash du systme. Donc, il est seulement conseill de
dsactiver fsync si vous pouvez facilement recrer la base de donnes complte partir de donnes externes.
Quelques exemples de circonstances permettant de dsactiver fsync : le chargement initial d'une nouvelle instance partir
d'une sauvegarde, l'utilisation de l'instance pour traiter un flot de donnes aprs quoi la base sera supprime puis recre, la
cration d'un clone d'une base en lecture seule, clone qui serait recr frquemment et n'est pas utilis pour du failover. La
haute qualit du matriel n'est pas une justification suffisante pour dsactiver fsync.
Dans de nombreuses situations, dsactiver synchronous_commit pour les transactions non critiques peut fournir une grande
partie des performances de la dsactivation de fsync, sans les risques associs de corruption de donnes.
fsync ne peut tre configur que dans le fichier postgresql.conf ou indiqu sur la ligne de commande. Si ce paramtre est dsactiv (off), il est intressant de dsactiver aussi full_page_writes.
synchronous_commit (enum)
Indique si la validation des transactions doit attendre l'criture des enregistrements WAL avant que la commande ne renvoie
une indication de russite au client. Les valeurs valides sont on, local et off. La configuration par dfaut, et la plus
sre, est on. Quand ce paramtre est dsactiv (off), il peut exister un dlai entre le moment o le succs est rapport et le
moment o la transaction est vraiment protge d'un arrt brutal du serveur. (Le dlai maximum est de trois fois
wal_writer_delay.) Contrairement fsync, la configuration de ce paramtre off n'implique aucun risque d'incohrence dans
la base de donnes : un arrt brutal du systme d'exploitation ou d'une base de donnes peut rsulter en quelques transactions
rcentes prtendument valides perdues malgr tout. Cependant, l'tat de la base de donnes est identique celui obtenu si les
transactions avaient t correctement annules. C'est pourquoi la dsactivation de synchronous_commit est une alternative utile quand la performance est plus importante que la sret de la transaction. Pour plus de discussion, voir Section 29.3,
Validation asynchrone (Asynchronous Commit) .
Si synchronous_standby_names est configur, ce paramtre contrle aussi si la validation d'une transaction attend que les enregistrements de journaux de transactions pour cette transaction soient bien vids sur disque et rpliqus sur le serveur en
standby. L'attente de la validation durera jusqu' ce qu'une rponse du serveur en standby synchrone indique qu'il a crit
l'enregistrement sur le disque. Si la rplication synchrone est utilis, il serait logique soit d'attendre que les enregistrements
334
Configuration du serveur
des journaux de transactions soient crits sur les disques local et distant, soit de permettre la transaction de valider en asynchrone. Nanmoins, la valeur spciale local est disponible pour les transactions qui souhaiente attendre le vidage local sur
disque et non pas la rplication synchrone.
Ce paramtre peut tre chang tout moment ; le comportement pour toute transaction est dtermin par la configuration en
cours lors de la validation. Il est donc possible et utile d'avoir certaines validations valides en synchrone et d'autres en asynchrone. Par exemple, pour raliser une validation asynchrone de transaction plusieurs instructions avec une valeur par dfaut
inverse, on excute l'instruction SET LOCAL synchronous_commit TO OFF dans la transaction.
wal_sync_method (enum)
Mthode utilise pour forcer les mises jour des WAL sur le disque. Si fsync est dsactiv, alors ce paramtre est inapplicable, car les mises jour des journaux de transactions ne sont pas du tout forces. Les valeurs possibles sont :
fsync_writethrough (appelle fsync() chaque validation, forant le mode write-through de tous les caches
disque en criture)
Ces options ne sont pas toutes disponibles sur toutes les plateformes. La valeur par dfaut est la premire mthode de la liste
ci-dessus supporte par la plateforme. Les options open_* utilisent aussi O_DIRECT s'il est disponible. L'outil src/
tools/fsync disponible dans le code source de PostgreSQL permet de tester les performances des diffrentes mthodes de
synchronisation. Ce paramtre ne peut tre configur que dans le fichier postgresql.conf ou indiqu sur la ligne de
commande.
full_page_writes (boolean)
Quand ce paramtre est activ, le serveur crit l'intgralit du contenu de chaque page disque dans les WAL lors de la premire modification de cette page qui intervient aprs un point de vrification. C'est ncessaire car l'criture d'une page lors
d'un plantage du systme d'exploitation peut n'tre que partielle, ce qui conduit une page sur disque qui contient un mlange
d'anciennes et de nouvelles donnes. Les donnes de modification de niveau ligne stockes habituellement dans les WAL ne
sont pas suffisantes pour restaurer compltement une telle page lors de la rcupration qui suit la panne. Le stockage de
l'image de la page complte garantit une restauration correcte de la page, mais au prix d'un accroissement de la quantit de
donnes crire dans les WAL. (Parce que la relecture des WAL dmarre toujours un point de vrification, il suffit de faire
cela lors de la premire modification de chaque page survenant aprs un point de vrification. De ce fait, une faon de rduire
le cot d'criture de pages compltes consiste augmenter le paramtre rglant les intervalles entre points de vrification.)
La dsactivation de ce paramtre acclre les oprations normales, mais peut aboutir soit une corruption impossible corriger soit une corruption silencieuse, aprs un chec systme. Les risques sont similaires la dsactivation de fsync, bien
que moindres. Sa dsactivation devrait se faire en se basant sur les mmes recommandations que cet autre paramtre.
La dsactivation de ce paramtre n'affecte pas l'utilisation de l'archivage des WAL pour la rcupration d'un instantan, aussi
appel PITR (voir Section 24.3, Archivage continu et rcupration d'un instantan (PITR) ).
Ce paramtre ne peut tre configur que dans le fichier postgresql.conf ou indiqu sur la ligne de commande. Activ
par dfaut (on).
wal_buffers (integer)
La quantit de mmoire partage utilise pour les donnes des journaux de transactions qui n'ont pas encore t crites sur
disque. La configuration par dfaut de -1 slectionne une taille gale 1/32 (environ 3%) de shared_buffers, mais pas moins
64kB et pas plus que la taille d'un journal de transactions, soit gnralement 16MB. Cette valeur peut tre configur manuellement si le choix automatique est trop gros ou trop petit, mais tout valeur positive infrieure 32kB sera traite comme tant
exactement 32kB. Ce paramtre ne peut tre configur qu'au dmarrage du serveur.
Le contenu du cache des journaux de transactions est crit sur le disque chaque validation d'une transaction, donc des valeurs trs importantes ont peu de chance d'apporter un gain significatif. Nanmoins, configurer cette valeur au moins
quelques mgaoctets peut amliorer les performances en criture sur un serveur charg quand plusieurs clients valident en
mme temps. La configuration automatique slectionn par dfaut avec la valeur -1 devrait tre convenable.
L'augmentation de ce paramtre peut conduire PostgreSQL rclamer plus de tampons partags System V que ne le permet la configuration par dfaut du systme d'exploitation. Voir la Section 17.4.1, Mmoire partage et smaphore pour les
informations sur la faon d'ajuster ces paramtres, si ncessaire.
335
Configuration du serveur
wal_writer_delay (integer)
Indique le dlai entre les tours d'activit pour l'enregistreur des WAL. chaque tour, l'enregistreur place les WAL sur disque.
Il s'endort ensuite pour wal_writer_delay millisecondes et recommence. La valeur par dfaut est de 200 millisecondes
(200ms). Pour de nombreux systmes, la rsolution relle du sleep est de 10 millisecondes ; configurer
wal_writer_delay une valeur qui n'est pas un multiple de 10 a le mme rsultat que de le configurer au multiple de 10
immdiatement suprieur. Ce paramtre ne peut tre configur que dans le fichier postgresql.conf ou indiqu sur la
ligne de commande.
commit_delay (integer)
Dlai entre l'enregistrement d'une validation dans le tampon WAL et le vidage du tampon sur le disque, en microsecondes. Un
dlai diffrent de zro peut autoriser la validation de plusieurs transactions en un seul appel systme fsync(), si la charge
systme est assez importante pour que des transactions supplmentaires soient prtes dans l'intervalle donn. Mais le dlai est
perdu si aucune autre transaction n'est prte tre valide. De ce fait, le dlai n'est trait que si, au minimun, commit_siblings autres transactions sont actives au moment o le processus serveur a crit son enregistrement de validation.
La valeur par dfaut est zro (pas de dlai).
commit_siblings (integer)
Nombre minimum de transactions concurrentes ouvertes en mme temps ncessaires avant d'attendre le dlai commit_delay. Une valeur plus importante rend plus probable le fait qu'au moins une autre transaction soit prte valider pendant le dlai. La valeur par dfaut est de cinq transactions.
18.5.3. Archivage
archive_mode (boolean)
Quand archive_mode est activ, les segments WAL remplis peuvent tre archivs en configurant archive_command. archive_mode et archive_command sont des variables spares de faon ce que archive_command puisse tre modifie sans quitter le mode d'archivage. Ce paramtre ne peut tre configur qu'au lancement du serveur. archive_mode ne
peut pas tre activ quand wal_level est configur minimal.
archive_command (string)
Commande shell excuter pour archiver un segment termin de la srie des fichiers WAL. Tout %p dans la chane est remplac par le chemin du fichier archiver et tout %f par le seul nom du fichier. (Le chemin est relatif au rpertoire de travail du
serveur, c'est--dire le rpertoire de donnes du cluster.) %% est utilis pour intgrer un caractre % dans la commande. Il est
important que la commande renvoit un code zro seulement si elle a russit l'archivage. Pour plus d'informations, voir Sec336
Configuration du serveur
18.6. Rplication
Ces paramtres contrlent le comportement de la fonctionnalit interne de rplication en flux (voir Section 25.2.5, Streaming
Replication ). Ces paramtres sont configurer sur le serveur matre alors que d'autres sont configurer sur le ou les serveurs en
standby qui recevront les donnes de rplication.
Configuration du serveur
Cela configure seulement le nombre minimum de fichiers conserver dans pg_xlog ; le systme pourrait avoir besoin de
conserver plus de fichiers pour l'archivage ou pour restaurer partir d'un CHECKPOINT. Si wal_keep_segments vaut
zro (ce qui est la valeur par dfaut), le systme ne conserve aucun fichier supplmentaire pour les serveurs en attente et le
nombre des anciens journaux disponibles pour les serveurs en attente est seulement bas sur l'emplacement du dernier
CHECKPOINT ainsi que sur l'tat de l'archivage des journaux de transactions. Ce paramtre n'a aucun effet sur les restartpoints. Ce paramtre peut seulement tre configur dans le fichier postgresql.conf ou sur la ligne de commande du serveur.
vacuum_defer_cleanup_age (integer)
Indique le nombre de transactions pendant lesquelles les VACUUM et les mises jour HOT reporteront plus tard le nettoyage des versions de lignes mortes. La valeur par dfaut est de zro transaction. Cela veut dire que les versions de lignes
mortes peuvent tre supprimes ds que possible, autrement dit partir du moment o elles ne sont plus visibles par les transactions en cours d'excution. Vous pourriez augmenter la valeur de ce paramtre sur un serveur matre qui accepte des serveurs en attente de type hotstandby, comme dcrit dans Section 25.5, Hot Standby . Ceci donne plus de temps aux requtes
sur les serveurs hotstandby pour qu'elles se terminent avec succs, sans conflit relatif un nettoyage des lignes. Nanmoins,
comme la valeur est mesure en terme de nombres de transactions en criture survenant sur le serveur matre, il est difficile de
prdire le temps supplmentaire que cela met disposition des requtes sur les serveurs hotstandby. Ce paramtre peut seulement tre configur dans le fichier postgresql.conf ou sur la ligne de commande du serveur.
Pensez configurer hot_standby_feedback comme alternative ce paramtre.
replication_timeout (integer)
Termine les connexions de rplication inactives depuis au moins ce nombre de millisecondes. C'est utile pour que le serveur
matre dtecte un arrt brutal du serveur en standby ou un problme rseau. Une valeur de zro dsactive ce mcanisme. Ce
paramtre peut seulement tre configur dans le fichier postgresql.conf ou sur la ligne de commande du serveur. La valeur par dfaut est de 60 secondes.
Pour empcher l'arrt prmatur des connexions, wal_receiver_status_interval doit tre activ sur le serveur en standby et sa
valeur doit tre infrieur la valeur de replication_timeout.
synchronous_standby_names (string)
Prcise une liste de noms de serveur en standby, chacun spar par une virgule, acceptant une rplication synchrone, comme
dcrite dans Section 25.2.6, Rplication synchrone . tout moment, il y aura au maximum un serveur standby synchrone
actif ; les transactions en attente de validation seront autorises continuer aprs que le serveur standby aura confirm la rception des donnes. Le standby synchrone est le premier serveur standby nomm dans cette liste, qui est la fois connect et
qui rcupre les donnes en temps rel (comme indiqu par l'tat streaming dans la vue pg_stat_replication). Les
autres serveurs standards apparaissant plus tard dans cette liste sont des serveurs standbys synchrones potentiels. Si le serveur
standby synchrone se dconnecte, quel qu'en soit la raison, il sera immdiatement remplac par le prochain standby dans
l'ordre des priorits. Indiquer plus qu'un nom de standby peut augmenter fortement la haute disponibilit.
Dans ce cadre, le nom d'un serveur standby correspond au paramtre application_name du standby, qui est configurable
dans primary_conninfo du walreceiver du standby. Il n'existe aucun paramtre pour s'assurer de l'unicit. Dans le cas o
des serveurs ont le mme nom, un des serveurs standby sera choisi pour tre le serveur standby synchrone mais il est impossible de dterminer lequel sera choisi. L'entre spciale * correspond tout application_name, cela incluant le nom de
l'application par dfaut de walreceiver.
Si aucun nom de serveur en standby synchrone n'est indiqu ici, alors la rplication synchrone n'est pas active et la validation
des transactions n'attendra jamais la rplication. Ceci est la configuration par dfaut. Mme si la rplication synchrone est active, les transactions individuelles peuvent tre configures pour ne pas avoir attendre la rplication en configurant le paramtre synchronous_commit local ou off.
Ce paramtre peut seulement tre configur dans le fichier postgresql.conf ou sur la ligne de commande du serveur.
Configuration du serveur
quer, comme c'est dcrit dans Section 25.5.2, Gestion des conflits avec les requtes . max_standby_archive_delay
est utilis quand les donnes de journaux de transactions sont lues partir des archives de journaux de transactions (et du
coup accuse un certain retard par rapport au serveur matre). La valeur par dfaut est de 30 secondes. L'unit est la milliseconde si cette dernire n'est pas spcifie. Une valeur de -1 autorise le serveur en attente attendre indfiniment la fin
d'excution des requtes en conflit. Ce paramtre peut seulement tre configur dans le fichier postgresql.conf ou sur
la ligne de commande du serveur.
Notez que max_standby_archive_delay ne correspond pas au temps d'excution maximum d'une requte avant son
annulation ; il s'agit plutt du temps maximum autoris pour enregistrer les donnes d'un journal de transactions. Donc, si une
requte a occasionn un dlai significatif au dbut du traitement d'un journal de transactions, les requtes suivantes auront un
dlai beaucoup moins important.
max_standby_streaming_delay (integer)
Quand Hot Standby est activ, ce paramtre dtermine le dlai maximum d'attente que le serveur esclave doit observer avant
d'annuler les requtes en lecture qui entreraient en conflit avec les enregistrements de transactions appliquer, comme c'est
dcrit dans Section 25.5.2, Gestion des conflits avec les requtes . max_standby_streaming_delay est utilis
quand les donnes des journaux de donnes sont reues via la connexion de la rplication en flux. La valeur par dfaut est de
30 secondes. L'unit est la milliseconde si cette dernire n'est pas spcifie. Une valeur de -1 autorise le serveur en attente
attendre indfiniment la fin d'excution des requtes en conflit. Ce paramtre peut seulement tre configur dans le fichier
postgresql.conf ou sur la ligne de commande du serveur.
Notez que max_standby_streaming_delay ne correspond pas au temps d'excution maximum d'une requte avant son
annulation ; il s'agit plutt du temps maximum autoris pour enregistrer les donnes d'un journal de transactions une fois
qu'elles ont t rcupres du serveur matre. Donc, si une requte a occasionn un dlai significatif au dbut du traitement
d'un journal de transactions, les requtes suivantes auront un dlai beaucoup moins important.
wal_receiver_status_interval (integer)
Indique la frquence minimale pour que le processus de rception (walreceiver) sur le serveur de standby envoie des informations sur la progression de la rplication au serveur principal, o elles sont disponibles en utilisant la vue
pg_stat_replication. Le serveur en standby renvoie la dernire position crite dans le journal de transactions, la dernire position vide sur disque du journal de transactions, et la dernire position rejoue. La valeur de ce paramtre est
l'intervalle maximum, en secondes, entre les rapports. Les mises jour sont envoyes chaque fois que les positions d'criture
ou de vidage ont changes et de toute faon au moins aussi frquemment que l'indique ce paramtre. Du coup, la position de
rejeu pourrait avoir un certain retard par rapport la vraie position. Configurer ce paramtre zro dsactive compltement
les mises jour de statut. Ce paramtre peut seulement tre configur dans le fichier postgresql.conf ou sur la ligne de
commande du serveur. La valeur par dfaut est de dix secondes.
Quand replication_timeout est activ sur le serveur principal, wal_receiver_status_interval doit tre activ et sa
valeur doit tre infrieure la valeur de replication_timeout.
hot_standby_feedback (boolean)
Spcifie si un serveur en Hot Standby enverra des informations au serveur principal sur les requtes en cours d'excution sur
le serveur en standby. Ce paramtre peut tre utilis pour liminer les annulations de requtes ncessaires au nettoyage des
enregistrements. Par contre, il peut causer une fragmentation plus importante sur le serveur principal pour certaines charges.
Les
messages
d'informations
ne
seront
pas
envoys
plus
frquemment
qu'une
fois
par
wal_receiver_status_interval. La valeur par dfaut est off. Ce paramtre peut seulement tre configur dans le
fichier postgresql.conf ou sur la ligne de commande du serveur.
339
Configuration du serveur
enable_hashagg (boolean)
Active ou dsactive l'utilisation des plans d'agrgation hache (hashed aggregation) par le planificateur. Activ par dfaut
(on).
enable_hashjoin (boolean)
Active ou dsactive l'utilisation des jointures de hachage (hash-join) par le planificateur. Activ par dfaut (on).
enable_indexscan (boolean)
Active ou dsactive l'utilisation des parcours d'index (index-scan) par le planificateur. Activ par dfaut (on).
enable_material (boolean)
Active ou dsactive l'utilisation de la matrialisation par le planificateur. Il est impossible de supprimer compltement son utilisation mais la dsactivation de cette variable permet d'empcher le planificateur d'insrer des nuds de matrialisation sauf
dans le cas o son utilisation est obligatoire pour des raisons de justesse de rsultat. Activ par dfaut (on).
enable_mergejoin (boolean)
Active ou dsactive l'utilisation des jointures de fusion (merge-join)par le planificateur. Activ par dfaut (on).
enable_nestloop (boolean)
Active ou dsactive l'utilisation des jointures de boucles imbriques (nested-loop) par le planificateur. Il n'est pas possible de
supprimer compltement les jointures de boucles imbriques mais la dsactivation de cette variable dcourage le planificateur
d'en utiliser une si d'autres mthodes sont disponibles. Activ par dfaut (on).
enable_seqscan (boolean)
Active ou dsactive l'utilisation des parcours squentiels (sequential scan) par le planificateur. Il n'est pas possible de supprimer compltement les parcours squentiels mais la dsactivation de cette variable dcourage le planificateur d'n utiliser un si
d'autres mthodes sont disponibles. Activ par dfaut (on).
enable_sort (boolean)
Active ou dsactive l'utilisation des tapes de tri explicite par le planificateur. Il n'est pas possible de supprimer compltement
ces tris mais la dsactivation de cette variable dcourage le planificateur d'en utiliser un si d'autres mthodes sont disponibles.
Activ par dfaut (on).
enable_tidscan (boolean)
Active ou dsactive l'utilisation des parcours de TID par le planificateur. Activ par dfaut (on).
Note
Il n'existe malheureuresement pas de mthode bien dfinie pour dterminer les valeurs idales des variables de
cot. Il est prfrable de les considrer comme moyennes sur un jeu complet de requtes d'une installation particulire. Cela signifie que modifier ces paramtres sur la seule base de quelques expriences est trs risqu.
seq_page_cost (floating point)
Initialise l'estimation faite par le planificateur du cot de rcupration d'une page disque incluse dans une srie de rcuprations squentielles. La valeur par dfaut est 1.0. Cette valeur peut tre surcharg par un tablespace spcifique en configurant
le paramtre du mme nom pour un tablespace (voir ALTER TABLESPACE(7)).
random_page_cost (floating point)
Initialise l'estimation faite par le planificateur du cot de rcupration non-squentielle d'une page disque. Mesure comme un
multiple du cot de rcupration d'une page squentielle, sa valeur par dfaut est 4.0. Cette valeur peut tre surcharg par un
tablespace spcifique en configurant le paramtre du mme nom pour un tablespace (voir ALTER TABLESPACE(7)).
340
Configuration du serveur
Rduire cette valeur par rapport seq_page_cost incite le systme privilgier les parcours d'index ; l'augmenter donne
l'impression de parcours d'index plus coteux. Les deux valeurs peuvent tre augmentes ou diminues concomitament pour
modifier l'importance des cots d'entres/sorties disque par rapport aux cots CPU, dcrits par les paramtres qui suivent.
Astuce
Bien que le systme permette de configurer random_page_cost une valeur infrieure celle de
seq_page_cost, cela n'a aucun intrt. En revanche, les configurer des valeurs identiques prend tout son
sens si la base tient entirement dans le cache en RAM. En effet, dans ce cas, il n'est pas pnalisant d'atteindre
des pages qui ne se suivent pas. De plus, dans une base presque entirement en cache, ces valeurs peuvent tre
abaisses relativement aux paramtres CPU car le cot de rcupration d'une page dj en RAM est bien
moindre celui de sa rcupration sur disque.
cpu_tuple_cost (floating point)
Initialise l'estimation faite par le planificateur du cot de traitement de chaque ligne lors d'une requte. La valeur par dfaut
est 0.01.
cpu_index_tuple_cost (floating point)
Initialise l'estimation faite par le planificateur du cot de traitement de chaque entre de l'index lors d'un parcours d'index. La
valeur par dfaut est 0.005.
cpu_operator_cost (floating point)
Initialise l'estimation faite par le planificateur du cot de traitement de chaque oprateur ou fonction excute dans une requte. La valeur par dfaut est 0.0025.
effective_cache_size (integer)
Initialise l'estimation faite par le planificateur de la taille relle du cache disque disponible pour une requte. Ce paramtre est
li l'estimation du cot d'utilisation d'un index ; une valeur importante favorise les parcours d'index, une valeur faible les
parcours squentiels. Pour configurer ce paramtre, il est important de considrer la fois les tampons partags de PostgreSQL et la portion de cache disque du noyau utilise pour les fichiers de donnes de PostgreSQL. Il faut galement tenir
compte du nombre attendu de requtes concurrentes sur des tables diffrentes car elles partagent l'espace disponible. Ce paramtre n'a pas d'inluence sur la taille de la mmoire partage alloue par PostgreSQL, et ne rserve pas non plus le cache
disque du noyau ; il n'a qu'un rle estimatif. Le systme ne suppose pas non plus que les donnes reste dans le cache du
disque entre des requtes. La valeur par dfaut est de 128 Mo.
Configuration du serveur
fluenant le comportement de GEQO (dcrites ci-dessous). Il est galement possible de les configurer manuellement.
geqo_pool_size (integer)
Contrle la taille de l'ensemble utilis par GEQO. C'est--dire le nombre d'individus au sein d'une population gntique. Elle
doit tre au minimum gale deux, les valeurs utiles tant gnralement comprises entre 100 et 1000. Si elle est configure
zro (valeur par dfaut), alors une valeur convenable est choisie en fonction de geqo_effort et du nombre de tables dans
la requte.
geqo_generations (integer)
Contrle le nombre de gnrations utilises par GEQO. C'est--dire le nombre d'itrations de l'algorithme. Il doit tre au minimum de un, les valeurs utiles se situent dans la mme plage que la taille de l'ensemble. S'il est configur zro (valeur par dfaut), alors une valeur convenable est choisie en fonction de geqo_pool_size.
geqo_selection_bias (floating point)
Contrle le biais de slection utilis par GEQO. C'est--dire la pression de slectivit au sein de la population. Les valeurs
s'tendent de 1.50 2.00 (valeur par dfaut).
geqo_seed (floating point)
Contrle la valeur initiale du gnrateur de nombres alatoires utilis par GEQO pour slectionner des chemins au hasard
dans l'espace de recherche des ordres de jointures. La valeur peut aller de zro (valeur par dfaut) un. Varier la valeur modifie l'ensemble des chemins de jointure explors et peut rsulter en des chemins meilleurs ou pires.
Avec l'activation de l'exclusion par contraintes, ce SELECT ne parcourt pas fils1000, ce qui amliore les performances.
l'heure actuelle, l'exclusion de contraintes est active par dfaut seulement pour les cas qui sont souvent utiliss pour implmenter le partitionnement de tables. L'activer pour toutes les tables impose un surcot pour la planification qui est assez mesurable pour des requtes simples, et le plus souvent n'apportera aucun bnfice aux requtes simples. Si vous n'avez pas de
tables partitionnes, vous voudrez peut-tre le dsactiver entirement.
Reportez vous Section 5.9.4, Partitionnement et exclusion de contrainte pour plus d'informations sur l'utilisation
d'exclusion de contraintes et du partitionnement.
cursor_tuple_fraction (floating point)
Positionne la fraction, estime par le planificateur, de la fraction d'enregistrements d'un curseur qui sera rcupre. La valeur
par dfaut est 0.1. Des valeurs plus petites de ce paramtre rendent le planificateur plus enclin choisir des plans dmarrage
rapide ( fast start ), qui rcupreront les premiers enregistrement rapidement, tout en mettant peut tre un temps plus long
rcuprer tous les enregistrements. Des valeurs plus grandes mettent l'accent sur le temps total estim. la valeur maximum
1.0 du paramtre, les curseurs sont planifis exactement comme des requtes classiques, en ne prenant en compte que le
temps total estim et non la vitesse laquelle les premiers enregistrements seront fournis.
342
Configuration du serveur
from_collapse_limit (integer)
Le planificateur assemble les sous-requtes dans des requtes suprieures si la liste FROM rsultante contient au plus ce
nombre d'lments. Des valeurs faibles rduisent le temps de planification mais conduisent des plans de requtes infrieurs.
La valeur par dfaut est de 8. Pour plus d'informations, voir Section 14.3, Contrler le planificateur avec des clauses JOIN
explicites .
Configurer cette valeur geqo_threshold ou plus pourrait dclencher l'utilisation du planificateur GEQO, ce qui pourrait
aboutir la gnration de plans non optimaux. Voir Section 18.7.3, Optimiseur gntique de requtes .
join_collapse_limit (integer)
Le planificateur rcrit les constructions JOIN explicites ( l'exception de FULL JOIN) en une liste d'lments FROM
chaque fois qu'il n'en rsulte qu'une liste ne contenant pas plus de ce nombre d'lments. Des valeurs faibles rduisent le
temps de planification mais conduisent des plans de requtes infrieurs.
Par dfaut, cette variable a la mme valeur que from_collapse_limit, valeur adapte la plupart des utilisations.
Configurer cette variable 1 empche le rordonnancement des JOINtures explicites. De ce fait, l'ordre des jointures explicites indiqu dans la requte est l'ordre rel dans lequel les relations sont jointes. Le planificateur de la requte ne choisit pas
toujours l'ordre de jointure optimal ; les utilisateurs aguerris peuvent choisir d'initialiser temporairement cette variable 1 et
d'indiquer explicitement l'ordre de jointure souhait. Pour plus d'informations, voir Section 14.3, Contrler le planificateur
avec des clauses JOIN explicites .
Configurer cette valeur geqo_threshold ou plus pourrait dclencher l'utilisation du planificateur GEQO, ce qui pourrait
aboutir la gnration de plans non optimaux. Voir Section 18.7.3, Optimiseur gntique de requtes .
Note
Sur la plupart des systmes Unix, il est ncessaire de modifier la configuration du dmon syslog pour utiliser
l'option syslog de log_destination. PostgreSQL peut tracer dans les niveaux syslog LOCAL0 LOCAL7 (voir syslog_facility) mais la configuration par dfaut de syslog sur la plupart des plateformes ignore de
tels messages. Il faut ajouter une ligne similaire :
local0.*
/var/log/postgresql
343
Configuration du serveur
Note
Il est possible d'envoyer les traces sur stderr sans utiliser le collecteur des traces. Les messages iront
l'endroit o la sortie des erreurs est dirige. Nanmoins, cette mthode est seulement intressante en cas d'un
faible volume de traces car elle ne propose aucun moyen simple pour raliser une rotation des journaux applicatifs. De plus, sur certaines plateformes, ne pas utiliser le collecteur de traces peut rsulter en une perte des
traces en sortie car l'criture de plusieurs processus sur le mme fichier en mme temps peut faire en sorte que
certaines critures soient perdues ou entremles.
Note
Le collecteur des traces est conu pour ne jamais perdre de messages. Cela signifie que, dans le cas d'une
charge extrmement forte, les processus serveur pourraient se trouver bloqus lors de l'envoi de messages de
trace supplmentaires. Le collecteur pourrait accumuler dans ce cas du retard. syslog prfre ignorer des messages s'il ne peut pas les crire, mais il ne bloquera pas le reste du systme.
log_directory (string)
Lorsque logging_collector est activ, ce paramtre dtermine le rpertoire dans lequel les fichiers de trace sont crs.
Il peut s'agir d'un chemin absolu ou d'un chemin relatif au rpertoire des donnes du cluster. Ce paramtre ne peut tre configur que dans le fichier postgresql.conf ou indiqu sur la ligne de commande. La valeur par dfaut est pg_log.
log_filename (string)
Lorsque logging_collector est activ, ce paramtre indique les noms des journaux applicatifs crs. La valeur est traite comme un motif strftime. Ainsi les chappements % peuvent tre utiliss pour indiquer des noms de fichiers horodats. (S'il y a des chappements % dpendant des fuseaux horaires, le calcul se fait dans le fuseau prcis par log_timezone.)
Les chappements % supports sont similaires ceux lists dans la spcification de strftime par l'Open Group. Notez que la
fonction strftime du systme n'est pas utilise directement, ce qui entrane que les extensions spcifiques la plateforme
(non-standard) ne fonctionneront pas. La valeur par dfaut est postgresql-%Y-%m-%d_%H%M%S.log.
Si vous spcifiez un nom de fichier sans chappements, vous devriez prvoir d'utiliser un utilitaire de rotation des journaux
pour viter le risque de remplir le disque entier. Dans les versions prcdentes 8.4, si aucun chappement % n'tait prsent,
PostgreSQL aurait ajout l'epoch de la date de cration du nouveau journal applicatif mais ce n'est plus le cas.
Si la sortie au format CSV est active dans log_destination, .csv est automatiquement ajout au nom du journal horodat. (Si log_filename se termine en .log, le suffixe est simplement remplac.)
Ce paramtre ne peut tre positionn que dans le fichier postgresql.conf ou en ligne de commande.
log_file_mode (integer)
Sur les systmes Unix, ce paramtre configure les droits pour les journaux applicatifs quand logging_collector est activ. (Sur Microsoft Windows, ce paramtre est ignor.) La valeur de ce paramtre doit tre un mode numrique spcifi dans
le format accept par les appels systmes chmod et umask. (Pour utiliser le format octal, ce nombre doit tre prcd d'un
zro, 0.)
Les droits par dfaut sont 0600, signifiant que seul l'utilisateur qui a lanc le serveur peut lire ou crire les journaux applicatifs. Un autre paramtrage habituel est 0640, permettant aux membres du groupe propritaire de lire les fichiers. Notez nanmoins que pour utiliser ce paramtre, vous devez modifier log_directory pour enregistrer les fichiers en dehors du rpertoire
des donnes de l'instance. Dans ce cas, il est dconseill de rendre les journaux applicatifs lisibles par tout le monde car ils
pourraient contenir des donnes sensibles.
Ce paramtre ne peut tre positionn que dans le fichier postgresql.conf ou en ligne de commande.
log_rotation_age (integer)
Lorsque logging_collector est activ, ce paramtre dtermine la dure de vie maximale (en minutes) d'un journal individuel. Pass ce dlai, un nouveau journal est cr. Initialiser ce paramtre zro dsactive la cration en temps compt de
nouveaux journaux. Ce paramtre ne peut qu'tre configur dans le fichier postgresql.conf ou indiqu sur la ligne de
commande.
log_rotation_size (integer)
Lorsque logging_collector est activ, ce paramtre dtermine la taille maximale (en kilooctets) d'un journal individuel. Pass cette taille, un nouveau journal est cr. Initialiser cette taille zro dsactive la cration en taille compte de nouveaux journaux. Ce paramtre ne peut tre configur que dans le fichier postgresql.conf ou indiqu sur la ligne de
commande.
344
Configuration du serveur
log_truncate_on_rotation (boolean)
Lorsque logging_collector est activ, ce paramtre impose PostgreSQL de vider (craser), plutt qu'ajouter , tout
fichier journal dont le nom existe dj. Toutefois, cet crasement ne survient qu' partir du moment o un nouveau fichier doit
tre ouvert du fait d'une rotation par temps compt, et non pas la suite du dmarrage du serveur ou d'une rotation par taille
compte. Si ce paramtre est dsactiv (off), les traces sont, dans tous les cas, ajoutes aux fichiers qui existent dj.
Par exemple, si ce paramtres est utilis en combinaison avec un log_filename tel que postgresql-%H.log, il en rsulte la gnration de 24 journaux (un par heure) crass de faon cyclique.
Ce paramtre ne peut tre configur que dans le fichier postgresql.conf ou indiqu sur la ligne de commande.
Exemple : pour conserver sept jours de traces, un fichier par jour nomm server_log.Mon, server_log.Tue, etc. et
craser automatiquement les traces de la semaine prcdente avec celles de la semaine courante, on positionne
log_filename server_log.%a, log_truncate_on_rotation on et log_rotation_age 1440.
Exemple : pour conserver 24 heures de traces, un journal par heure, toute en effectuant la rotation plus tt si le journal dpasse 1 Go, on positionne log_filename server_log.%H%M, log_truncate_on_rotation on,
log_rotation_age 60 et log_rotation_size 1000000. Inclure %M dans log_filename permet toute rotation par taille compte qui survient d'utiliser un nom de fichier distinct du nom initial horodat.
syslog_facility (enum)
Lorsque les traces syslog sont actives, ce paramtre fixe le niveau ( facility ) utilis par syslog. Les diffrentes possibilits
sont LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7 ; LOCAL0 tant la valeur par dfaut.
Voir aussi la documentation du dmon syslog du serveur. Ce paramtre ne peut tre configur que dans le fichier postgresql.conf ou indiqu sur la ligne de commande.
syslog_ident (string)
Si syslog est activ, ce paramtre fixe le nom du programme utilis pour identifier les messages PostgreSQL dans les traces
de syslog. La valeur par dfaut est postgres. Ce paramtre ne peut tre configur que dans le fichier postgresql.conf
ou indiqu sur la ligne de commande.
silent_mode (boolean)
Excute silencieusement le serveur. Si ce paramtre est configur, le serveur dmarre automatiquement en tche de fond et
tout terminal de contrle est dissoci. Ce paramtre ne peut tre configur qu'au dmarrage du serveur.
Attention
Quand ce paramtre est activ, la sortie standard et l'erreur standard sont rediriges vers le fichier postmaster.log dans le rpertoire des donnes. Ce fichier ne bnficie pas du systme de rotation, donc il grossira
indfiniment sauf si la sortie du serveur est renvoye ailleurs par d'autres paramtrages. Il est recommand de
configurer log_destination syslog ou que logging_collector soit activ lors de l'utilisation
de cette option. Mme avec ces mesures, les erreurs rapportes trs tt lors du dmarrage pourraient apparatre
dans le fichier postmaster.log plutt que dans la destination normal des traces.
Configuration du serveur
cours est incluse dans les traces pour tout message de svrit indique ou suprieure. Les valeurs valides sont DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, INFO, NOTICE, WARNING, ERROR, LOG, FATAL et PANIC. ERROR est la valeur par
dfaut, ce qui signifie que les instructions l'origine d'erreurs, de messages applicatifs, d'erreurs fatales ou de paniques sont
traces. Pour rellement dsactiver le traage des instructions choues, ce paramtre doit tre positionn PANIC. Seuls les
superutilisateurs peuvent modifier la valeur de ce paramtre.
log_min_duration_statement (integer)
Trace la dure de toute instruction termine dont le temps d'excution gale ou dpasse ce nombre de millisecondes. Positionn zro, les dures de toutes les instructions sont traces. -1 (valeur par dfaut) dsactive ces traces.
Par exemple, si le paramtre est positionn 250ms, alors toutes les instructions SQL dont la dure est suprieure ou gale
250 ms sont traces.
Il est utile d'activer ce paramtre pour tracer les requtes non optimises des applications. Seuls les superutilisateurs peuvent
modifier cette configuration.
Pour les clients utilisant le protocole de requtage tendu, les dures des tapes Parse (analyse), Bind (lien) et Execute
(excution) sont traces indpendamment.
Note
Lorsque cette option est utilise avec log_statement, le texte des instructions traces du fait de
log_statement n'est pas rpt dans le message de trace de la dure. Si syslog n'est pas utilis, il est recommand de tracer le PID ou l'ID de session l'aide de log_line_prefix de faon pouvoir lier le message de
l'instruction au message de dure par cet identifiant.
Tableau 18.1, Niveaux de svrit des messages explique les niveaux de svrit des messages utiliss par PostgreSQL. Si
la journalisation est envoye syslog ou l'eventlog de Windows, les niveaux de svrit sont traduits comme indiqu cidessous.
Tableau 18.1. Niveaux de svrit des messages
Svrit
Usage
DEBUG1..DEBUG5
INFORMATION
INFO
INFORMATION
NOTICE
INFORMATION
WARNING
Fournit
des
messages NOTICE
d'avertissement sur d'ventuels
problmes. Par exemple, un
COMMIT en dehors d'un bloc
de transaction.
WARNING
ERROR
ERROR
LOG
INFORMATION
FATAL
ERROR
PANIC
ERROR
syslog
346
eventlog
Configuration du serveur
Note
Quelques programmes clients, comme psql, tentent de se connecter deux fois pour dterminer si un mot de
passe est ncessaire, des messages connection received dupliqus n'indiquent donc pas forcment un problme.
log_disconnections (boolean)
Affiche dans les traces du serveur une ligne similaire log_connections mais la fin d'une session, en incluant la dure
de la session. Dsactiv par dfaut, ce paramtre ne peut pas tre dsactiv aprs le dmarrage de la session.
log_duration (boolean)
Trace la dure de toute instruction excute. Dsactiv par dfaut (off), seuls les superutilisateurs peuvent modifier ce paramtre.
Pour les clients utilisant le protocole de requtage tendu, les dures des tapes Parse (analyse), Bind (lien) et Execute
(excution) sont traces indpendamment.
Note
la diffrence de log_min_duration_statement, ce paramtre ne force pas le traage du texte des requtes. De
ce fait, si log_duration est activ (on) et que log_min_duration_statement a une valeur positive,
toutes les dures sont traces mais le texte de la requte n'est inclus que pour les instructions qui dpassent la
limite. Ce comportement peut tre utile pour rcuprer des statistiques sur les installations forte charge.
log_error_verbosity (enum)
Contrle la quantit de dtails crit dans les traces pour chaque message trac. Les valeurs valides sont TERSE, DEFAULT et
VERBOSE, chacun ajoutant plus de champs aux messages affichs. TERSE exclut des traces les informations de niveau DETAIL, HINT, QUERY et CONTEXT. La sortie VERBOSE inclut le code d'erreur SQLSTATE (voir aussi Annexe A, Codes
d'erreurs de PostgreSQL), le nom du code source, le nom de la fonction et le numro de la ligne qui a gnr l'erreur. Seuls
les superutilisateurs peuvent modifier ce paramtre.
log_hostname (boolean)
Par dfaut, les traces de connexion n'affichent que l'adresse IP de l'hte se connectant. Activer ce paramtre permet de tracer
347
Configuration du serveur
aussi le nom de l'hte. En fonction de la configuration de la rsolution de nom d'hte, les performances peuvent tre pnalises. Ce paramtre ne peut tre configur que dans le fichier postgresql.conf ou indiqu sur la ligne de commande.
log_line_prefix (string)
Il s'agit d'une chane de style printf affiche au dbut de chaque ligne de trace. Les caractres % dbutent des squences
d'chappement qui sont remplaces avec l'information de statut dcrite ci-dessous. Les chappement non reconnus sont
ignors. Les autres caractres sont copis directement dans la trace. Certains chappements ne sont reconnus que par les processus de session et ne s'appliquent pas aux processus en tche de fond comme le processus serveur principal. Ce paramtre
ne peut tre configur que dans le fichier postgresql.conf ou indiqu sur la ligne de commande. La valeur par dfaut est
une chane vide.
chappement
Produit
Session seule
%a
Nom de l'application
yes
%u
Nom de l'utilisateur
oui
%d
oui
%r
oui
%h
yes
%p
ID du processus
non
%t
non
%m
non
%i
oui
%e
no
%c
non
%l
non
%s
oui
%v
no
%x
non
%q
Ne produit aucune sortie, mais indique aux autres processus de stopper cet endroit non
de la chane. Ignor par les processus de session.
%%
non
L'chappement %c affiche un identifiant de session quasi-unique constitu de deux nombres hexadcimaux sur quatre octets
(sans les zros initiaux) et spars par un point. Les nombres reprsentent l'heure de lancement du processus et l'identifiant du
processus, %c peut donc aussi tre utilis comme une manire de raccourcir l'affichage de ces lments. Par exemple, pour
gnrer l'identifiant de session partir de pg_stat_activity, utilisez cette requte :
SELECT to_hex(EXTRACT(EPOCH FROM backend_start)::integer) || '.' ||
to_hex(procpid)
FROM pg_stat_activity;
Astuce
Si log_line_prefix est diffrent d'une chane vide, il est intressant d'ajouter une espace en fin de chane
pour crer une sparation visuelle avec le reste de la ligne. Un caractre de ponctuation peut aussi tre utilis.
Astuce
syslog produit ses propres informations d'horodatage et d'identifiant du processus. Ces chappements n'ont
donc que peu d'intrt avec syslog.
log_lock_waits (boolean)
Contrle si une trace applicative est crite quand une session attend plus longtemps que deadlock_timeout pour acqurir un
verrou. Ceci est utile pour dterminer si les attentes de verrous sont la cause des pertes de performance. Dsactiv (off) par
348
Configuration du serveur
dfaut.
log_statement (enum)
Contrle les instructions SQL tracer. Les valeurs valides sont none (off), ddl, mod et all (toutes les instructions). ddl
trace toutes les commandes de dfinition comme CREATE, ALTER et DROP. mod trace toutes les instructions ddl ainsi
que les instructions de modification de donnes INSERT, UPDATE, DELETE, TRUNCATE et COPY FROM. Les instructions PREPARE, EXECUTE et EXPLAIN ANALYZE sont aussi traces si la commande qui les contient est d'un type
appropri. Pour les clients utilisant le protocole de requtage tendu, la trace survient quand un message Execute est reu et
les valeurs des paramtres de Bind sont incluses (avec doublement de tout guillemet simple embarqu).
La valeur par dfaut est none. Seuls les superutilisateurs peuvent changer ce paramtrage.
Note
Les instructions qui contiennent de simples erreurs de syntaxe ne sont pas traces mme si log_statement
est positionn all car la trace n'est mise qu'aprs qu'une analyse basique soit ralise pour dterminer le
type d'instruction. Dans le cas du protocole de requtage tendu, ce paramtre ne trace pas les instructions qui
chouent avant la phase Execute (c'est--dire pendant l'analyse et la planification).
log_min_error_statement doit tre positionn ERROR pour tracer ce type d'instructions.
log_temp_files (integer)
Contrle l'criture de traces sur l'utilisation des fichiers temporaires (noms et tailles). Les fichiers temporaires peuvent tre
crs pour des tris, des hachages et des rsultats temporaires de requte. Une entre de journal est gnre pour chaque fichier
temporaire au moment ou il est effac. Zro implique une trace des informations sur tous les fichiers temporaires alors qu'une
valeur positive ne trace que les fichiers dont la taille est suprieure ou gale au nombre indiqu (en kilo-octets). La valeur par
dfaut est -1, ce qui a pour effet de dsactiver les traces. Seuls les superutilisateurs peuvent modifier ce paramtre.
log_timezone (string)
Configure le fuseau horaire utilis par l'horodatage des traces. Contrairement timezone, cette valeur est valable pour le cluster complet, de faon ce que toutes les sessions utilisent le mme. Si ce paramtre n'est pas explicitement configur, le serveur initialise cette variable avec le fuseau horaire indiqu par l'environnement systme. Voir Section 8.5.3, Fuseaux horaires pour plus d'informations. Ce paramtre ne peut tre configur que dans le fichier postgresql.conf ou indiqu
sur la ligne de commande.
Configuration du serveur
message text,
detail text,
hint text,
internal_query text,
internal_query_pos integer,
context text,
query text,
query_pos integer,
location text,
application_name text,
PRIMARY KEY (session_id, session_line_num)
);
Pour importer un journal dans cette table, on utilise la commande COPY FROM :
COPY postgres_log FROM '/chemin/complet/vers/le/logfile.csv' WITH csv;
Quelques conseils pour simplifier et automatiser l'import des journaux CVS :
1. configurer log_filename et log_rotation_age pour fournir un schma de nommage cohrent et prvisible des journaux. Cela permet de prdire le nom du fichier et le moment o il sera complet (et donc prt tre import) ;
2. initialiser log_rotation_size 0 pour dsactiver la rotation par taille compte, car elle rend plus difficile la prvision du
nom du journal ;
3. positionner log_truncate_on_rotation on pour que les donnes anciennes ne soient pas mlanges aux nouvelles
dans le mme fichier ;
4. la dfinition de la table ci-dessus inclut une cl primaire. C'est utile pour se protger de l'import accidentel de la mme information plusieurs reprises. La commande COPY valide toutes les donnes qu'elle importe en une fois. Toute erreur annule donc
l'import complet. Si un journal incomplet est import et qu'il est de nouveau import lorsque le fichier est complet, la violation
de la cl primaire cause un chec de l'import. Il faut attendre que le journal soit complet et ferm avant de l'importer. Cette procdure protge aussi de l'import accidentel d'une ligne partiellement crite, qui causerait aussi un chec de COPY.
350
Configuration du serveur
Note
Les fonctions en langage SQL qui sont assez simples pour tre inlined , c'est dire substitues dans le code
de la requte appelante, ne seront pas suivies, quelle que soit la valeur de ce paramtre.
update_process_title (boolean)
Active la mise jour du titre du processus chaque fois qu'une nouvelle commande SQL est reue par le serveur. Le titre du
processus est visible typiquement avec la commande ps sur Unix ou en utilisant l'explorateur de processus sur Windows.
Seuls les superutilisateurs peuvent modifier ce paramtre.
stats_temp_directory (string)
Prcise le rpertoire dans lequel stocker les donnes temporaires de statistiques. Cela peut tre un chemin relatif au rpertoire
de donnes ou un chemin absolu. La valeur par dfaut est pg_stat_tmp. Faire pointer ceci vers un systme de fichiers mmoire diminuera les entres/sorties physiques et peut amliorer les performances. Ce paramtre ne peut tre positionn que
dans le fichier postgresql.conf ou sur la ligne de commande.
log_parser_stats
(boolean),
log_planner_stats
(boolean),
crivent, pour chaque requte, les statistiques de performance du module respectif dans les traces du serveur. C'est un outil de
profilage trs simpliste, similaire aux possibilits de l'appel getrusage() du systme d'exploitation Unix.
log_statement_stats rapporte les statistiques d'instructions globales, tandis que les autres fournissent un rapport par
module. log_statement_stats ne peut pas tre activ conjointement une option de module. Par dfaut, toutes ces options sont dsactives. Seuls les superutilisateurs peuvent modifier ces paramtres.
Configuration du serveur
Indique le nombre minimum de lignes mises jour ou supprimes ncessaire pour dclencher un VACUUM sur une table. La
valeur par dfaut est de 50 lignes. Ce paramtre ne peut tre configur que dans le fichier postgresql.conf ou indiqu
sur la ligne de commande. Il est possible de surcharger ce paramtre pour toute table en modifiant les paramtres de stockage.
autovacuum_analyze_threshold (integer)
Indique le nombre minimum de lignes insres, mises jour ou supprimes ncessaire pour dclencher un ANALYZE sur
une table. La valeur par dfaut est de 50 lignes. Ce paramtre ne peut tre configur que dans le fichier postgresql.conf
ou indiqu sur la ligne de commande. Il est possible de surcharger ce paramtre pour toute table en modifiant les paramtres
de stockage.
autovacuum_vacuum_scale_factor (floating point)
Indique la fraction de taille de la table ajouter autovacuum_vacuum_threshold pour dcider du moment auquel dclencher un VACUUM. La valeur par dfaut est 0.2 (20 % de la taille de la table). Ce paramtre ne peut tre configur que
dans le fichier postgresql.conf ou indiqu sur la ligne de commande. Il est possible de surcharger ce paramtre pour
toute table en modifiant les paramtres de stockage.
autovacuum_analyze_scale_factor (floating point)
Indique la fraction de taille de la table ajouter autovacuum_analyze_threshold pour dcider du moment auquel
dclencher une commande ANALYZE. La valeur par dfaut est 0.1 (10 % de la taille de la table). Ce paramtre ne peut tre
configur que dans le fichier postgresql.conf ou indiqu sur la ligne de commande. Il est possible de surcharger ce paramtre pour toute table en modifiant les paramtres de stockage.
autovacuum_freeze_max_age (integer)
Indique l'ge maximum (en transactions) que le champ pg_class.relfrozenxid d'une table peut atteindre avant qu'une
opration VACUUM ne soit force pour empcher la rinitialisation de l'ID de transaction sur cette table. Le systme lance
les processus autovacuum pour viter ce bouclage mme si l'autovacuum est dsactiv.
L'opration VACUUM supprime aussi les anciens fichiers du sous-rpertoire pg_clog, ce qui explique pourquoi la valeur
par dfaut est relativement basse (200 millions de transactions). Ce paramtre n'est lu qu'au dmarrage du serveur, mais il
peut tre diminu pour toute table en modifiant les paramtres de stockage. Pour plus d'informations, voir Section 23.1.4,
viter les cycles des identifiants de transactions .
autovacuum_vacuum_cost_delay (integer)
Indique la valeur du cot de dlai utilise dans les oprations de VACUUM. Si -1 est indiqu, la valeur habituelle de vacuum_cost_delay est utilise. La valeur par dfaut est 20 millisecondes. Ce paramtre ne peut tre configur que dans le fichier postgresql.conf ou indiqu sur la ligne de commande. Il est possible de le surcharger pour toute table en modifiant les paramtres de stockage.
autovacuum_vacuum_cost_limit (integer)
Indique la valeur de cot limite utilise dans les oprations de VACUUM automatiques. Si -1 est indiqu (valeur par dfaut),
la valeur courante de vacuum_cost_limit est utilise. La valeur est distribue proportionnellement entre les processus autovacuum en cours d'excution, s'il y en a plus d'un, de sorte que la somme des limites de chaque processus ne dpasse jamis la limite de cette variable. Ce paramtre ne peut tre configur que dans le fichier postgresql.conf ou indiqu sur la ligne
de commande. Il est possible de le surcharger pour toute tableen modifiant les paramtres de stockage.
Configuration du serveur
n, il est alors parcouru dans l'ordre indiqu. Dans le cas contraire, il est parcouru avant tout autre lment du chemin.
De mme, le schma des tables temporaires, pg_temp_nnn, s'il existe, est toujours parcouru. Il peut tre explicitement ajout au chemin l'aide de l'alias pg_temp. S'il n'en fait pas partie, la recherche commence par lui (avant mme
pg_catalog). Nanmoins, seuls les noms de relation (table, vue, squence, etc.) et de type de donnes sont recherchs dans
le schma temporaire. Aucune fonction et aucun oprateur n'y est jamais recherch.
Lorsque des objets sont crs sans prcision de schma cible particulier, ils sont placs dans le premier schma list dans le
chemin de recherche. Une erreur est rapporte si le chemin de recherche est vide.
La valeur par dfaut de ce paramtre est '"$user", public' (la deuxime partie est ignore s'il n'existe pas de schma
nomm public). Elle permet l'utilisation partage d'une base de donnes (dans laquelle aucun utilisateur n'a de schma priv et tous partagent l'utilisation de public), les schmas privs d'utilisateur ainsi qu'une combinaison de ces deux modes.
D'autres effets peuvent tre obtenus en modifiant le chemin de recherche par dfaut, globalement ou par utilisateur.
La valeur courante relle du chemin de recherche peut tre examine via la fonction SQL current_schemas() (voir Section 9.23, Fonctions d'informations systme ). Elle n'est pas identique la valeur de search_path car current_schemas affiche la faon dont les requtes apparaissant dans search_path sont rsolues.
Pour plus d'informations sur la gestion des schmas, voir la Section 5.7, Schmas .
default_tablespace (string)
Cette variable indique le tablespace par dfaut dans lequel sont crs les objets (tables et index) quand une commande
CREATE ne l'explicite pas.
La valeur est soit le nom d'un tablespace soit une chane vide pour indiquer l'utilisation du tablespace par dfaut de la base de
donnes courante. Si la valeur ne correspond pas au nom d'un tablespace existant, PostgreSQL utilise automatiquement le
tablespace par dfaut de la base de donnes courante. Si un tablespace diffrent de celui par dfaut est indiqu, l'utilisateur
doit avoir le droit CREATE. Dans le cas contraire, la tentative de cration chouera.
Cette variable n'est pas utilise pour les tables temporaires ; pour elles, temp_tablespaces est consult la place.
Cette variable n'est pas utilise non plus lors de la cration de bases de donnes. Par dfaut, une nouvelle base de donnes hrite sa configuration de tablespace de la base de donnes modle qui sert de copie.
Pour plus d'informations sur les tablespaces, voir Section 21.6, Tablespaces .
temp_tablespaces (string)
Cette variable indique le (ou les) tablespace(s) dans le(s)quel(s) crer les objets temporaires (tables temporaires et index sur
des tables temporaires) quand une commande CREATE n'en explicite pas. Les fichiers temporaires crs par les tris de gros
ensembles de donnes sont aussi crs dans ce tablespace.
Cette valeur est une liste de noms de tablespaces. Quand cette liste contient plus d'un nom, PostgreSQL choisit un membre
de la liste au hasard chaque fois qu'un objet temporaire doit tre cr. En revanche, dans une transaction, les objets temporaires crs successivement sont placs dans les tablespaces successifs de la liste. Si l'lment slectionn de la liste est une
chane vide, PostgreSQL utilise automatiquement le tablespace par dfaut de la base en cours.
Si temp_tablespaces est configur interactivement, l'indication d'un tablespace inexistant est une erreur. Il en est de
mme si l'utilisateur n'a pas le droit CREATE sur le tablespace indiqu. Nanmoins, lors de l'utilisation d'une valeur prcdemment configure, les tablespaces qui n'existent pas sont ignors comme le sont les tablespaces pour lesquels l'utilisateur
n'a pas le droit CREATE. Cette rgle s'applique, en particulier, lors de l'utilisation d'une valeur configure dans le fichier
postgresql.conf.
La valeur par dfaut est une chane vide. De ce fait, tous les objets temporaires sont crs dans le tablespace par dfaut de la
base de donnes courante.
Voir aussi default_tablespace.
check_function_bodies (boolean)
Ce paramtre est habituellement positionn on. Positionn off, il dsactive la validation du corps de la fonction lors de
CREATE FUNCTION(7). Dsactiver la validation vite les effets de bord du processus de validation et vite les faux positifs
ds aux problmes, par exemple les rfrences. Configurer ce paramtre off avant de charger les fonctions la place des
autres utilisateurs ; pg_dump le fait automatiquement.
default_transaction_isolation (enum)
Chaque transaction SQL a un niveau d'isolation. Celui-ci peut tre read uncommitted , read committed , repeatable
read ou serializable . Ce paramtre contrle le niveau d'isolation par dfaut de chaque nouvelle transaction. La valeur par
dfaut est read committed .
353
Configuration du serveur
Consulter le Chapitre 13, Contrle d'accs simultan et SET TRANSACTION(7) pour plus d'informations.
default_transaction_read_only (boolean)
Une transaction SQL en lecture seule ne peut pas modifier les tables permanentes. Ce paramtre contrle le statut de lecture
seule par dfaut de chaque nouvelle transaction. La valeur par dfaut est off (lecture/criture).
Consulter SET TRANSACTION(7) pour plus d'informations.
default_transaction_deferrable (boolean)
Lors du fonctionnement avec le niveau d'isolation serializable, une transaction SQL en lecture seule et diffrable peut
subir un certain dlai avant d'tre autorise continuer. Nanmoins, une fois qu'elle a commenc son excution, elle n'encourt
aucun des frais habituels ncessaires pour assurer sa sriabilit. Donc le code de srialisation n'a aucune raison de forcer son
annulation cause de mises jour concurrentes, ce qui rend cette option trs intressante pour les longues transactions en lecture seule.
Ce paramtre contrle le statut diffrable par dfaut de chaque nouvelle transaction. Il n'a actuellement aucun effet sur les
transactions en lecture/criture ou celles oprant des niveaux d'isolation infrieurs serializable. La valeur par dfaut
est off.
Consultez SET TRANSACTION(7) pour plus d'informations.
session_replication_role (enum)
Contrle l'excution des triggers et rgles relatifs la rplication pour la session en cours. Seul un superutilisateur peut configurer cette variable. Sa modification rsulte en l'annulation de tout plan de requte prcdemment mis en cache. Les valeurs
possibles sont origin (la valeur par dfaut), replica et local. Voir ALTER TABLE(7) pour plus d'informations.
statement_timeout (integer)
Interrompt toute instruction qui dure plus longtemps que ce nombre (indiqu en millisecondes). Le temps est dcompt partir du moment o la commande en provenance du client arrive sur le serveur. Si log_min_error_statement est configur ERROR, ou plus bas, l'instruction en cause est trace. La valeur zro (par dfaut) dsactive le dcompte.
Il n'est pas recommand de configurer statement_timeout dans postgresql.conf car cela affecte toutes les sessions.
vacuum_freeze_table_age (integer)
VACUUM effectuera un parcours complet de la table si le champ pg_class.relfrozenxid de la table a atteint l'ge spcifi par ce paramtre. La valeur par dfaut est 150 millions de transactions. Mme si les utilisateurs peuvent positionner cette
valeur n'importe quelle valeur comprise entre zro et 1 milliard, VACUUM limitera silencieusement la valeur effective
95% de autovacuum_freeze_max_age, afin qu'un vacuum priodique manuel ait une chance de s'excuter avant un autovacuum anti-bouclage ne soit lanc pour la table. Pour plus d'informations voyez Section 23.1.4, viter les cycles des identifiants de transactions .
vacuum_freeze_min_age (integer)
Indique l'ge limite (en transactions) que VACUUM doit utiliser pour dcider de remplacer les ID de transaction par FrozenXID lors du parcours d'une table. La valeur par dfaut est 50 millions. Bien que les utilisateurs puissent configurer une
valeur quelconque comprise entre zro et 1 milliard, VACUUM limite silencieusement la valeur relle la moiti de la valeur
de autovacuum_freeze_max_age afin que la valeur entre deux autovacuums forcs ne soit pas draisonnablement courte. Pour
plus d'informations, voir Section 23.1.4, viter les cycles des identifiants de transactions .
bytea_output (enum)
Configure le format de sortie pour les valeurs de type bytea. Les valeurs valides sont hex (la valeur par dfaut) et escape
(le format traditionnel de PostgreSQL). Voir Section 8.4, Types de donnes binaires pour plus d'informations. Le type bytea accepte toujours les deux formats en entre, quelque soit la valeur de cette configuration.
xmlbinary (enum)
Dfinit la manire de coder les valeurs binaires en XML. Ceci s'applique, par exemple, quand les valeurs bytea sont converties en XML par les fonctions xmlelement et xmlforest. Les valeurs possibles sont base64 et hex, qui sont toutes les
deux dfinies dans le standard XML Schema. La valeur par dfaut est base64. Pour plus d'informations sur les fonctions relatives XML, voir Section 9.14, Fonctions XML .
Le choix effectif de cette valeur est une affaire de sensibilit, la seule restriction provenant des applications clientes. Les deux
mthodes supportent toutes les valeurs possibles, et ce bien que le codage hexadcimal soit un peu plus grand que le codage
en base64.
xmloption (enum)
354
Configuration du serveur
Dfinit si DOCUMENT ou CONTENT est implicite lors de la conversion entre XML et valeurs chanes de caractres. Voir Section 8.13, Type XML pour la description. Les valeurs valides sont DOCUMENT et CONTENT. La valeur par dfaut est
CONTENT.
D'aprs le standard SQL, la commande pour configurer cette option est :
SET XML OPTION { DOCUMENT | CONTENT };
Cette syntaxe est aussi disponible dans PostgreSQL.
Configuration du serveur
Seuls les superutilisateurs peuvent modifier ce paramtre car il affecte aussi bien les messages envoys dans les traces du serveur que ceux envoys au client.
lc_monetary (string)
Initialise la locale utiliser pour le formatage des montants montaires (pour la famille de fonctions to_char, par exemple).
Les valeurs acceptables dpendent du systme ; voir la Section 22.1, Support des locales pour plus d'informations. Si cette
variable est initialise une chane vide (valeur par dfaut), alors la valeur est hrite de l'environnement d'excution du serveur, et une valeur incorrecte pourrait dgrader la lisibilit des traces du serveur.
lc_numeric (string)
Initialise la locale utiliser pour le formatage des nombres (pour la famille de fonctions to_char, par exemple). Les valeurs
acceptables dpendent du systme ; voir la Section 22.1, Support des locales pour plus d'informations. Si cette variable est
initialise une chane vide (valeur par dfaut), alors la valeur est hrite de l'environnement d'excution du serveur.
lc_time (string)
Initialise la locale utiliser pour le formatage des valeurs de date et d'heure, par exemple avec la famille de fonctions
to_char. Les valeurs acceptables dpendent du systme ; voir la Section 22.1, Support des locales pour plus
d'informations. Si cette variable est initialise une chane vide (valeur par dfaut), alors la valeur est hrite de
l'environnement d'excution du serveur.
default_text_search_config (string)
Slectionne la configuration de recherche plein texte utilise par les variantes des fonctions de recherche plein texte qui n'ont
pas d'argument explicite pour prciser la configuration. Voir Chapitre 12, Recherche plein texte pour plus d'informations. La
valeur par dfaut est pg_catalog.simple mais initdb initialise le fichier de configuration avec une valeur qui correspond
la locale choisie pour lc_ctype s'il est possible d'identifier une configuration correspondant la locale.
Configuration du serveur
bases de donnes de s'assurer que seules des bibliothques saines s'y trouvent.) Les entres dans local_preload_libraries peuvent indiquer ce rpertoire explicitement, par exemple $libdir/plugins/ma_lib,
ou n'indiquer que le nom de la bibliothque -- ma_lib a le mme effet que $libdir/plugins/ma_lib.
Contrairement shared_preload_libraries, il n'y a pas de gain de performance charger une bibliothque au dmarrage d'une
session ou sa premire utilisation. Le but de cette fonctionnalit est d'autoriser le chargement de bibliothques de dbogage
ou de mesure de performance dans certaines sessions spcifiques sans commande LOAD explicite. Par exemple, le dbogage
peut tre activ pour toutes les sessions d'un nom d'utilisateur donn en configurant ce paramtre avec ALTER ROLE SET.
Si une bibliothque indique n'est pas trouve, la tentative de connexion choue.
Toute bibliothque supporte par PostgreSQL contient un bloc magique qui permet d'en garantir la compatibilit. Pour
cette raison, les bibliothques non PostgreSQL ne peuvent pas tre charges de cette faon.
Configuration du serveur
Configuration du serveur
Ce paramtre contrle si les rfrences de table doivent inclure les tables filles. La valeur par dfaut est on, signifiant que les
tables filles sont incluses (et de ce fait, un suffixe * est suppos par dfaut. Si ce paramtre est dsactiv ( off), les tables
filles ne sont pas inclus (et de ce fait, le prfixe ONLY est ajout). Le standard SQL requiert que les tables filles soient inclues,
donc le paramtrages off n'est pas conforme au standard. Cependant, il est fourni par compatibilit avec les versions PostgreSQL antrieures la 7.1. Voir Section 5.8, L'hritage pour plus d'informations.
Dsactiver sql_allance n'est pas conseill car le comportement induis par cette configuration porte faire beaucoup
d'erreurs. Ceci n'est pas constat lorsque ce paramtre est activ comme le demande le standard SQL. Les discussions sur
l'hritage dans ce manuel supposent gnralement que ce paramtre est configur on.
standard_conforming_strings (boolean)
Contrle si les chanes ordinaires ('...') traitent les antislashs littralement, comme cela est indiqu dans le standard SQL.
partir de PostgreSQL 9.1, ce paramtre est activ par dfaut, donc on (les versions prcdentes avaient off par dfaut). Les applications peuvent vrifier ce paramtre pour dterminer la faon dont elles doivent traiter les chanes littrales.
La prsence de ce paramtre indique aussi que la syntaxe de chane d'chappement (E'...') est supporte. La syntaxe de
chane d'chappement (Section 4.1.2.2, Constantes chane avec des chappements de style C ) doit tre utilise pour les applications traitant les antislashs comme des caractres d'chappement.
synchronize_seqscans (boolean)
Cette variable permet la synchronisation des parcours squentiels de grosses tables pour que les parcours concurrents lisent le
mme bloc peu prs au mme moment, et donc partagent la charge d'entres/sorties. Quand ce paramtre est activ, un parcours peut commencer au milieu de la table, aller jusqu' la fin, puis revenir au dbut pour rcuprer toutes les lignes, ce
qui permet de le synchroniser avec l'activit de parcours dj entams. Il peut en rsulter des modifications non prvisibles
dans l'ordre des lignes renvoyes par les requtes qui n'ont pas de clause ORDER BY. Dsactiver ce paramtre assure un comportement identique aux versions prcdant la 8.3 pour lesquelles un parcours squentiel commence toujours au dbut de la
table. Activ par dfaut (on).
359
Configuration du serveur
Configuration du serveur
Configuration du serveur
Configuration du serveur
Si positionn, gnre des informations propos de tous les verrous en cours quand l'expiration de temps d'attente d'un verrou
mortel se produit.
Ce paramtre n'est disponible que si la macro LOCK_DEBUG a t dfinie quand PostgreSQL a t compil.
log_btree_build_stats (boolean)
Si positionn, trace des statistiques d'utilisation de ressource systme (mmoire et processeur) sur diffrentes oprations Btree.
Ce paramtre n'est disponible que si la macro BTREE_BUILD_STATS a t dfinie quand PostgreSQL a t compil.
wal_debug (boolean)
Si ce paramtre est positionn on, une sortie de dbogage relative aux WAL est mise. Ce paramtre n'est disponible que si
la macro WAL_DEBUG a t dfinie au moment de la compilation de PostgreSQL.
zero_damaged_pages (boolean)
La dtection d'un en_tte de page endommag cause normalement le renvoi d'une erreur par PostgreSQL, annulant du
mme coup la transaction en cours. Activer zero_damaged_pages fait que le systme renvoie un message
d'avertissement, efface la page endommage en mmoire et continue son traitement. Ce comportement dtruit des donnes,
trs exactement toutes les lignes comprises dans la page endommage. Nanmoins, il vous permet de passer l'erreur et de rcuprer les lignes des pages non endommages qui pourraient tre prsentes dans la table. C'est intressant pour rcuprer des
donnes si une corruption est survenue cause d'une erreur logicielle ou matrielle. Vous ne devriez pas activer cette option
sauf si vous avez perdu tout espoir de rcuprer les donnes des pages endommages d'une table. L'effacement des pages n'est
pas vide sur disque donc il est recommand de recrer la table ou l'index avant de dsactiver de nouveau ce paramtre. La
configuration par dfaut est off, et peut seulement tre modifie par un superutilisateur.
Option courte
quivalent
-A x
debug_assertions = x
-B x
shared_buffers = x
-d x
log_min_messages = DEBUGx
-e
datestyle = euro
-F
fsync = off
-h x
listen_addresses = x
-i
listen_addresses = '*'
-k x
unix_socket_directory = x
-l
ssl = on
-N x
max_connections = x
-O
allow_system_table_mods = on
-p x
port = x
-P
ignore_system_indexes = on
-s
log_statement_stats = on
-S x
work_mem = x
-W x
post_auth_delay = x
363
Note
Comme expliqu dans le Chapitre 20, Rles de la base de donnes, PostgreSQL gre les droits par
l'intermdiaire des rles . Dans ce chapitre, le terme utilisateur de bases de donnes est utilis pour signifier
rle disposant du droit LOGIN .
L'authentification est le processus par lequel le serveur de bases de donnes tablit l'identit du client et, par extension, dtermine si l'application client (ou l'utilisateur qui l'utilise) est autorise se connecter avec le nom d'utilisateur de bases de donnes
indiqu.
PostgreSQL offre quantit de mthodes d'authentification diffrentes. La mthode utilise pour authentifier une connexion
client particulire peut tre slectionne d'aprs l'adresse (du client), la base de donnes et l'utilisateur.
Les noms d'utilisateur de bases de donnes sont spars de faon logique des noms d'utilisateur du systme d'exploitation sur lequel tourne le serveur. Si tous les utilisateurs d'un serveur donn ont aussi des comptes sur la machine serveur, il peut tre pertinent d'attribuer aux utilisateurs de bases de donnes des noms qui correspondent ceux des utilisateurs du systme
d'exploitation. Cependant, un serveur qui accepte des connexions distantes peut avoir des utilisateurs de bases de donnes dpourvus de compte correspondant sur le systme d'exploitation. Dans ce cas, aucune correspondance entre les noms n'est ncessaire.
database
database
database
database
database
database
database
user
user
user
user
user
user
user
auth-method [auth-options]
address auth-method [auth-options]
address auth-method [auth-options]
address auth-method [auth-options]
IP-address IP-mask auth-method [auth-options]
IP-address IP-mask auth-method [auth-options]
IP-address IP-mask auth-method [auth-options]
Authentification du client
Note
Les connexions TCP/IP ne sont pas autorises si le serveur n'est pas dmarr avec la valeur approprie du paramtre de configuration listen_addresses. En effet, par dfaut, le serveur n'coute que les connexions TCP/IP en
provenance de l'adresse loopback locale, localhost.
hostssl
Cet enregistrement intercepte les seules tentatives de connexions par TCP/IP qui utilisent le chiffrement SSL.
Pour utiliser cette fonction, le serveur doit tre compil avec le support de SSL. De plus, SSL doit tre activ au dmarrage du
serveur en positionnant le paramtre de configuration ssl (voir la Section 17.9, Connexions tcp/ip scurises avec ssl pour
plus d'informations).
hostnossl
Cet enregistrement a un comportement oppos hostssl : il n'intercepte que les tentatives de connexion qui n'utilisent pas
SSL.
database
Indique les noms des bases de donnes concernes par l'enregistrement. La valeur all indique qu'il concerne toutes les bases
de donnes. Le terme sameuser indique que l'enregistrement concide si la base de donnes demande a le mme nom que
l'utilisateur demand. Le terme samerole indique que l'utilisateur demand doit tre membre du rle portant le mme nom
que la base de donnes demande (samegroup est obsolte bien qu'il soit toujours accept comme criture alternative de
samerole.). La valeur replication indique que l'enregistrement tablit une correspondance si une connexion de rplication est demande (notez que les connexions de rplication ne ciblent pas une base de donnes particulire). Dans tous les
autres cas, c'est le nom d'une base de donnes particulire. Plusieurs noms de base de donnes peuvent tre fournis en les sparant par des virgules. Un fichier contenant des noms de base de donnes peut tre indiqu en faisant prcder le nom du fichier de @.
user
Indique les utilisateurs de bases de donnes auxquels cet enregistrement correspond. La valeur all indique qu'il concerne
tous les utilisateurs. Dans le cas contraire, il s'agit soit du nom d'un utilisateur spcifique de bases de donnes ou d'un nom de
groupe prcd par un + (il n'existe pas de vritable distinction entre les utilisateurs et les groupes dans PostgreSQL ; un +
signifie exactement tablit une correspondance pour tous les rles faisant parti directement ou indirectement de ce rle
alors qu'un nom sans + tablit une correspondance avec ce rle spcifique). Plusieurs noms d'utilisateurs peuvent tre fournis
en les sparant par des virgules. Un fichier contenant des noms d'utilisateurs peut tre indiqu en faisant prcder le nom du
fichier de @.
address
Indique l'adresse IP ou la plage d'adresses IP laquelle correspond cet enregistrement. Ce champ peut contenir soit un nom de
machine (FQDN), soit le suffixe d'un domaine (sous la forme .exemple.com), soit une adresse ou une plage d'adresses IP, soit
enfin l'un des mots-cls mentionns ci-aprs.
Les adresses IP doivent tre crites sous la notation dcimale standard avec une longueur de masque CIDR. La longueur du
masque indique le nombre de bits forts pour lesquels une correspondance doit tre trouve avec l'adresse IP du client. Les bits
de droite doivent valoir zro dans l'adresse IP indique. Il ne doit y avoir aucune espace entre l'adresse IP, le / et la longueur
du masque CIDR.
la place du CIDR-address, vous pouvez crire samehost pour correspondre aux adresses IP du serveur ou samenet
pour correspondre toute adresse du sous-rseau auquel le serveur est directement connect.
Une adresse CIDR (CIDR-address) est typiquement 172.20.143.89/32 pour un hte seul, 172.20.143.0/24
pour un petit rseau ou 10.6.0.0/16 pour un rseau plus grand. 0.0.0.0/0 reprsente toutes les adresses IPv4, et ::/0
reprsente l'ensemble des adresses IPv6. Pour n'indiquer qu'un seul hte, on utilise un masque de 32 pour IPv4 ou 128 pour
IPv6. Dans une adresse rseau, ne pas oublier les zros terminaux.
Une adresse IP indique au format IPv4 concide avec les connexions IPv6 d'adresse correspondante. Par exemple,
127.0.0.1 correspond l'adresse IPv6 ::ffff:127.0.0.1. Une entre donne au format IPv6 correspond uniquement
aux connexions IPv6 mme si l'adresse reprsente est dans le domaine IPv4-vers-IPv6. Les adresses au format IPv6 sont rejetes si la bibliothque systme C ne supporte pas les adresses IPv6.
La valeur all permet de cibler n'importe quelle adresse IP cliente, samehost n'importe quelle adresse IP du serveur ou
samenet pour toute adresse IP faisant partie du mme sous-rseau que le serveur.
365
Authentification du client
Si un nom d'hte est renseign (dans les faits tout ce qui ne correspond pas une adresse ou une plage d'adresses IP, ni un
mot cl, sera trait comme un nom d'hte potentiel), ce nom est compar au rsultat d'une rsolution de nom inverse de
l'adresse IP du client (ou une recherche DNS inverse si un DNS est utilis). Les comparaisons de noms d'htes ne sont pas
sensibles la casse. En cas de correspondance, une nouvelle recherche rcursive de nom sera lance afin de dterminer que le
nom d'hte concorde bel et bien avec l'adresse IP du client. L'enregistrement n'est valid qu'en cas de concordance entre la rsolution inverse et la rsolution rcursive pour l'adresse IP cliente. (Le nom d'hte fourni dans le fichier pg_hba.conf doit
donc correspondre au moins l'une des adresses IP fournies par le mcanisme de rsolution de noms, sinon l'enregistrement
ne sera pas pris en considration. Certains serveurs de noms rseau permettent d'associer une adresse IP de multiples noms
d'htes (alias DNS), mais bien souvent le systme d'exploitation ne retourne qu'un seul nom d'hte lors de la rsolution d'une
adresse IP.)
Un nom d'hte dbutant par un point (.) ciblera le suffixe du nom d'hte du poste client. Du coup, indiquer .exemple.com
correspondra la machine foo.exemple.com (mais pas au client exemple.com).
Lorsque vous spcifiez des noms d'htes dans le fichier pg_hba.conf, vous devez vous assurer que la rsolution de noms
soit raisonnablement rapide. dfaut, il peut tre avantageux de configurer un serveur-cache local pour effectuer la rsolution
de noms, tel que nscd. Vous pouvez galement valider le paramtre de configuration log_hostname afin de retrouver dans
les journaux le nom d'hte du client au lieu de sa simple adresse IP.
diffrentes occasions, des utilisateurs ont demand pourquoi les demandes d'authentification par noms d'htes sont gres
de manire aussi complexe : deux requtes de rsolution du nom d'hte dont une rsolution inverse qui n'est parfois pas
configure ou peut pointer vers un nom d'hte indsirable. Son but premier rside dans l'efficacit de l'authentification : une
tentative de connexion ncessite deux rsolutions de l'adresse du client, et s'il survient un problme de rsolution de nom,
cela devient le problme de ce client particulier. Une hypothtique implmentation alternative ne se basant que sur la seule
rsolution de nom rcursive devrait rsoudre tous les noms d'hte mentionns dans le fichier pg_hba.conf pour chacune
des tentatives de connexion au serveur. Ce qui s'avrerait lent par nature, et dans le cas d'un problme la rsolution d'un
nom d'hte, deviendrait un problme pour tout le monde.
De plus, une rsolution inverse est ncessaire pour implmenter la fonctionnalit de correspondance par suffixe dans la mesure o le nom d'hte du candidat la connexion doit tre connu afin de pouvoir effectuer cette comparaison.
Enfin, cette mthode est couramment adopte par d'autres implmentations du contrle d'accs bas sur les noms d'htes,
tels que le serveur web Apache ou TCP-wrapper.
Ce champ ne concerne que les enregistrements host, hostssl et hostnossl.
IP-address, IP-mask
Ces champs peuvent tre utiliss comme alternative la notation CIDR-address. Au lieu de spcifier la longueur du
masque, le masque rel est indique dans une colonne distincte. Par exemple, 255.0.0.0 reprsente une longueur de
masque CIDR IPv4 de 8, et 255.255.255.255 reprsente une longueur de masque de 32.
Ces champs ne concernent que les enregistrements host, hostssl et hostnossl.
auth-method
Indique la mthode d'authentification utiliser lors d'une connexion via cet enregistrement. Les choix possibles sont rsums
ici ; les dtails se trouvent dans la Section 19.3, Mthodes d'authentification .
trust
Autorise la connexion sans condition. Cette mthode permet quiconque peut se connecter au serveur de bases de donnes de
s'enregistrer sous n'importe quel utilisateur PostgreSQL de son choix sans mot de passe ou autre authentification. Voir la
Section 19.3.1, Authentification trust pour les dtails.
reject
Rejette la connexion sans condition. Ce cas est utile pour filtrer certains htes d'un groupe, par exemple une ligne reject peut bloquer la connexion d'un hte spcifique alors qu'une ligne plus bas permettra aux autres htes de se connecter
partir d'un rseau spcifique.
md5
Demande au client de fournir un mot de passe chiffr MD5 pour l'authentification. Voir la Section 19.3.2, Authentification
par mot de passe pour les dtails.
password
Requiert que le client fournisse un mot de passe non chiffr pour l'authentification. Comme le mot de passe est envoy en
clair sur le rseau, ceci ne doit pas tre utilis sur des rseaux non dignes de confiance. Voir la Section 19.3.2,
Authentification par mot de passe pour les dtails.
366
Authentification du client
gss
Utilise GSSAPI pour authentifier l'utilisateur. Disponible uniquement pour les connexions TCP/IP. Voir Section 19.3.3,
Authentification GSSAPI pour les dtails.
sspi
Utilise SSPI pour authentifier l'utilisateur. Disponible uniquement sur Windows. Voir Section 19.3.4, Authentification SSPI pour plus de dtails.
krb5
Utilise Kerberos V5 pour authentifier l'utilisateur. Ceci n'est disponible que pour les connexions TCP/IP. Voir la Section 19.3.5, Authentification Kerberos pour les dtails.
ident
Rcupre le nom de l'utilisateur en contactant le serveur d'identification sur le poste client, et vrifie que cela correspond au
nom d'utilisateur de base de donnes demand. L'authentification Ident ne peut tre utilise que pour les connexions TCP/IP.
Pour les connexions locales, elle sera remplace par l'authentification peer.
peer
Rcupre le nom d'utilisateur identifi par le systme d'exploitation du client et vrifie que cela correspond au nom
d'utilisateur de base de donnes demand. Peer ne peut tre utilise que pour les connexions locales. Voir la Section 19.3.7,
Peer Authentication ci-dessous pour les details.
ldap
Authentification par un serveur LDAP. Voir la Section 19.3.8, Authentification LDAP pour les dtails.
radius
Authentification par un serveur RADIUS. Voir Section 19.3.9, Authentification RADIUS pour les dtails.
cert
Authentification par certificat client SSL. Voir Section 19.3.10, Authentification de certificat pour les dtails.
pam
Authentification par les Pluggable Authentification Modules (PAM) fournis par le systme d'exploitation. Voir la Section 19.3.11, Authentification PAM pour les dtails.
auth-options
Aprs le champ auth-method, on peut trouver des champs de la forme nom=valeur qui spcifient des options pour la
mthode d'authentification. Les dtails sur les options disponibles apparaissent ci-dessous pour chaque mthode
d'authentification.
Les fichiers inclus par les constructions @ sont lus comme des listes de noms, spars soit par des espaces soit par des virgules.
Les commentaires sont introduits par le caractre # comme dans pg_hba.conf, et les constructions @ imbriques sont autorises. moins que le nom du fichier qui suit @ ne soit un chemin absolu, il est suppos relatif au rpertoire contenant le fichier le
rfrenant.
Les enregistrements du fichier pg_hba.conf sont examins squentiellement chaque tentative de connexion, l'ordre des enregistrements est donc significatif. Gnralement, les premiers enregistrements ont des paramtres d'interception de connexions
stricts et des mthodes d'authentification peu restrictives tandis que les enregistrements suivants ont des paramtres plus larges et
des mthodes d'authentification plus fortes. Par exemple, on peut souhaiter utiliser l'authentification trust pour les connexions
TCP/IP locales mais demander un mot de passe pour les connexion TCP/IP distantes. Dans ce cas, l'enregistrement prcisant une
authentification trust pour les connexions issues de 127.0.0.1 apparat avant un enregistrement indiquant une authentification
par mot de passe pour une plage plus tendue d'adresses IP client autorises.
Le fichier pg_hba.conf est lu au dmarrage et lorsque le processus serveur principal reoit un signal SIGHUP. Si le fichier est
dit sur un systme actif, on peut signaler au postmaster (en utilisant pg_ctl reload ou kill -HUP) de relire le fichier.
Astuce
Pour se connecter une base particulire, un utilisateur doit non seulement passer les vrifications de
pg_hba.conf mais doit galement avoir le droit CONNECT sur cette base. Pour contrler qui peut se connecter
quelles bases, il est en gnral plus facile de le faire en donnant ou retirant le privilge CONNECT plutt qu'en
plaant des rgles dans le fichier pg_hba.conf.
Quelques exemples d'entres de pg_hba.conf sont donns ci-dessous dans l'Exemple 19.1, Exemple d'entres de
pg_hba.conf . Voir la section suivante pour les dtails des mthodes d'authentification.
Exemple 19.1. Exemple d'entres de pg_hba.conf
367
Authentification du client
USER
all
ADDRESS
::1/128
METHOD
trust
METHOD
trust
Authentification du client
/^(.*)@mydomain\.com$
/^(.*)@otherdomain\.com$
\1
guest
supprimeront la partie domaine pour les utilisateurs de systme d'exploitation dont le nom finissent avec @mydomain.com, et
permettront aux utilisateurs dont le nom se termine avec @otherdomain.com de se connecter en tant que guest.
Astuce
Gardez en tte que, par dfaut, une expression rationnelle peut correspondre une petite partie d'une chane. Il est
369
Authentification du client
gnralement conseill d'utiliser les jokers ^ et $, comme indiqu dans l'exemple ci-dessus, pour forcer une correspondance sur le nom entier de l'utilisateur du systme d'exploitation.
Le fichier pg_ident.conf est lu au dmarrage et quand le processus principal du serveur reoit un signal SIGHUP. Si vous
ditez le fichier sur un systme en cours d'utilisation, vous devez notifier le postmaster (en utilisantpg_ctl reload ou kill
-HUP) pour lui faire relire le fichier.
Un fichier pg_ident.conf qui pourrait tre utilis avec le fichier pg_hba.conf de Exemple 19.1, Exemple d'entres de
pg_hba.conf est montr en Exemple 19.2, Un exemple de fichier pg_ident.conf . Dans cet exemple, toute personne
connecte sur une machine du rseau 192.168 qui n'a pas le nom d'utilisateur du systme d'exploitation bryanh, ann, ou robert verrait son accs refus. L'utilisateur Unix robert ne verrait son accs autoris que lorsqu'il essaye de se connecter en tant
qu'utilisateur PostgreSQL bob, pas en tant que robert ou qui que ce soit d'autre. ann ne serait autorise se connecter qu'en
tant que ann. L'utilisateur bryanh aurait le droit de se connecter soit en tant que bryanh, soit en tant que guest1.
Exemple 19.2. Un exemple de fichier pg_ident.conf
# MAPNAME
SYSTEM-USERNAME
PG-USERNAME
omicron
bryanh
bryanh
omicron
ann
ann
# bob has user name robert on these machines
omicron
robert
bob
# bryanh can also connect as guest1
omicron
bryanh
guest1
Authentification du client
Les mots de passe PostgreSQL sont distincts des mots de passe du systme d'exploitation. Le mot de passe de chaque utilisateur
est enregistr dans le catalogue systme pg_authid. Ils peuvent tre grs avec les commandes SQL CREATE USER(7) et ALTER ROLE(7). Ainsi, par exemple, CREATE USER foo WITH PASSWORD 'secret';. Si aucun mot de passe n'est enregistr pour un utilisateur, le mot de passe enregistr est nul et l'authentification par mot de passe choue systmatiquement pour
cet utilisateur.
Authentification du client
Note
L'authentification Kerberos native est obsolte et ne doit tre utilise que pour assurer la compatibilit ascendante.
Les nouvelles installations et les mises jour utiliseront prfrentiellement le standard d'authentification de
l'industrie, GSSAPI (voir Section 19.3.3, Authentification GSSAPI ).
Kerberos est un systme d'authentification scurise de standard industriel destin l'informatique distribue sur un rseau public. La description de Kerberos dpasse les objectifs de ce document mme dans les gnralits, c'est assez complexe (bien
que puissant). La FAQ Kerberos ou la page Kerberos du MIT sont un bon point de dpart l'exploration. Il existe plusieurs
sources de distribution Kerberos. Kerberos fournit une authentification scurise mais ne chiffre pas les requtes ou les donnes passes sur le rseau ; pour cela, SSL doit tre utilis.
PostgreSQL supporte Kerberos version 5. Le support de Kerberos doit tre activ lors de la construction de PostgreSQL ; voir
le Chapitre 15, Procdure d'installation de PostgreSQL du code source pour plus d'informations.
PostgreSQL opre comme un service Kerberos normal. Le nom du service principal est nomservice/nomhte@domaine.
nomservice peut tre configur du ct serveur en utilisant le paramtre de configuration krb_srvname (voir aussi Section 31.1,
Fonctions de contrle de connexion la base de donnes ). La valeur par dfaut l'installation, postgres, peut tre modifie
lors de la construction avec ./configure --with-krb-srvnam=quelquechose. Dans la plupart des environnements, il
est inutile de modifier cette valeur. Nanmoins, cela devient ncessaire pour supporter plusieurs installations de PostgreSQL sur
le mme hte. Quelques implantations de Kerberos peuvent imposer un nom de service diffrent, comme Microsoft Active Directory qui rclame un nom du service en majuscules (POSTGRES).
nom_hote est le nom de l'hte pleinement qualifi (fully qualified host name) de la machine serveur. Le domaine du service
principal (client) est le domaine prfr du serveur.
Les principaux (clients) doivent contenir le nom de leur utilisateur PostgreSQL comme premier composant, nomutilisateurpg@domaine, par exemple. Sinon, vous pouvez utiliser une correspondance du nom d'utilisateur qui tablit la correspondance partir du premier composant du nom du principal vers le nom d'utilisateur de la base de donnes Par dfaut, le domaine du
client n'est pas vrifi par PostgreSQL. Si l'authentification inter-domaine (cross-realm) est active, on utilise le paramtre
krb_realm ou activer include_realm et utiliser la correspondance du nom d'utilisateur pour vrifier le royaume.
Le fichier de cls du serveur doit tre lisible (et de prfrence uniquement lisible) par le compte serveur PostgreSQL (voir aussi
la Section 17.1, Compte utilisateur PostgreSQL ). L'emplacement du fichier de cls est indiqu grce au paramtre de configuration krb_server_keyfile fourni l'excution. La valeur par dfaut est /etc/srvtab, si Kerberos 4 est utilis, et /
usr/local/pgsql/etc/krb5.keytab sinon (ou tout autre rpertoire indiqu comme sysconfdir la compilation).
Le fichier de cls est engendr par le logiciel Kerberos ; voir la documentation de Kerberos pour les dtails. L'exemple suivant
correspond des implantations de Kerberos 5 compatibles avec MIT :
kadmin% ank -randkey postgres/server.my.domain.org
kadmin% ktadd -k krb5.keytab postgres/server.my.domain.org
Lors de la connexion la base de donnes, il faut s'assurer de possder un ticket pour le principal correspondant au nom
d'utilisateur de base de donnes souhait. Par exemple, pour le nom d'utilisateur PostgreSQL fred, le principal
fred@EXAMPLE.COM pourrait se connecter. Pour autoriser aussi le principal fred/users.example.com@EXAMPLE.COM,
utiliser une correspondance de nom d'utilisateur, comme dcrit dans Section 19.2, Correspondances d'utilisateurs .
Si mod_auth_kerb et mod_perl sont utiliss sur le serveur web Apache, AuthType KerberosV5SaveCredentials peut
tre utilis avec un script mod_perl. Cela fournit un accs sr aux bases de donnes, sans demander de mot de passe supplmentaire.
Les options de configuration suivantes sont supportes pour Kerberos :
map
Permet la mise en correspondance entre les noms systme et base de donnes. Voir Section 19.2, Correspondances
d'utilisateurs pour plus de dtails.
include_realm
Si configur 1, le nom du royaume provenant du principal de l'utilisateur authentifi est inclus dans le nom de l'utilisateur
systme qui est pass au systme de correspondance d'utilisateur (Section 19.2, Correspondances d'utilisateurs ). Ceci est
utile pour grer des utilisateurs provenant de plusieurs royaumes.
krb_realm
Configure le royaume pour la correspondance du principal de l'utilisateur. Si ce paramtre est configur, seuls les utilisateurs
de ce royaume seront accepts. S'il n'est pas configur, les utilisateurs de tout royaume peuvent se connecter, condition que
la correspondance du nom de l'utilisateur est faite.
372
Authentification du client
krb_server_hostname
Prcise le nom d'hte du service principal. Cela, combin avec krb_srvname, est utilis pour gnr le nom complet du
service principal, qui est krb_srvname/krb_server_hostname@REALM. S'il n'est pas renseign, la valeur par dfaut
est le nom d'hte du serveur.
Note
Lorsqu'ident est spcifi pour une connexion locale (c'est--dire non TCP/IP), l'authentification peer (voir Section 19.3.7, Peer Authentication ) lui est automatiquement substitue.
Les options de configuration suivantes sont supportes pour ident :
map
Permet la mise en correspondance entre les noms systme et base de donnes. Voir Section 19.2, Correspondances
d'utilisateurs pour plus de dtails.
Le protocole d'identification est dcrit dans la RFC 1413. Thoriquement, chaque systme d'exploitation de type Unix contient
un serveur ident qui coute par dfaut sur le port TCP 113. La fonctionnalit basique d'un serveur ident est de rpondre aux questions telles que : Quel utilisateur a initi la connexion qui sort du port X et se connecte mon port Y? . Puisque PostgreSQL
connat X et Y ds lors qu'une connexion physique est tablie, il peut interroger le serveur ident de l'hte du client qui se connecte
et peut ainsi thoriquement dterminer l'utilisateur du systme d'exploitation pour n'importe quelle connexion.
Le revers de cette procdure est qu'elle dpend de l'intgrit du client : si la machine cliente est douteuse ou compromise, un attaquant peut lancer n'importe quel programme sur le port 113 et retourner un nom d'utilisateur de son choix. Cette mthode
d'authentification n'est, par consquent, approprie que dans le cas de rseaux ferms dans lesquels chaque machine cliente est
soumise un contrle strict et dans lesquels les administrateurs systme et de bases de donnes oprent en troite collaboration.
En d'autres mots, il faut pouvoir faire confiance la machine hbergeant le serveur d'identification. Cet avertissement doit tre
gard l'esprit :
Le protocole d'identification n'a pas vocation tre un protocole d'autorisation ou de contrle d'accs.
RFC 1413
Certains serveurs ident ont une option non standard qui chiffre le nom de l'utilisateur retourn l'aide d'une cl connue du seul administrateur de la machine dont mane la connexion. Cette option ne doit pas tre employe lorsque le serveur ident est utilis
avec PostgreSQL car PostgreSQL n'a aucun moyen de dchiffrer la chane renvoye pour dterminer le nom rel de
l'utilisateur.
Authentification du client
cation des mots de passe. LDAP n'est utilis que pour valider les paires nom d'utilisateur/mot de passe. De ce fait, pour pouvoir
utiliser LDAP comme mthode d'authentification, l'utilisateur doit pralablement exister dans la base.
L'authentification LDAP peut oprer en deux modes. Dans le premier mode, le serveur fera un bind sur le nom distingu
comme prfixe nom_utilisateur suffixe. Typiquement, le paramtre prefix est utilis pour spcifier cn= ou DOMAIN\ dans un environnement Active Directory. suffix est utilis pour spcifier le reste du DN dans un environnement autre
qu'Active Directory.
Dans le second mode, le serveur commence un bind sur le rpertoire LDAP avec un nom d'utilisateur et un mot de passe fixs,
qu'il indique ldapbinddn et ldapbindpasswd. Il ralise une recherche de l'utilisateur en essayant de se connecter la base
de donnes. Si aucun utilisateur et aucun mot de passe n'est configur, un bind anonyme sera tent sur le rpertoire. La recherche sera ralise sur le sous-arbre sur ldapbasedn, et essaiera une correspondance exacte de l'attribut indiqu par ldapsearchattribute. Si aucun attribut n'est indiqu, l'attribut uid sera utilis. Une fois que l'utilisateur a t trouv lors de cette
recherche, le serveur se dconnecte et effectue un nouveau bind au rpertoire en tant que cet utilisateur, en utilisant le mot de
passe indiqu par le client pour vrifier que la chane de connexion est correcte. Cette mthode permet une plus grande flexibilit
sur l'emplacement des objets utilisateurs dans le rpertoire mais demandera deux connexions au serveur LDAP.
Les options de configuration suivantes sont supportes pour LDAP :
ldapserver
Noms ou adresses IP des serveurs LDAP auxquels se connecter. Plusieurs serveurs peuvent tre indiqus, en les sparant par
des espaces.
ldapport
Numro de port du serveur LDAP auquel se connecter. Si aucun port n'est spcifi, le port par dfaut de la bibliothque
LDAP sera utilis.
ldaptls
Positionnez 1 pour que la connexion entre PostgreSQL et le serveur LDAP utilise du chiffrage TLS. Notez que ceci ne
chiffre que le trafic jusqu'au serveur LDAP -- la connexion vers le client peut toujours ne pas tre chiffre sauf si SSL est utilis.
ldapprefix
Chane prfixer au nom de l'utilisateur pour former le DN utilis comme lien lors d'une simple authentification bind.
ldapsuffix
Chane suffixer au nom de l'utilisateur pour former le DN utilis comme lien lors d'une simple authentification bind.
ldapbasedn
Racine DN pour commencer la recherche de l'utilisateur lors d'une authentification search+bind.
ldapbinddn
DN de l'utilisateur pour se lier au rpertoire avec lequel effectuer la recherche lors d'une authentification search+bind.
ldapbindpasswd
Mot de passe de l'utilisateur pour se lier au rpertoire avec lequel effectuer la recherche lors d'une authentification
search+bind.
ldapsearchattribute
Attribut faire correspondre au nom d'utilisateur dans la recherche lors d'une authentification search+bind.
Note
Comme LDAP utilise souvent des virgules et des espaces pour sparer les diffrentes parties d'un DN, il est souvent ncessaire d'utiliser des paramtres entours de guillements durant le paramtrage des options LDAP, comme
par exemple :
ldapserver=ldap.example.net ldapprefix="cn=" ldapsuffix=", dc=example,
dc=net"
374
Authentification du client
Lors de l'utilisation de l'authentification RADIUS, un message de demande d'accs (Access Request) sera envoy au serveur RADIUS configur. Cette demande sera du type authentification seule (Authenticate Only) et incluera les paramtres pour
le nom de l'utilisateur, son mot de passe (chiffr) et un identifiant NAS (NAS Identifier). La demande sera chiffre en utilisant un secret partag avec le serveur. Le serveur RADIUS rpondre au serveur soit la russite (Access Accept) soit l'chec
(Access Reject) de l'accs. Il n'y a pas de support des comptes RADIUS.
Les options de configuration suivantes sont supportes par RADIUS :
radiusserver
Le nom ou l'adresse IP sur serveur RADIUS pour l'authentification. Ce paramtre est requis.
radiussecret
Le secret partag utilis lors de discussions scurises avec le serveur RADIUS. Il doit y avoir exactement la mme valeur sur
le serveur PostgreSQL et sur le serveur RADIUS. Il est recommand d'utiliser une chane d'au moins 16 caractres. Ce paramtre est requis.
Note
Le vecteur de chiffrement utilis sera un chiffrement fort seulement si PostgreSQL a t compil avec le
support d'OpenSSL. Dans les autres cas, la transmission au serveur RADIUS peut seulement tre considre
comme cach, et non pas scuris, et des mesures de scurit externes doivent tre appliques si ncessaire.
radiusport
Le numro de port sur le serveur RADIUS pour la connexion. Si aucun port n'est indiqu, le port par dfaut, 1812, sera utilis.
radiusidentifier
La chane utilise comme identifiant NAS (NAS Identifier) dans les demandes RADIUS. Ce paramtre peut tre utilis
comme second paramtre identifiant par exemple l'utilisateur de bases de donnes pour la connexion. C'est utilisable pour des
vrifications sur le serveur RADIUS. Si aucune identifiant n'est spcifi, la valeur par dfaut, postgresql, sera utilise.
Note
Si PAM est configur pour lire /etc/shadow, l'authentification choue car le serveur PostgreSQL est excut en
tant qu'utilisateur standard. Ce n'est toutefois pas un problme quand PAM est configur pour utiliser LDAP ou les
375
Authentification du client
ou, en franais,
FATAL:
Les messages de ce type indiquent que le serveur a t contact et qu'il accepte la communication, mais pas avant que la mthode
d'authentification indique dans le fichier pg_hba.conf n'ait t franchie avec succs. Le mot de passe fourni, le logiciel
d'identification ou le logiciel Kerberos doivent tre vrifis en fonction du type d'authentification mentionn dans le message
d'erreur.
FATAL:
ou, en franais,
FATAL:
ou, en franais,
FATAL:
La base de donnes utilise pour la tentative de connexion n'existe pas. Si aucune base n'est prcise, le nom de la base par dfaut
est le nom de l'utilisateur, ce qui peut tre appropri ou non.
Astuce
Les traces du serveur contiennent plus d'informations sur une erreur d'authentification que ce qui est rapport au
client. En cas de doute sur les raisons d'un chec, il peut s'avrer utile de les consulter.
376
de donnes. Un rle avec l'attribut LOGIN peut tre considr de la mme faon qu'un utilisateur de la base de donnes .
Pour crer un rle disposant du droit de connexion, utilisez :
CREATE ROLE nom LOGIN;
CREATE USER nom;
(CREATE USER est quivalent CREATE ROLE sauf que CREATE USER utilise LOGIN par dfaut alors que
CREATE ROLE ne le fait pas)
statut de superutilisateur
Les superutilisateurs ne sont pas pris en compte dans les vrifications des droits, sauf le droit de connexion ou d'initier la rplication. Ceci est un droit dangereux et ne devrait pas tre utilis sans faire particulirement attention ; il est prfrable de
faire la grande majorit de votre travail avec un rle qui n'est pas superutilisateur. Pour crer un nouveau superutilisateur, utilisez CREATE ROLE nom SUPERUSER. Vous devez le faire en tant que superutilisateur. Crer un superutilisateur donne
par dfaut les droits pour initier une rplication en flux. Pour une scurit accrue, cela peut tre interdit en utilisant la requte
CREATE ROLE nom SUPERUSER NOREPLICATION.
cration de bases de donnes
Les droits de cration de bases doivent tre explicitement donnes un rle ( l'exception des super-utilisateurs qui passent au
travers de toute vrification de droits). Pour crer un tel rle, utilisez CREATE ROLE nom_utilisateur CREATEDB.
cration de rle
Un rle doit se voir explicitement donn le droit de crer plus de rles (sauf pour les superutilisateurs vu qu'ils ne sont pas
pris en compte lors des vrifications de droits). Pour crer un tel rle, utilisez CREATE ROLE nom CREATEROLE. Un rle
disposant du droit CREATEROLE peut aussi modifier et supprimer d'autres rles, ainsi que donner ou supprimer
l'appartenance ces rles. Nanmoins, pour crer, modifier, supprimer ou changer l'appartenance un rle superutilisateur, le
statut de superutilisateur est requis ; CREATEROLE n'est pas suffisant pour cela.
initiating replication
Un rle doit se voir explicitement donn le droit d'initier une rplication en flux. Un rle utilis pour la rplication en flux doit
toujours avoir le droit LOGIN. Pour crer un tel rle, utilisez CREATE ROLE nom REPLICATION LOGIN.
mot de passe
Un mot de passe est seulement significatif si la mthode d'authentification du client exige que le client fournisse un mot de
passe quand il se connecte la base. Les mthodes d'authentification par mot de passe et md5 utilisent des mots de
passe. Les mots de passe de la base de donnes ne sont pas les mmes que ceux du systme d'exploitation. Indiquez un mots
de passe lors de la cration d'un rle avec CREATE ROLE nom_utilisateur PASSWORD 'le_mot_de_passe'.
Les attributs d'un rle peuvent tre modifis aprs sa cration avec ALTER ROLE. Regardez les pages de rfrences de
CREATE ROLE(7) et de ALTER ROLE(7) pour plus de dtails.
Astuce
Une bonne pratique est de crer un rle qui dispose des droits CREATEDB et CREATEROLE mais qui n'est pas un
superutilisateur, et d'utiliser ce rle pour toute la gestion des bases de donnes et des rles. Cette approche vite les
dangers encourus en travaillant en tant que superutilisateur pour des tches qui n'ont pas besoin de cet tat.
Un rle peut aussi configurer ses options par dfaut pour de nombreux paramtres de configuration dcris dans le Chapitre 18,
Configuration du serveur. Par exemple, si, pour une raison ou une autre, vous voulez dsactiver les parcours d'index (conseil : ce
n'est pas une bonne ide) chaque fois que vous vous connectez, vous pouvez utiliser :
ALTER ROLE myname SET enable_indexscan TO off;
Cela sauve les paramtres (mais ne les applique pas immdiatement). Dans les connexions ultrieures de ce rle, c'est comme si
SET enable_indexscan TO off avait t appel juste avant le dmarrage de la session. Vous pouvez toujours modifier les
paramtres durant la session. Pour supprimer une configuration par dfaut spcifique un rle, utilisez ALTER ROLE
nom_utilisateur RESET nom_variable. Notez que les valeurs par dfaut spcifiques aux rles sans droit de connexion
(LOGIN) sont vraiment inutiles car ils ne seront jamais appels.
Typiquement, un rle utilis en tant que groupe n'aura pas l'attribut LOGIN bien que vous puissiez le faire si vous le souhaitez.
Une fois que ce rle existe, vous pouvez lui ajouter et lui supprimer des membres en utilisant les commandes GRANT(7) et REVOKE(7) :
GRANT role_groupe TO role1, ... ;
REVOKE role_groupe FROM role1, ... ;
Vous pouvez aussi faire en sorte que d'autres rles groupes appartiennent ce groupe (car il n'y a pas rellement de distinction
entre les rles groupe et les rles non groupe). La base de donnes ne vous laissera pas configure des boucles circulaires
d'appartenance. De plus, il est interdit de faire en sorte qu'un membre appartienne PUBLIC.
Les membres d'un rle groupe peuvent utiliser les droits du rle de deux faons. Tout d'abord, chaque membre d'un groupe peut
excuter explicitement SET ROLE(7) pour devenir temporairement le rle groupe. Dans cet tat, la session de la base de donnes a accs aux droits du rle groupe plutt qu' ceux du rle de connexion original et tous les objets crs sont considrs
comme appartenant au rle groupe, et non pas au rle utilis lors de la connexion. Deuximement, les rles membres qui ont
l'attribut INHERIT peuvent utiliser automatiquement les droits des rles dont ils sont membres, ceci incluant les droits hrits par
ces rles. Comme exemple, supposons que nous avons lanc les commandes suivantes :
CREATE ROLE
CREATE ROLE
CREATE ROLE
GRANT admin
GRANT wheel
Immdiatement aprs connexion en tant que joe, la session de la base de donnes peut utiliser les droits donns directement
joe ainsi que ceux donns admin parce que joe hrite des droits de admin. Nanmoins, les droits donns wheel ne
sont pas disponibles parce que, mme si joe est un membre indirect de wheel, l'appartenance se fait via admin qui dispose de
l'attribut NOINHERIT. Aprs :
SET ROLE admin;
la session aura la possibilit d'utiliser les droits donns admin mais n'aura plus accs ceux de joe. Aprs :
SET ROLE wheel;
la session pourra utiliser uniquement ceux de wheel, mais ni ceux de joe ni ceux de admin. L'tat du droit initial peut tre restaur avec une des instructions suivantes :
SET ROLE joe;
SET ROLE NONE;
RESET ROLE;
Note
La commande SET ROLE autorisera toujours la slection de tout rle dont le rle de connexion est membre directement ou indirectement. Du coup, dans l'exemple prcdent, il n'est pas ncessaire de devenir admin pour devenir
wheel.
Note
Dans le standard SQL, il existe une distinction claire entre les utilisateurs et les rles. Les utilisateurs ne peuvent
pas hriter automatiquement alors que les rles le peuvent. Ce comportement est obtenu dans PostgreSQL en
donnant aux rles utiliss comme des rles SQL l'attribut INHERIT, mais en donnant aux rles utiliss en tant
qu'utilisateurs SQL l'attribut NOINHERIT. Nanmoins, par dfaut, PostgreSQL donne tous les rles l'attribut
INHERIT pour des raisons de compatibilit avec les versions prcdant la 8.1 dans lesquelles les utilisateurs
avaient toujours les droits des groupes dont ils taient membres.
Les attributs LOGIN, SUPERUSER, CREATEDB et CREATEROLE peuvent tre vus comme des droits spciaux qui ne sont jamais
hrits contrairement aux droits ordinaires sur les objets de la base. Vous devez rellement utiliser SET ROLE vers un rle spcifique pour avoir un de ces attributs et l'utiliser. Pour continuer avec l'exemple prcdent, nous pourrions trs bien choisir de donner les droits CREATEDB et CREATEROLE au rle admin. Puis, une session connecte en tant que le rle joe n'aurait pas ces
droits immdiatement, seulement aprs avoir excut SET ROLE admin.
Pour dtruire un rle groupe, utilisez DROP ROLE(7):
DROP ROLE nom;
379
Toute appartenance ce rle est automatiquement supprime (mais les rles membres ne sont pas autrement affects). Notez
nanmoins que tous les objets dont le groupe tait propritaire doivent d'abord tre supprims ou raffects ; et tous les droits accords au rle groupe doivent tre supprims.
380
21.1. Aperu
Une base de donnes est un ensemble nomm d'objets SQL ( objets de base de donnes ). En gnral, chaque objet de base de
donnes (table, fonction etc.) appartient une et une seule base de donnes (nanmoins certains catalogues systme, par
exemple pg_database, appartiennent tout le groupe et sont accessibles depuis toutes les bases de donnes du groupe). Plus
prcisment, une base de donnes est une collection de schmas et les schmas contiennent les tables, fonctions, etc. Ainsi, la
hirarchie complte est : serveur, base de donnes, schma, table (ou un autre type d'objet, comme une fonction).
Lors de la connexion au serveur de bases de donnes, une application cliente doit spcifier dans sa requte de connexion la base
de donnes laquelle elle veut se connecter. Il n'est pas possible d'accder plus d'une base de donnes via la mme connexion.
Nanmoins une application n'est pas limite dans le nombre de connexions qu'elle tablit avec une ou plusieurs bases de donnes. Les bases de donnes sont spares physiquement et le contrle d'accs est gr au niveau de la connexion. Si une instance
de serveur PostgreSQL doit hberger des projets ou des utilisateurs censs rester spars et sans interaction, il est recommand de les rpartir sur plusieurs bases de donnes. Si les projets ou les utilisateurs sont relis et doivent pouvoir partager leurs ressources, alors ils devraient tre placs dans la mme base de donnes mais ventuellement dans des schmas diffrents. Les
schmas sont une structure purement logique et qui peut accder ce qui est gr par le systme des droits. Pour plus
d'informations sur la manipulation des schmas, voir la Section 5.7, Schmas .
Les bases de donnes sont cres avec la commande CREATE DATABASE (voir la Section 21.2, Cration d'une base de
donnes ) et dtruites avec la commande DROP DATABASE (voir la Section 21.5, Dtruire une base de donnes ). Pour
dterminer l'ensemble des bases de donnes existantes, examinez le catalogue systme pg_database, par exemple
SELECT datname FROM pg_database;
La mta-commande \l du programme psql(1) et l'option en ligne de commande -l sont aussi utiles pour afficher les bases de
donnes existantes.
Note
Le standard SQL appelle les bases de donnes des catalogues mais il n'y a aucune diffrence en pratique.
donnes, createdb.
createdb nom_base
createdb ne fait rien de magique. Il se connecte la base de donnes postgres et excute la commande CREATE DATABASE, exactement comme ci-dessus. La page de rfrence sur createdb(1) contient les dtails de son invocation. Notez que createdb sans aucun argument cre une base de donne portant le nom de l'utilisateur courant.
Note
Le Chapitre 19, Authentification du client contient des informations sur la manire de restreindre l'accs une base
de donnes.
Parfois, vous voulez crer une base de donnes pour quelqu'un d'autre. Ce rle doit devenir le propritaire de la nouvelle base de
donnes afin de pouvoir la configurer et l'administrer lui-mme. Pour faire ceci, utilisez l'une des commandes suivantes :
CREATE DATABASE nom_base OWNER nom_role;
dans l'environment SQL ou
createdb -O nom_role nom_base
dans le shell. Seul le super-utilisateur est autoris crer une base de donnes pour quelqu'un d'autre c'est--dire pour un rle dont
vous n'tes pas membre.
datallowconn est positionn faux, alors aucune nouvelle connexion cette base de donnes n'est autorise (mais les sessions
existantes ne sont pas termines simplement en positionnant ce drapeau faux). La base de donnes template0 est normalement marque datallowconn = false pour empcher qu'elle ne soit modifie. Aussi bien template0 que template1
devraient toujours tre marques datistemplate = true.
Note
template1 et template0 n'ont pas de statut particulier en dehors du fait que template1 est la base de donnes source par dfaut pour la commande CREATE DATABASE. Par exemple, on pourrait supprimer template1 et la recrer partir de template0 sans effet secondaire gnant. Ce procd peut tre utile lorsqu'on a
encombr template1 d'objets inutiles. (Pour supprimer template1, cette dernire doit avoir le statut
pg_database.datistemplate false.
La base de donnes postgres est aussi cr quand le groupe est initialis. Cette base de donnes a pour but de
devenir une base de donnes par dfaut pour la connexion des utilisateurs et applications. C'est une simple copie de
template1 et peut tre supprime et re-cre si ncessaire.
21.6. Tablespaces
Les tablespaces dans PostgreSQL permettent aux administrateurs de bases de donnes de dfinir l'emplacement dans le systme
de fichiers o seront stocks les fichiers reprsentant les objets de la base de donnes. Une fois cr, un tablespace peut tre rfrenc par son nom lors de la cration d'objets.
En utilisant les tablespaces, un administrateur peut contrler les emplacements sur le disque d'une installation PostgreSQL. Ceci
est utile dans au moins deux cas. Tout d'abord, si la partition ou le volume sur lequel le groupe a t initialis arrive court
d'espace disque mais ne peut pas tre tendu, un tablespace peut tre cr sur une partition diffrente et utilis jusqu' ce que le
systme soit reconfigur.
Deuximement, les tablespaces permettent un administrateur d'utiliser sa connaissance des objets de la base pour optimiser les
performances. Par exemple, un index qui est trs utilis peut tre plac sur un disque trs rapide et disponible, comme un priph383
rique mmoire. En mme temps, une table stockant des donnes archives et peu utilise ou dont les performances ne portent pas
consquence pourra tre stocke sur un disque systme plus lent, moins cher.
Pour dfinir un tablespace, utilisez la commande CREATE TABLESPACE(7), par exemple :
CREATE TABLESPACE espace_rapide LOCATION '/mnt/sda1/postgresql/data';
L'emplacement doit tre un rpertoire existant, possd par l'utilisateur systme d'exploitation de PostgreSQL. Tous les objets
crs par la suite dans le tablespace seront stocks dans des fichiers contenus dans ce rpertoire.
Note
Il n'y a gnralement aucune raison de crer plus d'un tablespace sur un systme de fichiers logique car vous ne
pouvez pas contrler l'emplacement des fichiers individuels l'intrieur de ce systme de fichiers logique. Nanmoins, PostgreSQL ne vous impose aucune limitation et, en fait, il n'est pas directement conscient des limites du
systme de fichiers sur votre systme. Il stocke juste les fichiers dans les rpertoires que vous lui indiquez.
La cration d'un tablespace lui-mme doit tre fait en tant que superutilisateur de la base de donnes mais, aprs cela, vous pouvez
autoriser des utilisateurs standards de la base de donnes l'utiliser. Pour cela, donnez-leur le droit CREATE sur le tablespace.
Les tables, index et des bases de donnes entires peuvent tre affects des tablespaces particuliers. Pour cela, un utilisateur disposant du droit CREATE sur un tablespace donn doit passer le nom du tablespace comme paramtre de la commande. Par
exemple, ce qui suit cre une table dans le tablespace espace1 :
CREATE TABLE foo(i int) TABLESPACE espace1;
Autrement, utilisez le paramtre default_tablespace :
SET default_tablespace = espace1;
CREATE TABLE foo(i int);
Quand default_tablespace est configur avec autre chose qu'une chane vide, il fournit une clause TABLESPACE implicite
pour les commandes CREATE TABLE et CREATE INDEX qui n'en ont pas d'explicites.
Il existe aussi un paramtre temp_tablespaces, qui dtermine l'emplacement des tables et index temporaires, ainsi les fichiers temporaires qui sont utiliss pour le tri de gros ensembles de donnes. Ce paramtre peut aussi contenir une liste de tablespaces, plutt
qu'une seule, pour que la charge associe aux objets temporaires soit rpartie sur plusieurs tablespaces. Un membre de la liste est
pris au hasard chaque fois qu'un objet temporaire doit tre cr.
Le tablespace associ avec une base de donnes est utilis pour stocker les catalogues systme de la base. De plus, il est l'espace
par dfaut pour les tables, index et fichiers temporaires crs l'intrieur de cette base de donnes si aucune clause TABLESPACE
n'est fournie et qu'aucune slection n'est spcifie par default_tablespace ou temp_tablespaces (comme appropri).
Si une base de donnes est cre sans spcifier de tablespace pour elle, le serveur utilise le mme tablespace que celui de la base
modle utilise comme copie.
Deux tablespaces sont automatiquement crs lors de l'initialisation du cluster de bases de donnes. Le tablespace pg_global
est utilis pour les catalogues systme partags. Le tablespace pg_default est l'espace logique par dfaut des bases de donnes
template1 et template0 (et, du coup, sera le tablespace par dfaut pour les autres bases de donnes sauf en cas de surcharge
par une clause TABLESPACE dans CREATE DATABASE).
Une fois cr, un tablespace peut tre utilis partir de toute base de donnes si l'utilisateur le souhaitant dispose du droit ncessaire. Ceci signifie qu'un tablespace ne peut pas supprim tant que tous les objets de toutes les bases de donnes utilisant le tablespace n'ont pas t supprims.
Pour supprimer un tablespace vide, utilisez la commande DROP TABLESPACE(7).
Pour dterminer l'ensemble des tablespaces existants, examinez le catalogue systme pg_tablespace, par exemple
SELECT spcname FROM pg_tablespace;
La mtacommande \db du programme psql(1) est aussi utile pour afficher les tablespaces existants.
PostgreSQL utilise des liens symboliques pour simplifier l'implmentation des tablespaces. Ceci signifie que les tablespaces
peuvent tre utiliss seulement sur les systmes supportant les liens symboliques.
Le rpertoire $PGDATA/pg_tblspc contient des liens symboliques qui pointent vers chacun des tablespaces utilisateur dans le
groupe. Bien que non recommand, il est possible d'ajuster la configuration des tablespaces la main en redfinissant ces liens.
Deux avertissements : ne pas le faire alors que le serveur est en cours d'excution, mettez jour le catalogue pg_tablespace pour
indiquer les nouveaux emplacements (si vous ne le faites pas, pg_dump continuera afficher les anciens emplacements des tablespaces).
384
l'utilisation des fonctionnalits de locales du systme d'exploitation pour l'ordonnancement du tri, le formatage des chiffres,
les messages traduits et autres aspects spcifiques la locale. Ces aspects sont couverts dans Section 22.1, Support des locales et Section 22.2, Support des collations . ;
la fourniture d'un certain nombre d'encodages diffrents pour permettre le stockage de texte dans toutes les langues et fournir
la traduction de l'encodage entre serveur et client. Ces aspects sont couverts dans Section 22.3, Support des jeux de caractres .
22.1.1. Aperu
Le support des locales est configur automatiquement lorsqu'un cluster de base de donnes est cr avec initdb. initdb initialise
le cluster avec la valeur des locales de son environnement d'excution par dfaut. Si le systme est dj paramtr pour utiliser
la locale souhaite pour le cluster, il n'y a donc rien d'autre faire. Si une locale diffrente est souhaite (ou que celle utilise par
le serveur n'est pas connue avec certitude), il est possible d'indiquer initdb la locale utiliser l'aide de l'option --locale.
Par exemple :
initdb --locale=sv_SE
Cet exemple pour les systmes Unix positionne la locale au sudois (sv) tel que parl en Sude (SE). Parmi les autres possibilits, on peut inclure en_US (l'anglais amricain) ou fr_CA (franais canadien). Si plus d'un ensemble de caractres peuvent tre
utiliss pour une locale, alors les spcifications peuvent prendre la forme langage_territoire.codeset. Par exemple,
fr_BE.UTF-8 reprsente la langue franaise telle qu'elle est parle en Belgique (BE), avec un encodage UTF-8.
Les locales disponibles et leurs noms dpendent de l'diteur du systme d'exploitation et de ce qui est install. Sur la plupart des
systmes Unix, la commande locale -a fournit la liste des locales disponibles. Windows utilise des noms de locale plus verbeux, comme German_Germany ou Swedish_Sweden.1252 mais le principe est le mme.
Il est parfois utile de mlanger les rgles de plusieurs locales, par exemple d'utiliser les rgles de tri anglais avec des messages
en espagnol. Pour cela, des sous-catgories de locales existent qui ne contrlent que certains aspects des rgles de localisation :
LC_COLLATE
LC_CTYPE
LC_MESSAGES
LC_MONETARY
LC_NUMERIC
LC_TIME
Les noms des catgories se traduisent par des options la commande initdb qui portent un nom identique pour surcharger le
choix de locale pour une catgorie donne. Par exemple, pour utiliser la locale franais canadien avec des rgles amricaines
pour le formatage montaire, on utilise initdb --locale=fr_CA --lc-monetary=en_US.
Pour bnficier d'un systme qui se comporte comme s'il ne disposait pas du support des locales, on utilise les locales spciales
C ou un quivalent, POSIX.
Certaines catgories de locales doivent avoir leur valeurs fixes lors de la cration de la base de donnes. Vous pouvez utiliser
des paramtrages diffrents pour chaque bases de donnes. En revanche, une fois que la base est cre, les paramtrages de locales ne peuvent plus tre modifis. LC_COLLATE et LC_CTYPE sont ces catgories. Elles affectent l'ordre de tri des index et
doivent donc rester inchanges, les index sur les colonnes de texte risquant d'tre corrompus dans le cas contraire. (Mais vous
pouvez lever ces restrictions sur les collations, comme cela est discut dans Section 22.2, Support des collations .) La valeur
par dfaut pour ces catgories est dtermine lors de l'excution d'initdb. Ces valeurs sont utilises quand de nouvelles bases de
385
Localisation
donnes sont cres, sauf si d'autres valeurs sont indiques avec la commande CREATE DATABASE.
Les autres catgories de locale peuvent tre modifies n'importe quel moment en configurant les variables d'environnement de
mme nom (voir la Section 18.11.2, Locale et formatage pour de plus amples dtails). Les valeurs par dfaut choisies par initdb sont en fait crites dans le fichier de configuration postgresql.conf pour servir de valeurs par dfaut au dmarrage du
serveur. Si ces dclarations sont supprimes du fichier postgresql.conf, le serveur hrite des paramtres de son environnement d'excution.
Le comportement des locales du serveur est dtermin par les variables d'environnement vues par le serveur, pas par celles de
l'environnement d'un quelconque client. Il est donc important de configurer les bons paramtres de locales avant le dmarrage du
serveur. Cela a pour consquence que, si les locales du client et du serveur diffrent, les messages peuvent apparatre dans des
langues diffrentes en fonction de leur provenance.
Note
Hriter la locale de l'environnement d'excution signifie, sur la plupart des systmes d'exploitation, la chose suivante : pour une catgorie de locales donne (l'ordonnancement par exemple) les variables d'environnement
LC_ALL, LC_COLLATE (ou la variable qui correspond la catgorie) et LANG sont consultes dans cet ordre jusqu' en trouver une qui est fixe. Si aucune de ces variables n'est fixe, c'est la locale par dfaut, C, qui est utilise.
Certaines bibliothques de localisation regardent aussi la variable d'environnement LANGUAGE qui surcharge tout
autre paramtre pour fixer la langue des messages. En cas de doute, lire la documentation du systme
d'exploitation, en particulier la partie concernant gettext.
Pour permettre la traduction des messages dans la langue prfre de l'utilisateur, NLS doit avoir t activ pendant la compilation
(configure --enable-nls). Tout autre support de la locale est construit automatiquement.
22.1.2. Comportement
Le paramtrage de la locale influence les fonctionnalits SQL suivantes :
l'ordre de tri dans les requtes utilisant ORDER BY ou les oprateurs de comparaison standards sur des donnes de type texte ;
Les oprateurs de correspondance de motifs (LIKE, SIMILAR TO et les expressions rationnelles de type POSIX); les locales
affectent aussi bien les oprateurs insensibles la classe et le classement des caractres par les expressions rationnelles portant
sur des caractres.
Le support des locales autres que C ou POSIX dans PostgreSQL a pour inconvnient son impact sur les performances. Il ralentit
la gestion des caractres et empche l'utilisation des index ordinaires par LIKE. Pour cette raison, il est prfrable de n'utiliser les
locales qu'en cas de rel besoin.
Toutefois, pour permettre PostgreSQL d'utiliser des index avec les clauses LIKE et une locale diffrente de C, il existe plusieurs classes d'oprateurs personnalises. Elles permettent la cration d'un index qui ralise une stricte comparaison caractre par
caractre, ignorant les rgles de comparaison des locales. Se rfrer la Section 11.9, Classes et familles d'oprateurs pour
plus d'informations. Une autre possibilit est de crer des index en utilisant la collation C collation, comme cela est indiqu dans
Section 22.2, Support des collations .
22.1.3. Problmes
Si le support des locales ne fonctionne pas au regard des explications ci-dessus, il faut vrifier que le support des locales du systme d'exploitation est correctement configur. Pour vrifier les locales installes sur le systme, on peut utiliser la commande
locale -a, si elle est fournie avec le systme d'exploitation.
Il faut vrifier que PostgreSQL utilise effectivement la locale suppose. Les paramtres LC_COLLATE et LC_CTYPE sont dtermins lors de la cration de la base de donnes et ne peuvent pas tre modifis sauf en crant une nouvelle base de donnes.
D'autres paramtres de locale, y compris LC_MESSAGES et LC_MONETARY, sont dtermins initialement par l'environnement
dans lequel le serveur est lanc mais peuvent tre modifis pendant l'excution. Pour vrifier le paramtrage de la locale active on
utilise la commande SHOW.
Le rpertoire src/test/locale de la distribution source contient une srie de tests pour le support des locales dans PostgreSQL.
386
Localisation
Les applications clientes qui grent les erreurs en provenance du serveur par l'analyse du texte du message d'erreur vont certainement prouver des difficults lorsque les messages du serveur sont dans une langue diffrente. Les auteurs de telles applications
sont invits utiliser le schma de code d'erreur la place.
Le maintien de catalogues de traductions de messages ncessitent les efforts permanents de beaucoup de volontaires qui souhaitent
voir PostgreSQL parler correctement leur langue prfre. Si certains messages dans une langue ne sont pas disponibles ou pas
compltement traduits, toute aide est la bienvenue. Pour apporter son aide ce projet, consulter le Chapitre 48, Support natif des
langues ou crire la liste de diffusion des dveloppeurs.
22.2.1. Concepts
Conceptuellement, toute expression d'un type de donne qui est collatable a une collation. (Les types de donnes intgrs qui supportent une collation sont text, varchar, et char. Les types de donnes dfinies par l'utilisateur peuvent aussi tre marques comme
supportant la collation, et bien entendu un domaine qui est dfini sur un type de donnes supportant la collation est, lui aussi, collationnable.) Si l'expression est une colonne, la collation de l'expression est dtermine par la collation de la colonne. Si
l'expression est une constante, la collation utilise sera la collation par dfaut du type de donnes de la constante. La collation
d'une expression plus complexe est dtermine partir des diffrentes collations de ses entres, comme cela est dcrit ci-dessous.
Une expression peut prendre la collation par dfaut, default , c'est dire la collation dfinie au niveau de la base de donnes. Il
est possible que la collation d'une expression soit indtermine. Dans un tel cas, les oprations de tri et les autres oprations qui
ont besoin de connatre la collation vont chouer.
Lorsque la base de donnes doit raliser un tri ou classement de caractres, alors elle utilisera la collation de l'expression en entre.
Ce cas se prsentera, par exemple, si vous employez la clause ORDER BY et des appels des fonctions ou des oprateurs tels que
<. La collation qui s'applique une clause ORDER BY est simplement la collation de la cl de tri. La collation qui s'applique pour
l'appel une fonction ou un oprateur est driv des arguments, comme dcrit plus bas. En plus de s'appliquer aux oprateurs de
comparaison, les collations sont galement prises en compte par les fonctions qui ralisent les conversions entre minuscules et majuscules, comme lower, upper et initcap; par les oprateurs de correspondance de motifs et par to_char et les fonctions
affilies.
Pour un appel une fonction ou un oprateur, la collation est dtermine partir de la collation des arguments qui sont passs
l'excution de l'opration. Si une expression voisine ncessite de connatre la collation de la fonction ou de l'oprateur, et si le type
de donnes du rsultat de l'appel possde une collation alors cette collation est interprte comme la collation de l'expression au
moment de l'analyse.
Le calcul de la collation d'une expression est ralis implicitement ou explicitement. Cette distinction affecte la faon dont les collations sont combines entre elles lorsque plusieurs collations diffrentes sont utilises dans une expression. La collation d'une expression peut tre dtermine explicitement par l'emploi de la clause COLLATE; dans les autres cas, la collation est dtermine de
manire implicite. Les rgles suivantes s'appliquent lorsque plusieurs collations doivent tre utilise en mme temps, par exemple
dans un appel une fonction, les rgles suivantes s'appliquent:
1. Si la collation d'une expression d'entre est dclare explicitement alors les collations dclare explicitement pour les autres expressions d'entres doivent tre les mmes, sinon une erreur est leve. Si une expression en entre contient une collation explicite, toutes les collations explicitement drives parmi les expressions en entre doivent tre identiques. Dans le cas contraire,
une erreur est renvoye. Si une collation drive explicitement est prsente, elle est le rsultat de la combinaison des collations.
2. Dans les autres cas, toutes les expressions en entre doivent avoir la mme collation, qu'elle soit implicite ou dtermine partir de la collation par dfaut. Si une collation est prsente, autre que celle par dfaut, elle est le rsultat de la combinaison des
collations. Sinon, le rsultat correspond la collation par dfaut.
3. S'il existe des collations implicites mais non par dfaut qui entrent en conflit avec les expressions en entre, alors la combinaison ne peut aboutir qu' une collation indtermine. Ce n'est pas une erreur sauf si la fonction appele requiert une application
de la collation. Dans ce cas, une erreur est renvoye lors de l'excution.
Par exemple, considrez la table dfinie de la faon suivante:
CREATE TABLE test1 (
a text COLLATE "de_DE",
b text COLLATE "es_ES",
...
387
Localisation
);
Ensuite, dans la requte
SELECT a < 'foo' FROM test1;
la comparaison < est ralise en tenant compte des rgles de la locale de_DE, parce que l'expression combine la collation calcule
implicitement avec la collation par dfaut. Mais, dans la requte
SELECT a < ('foo' COLLATE "fr_FR") FROM test1;
la comparaison est effectue en utilisant les rgles de la locale fr_FR, parce que l'utilisation explicite de cette locale prvaut sur
la locale dtermine de manire implicite. De plus, avec la requte
SELECT a < b FROM test1;
l'analyseur ne dispose pas des lments pour dterminer quelle collation employer, car les collations des colonnes a et b sont diffrentes. Comme l'oprateur < a besoin de connatre quelle locale utiliser, une erreur sera gnre. Cette erreur peut tre rsolue en
attachant une dclaration de collation explicite l'une ou l'autre des expressions d'entres, soit:
SELECT a < b COLLATE "de_DE" FROM test1;
ou de manire quivalente
SELECT a COLLATE "de_DE" < b FROM test1;
Toutefois, pour cas structurellement similaire comme
SELECT a || b FROM test1;
ne retournera pas d'erreur car l'oprateur || ne tient pas compte des collations: son rsultat sera le mme quel que soit la collation.
La collation qui est assigne une fonction ou une combinaisons d'un oprateur avec ses expressions d'entres s'appliquent galement au rsultat de la fonction ou de l'oprateur. Bien videmment, cela s'applique que si la fonction de l'oprateur dlivre un rsultat dans un type de donnes auquel la collation peut s'appliquer. Ainsi, dans la requte
SELECT * FROM test1 ORDER BY a || 'foo';
le tri sera ralis en fonction de rgles de la locale de_DE. Mais cette requte:
SELECT * FROM test1 ORDER BY a || b;
retournera une erreur car bien que l'oprateur || ne tienne pas compte des collations de ses expressions, la clause ORDER BY en
tient compte. Comme prcdemment, ce conflit peut tre rsolue par l'emploi d'une dclaration explicite de collation:
SELECT * FROM test1 ORDER BY a || b COLLATE "fr_FR";
Localisation
considres comme des lettres, et les tris sont ordonns strictement par valeur de l'octet du code caractre.
Si le systme d'exploitation permet un programme de supporter plusieurs locales (fonction newlocale et fonctions conjointes),
alors initdb peuplera le catalogue systme pg_collation en se basant sur toutes les locales qu'il trouve sur le systme
d'exploitation au moment de l'initialisation du cluster de bases de donnes. Par exemple, le systme d'exploitation peut offrir une
locale appele de_DE.utf8. initdb crera alors une collation nomme de_DE.utf8 pour le jeu de caractre UTF8 pour lequel
LC_COLLATE et LC_CTYPE sont positionns de_DE.utf8. Il crera aussi une collation dont le nom sera amput du tag
.utf8. Ainsi, vous pouvez utiliser cette collation sous le nom de_DE, dont l'criture est beaucoup plus facile et qui le rend
moins dpendant du jeu de caractres.Nanmoins, notez que le nommage de chaque collation collecte par initdb est dpendant de
la plateforme utilise.
Si vous souhaitez utiliser une collation dont les valeurs LC_COLLATE et LC_CTYPE diffrent, il vous faudra crer une nouvelle
collation par le biais de la commande CREATE COLLATION(7). Cette commande peut galement tre utilise pour crer une
nouvelle collation partir d'une collation existante, ce qui tre utile pour utiliser dans vos applications des collations dont le nom
est indpendant du systme d'exploitation.
Dans une mme base de donnes, seules les collations qui utilisent le jeu de caractres de la base de donnes sont pris en compte.
Les autres entres de pg_collation sont ignores. De cette faon, une collation dont le nom est tronqu, comme de_DE, sera
considr de manire unique au sein d'une mme base de donnes, mme si elle ne peut tre considre comme unique un niveau
plus global. L'utilisation de collations dont le nom est tronqu est d'ailleurs recommand car vous n'aurez pas besoin de le modifier si vous dcidez de changer le jeu de caractres de la base de donnes. Notez toutefois que les collations default, C, et POSIX peuvent tre utilis sans se soucier du jeu de caractres de la base de donnes.
PostgreSQL considre les collations comme des objets distincts et incompatibles entre eux, mme si elles possdent des proprits identiques. Ainsi, par exemle,
SELECT a COLLATE "C" < b COLLATE "POSIX" FROM test1;
va afficher une erreur alors que les collations C et POSIX possdent des proprits strictement identiques. Il n'est donc pas recommand de mlanger des collations dont le nom est complet avec des collations dont le nom l'est.
Nom
Description
Langue
Ser- Octets/Caractre
veur
?
BIG5
Big Five
Chinois traditionnel
Non 1-2
EUC_CN
Chinois simplifi
Oui
1-3
EUC_JP
Japonais
Oui
1-3
EUC_JIS_2004
Japonais
Oui
1-3
EUC_KR
Coren
Oui
1-3
EUC_TW
1-3
GB18030
Standard national
Chinois
Non 1-2
GBK
Chinois simplifi
Non 1-2
389
Localisation
Nom
Description
Langue
Ser- Octets/Caractre
veur
?
ISO_8859_5
Latin/Cyrillique
Oui
ISO_8859_6
Latin/Arabe
Oui
ISO_8859_7
Latin/Grec
Oui
ISO_8859_8
Latin/Hbreu
Oui
JOHAB
JOHAB
Koren (Hangul)
Non 1-3
KOI8
KOI8-R(U)
Cyrillique
Oui
KOI8R
KOI8-R
Cyrillique (Russie)
Oui
KOI8U
KOI8-U
Cyrillique (Ukraine)
Oui
LATIN1
Europe de l'ouest
Oui
LATIN2
Europe centrale
Oui
LATIN3
Europe du sud
Oui
LATIN4
Europe du nord
Oui
LATIN5
Turque
Oui
LATIN6
Nordique
Oui
LATIN7
ISO 8859-13
Baltique
Oui
LATIN8
ISO 8859-14
Celtique
Oui
LATIN9
ISO 8859-15
LATIN10
Roumain
Oui
MULE_INTERNAL
Emacs multi-langues
Oui
1-4
SJIS
Shift JIS
Japonais
Non 1-2
SHIFT_JIS_2004
Japonais
Non 1-2
SQL_ASCII
tout
Oui
UHC
Koren
Non 1-2
UTF8
Unicode, 8-bit
tous
Oui
1-4
WIN866
Windows CP866
Cyrillique
Oui
WIN874
Windows CP874
Thai
Oui
WIN1250
Windows CP1250
Europe centrale
Oui
WIN1251
Windows CP1251
Cyrillique
Oui
WIN1252
Windows CP1252
Europe de l'ouest
Oui
WIN1253
Windows CP1253
Grec
Oui
WIN1254
Windows CP1254
Turque
Oui
WIN1255
Windows CP1255
Hbreux
Oui
WIN1256
Windows CP1256
Arabe
Oui
WIN1257
Windows CP1257
Baltique
Oui
WIN1258
Windows CP1258
Vietnamien
Oui
Toutes les API clients ne supportent pas tous les jeux de caractres de la liste. Le pilote JDBC de PostgreSQL, par exemple, ne
supporte pas MULE_INTERNAL, LATIN6, LATIN8 et LATIN10.
SQL_ASCII se comporte de faon considrablement diffrente des autres valeurs. Quand le jeu de caractres du serveur est
SQL_ASCII, le serveur interprte les valeurs des octets 0-127 suivant le standard ASCII alors que les valeurs d'octets 128-255
sont considres comme des caractres non interprts. Aucune conversion de codage n'est effectue avec SQL_ASCII. De ce
fait, cette valeur ne dclare pas tant un encodage spcifique que l'ignorance de l'encodage. Dans la plupart des cas, si des donnes
non ASCII doivent tre traites, il est dconseill d'utiliser la valeur SQL_ASCII car PostgreSQL est alors incapable de
convertir ou de valider les caractres non ASCII.
390
Localisation
List of databases
Name | Owner | Encoding | Collation | Ctype | Access Privileges
-----------+----------+-----------+-------------+-------------+----------------------------clocaledb | hlinnaka | SQL_ASCII | C | C |
englishdb | hlinnaka | UTF8 | en_GB.UTF8 | en_GB.UTF8 |
japanese | hlinnaka | UTF8 | ja_JP.UTF8 | ja_JP.UTF8 |
korean | hlinnaka | EUC_KR | ko_KR.euckr | ko_KR.euckr |
postgres | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 |
template0 | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 |
{=c/hlinnaka,hlinnaka=CTc/hlinnaka}
template1 | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 |
{=c/hlinnaka,hlinnaka=CTc/hlinnaka}
(7 rows)
Important
Sur la plupart des systmes d'exploitation modernes, PostgreSQL peut dterminer le jeu de caractres impliqu
par la variable LC_CTYPE, et s'assure que l'encodage correspondant de la base de donnes est utilis. Sur les systmes plus anciens, il est de la responsabilit de l'utilisateur de s'assurer que l'encodage attendu par la locale est
bien utilis. Une erreur ce niveau risque fort de conduire un comportement trange des oprations lies la locale, tel le tri.
PostgreSQL autorise les superutilisateurs crer des bases de donnes avec le jeu de caractre SQL_ASCII
mme lorsque la variable LC_CTYPE n'est pas C ou POSIX. Comme indiqu plus haut, SQL_ASCII n'impose
aucun encodage particulier aux donnes stockes en base, ce qui rend ce paramtrage vulnrable aux comportements erratiques lors d'oprations lies la locale. Cette combinaison de paramtres est dprcie et pourrait un
jour tre interdite.
BIG5
Localisation
EUC_CN
EUC_JP
EUC_KR
EUC_TW
GB18030
GBK
ISO_8859_5
ISO_8859_6
ISO_8859_6, UTF8
ISO_8859_7
ISO_8859_7, UTF8
ISO_8859_8
ISO_8859_8, UTF8
JOHAB
JOHAB, UTF8
KOI8R
KOI8U
KOI8U, UTF8
LATIN1
LATIN2
LATIN3
LATIN4
LATIN5
LATIN5, UTF8
LATIN6
LATIN6, UTF8
LATIN7
LATIN7, UTF8
LATIN8
LATIN8, UTF8
LATIN9
LATIN9, UTF8
LATIN10
LATIN10, UTF8
MULE_INTERNAL
SJIS
SQL_ASCII
UHC
UTF8
WIN866
WIN874
WIN874, UTF8
WIN1250
WIN1251
WIN1252
WIN1252, UTF8
WIN1253
WIN1253, UTF8
WIN1254
WIN1254, UTF8
WIN1255
WIN1255, UTF8
WIN1256
WIN1256, UTF8
WIN1257
WIN1257, UTF8
WIN1258
WIN1258, UTF8
Pour activer la conversion automatique des jeux de caractres, il est ncessaire d'indiquer PostgreSQL le jeu de caractres
(encodage) souhait ct client. Il y a plusieurs faons de le faire :
en utilisant la commande \encoding dans psql. \encoding permet de changer l'encodage client la vole. Par exemple, pour
changer le codage en SJIS, taper :
392
Localisation
\encoding SJIS
la libpq (Section 31.9, Fonctions de contrle ) a des fonctions de contrle de l'encodage client ;
en utilisant SET client_encoding TO. L'encodage client peut tre fix avec la commande SQL suivante :
SET CLIENT_ENCODING TO 'valeur';
La syntaxe SQL plus standard SET NAMES peut galement tre utilise pour cela :
SET NAMES 'valeur';
Pour connatre l'encodage client courant :
SHOW client_encoding;
Pour revenir l'encodage par dfaut :
RESET client_encoding;
en utilisant la variable de configuration client_encoding. Si la variable client_encoding est dfinie, l'encodage client est
automatiquement slectionn lors de l'tablissement d'une connexion au serveur (cette variable peut tre surcharge l'aide de
toute autre mthode dcrite ci-dessus).
Si la conversion d'un caractre particulier n'est pas possible -- dans le cas d'encodages EUC_JP pour le serveur et LATIN1 pour le
client, et que certains caractres japonais renvoys n'ont pas de reprsentation en LATIN1 -- une erreur est remonte.
Si l'encodage client est dfini en tant que SQL_ASCII, la conversion de l'encodage est dsactive quelque soit celui du serveur.
Comme pour le serveur, SQL_ASCII est dconseill sauf ne travailler qu'avec des donnes ASCII.
393
utilise doit tre rendue pour tre rutilise par d'autres lignes afin d'viter un accroissement constant, sans limite, du volume occup sur le disque. Cela est ralis en excutant VACUUM.
La forme standard de VACUUM limine les versions d'enregistrements morts dans les tables et les index, et marque l'espace
comme rutilisable. Nanmoins, il ne rend pas cet espace au systme d'exploitation, sauf dans le cas spcial o des pages la fin
d'une table deviennent totalement vides et qu'un verrou exclusif sur la table peut tre obtenu aisment. Par opposition, VACUUM
FULL compacte activement les tables en crivant une nouvelle version complte du fichier de la table, sans espace vide. Ceci rduit la taille de la table mais peut prendre beaucoup de temps. Cela requiert aussi un espace disque supplmentaire pour la nouvelle copie de la table jusqu' la fin de l'opration.
Le but habituel d'un vacuum rgulier est de lancer des VACUUM standard suffisamment souvent pour viter d'avoir recours
VACUUM FULL. Le dmon autovacuum essaie de fonctionner de cette faon, et n'excute jamais de VACUUM FULL. Avec
cette approche, l'ide directrice n'est pas de maintenir les tables leur taille minimale, mais de maintenir l'utilisation de l'espace
disque un niveau constant : chaque table occupe l'espace quivalent sa taille minimum plus la quantit d'espace consomme
entre deux vacuums. Bien que VACUUM FULL puisse tre utilis pour retourner une table sa taille minimale et rendre l'espace
disque au systme d'exploitation, cela ne sert pas grand chose, si cette table recommence grossir dans un futur proche. Par
consquent, cette approche s'appuyant sur des commandes VACUUM excutes intervalles modrment rapprochs est une
meilleure approche que d'excuter des VACUUM FULL espacs pour des tables mises jour de faon intensive.
Certains administrateurs prfrent planifier le passage de VACUUM eux-mmes, par exemple faire le travail de nuit, quand la
charge est faible. La difficult avec cette stratgie est que si une table a un pic d'activit de mise jour inattendu, elle peut grossir
au point qu'un VACUUM FULL soit vraiment ncessaire pour rcuprer l'espace. L'utilisation du dmon d'autovacuum minore ce
problme, puisque le dmon planifie les vacuum de faon dynamique, en rponse l'activit de mise jour. Il est peu raisonnable
de dsactiver totalement le dmon, sauf si l'activit de la base est extrmement prvisible. Un compromis possible est de rgler les
paramtres du dmon afin qu'il ne ragisse qu' une activit exceptionnellement lourde de mise jour, de sorte viter seulement
de perdre totalement le contrle de la volumtrie, tout en laissant les VACUUM planifis faire le gros du travail quand la charge
est normale.
Pour ceux qui n'utilisent pas autovacuum, une approche typique alternative est de planifier un VACUUM sur la base complte une
fois par jour lorsque l'utilisation n'est pas grande, avec en plus des oprations de VACUUM plus frquentes pour les tables trs
impactes par des mises jour, de la faon adquate. (Certaines installations avec normment de mises jour peuvent excuter
des VACUUM toutes les quelques minutes.) Lorsqu'il y a plusieurs bases dans un cluster, il faut penser excuter un VACUUM
sur chacune d'elles ; le programme vacuumdb(1) peut tre utile.
Astuce
Le VACUUM simple peut ne pas suffire quand une table contient un grand nombre d'enregistrements morts
comme consquence d'une mise jour ou suppression massive. Dans ce cas, s'il est ncessaire de rcuprer l'espace
disque gaspill, VACUUM FULL peut tre utilis, CLUSTER(7) ou une des variantes de ALTER TABLE(7). Ces
commandes crivent une nouvelle copie de la table et lui adjoignent de nouveaux index. Toutes ces options ncessitent un verrou exclusif. Elles utilisent aussi temporairement un espace disque supplmentaire, approximativement
gal la taille de la table, car les anciennes copies de la table et des index ne peuvent pas tre supprimes avant la
fin de l'opration.
Astuce
Si le contenu d'une table est supprim priodiquement, il est prfrable d'envisager l'utilisation de TRUNCATE(7),
plutt que DELETE suivi de VACUUM. TRUNCATE supprime le contenu entier de la table immdiatement sans
ncessiter de VACUUM ou VACUUM FULL pour rclamer l'espace disque maintenant inutilis. L'inconvnient
est la violation des smantiques MCC strictes.
l'instar du nettoyage pour rcuprer l'espace, les statistiques doivent tre plus souvent collectes pour les tables intensment modifies que pour celles qui le sont moins. Mais mme si la table est trs modifie, il se peut que ces collectes soient inutiles si la
distribution probabiliste des donnes volue peu. Une rgle simple pour dcider est de voir comment voluent les valeurs minimum et maximum des donnes. Par exemple, une colonne de type timestamp qui contient la date de mise jour de la ligne aura
une valeur maximum en continuelle croissance au fur et mesure des modifications ; une telle colonne ncessitera plus de collectes statistiques qu'une colonne qui contient par exemple les URL des pages accdes sur un site web. La colonne qui contient
les URL peut trs bien tre aussi souvent modifie mais la distribution probabiliste des donnes changera certainement moins rapidement.
Il est possible d'excuter ANALYZE sur des tables spcifiques, voire des colonnes spcifiques ; il a donc toute flexibilit pour
mettre jour certaines statistiques plus souvent que les autres en fonction des besoins de l'application. Quoi qu'il en soit, dans la
pratique, il est gnralement mieux de simplement analyser la base entire car il s'agit d'une opration rapide. ANALYZE utilise
un systme d'chantillonage des lignes d'une table, ce qui lui vite de lire chaque ligne.
Astuce
Mme si il n'est pas trs productif de rgler prcisment la frquence de ANALYZE pour chaque colonne, il peut
tre intressant d'ajuster le niveau de dtail des statistiques collectes pour chaque colonne. Les colonnes trs utilises dans les clauses WHERE et dont la distribution n'est pas uniforme requirent des histogrammes plus prcis que
les autres colonnes. Voir ALTER TABLE SET STATISTICS, ou modifier les paramtres par dfaut de la base de
donnes en utilisant le paramtre de configuration default_statistics_target.
De plus, par dfaut, il existe peu d'informations sur la slectivit des fonctions. Nanmoins, si vous crez un index
qui utilise une fonction, des statistiques utiles seront rcupres de la fonction, ce qui peut grandement amliorer
les plans de requtes qui utilisent l'index.
une fois toutes les autovacuum_freeze_max_age moins vacuum_freeze_min_age transactions. Pour les tables qui
ont rgulirement l'opration de VACUUM pour rclamer l'espace perdu, ceci a peu d'importance. Nanmoins, pour les tables statiques (ceci incluant les tables qui ont des INSERT mais pas d'UPDATE ou de DELETE), il n'est pas ncessaire d'excuter un
VACUUM pour rcuprer de la place et donc il peut tre utile d'essayer de maximiser l'interval entre les autovacuums forcs sur
de trs grosses tables statiques. videmment, vous pouvez le faire soit en augmentant autovacuum_freeze_max_age soit en
diminuant vacuum_freeze_min_age.
Le maximum efficace pour vacuum_freeze_table_age est 0.95 * autovacuum_freeze_max_age ; un paramtrage
plus haut que a sera limit ce maximum. Une valeur plus importante qie autovacuum_freeze_max_age n'aurait pas de
sens car un autovacuum de prservation contre la r-utilisation des identifiants de transactions serait dclench, et le multiplicateur
0,95 laisse un peu de place pour excuter un VACUUM manuel avant que cela ne survienne. Comme rgle d'or, vacuum_freeze_table_age devrait tre configur une valeur lgrement infrieure autovacuum_freeze_max_age, laissant
suffisamment d'espace pour qu'un VACUUM planifi rgulirement ou pour qu'un autovacuum dclench par des activits normales de suppression et de mise jour puissent tre activs pendant ce laps de temps. Le configurer de faon trop proche pourrait
dclencher des autovacuum de protection contre la r-utilisation des identifiants de transactions, mme si la table a t rcemment
l'objet d'un VACUUM pour rcuprer l'espace, alors que des valeurs basses amnent des parcours complets de table plus frquents.
Le seul inconvnient augmenter autovacuum_freeze_max_age (et vacuum_freeze_table_age avec elle) est que le
sous-rpertoire pg_clog du cluster prendre plus de place car il doit stocker le statut du COMMIT pour toutes les transactions depuis autovacuum_freeze_max_age. L'tat de COMMIT utilise deux bits par transaction, donc si autovacuum_freeze_max_age et vacuum_freeze_table_age ont une valeur maximum permise de deux milliards, pg_clog
peut grossir jusqu' la moiti d'un Go. Si c'est rien compar votre taille de base totale, configurer autovacuum_freeze_max_age son maximum permis est recommand. Sinon, le configurer suivant ce que vous voulez comme stockage maximum dans pg_clog. (La valeur par dfaut, 200 millions de transactions, se traduit en peu prs 50 Mo de stockage
dans pg_clog.)
Un inconvnient caus par la diminution de vacuum_freeze_min_age est que cela pourrait faire que VACUUM travaille
sans raison : modifier le XID de la ligne d'une table FrozenXID est une perte de temps si la ligne est modifie rapidement
aprs (ce qui fait qu'elle obtiendra un nouveau XID). Donc ce paramtre doit tre suffisamment important pour que les lignes ne
soient pas geles jusqu' ce qu'il soit pratiquement certain qu'elles ne seront plus modifies. Un autre inconvnient en diminuant ce
paramtre est que les dtails sur la transaction exacte qui a insr ou modifi une ligne seront perdus plus tt. Cette information est
quelque fois utile, particulirement lors d'une analyse de ce qui s'est mal pass sur une base aprs un problme. Pour ces deux raisons, baisser ce paramtre n'est pas recommand sauf pour les tables entirement statiques.
Pour tracer l'ge des plus anciens XID de la base, VACUUM stocke les statistiques sur XID dans les tables systmes pg_class et
pg_database. En particulier, la colonne relfrozenxid de la ligne pg_class d'une table contient le XID final du gel qui a t utilis par le dernier VACUUM pour cette table. Il est garanti que tous les XID plus anciens que ce XID ont t remplacs par FrozenXID pour cette table. De faon similaire, la colonne datfrozenxid de la ligne pg_database de la base est une limite infrieure des XID normaux apparaissant dans cette base -- c'est tout simplement le minimum des valeurs relfrozenxid par table
dans cette base. Pour examiner cette information, le plus simple est d'excuter des requtes comme :
SELECT c.oid::regclass as table_name,
greatest(age(c.relfrozenxid),age(t.relfrozenxid)) as age
FROM pg_class c
LEFT JOIN pg_class t ON c.reltoastrelid = t.oid
WHERE c.relkind = 'r';
SELECT datname, age(datfrozenxid) FROM pg_database;
La colonne age mesure le nombre de transactions partir du XID final vers le XID de transaction en cours.
VACUUM parcourt habituellement seulement les pages qui ont t modifies depuis le dernier VACUUM mais relfrozenxid
peut seulement tre avanc quand la table est parcourue compltement. La table est parcourue entirement quand relfrozenxid est age de plus de vacuum_freeze_table_age transactions, quand l'option FREEZE de la commande VACUUM est
utilise ou quand toutes les pages se trouvent ncessiter un VACUUM pour supprimer les versions mortes des lignes. Aprs que
VACUUM ait parcouru la table complte age(relfrozenxid) devrait tre un peu plus grande que le paramtre vacuum_freeze_min_age qui a t utilis (la diffrence tant due au nombre de transactions dmarres depuis que VACUUM a
commenc son travail). Si aucun parcours de table complet ne se trouve excut via un VACUUM sur cette table, lorsque autovacuum_freeze_max_age est atteint, un autovacuum sera rapidement forc sur la table.
Si, pour une certaine raison, l'autovacuum choue effacer les anciens XID d'une table, le systme commencera mettre des
messages d'avertissement comme ceci quand les plus anciens XID de la base atteignent les 10 millions de transactions partir du
point de rinitialisation :
WARNING:
HINT:
(Une commande VACUUM manuelle devrait rsoudre le problme, comme suggr par l'indice ; mais notez que la commande
VACUUM doit tre excute par un superutilisateur, sinon elle chouera mettre jour les catalogues systmes et ne pourra donc
pas faire avancer le datfrozenxid de la base.) Si ces avertissements sont ignors, le systme s'arrtera et refusera de commencer toute nouvelle transaction ds qu'il n'en restera qu'un million avant la rinitialisation :
ERROR: database is not accepting commands to avoid wraparound data loss in database
"mydb"
HINT: Stop the postmaster and use a standalone backend to VACUUM in "mydb".
La marge de scurit de un million de transactions existe pour permettre l'administrateur de rcuprer ces donnes sans perte en
excutant manuellement les commandes VACUUM requises. Nanmoins, comme le systme n'excute pas de commandes tant
qu'il n'est pas sorti du mode d'arrt par scurit, la seule faon de le faire est de stopper le serveur et d'utiliser un moteur simple
utilisateur pour excuter le VACUUM. Le mode d'arrt n'est pas pris en compte par le moteur simple utilisateur. Voir la page de
rfrence de postgres(1) pour des dtails sur l'utilisation du moteur simple utilisateur.
table ; voir la section intitule Paramtres de stockage pour plus d'informations. Si un paramtre a t modifi via les paramtres de stockage, cette valeur est utilise ; sinon les paramtres globaux sont utiliss. Voir Section 18.10, Nettoyage
(vacuum) automatique pour plus d'informations sur les paramtres globaux.
En plus des valeurs de la limite de base et des facteurs d'chelle, il existe six autres paramtres autovacuum pouvant tre configurs pour chaque table via les paramtres de stockage. Le premier paramtre, autovacuum_enabled, peut tre configur
false pour instruire le dmon autovacuum de laisser cette table particulire. Dans ce cas, autovacuum touchera seulement la
table quand il devra le faire pour prvenir la rinitialisation de l'ID de transaction. Deux autres paramtres, le dlai du cot du VACUUM (autovacuum_vacuum_cost_delay) et la limite du cot du VACUUM (autovacuum_vacuum_cost_limit),
sont utiliss pour configurer des valeurs spcifiques aux tables pour la fonctionnalit de dlai de VACUUM bas sur le cot (voir
Section 18.4.3, Report du VACUUM en fonction de son cot ). autovacuum_freeze_min_age, autovacuum_freeze_max_age et autovacuum_freeze_table_age sont utiliss pour configurer des valeurs par table, respectivement vacuum_freeze_min_age, autovacuum_freeze_max_age et vacuum_freeze_table_age.
Lorsque plusieurs processus autovacuum sont en cours d'excution, la limite de cot est rpartie parmi tous les processus pour
que l'impact total sur le systme soit identique quelque soit le nombre de processus en cours d'excution.
sage sur disque, amenant des performances assez pauvres. (Vous pouvez utiliser un - au dbut du nom de fichier dans le fichier de configuration syslog pour dsactiver la synchronisation.)
Notez que toutes les solutions dcrites ci-dessus font attention lancer de nouveaux journaux de traces des intervalles configurables mais ils ne grent pas la suppression des vieux fichiers de traces, qui ne sont probablement plus trs utiles. Vous voudrez
probablement configurer un script pour supprimer priodiquement les anciens journaux. Une autre possibilit est de configurer le
programme de rotation pour que les anciens journaux de traces soient crass de faon cyclique.
pgFouine est un projet externe qui analyse les journaux applicatifs d'une faon trs pousse. check_postgres fournit des alertes Nagios quand des messages importants apparat dans les journaux applicatifs, mais dtecte aussi de nombreux autres cas.
400
la sauvegarde SQL ;
l'archivage continu.
Chacune a ses avantages et ses inconvnients. Elles sont toutes analyses, chacune leur tour, dans les sections suivantes.
Important
Si la base de donnes utilise les OID (par exemple en tant que cls trangres), il est impratif d'indiquer
pg_dump de sauvegarder aussi les OID. Pour cela, on utilise l'option -o sur la ligne de commande.
Sauvegardes et restaurations
Tous les utilisateurs possdant des objets ou ayant certains droits sur les objets de la base sauvegarde doivent exister pralablement la restauration de la sauvegarde. S'ils n'existent pas, la restauration choue pour la cration des objets dont ils sont propritaires ou sur lesquels ils ont des droits (quelque fois, cela est souhaitable mais ce n'est habituellement pas le cas).
Par dfaut, le script psql continue de s'excuter aprs la dtection d'une erreur SQL. Vous pouvez excuter psql avec la variable
ON_ERROR_STOP configure pour modifier ce comportement. psql quitte alors avec un code d'erreur 3 si une erreur SQL survient :
psql --set ON_ERROR_STOP=on base_de_donnes < infile
Dans tous les cas, une sauvegarde partiellement restaure est obtenue. Si cela n'est pas souhaitable, il est possible d'indiquer que la
sauvegarde complte doit tre restaure au cours d'une transaction unique. De ce fait, soit la restauration est valide dans son ensemble, soit elle est entirement annule. Ce mode est choisi en passant l'option -1 ou --single-transaction en ligne de
commande psql. Dans ce mode, la plus petite erreur peut annuler une restauration en cours depuis plusieurs heures. Nanmoins,
c'est probablement prfrable au nettoyage manuel d'une base rendue complexe par une sauvegarde partiellement restaure.
La capacit de pg_dump et psql crire et lire dans des tubes permet de sauvegarder une base de donnes directement d'un serveur sur un autre. Par exemple :
pg_dump -h serveur1 base_de_donnees | psql -h serveur2 base_de_donnees
Important
Les fichiers de sauvegarde produits par pg_dump sont relatifs template0. Cela signifie que chaque langage,
procdure, etc. ajout template1 est aussi sauvegard par pg_dump. En consquence, si une base template1
modifie est utilise lors de la restauration, il faut crer la base vide partir de template0, comme dans
l'exemple plus haut.
Aprs la restauration d'une sauvegarde, il est conseill d'excuter ANALYZE(7) sur chaque base de donnes pour que l'optimiseur
de requtes dispose de statistiques utiles ; voir Section 23.1.3, Maintenir les statistiques du planificateur et Section 23.1.5, Le
dmon auto-vacuum pour plus d'informations. Pour plus de conseils sur le chargement efficace de grosses quantits de donnes
dans PostgreSQL, on peut se rfrer la Section 14.4, Remplir une base de donnes .
Sauvegardes et restaurations
ou
cat nom_fichier.gz | gunzip | psql base_de_donnees
Couper le fichier avec split. La commande split permet de dcouper le fichier en fichiers plus petits, de taille acceptable par le
systme de fichiers sous-jacent. Par exemple, pour faire des morceaux de 1 Mo :
pg_dump base_de_donnees | split -b 1m - nom_fichier
Pour restaurer :
cat nom_fichier* | psql base_de_donnees
Utilisation du format de sauvegarde personnalis de pg_dump. Si PostgreSQL est install sur un systme o la bibliothque
de compression zlib est disponible, le format de sauvegarde personnalis peut tre utilis pour compresser les donnes la vole.
Pour les bases de donnes volumineuses, cela produit un fichier de sauvegarde d'une taille comparable celle du fichier produit
par gzip, avec l'avantage supplmentaire de permettre de restaurer des tables slectivement. La commande qui suit sauvegarde une
base de donnes en utilisant ce format de sauvegarde :
pg_dump -Fc base_de_donnees > nom_fichier
Le format de sauvegarde personnalis ne produit pas un script utilisable par psql. Ce script doit tre restaur avec pg_restore, par
exemple :
pg_restore -d nom_base nom_fichier
Voir les pages de rfrence de pg_dump(1) et pg_restore(1) pour plus de dtails.
Pour les trs grosses bases de donnes, il peut tre ncessaire de combiner split avec une des deux autres approches.
Sauvegardes et restaurations
sable parce que ces dernires doivent tre simultanes. La documentation du systme de fichiers doit tre tudie avec attention
avant de faire confiance la technique d'images cohrentes dans de telles situations.
S'il n'est pas possible d'obtenir des images simultanes, il est toujours possible d'teindre le serveur de bases de donnes suffisamment longtemps pour tablir toutes les images geles. Une autre possibilit est de faire une sauvegarde de la base en archivage
continu (Section 24.3.2, Raliser une sauvegarde de base ) parce que ces sauvegardes ne sont pas sensibles aux modifications
des fichiers pendant la sauvegarde. Cela n'impose d'activer l'archivage en continu que pendant la priode de sauvegarde ; la restauration est faite en utilisant la restauration d'archive en ligne (Section 24.3.3, Rcupration partir d'un archivage continu ).
Une autre option consiste utiliser rsync pour raliser une sauvegarde du systme de fichiers. Ceci se fait tout d'abord en lanant
rsync alors que le serveur de bases de donnes est en cours d'excution, puis en arrtant le serveur juste assez longtemps pour lancer rsync une deuxime fois. Le deuxime rsync est beaucoup plus rapide que le premier car il a relativement peu de donnes
transfrer et le rsultat final est cohrent, le serveur tant arrt. Cette mthode permet de raliser une sauvegarde du systme de
fichiers avec un arrt minimal.
Une sauvegarde des fichiers de donnes va tre gnralement plus volumineuse qu'une sauvegarde SQL. (pg_dump ne sauvegarde
pas le contenu des index, mais la commande pour les recrer). Cependant, une sauvegarde des fichiers de donnes peut tre plus
rapide.
Il n'est pas ncessaire de disposer d'une sauvegarde des fichiers parfaitement cohrente comme point de dpart. Toute incohrence dans la sauvegarde est corrige par la r-excution des journaux (ceci n'est pas significativement diffrent de ce qu'il se
passe lors d'une rcupration aprs un arrt brutal). La fonctionnalit d'image du systme de fichiers n'est alors pas ncessaire,
tar ou tout autre outil d'archivage est suffisant.
Puisqu'une longue squence de fichiers WAL peut tre assemble pour tre rejoue, une sauvegarde continue est obtenue en
continuant simplement archiver les fichiers WAL. C'est particulirement intressant pour les grosses bases de donnes dont
une sauvegarde complte frquente est difficilement ralisable.
Les entres WAL ne doivent pas obligatoirement tre rejoues intgralement. La r-excution peut tre stoppe en tout point,
tout en garantissant une image cohrente de la base de donnes telle qu'elle tait ce moment-l. Ainsi, cette technique autorise la rcupration d'un instantan (PITR) : il est possible de restaurer l'tat de la base de donnes telle qu'elle tait en tout
point dans le temps depuis la dernire sauvegarde de base.
Si la srie de fichiers WAL est fournie en continu une autre machine charge avec le mme fichier de sauvegarde de base, on
obtient un systme de reprise intermdiaire (warm standby) : tout moment, la deuxime machine peut tre monte et disposer d'une copie quasi-complte de la base de donnes.
Note
pg_dump et pg_dumpall ne font pas de sauvegardes au niveau systme de fichiers. Ce type de sauvegarde est qualifi de logique et ne contiennent pas suffisamment d'informations pour permettre le rejeu des journaux de transactions.
Tout comme la technique de sauvegarde standard du systme de fichiers, cette mthode ne supporte que la restauration d'un cluster de bases de donnes complet, pas d'un sous-ensemble. De plus, un espace d'archivage important est requis : la sauvegarde de la
base peut tre volumineuse et un systme trs utilis engendre un trafic WAL archiver de plusieurs Mo. Malgr tout, c'est la
technique de sauvegarde prfre dans de nombreuses situations o une haute fiabilit est requise.
Une rcupration fructueuse partir de l'archivage continu (aussi appel sauvegarde chaud par certains vendeurs de SGBD)
ncessite une squence ininterrompue de fichiers WAL archivs qui s'tend au moins jusqu'au point de dpart de la sauvegarde.
Pour commencer, il faut configurer et tester la procdure d'archivage des journaux WAL avant d'effectuer la premire sauvegarde
de base. C'est pourquoi la suite du document commence par prsenter les mcanismes d'archivage des fichiers WAL.
404
Sauvegardes et restaurations
Sauvegardes et restaurations
La vitesse de la commande d'archivage n'est pas importante, tant qu'elle suit le rythme de gnration des donnes WAL du serveur. Les oprations normales continuent mme si le processus d'archivage est un peu plus lent. Si l'archivage est significativement plus lent, alors la quantit de donnes qui peut tre perdue crot. Cela signifie aussi que le rpertoire pg_xlog/ contient un
grand nombre de fichiers segment non archivs, qui peuvent finir par dpasser l'espace disque disponible. Il est conseill de surveiller le processus d'archivage pour s'assurer que tout fonctionne normalement.
Lors de l'criture de la commande d'archivage, il faut garder l'esprit que les noms de fichier archiver peuvent contenir jusqu'
64 caractres et tre composs de toute combinaison de lettres ASCII, de chiffres et de points. Il n'est pas ncessaire de conserver
le chemin relatif original (%p) mais il est ncessaire de se rappeler du nom du fichier (%f).
Bien que l'archivage WAL autorise restaurer toute modification ralise sur les donnes de la base, il ne restaure pas les modifications effectues sur les fichiers de configuration (c'est--dire postgresql.conf, pg_hba.conf et pg_ident.conf) car
ceux-ci sont dits manuellement et non au travers d'oprations SQL. Il est souhaitable de conserver les fichiers de configuration
un endroit o ils sont sauvegards par les procdures standard de sauvegarde du systme de fichiers. Voir la Section 18.2,
Emplacement des fichiers pour savoir comment modifier l'emplacement des fichiers de configuration.
La commande d'archivage n'est appele que sur les segments WAL complets. Du coup, si le serveur engendre peu de trafic WAL
(ou qu'il y a des priodes de calme o le trafic WAL est lger), il peut y avoir un long dlai entre la fin d'une transaction et son enregistrement sr dans le stockage d'archive. Pour placer une limite sur l'anciennet des donnes archives, on configure archive_timeout qui force le serveur changer de fichier segment WAL pass ce dlai. Les fichiers archivs lors d'un tel forage ont
toujours la mme taille que les fichiers complets. Il est donc dconseill de configurer un dlai archive_timeout trop court -cela fait grossir anormalement le stockage. Une minute pour archive_timeout est gnralement raisonnable.
De plus, le changement d'un segment peut tre forc manuellement avec pg_switch_xlog. Cela permet de s'assurer qu'une
transaction tout juste termine est archive aussi vite que possible. D'autres fonctions utilitaires relatives la gestion des WAL
sont disponibles dans Tableau 9.56, Fonctions de contrle de la sauvegarde .
Quand wal_level est configur minimal, certaines commandes SQL sont optimises pour viter la journalisation des transactions, de la faon dcrite dans Section 14.4.7, Dsactiver l'archivage des journaux de transactions et la rplication en flux .
Si l'archivage ou la rplication en flux est activ lors de l'excution d'une de ces instructions, les journaux de transaction ne
contiennent pas suffisamment d'informations pour une rcupration via les archives. (La rcupration aprs un arrt brutal n'est
pas affecte.) Pour cette raison, wal_level ne peut tre modifi qu'au lancement du serveur. Nanmoins, archive_command
peut tre modifi par rechargement du fichier de configuration. Pour arrter temporairement l'archivage, on peut placer une chane
vide ('') pour archive_command. Les journaux de transaction sont alors accumuls dans pg_xlog/ jusqu'au rtablissement
d'un paramtre archive_command fonctionnel.
Sauvegardes et restaurations
SELECT pg_stop_backup();
Cela met fin au processus de sauvegarde et ralise une bascule automatique vers le prochain segment WAL. Cette bascule est
ncessaire pour permettre au dernier fichier de segment WAL crit pendant la sauvegarde d'tre immdiatement archivable.
5. Une fois que les fichiers des segments WAL utiliss lors de la sauvegarde sont archivs, c'est termin. Le fichier identifi par le
rsultat de pg_stop_backup est le dernier segment ncessaire pour produire un jeu complet de fichiers de backup. Si archive_mode est activ, pg_stop_backup ne rend pas la main avant que le dernier segment n'ait t archiv. L'archivage
de ces fichiers est automatique puisque archive_command est configur. Dans la plupart des cas, c'est rapide, mais il est
conseill de surveiller le systme d'archivage pour s'assurer qu'il n'y a pas de retard. Si le processus d'archivage a pris du retard
en raison d'checs de la commande d'archivage, il continuera d'essayer jusqu' ce que l'archive russisse et que le backup soit
complet. Pour positionner une limite au temps d'excution de pg_stop_backup, il faut positionner statement_timeout une valeur approprie.
Vous pouvez aussi utiliser l'outil pg_basebackup(1) pour faire la sauvegarde, la place d'une copie manuelle des fichiers. Cet outil
fera l'quivalent des tapes pg_start_backup(), copie et pg_stop_backup() automatiquement, et transfert la sauvegarde via une connexion standard PostgreSQL en utilisant le protocole de rplication, au lieu d'avoir besoin d'un accs au niveau du systme de fichiers. pg_basebackup n'interfre pas avec les sauvegardes de niveau systme de fichiers prises l'aide de
pg_start_backup()/pg_stop_backup().
Certains outils de sauvegarde de fichiers mettent des messages d'avertissement ou d'erreur si les fichiers qu'ils essaient de copier
sont modifis au cours de la copie. Cette situation, normale lors de la sauvegarde d'une base active, ne doit pas tre considre
comme une erreur ; il suffit de s'assurer que ces messages puissent tre distingus des autres messages. Certaines versions de
rsync, par exemple, renvoient un code de sortie distinct en cas de disparition de fichiers source . Il est possible d'crire un script
qui considre ce code de sortie comme normal.
De plus, certaines versions de GNU tar retournent un code d'erreur qu'on peut confondre avec une erreur fatale si le fichier a t
tronqu pendant sa copie par tar. Heureusement, les versions 1.16 et suivantes de GNU tar retournent 1 si le fichier a t modifi
pendant la sauvegarde et 2 pour les autres erreurs.
Il n'est pas utile d'accorder de l'importance au temps pass entre pg_start_backup et le dbut rel de la sauvegarde, pas plus
qu'entre la fin de la sauvegarde et pg_stop_backup ; un dlai de quelques minutes ne pose pas de problme. (Nanmoins, si le
serveur est normalement utilis alors que full_page_writes est dsactiv, une perte de performances entre
pg_start_backup et pg_stop_backup peut tre constate car l'activation du paramtre full_page_writes est force
lors du mode de sauvegarde.) Il convient toutefois de s'assurer que ces tapes sont effectues squentiellement, sans chevauchement. Dans le cas contraire, la sauvegarde est invalide.
La sauvegarde doit inclure tous les fichiers du rpertoire du groupe de bases de donnes (/usr/local/pgsql/data, par
exemple). Si des tablespaces qui ne se trouvent pas dans ce rpertoire sont utiliss, il ne faut pas oublier de les inclure (et s'assurer
galement que la sauvegarde archive les liens symboliques comme des liens, sans quoi la restauration va corrompre les tablespaces).
Nanmoins, les fichiers du sous-rpertoire pg_xlog/, contenu dans le rpertoire du cluster, peuvent tre omis. Ce lger ajustement permet de rduire le risque d'erreurs lors de la restauration. C'est facile raliser si pg_xlog/ est un lien symbolique vers
quelque endroit extrieur au rpertoire du cluster, ce qui est toutefois une configuration courante, pour des raisons de performance.
Il peut tre intressant d'exclure postmaster.pid et postmaster.opts, qui enregistrent des informations sur le postmaster
en cours d'excution, mais pas sur le postmaster qui va utiliser cette sauvegarde. De plus, ces fichiers peuvent poser problme
pg_ctl.
La sauvegarde n'est utilisable que si les fichiers de segment WAL engendrs pendant ou aprs cette sauvegarde sont prservs.
Pour faciliter cela, la fonction pg_stop_backup cre un fichier d'historique de la sauvegarde immdiatement stock dans la
zone d'archivage des WAL. Ce fichier est nomm d'aprs le nom du premier fichier segment WAL ncessaire l'utilisation de la
sauvegarde. Ainsi, si le fichier WAL de dmarrage est 0000000100001234000055CD, le nom du fichier d'historique ressemble 0000000100001234000055CD.007C9330.backup (le deuxime nombre dans le nom de ce fichier contient la
position exacte l'intrieur du fichier WAL et peut en gnral tre ignor). Une fois que la sauvegarde du systme de fichiers et
des segments WAL utiliss pendant celle-ci (comme prcis dans le fichier d'historique des sauvegardes) est archive de faon
sre, tous les segments WAL archivs de noms numriquement plus petits ne sont plus ncessaires la rcupration de la sauvegarde du systme de fichiers et peuvent tre supprims. Toutefois, il est prfrable de conserver plusieurs jeux de sauvegarde pour
tre absolument certain de pouvoir rcuprer les donnes.
Le fichier d'historique de la sauvegarde est un simple fichier texte. Il contient le label pass pg_start_backup, l'heure et les
segments WAL de dbut et de fin de la sauvegarde. Si le label est utilis pour identifier l'endroit o le fichier de sauvegarde associ est conserv, alors le fichier d'historique archiv est suffisant pour savoir quel fichier de sauvegarde restaurer, en cas de besoin.
Puisqu'il faut conserver tous les fichiers WAL archivs depuis la dernire sauvegarde de base, l'intervalle entre les sauvegardes de
base est habituellement choisi en fonction de l'espace de stockage qu'on accepte de consommer en fichiers d'archives WAL. Il faut
407
Sauvegardes et restaurations
galement considrer le temps dpenser pour la rcupration, si celle-ci s'avre ncessaire -- le systme doit rejouer tous les segments WAL et ceci peut prendre beaucoup de temps si la dernire sauvegarde de base est ancienne.
La fonction pg_start_backup cre un fichier nomm backup_label dans le rpertoire du cluster de bases de donnes. Ce
fichier est ensuite supprim par pg_stop_backup. Ce fichier est archiv dans le fichier de sauvegarde. Le fichier de label de la
sauvegarde inclut la chane de label passe pg_start_backup, l'heure laquelle pg_start_backup a t excut et le
nom du fichier WAL initial. En cas de confusion, il est ainsi possible de regarder dans le fichier sauvegarde et de dterminer avec
prcision de quelle session de sauvegarde provient ce fichier.
Il est aussi possible de faire une sauvegarde alors que le serveur est arrt. Dans ce cas, pg_start_backup et
pg_stop_backup ne peuvent pas tre utiliss. L'utilisateur doit alors se dbrouiller pour identifier les fichiers de sauvegarde et
dterminer jusqu'o remonter avec les fichiers WAL associs. Il est gnralement prfrable de suivre la procdure d'archivage
continu dcrite ci-dessus.
Sauvegardes et restaurations
ront demands la commande ; elle doit renvoyer autre chose que zro dans ce cas. Ce n'est pas une condition d'erreur. Tous les
fichiers demands ne seront pas des segmets WAL; vous pouvez aussi vous attendre des demandes de fichiers suffixs par
.backup or .history. Il faut galement garder l'esprit que le nom de base du chemin %p diffre de %f ; il ne sont pas interchangeables.
Les segments WAL qui ne se trouvent pas dans l'archive sont recherchs dans pg_xlog/ ; cela autorise l'utilisation de segments
rcents non archivs. Nanmoins, les segments disponibles dans l'archive sont utiliss de prfrence aux fichiers contenus dans
pg_xlog/. Le systme ne surcharge pas le contenu de pg_xlog/ lors de la rcupration des fichiers archivs.
Normalement, la rcupration traite tous les segments WAL disponibles, restaurant du coup la base de donnes l'instant prsent
(ou aussi proche que possible, en fonction des segments WAL disponibles). Une rcupration normale se finit avec un message
fichier non trouv , le texte exact du message d'erreur dpendant du choix de restore_command. Un message d'erreur au
dbut de la rcupration peut galement apparatre concernant un fichier nomm dont le nom ressemble 00000001.history.
Ceci est aussi normal et n'indique par un problme dans les situations de rcupration habituelles. Voir Section 24.3.4, Lignes
temporelles (Timelines) pour plus d'informations.
Pour rcuprer un moment prcis (avant que le DBA junior n'ait supprim la table principale), il suffit d'indiquer le point d'arrt
requis dans recovery.conf. Le point d'arrt, aussi nomm recovery target (cible de rcupration), peut tre prcis par une
combinaison date/heure, un point de rcupration nomm ou par le dernier identifiant de transaction. Actuellement, seules les options date/heure et point de rcupration nomm sont vraiment utilisables car il n'existe pas d'outils permettant d'identifier avec
prcision l'identifiant de transaction utiliser.
Note
Le point d'arrt doit tre postrieur la fin de la sauvegarde de la base (le moment o pg_stop_backup se termine). Une sauvegarde ne peut pas tre utilise pour repartir d'un instant o elle tait encore en cours (pour ce faire,
il faut rcuprer la sauvegarde prcdente et rejouer partir de l).
Si la rcupration fait face une corruption des donnes WAL, elle se termine ce point et le serveur ne dmarre pas. Dans un tel
cas, le processus de rcupration peut alors tre r-excut partir du dbut en prcisant une cible de rcupration antrieure
au point de rcupration pour permettre cette dernire de se terminer correctement. Si la rcupration choue pour une raison externe (arrt brutal du systme ou archive WAL devenue inaccessible), la rcupration peut tre simplement relance. Elle redmarre alors quasiment l o elle a chou. Le redmarrage de la restauration fonctionne comme les points de contrle du droulement normal : le serveur force une criture rgulire de son tat sur les disques et actualise alors le fichier pg_control pour indiquer que les donnes WAL dj traites n'ont plus tre parcourues.
Sauvegardes et restaurations
Par dfaut, la rcupration s'effectue sur la timeline en vigueur au cours de la la sauvegarde. Si l'on souhaite effectuer la rcupration dans une timeline fille (c'est--dire retourner un tat enregistr aprs une tentative de rcupration), il faut prciser
l'identifiant de la timeline dans recovery.conf. Il n'est pas possible de rcuprer dans des timelines antrieures la sauvegarde.
410
Sauvegardes et restaurations
copier les journaux de transaction en groupe pour qu'ils soient transfrs toutes les trois heures plutt qu'un la fois ;
Astuce
Lors de l'utilisation du script archive_command, il est prfrable d'activer logging_collector. Tout message envoy dans stderr partir du script apparatra dans les traces du serveur, permettant un diagnostic plus ais de
configurations complexes en cas de problme.
24.3.6. Restrictions
Au moment o ces lignes sont crites, plusieurs limitations de la technique d'achivage continu sont connues. Elles seront probablement corriges dans une prochaine version :
Les oprations sur les index de hachage ne sont pas traces dans les journaux de transactions. Ces index ne sont donc pas actualiss lorsque la sauvegarde est rejoue. Cela signifie que toute nouvelle insertion sera ignore par l'index, que les lignes
mises jour sembleront disparatre et que les lignes supprimes auront toujours leur pointeurs. En d'autres termes, si vous modifier une table disposant d'un index hash, alors vous obtiendrez des rsultats errons sur un serveur en attente. Lorsque la restauration se termine, il est recommand de lancer manuellement la commande REINDEX(7) sur chacun des index la fin de la
rcupration.
Si une commande CREATE DATABASE(7) est excute alors qu'une sauvegarde est en cours, et que la base de donnes modle utilise par l'instruction CREATE DATABASE est son tour modifie pendant la sauvegarde, il est possible que la rcupration propage ces modifications dans la base de donnes cre. Pour viter ce risque, il est prfrable de ne pas modifier les
bases de donnes modle lors d'une sauvegarde de base.
Les commandes CREATE TABLESPACE(7) sont traces dans les WAL avec le chemin absolu et sont donc rejoues en tant
que crations de tablespace suivant le mme chemin absolu. Cela n'est pas forcment souhaitable si le journal est rejoue sur
une autre machine. De plus, cela peut s'avrer dangereux mme lorsque le journal est rejou sur la mme machine, mais dans
un rpertoire diffrent : la r-excution surcharge toujours le contenu du tablespace original. Pour viter de tels problmes, la
meilleure solution consiste effectuer une nouvelle sauvegarde de la base aprs la cration ou la suppression de tablespace.
Il faut de plus garder l'esprit que le format actuel des WAL est extrmement volumineux car il inclut de nombreuses images des
pages disques. Ces images de page sont conues pour supporter la rcupration aprs un arrt brutal, puisqu'il peut tre ncessaire
de corriger des pages disque partiellement crites. En fonction du matriel et des logiciels composant le systme, le risque
d'criture partielle peut tre suffisamment faible pour tre ignor, auquel cas le volume total des traces archives peut tre considrablement rduit par la dsactivation des images de page l'aide du paramtre full_page_writes (lire les notes et avertissements
dans Chapitre 29, Fiabilit et journaux de transaction avant de le faire). Dsactiver les images de page n'empche pas l'utilisation
des traces pour les oprations PITR. Un piste ventuelle de dveloppement futur consiste compresser les donnes des WAL archivs en supprimant les copies inutiles de pages mme si full_page_writes est actif. Entre temps, les administrateurs
peuvent souhaiter rduire le nombre d'images de pages inclus dans WAL en augmentant autant que possible les paramtres
d'intervalle entre les points de vrification.
411
NAS
DRBD
Mthode
de Disque partag Blocs disque
communication
Ne requiert aucun matriel
spcial
Secours semiautomatique
(Hot/Warm
Standby) par
PITR
Rplication
matre/esclave
bas sur les
triggers
PITR
Slony
pgpool-II
Bucardo
WAL
Lignes de
tables
SQL
Lignes de
tables
Lignes de
tables et verrous de ligne
Pas d'attente
entre serveurs
Pas de perte de
donnes en cas
de panne du
matre
Les esclaves
acceptent les
requtes
en
lecture seule
Hot only
Granularit de
niveau table
Ne ncessite
pas de rsolution de conflit
Middleware
Rplication
Rplication
de rplication asynchrone
synchrone
sur instruc- multi-matres multi-matres
tions
414
25.2.1. Prparatifs
Il est habituellement prfrable de crer les serveurs primaire et de standby de faon ce qu'ils soient aussi similaires que possible, au moins du point de vue du serveur de bases de donnes. En particulier, les chemins associs avec les tablespaces seront
passs d'un noeud l'autre sans conversion, ce qui implique que les serveurs primaire et de standby doivent avoir les mmes chemins de montage pour les tablespaces si cette fonctionnalit est utilise. Gardez en tte que si CREATE TABLESPACE(7) est
excut sur le primaire, tout nouveau point de montage ncessaire pour cela doit tre cr sur le primaire et tous les standby avant
que la commande ne soit excute. Le matriel n'a pas besoin d'tre exactement le mme, mais l'exprience monte que maintenir
deux systmes identiques est plus facile que maintenir deux diffrents sur la dure de l'application et du systme. Quoi qu'il en
soit, l'architecture hardware doit tre la mme -- rpliquer par exemple d'un serveur 32 bits vers un 64 bits ne fonctionnera pas.
De manire gnrale, le log shipping entre serveurs excutant des versions majeures diffrentes de PostgreSQL est impossible.
La politique du PostgreSQL Global Development Group est de ne pas raliser de changement sur les formats disques lors des
mises jour mineures, il est par consquent probable que l'excution de versions mineures diffrentes sur le primaire et le standby
fonctionne correctement. Toutefois, il n'y a aucune garantie formelle de cela et il est fortement conseill de garder le serveur primaire et celui de standby au mme niveau de version autant que faire se peut. Lors d'une mise jour vers une nouvelle version mineure, la politique la plus sre est de mettre jour les serveurs de standby d'abord -- une nouvelle version mineure est davantage
susceptible de lire les enregistrements WAL d'une ancienne version mineure que l'inverse.
Note
N'utilisez pas pg_standby ou des outils similaires avec le mode de standby intgr dcrit ici. restore_command
devrait retourner immdiatement si le fichier n'existe pas; le serveur essayera la commande nouveau si ncessaire.
Voir Section 25.4, Mthode alternative pour le log shipping pour utiliser des outils tels que pg_standby.
Si vous souhaitez utiliser la streaming replication, renseignez primary_conninfo avec une chane de connexion libpq, contenant le nom d'hte (ou l'adresse IP) et tout dtail supplmentaire ncessaire pour se connecter au serveur primaire. Si le primaire a
besoin d'un mot de passe pour l'authentification, le mot de passe doit aussi tre spcifi dans primary_conninfo.
Si vous mettez en place le serveur de standby pour des besoins de haute disponibilit, mettez en place l'archivage de WAL, les
connexions et l'authentification l'identique du serveur primaire, parce que le serveur de standby fonctionnera comme un serveur
primaire aprs la bascule.
Si vous utilisez une archive WAL, sa taille peut tre rduite en utilisant l'option archive_cleanup_command pour supprimer les fichiers qui ne sont plus ncessaires au serveur de standby. L'outil pg_archivecleanup est conu spcifiquement pour tre utilis
avec archive_cleanup_command dans des configurations typiques de standby, voir pg_archivecleanup. Notez toutefois que
si vous utilisez l'archive des fins de sauvegarde, vous avez besoin de garder les fichiers ncessaires pour restaurer partir de
votre dernire sauvegarde de base, mme si ces fichiers ne sont plus ncessaires pour le standby.
If you're using a WAL archive, its size can be minimized using the parameter to remove files that are no longer required by the
standby server. Note however, that if you're using the archive for backup purposes, you need to retain files needed to recover from
at least the latest base backup, even if they're no longer needed by the standby.
Un simple exemple de recovery.conf est:
standby_mode = 'on'
primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass'
restore_command = 'cp /path/to/archive/%f %p'
archive_cleanup_command = 'pg_archivecleanup /path/to/archive %r'
Vous pouvez avoir n'importe quel nombre de serveurs de standby, mais si vous utilisez la streaming replication, assurez vous
416
25.2.5.1. Authentification
Il est trs important que les privilges d'accs pour la rplications soient paramtrs pour que seuls les utilisateurs de confiance
puissent lire le flux WAL, parce qu'il est facile d'en extraire des informations privilgies. Les serveurs de standby doivent
s'authentifier sur le primaire avec un compte dot de l'attribut REPLICATION. Par consquent, un rle avec les attributs REPLICATION et LOGIN doit tre cr sur le primaire.
Note
Il est recommand d'utiliser un compte utilisateur spcifique pour la rplication. Bien que l'attribut REPLICATION
soit accord aux comptes superutilisateurs par dfaut, il n'est pas recommand d'utiliser un compte superutilisateur
pour la rplication. Mme si l'attribut REPLICATION laisse beaucoup de libert un utilisateur, il ne l'autorise pas
modifier les donnes sur le primaire, alors que l'attribut SUPERUSER le permet.
L'authentification cliente pour la rplication est contrle par un enregistrement de pg_hba.conf spcifiant replication
dans le champ database. Par exemple, si le standby s'excute sur un hte d'IP 192.168.1.100 et que le nom de l'utilisateur
pour la rplication est foo, l'administrateur peut ajouter la ligne suivante au fichier pg_hba.conf sur le primaire:
# Autoriser l'utilisateur "foo" de l'hte 192.168.1.100 se connecter au primaire
# en tant que standby de replication si le mot de passe de l'utilisateur est
correctement fourni
#
# TYPE DATABASE
USER
ADDRESS
METHOD
host
replication
foo
192.168.1.100/32
md5
Le nom d'hte et le numro de port du primaire, le nom d'utilisateur de la connexion, et le mot de passe sont spcifis dans le fichier recovery.conf. Le mot de passe peut aussi tre enregistr dans le fichier ~/.pgpass sur le serveur en attente (en prcisant replication dans le champ database). Par exemple, si le primaire s'excute sur l'hte d'IP 192.168.1.50, port
5432, que le nom de l'utilisateur pour la rplication est foo, et que le mot de passe est foopass, l'administrateur peut ajouter la
417
25.2.5.2. Supervision
Un important indicateur de sant de la streaming replication est le nombre d'enregistrements gnrs sur le primaire, mais pas encore appliqus sur le standby. Vous pouvez calculer ce retard en comparant le point d'avancement des critures du WAL sur le primaire avec le dernier point d'avancement reu par le standby. Ils peuvent tre rcuprs en utilisant
pg_current_xlog_location sur le primaire et pg_last_xlog_receive_location sur le standby, respectivement
(voir Tableau 9.56, Fonctions de contrle de la sauvegarde et Tableau 9.57, Fonctions d'information sur la restauration
pour plus de dtails). Le point d'avancement de la rception dans le standby est aussi affich dans le statut du processus de rception des WAL (wal receiver), affich par la commande ps (voyez Section 27.1, Outils Unix standard pour plus de dtails).
Vous pouvez obtenir la liste des processus metteurs de WAL au moyen de la vue pg_stat_replication D'importantes diffrences entre les champs pg_current_xlog_location et sent_location peuvent indiquer que le serveur matre est en
surcharge, tandis que des diffrences entre sent_location et pg_last_xlog_receive_location sur le standby
peuvent soit indiquer une latence rseau importante, soit que le standby est surcharg.
25.4.1. Implmentation
La procdure simplifi pour configurer un serveur de test en utilisant cette mthode alternative est la suivante. Pour tous les dtails
sur chaque tape, rfrez vous aux sections prcdentes suivant les indications.
1. Paramtrez les systmes primaire et standby de faon aussi identique que possible, y compris deux copies identiques de PostgreSQL au mme niveau de version.
2. Activez l'archivage en continu du primaire vers un rpertoire d'archives WAL sur le serveur de standby. Assurez vous que archive_mode, archive_command et archive_timeout sont positionns correctement sur le primaire (voir Section 24.3.1,
Configurer l'archivage WAL ).
3. Effectuez une sauvegarde de base du serveur primaire( voir Section 24.3.2, Raliser une sauvegarde de base ), , et chargez
ces donnes sur le standby.
4. Commencez la rcupration sur le serveur de standby partir de l'archive WAL locale, en utilisant un recovery.conf qui
spcifie une restore_command qui attend comme dcrit prcdemment (voir Section 24.3.3, Rcupration partir d'un
archivage continu ).
Le rcupration considre l'archive WAL comme tant en lecture seule, donc une fois qu'un fichier WAL a t copi sur le systme de standby il peut tre copi sur bande en mme temps qu'il est lu par le serveur de bases de donnes de standby. Ainsi, on
peut faire fonctionner un serveur de standby pour de la haute disponibilit en mme temps que les fichiers sont stocks pour de la
reprise aprs sinistre.
des fins de test, il est possible de faire fonctionner le serveur primaire et de standby sur le mme systme. Cela n'apporte rien en
termes de robustesse du serveur, pas plus que cela ne pourrait tre dcrit comme de la haute disponibilit.
.
LOCK TABLE, mais seulement quand explicitement dans un de ces modes: ACCESS SHARE, ROW SHARE ou ROW EXCLUSIVE.
Les transactions lances pendant la restauration d'un serveur en hotstandby ne se verront jamais affectes un identifiant de transactions et ne peuvent pas tre crites dans les journaux de transactions. Du coup, les actions suivantes produiront des messages
d'erreur :
Langage de Manipulation de Donnes (LMD ou DML) - INSERT, UPDATE, DELETE, COPY FROM, TRUNCATE. Notez qu'il n'y a pas d'action autorise qui entranerait l'excution d'un trigger pendant la rcupration. Cette restriction s'applique
mme pour les tables temporaires car les lignes de ces tables ne peuvent tre lues et crites s'il n'est pas possible d'affecter un
identifiant de transactions, ce qui n'est actuellement pas possible dans un environnement Hot Standby.
Langage de Dfinition de Donnes (LDD ou DDL) - CREATE, DROP, ALTER, COMMENT. Cette restriction s'applique
aussi aux tables temporaires car, pour mener bien ces oprations, cela ncessiterait de mettre jour les catalogues systmes.
SELECT ... FOR SHARE | UPDATE, car les verrous de lignes ne peuvent pas tre pris sans mettre jour les fichiers de
donnes.
Rules sur des ordres SELECT qui gnrent des commandes LMD.
LOCK dans sa forme courte par dfaut, puisqu'il demande ACCESS EXCLUSIVE MODE.
422
Commandes de gestion de transaction qui positionnent explicitement un tat n'tant pas en lecture-seule:
SET TRANSACTION READ WRITE, SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE
Dans le cadre normal, les transactions en lecture seule permettent la mise jour des squences et l'utilisation des instructions
LISTEN, UNLISTEN et NOTIFY, donc les sessions Hot Standby ont des restrictions lgrement infrieures celles de sessions
en lecture seule ordinaires. Il est possible que certaines des restrictions soient encore moins importantes dans une prochaine version.
Lors du fonctionnement en serveur hotstandby, le paramtre transaction_read_only est toujours true et ne peut pas tre
modifi. Tant qu'il n'y a pas de tentative de modification sur la base de donnes, les connexions sur un serveur en hotstandby se
comportent de faon pratiquement identiques celles sur un serveur normal. Quand une bascule (failover ou switchover) survient,
la base de donnes bascule dans le mode de traitement normal. Les sessions resteront connectes pendant le changement de mode.
Quand le mode hotstandby est termin, il sera possible de lancer des transactions en lecture/criture, y compris pour les sessions
connectes avant la bascule.
Les utilisateurs pourront dterminer si leur session est en lecture seule en excutant SHOW transaction_read_only. De plus, un
jeu de fonctions (Tableau 9.57, Fonctions d'information sur la restauration ) permettent aux utilisateurs d' accder des informations propos du serveur de standby. Ceci vous permet d'crire des programmes qui sont conscients de l'tat actuel de la base.
Vous pouvez vous en servir pour superviser l'avancement de la rcupration, ou pour crire des programmes complexes qui restaurent la base dans des tats particuliers.
Des verrous en accs exclusif pris sur le serveur matre, incluant la fois les commandes LOCK exclusives et quelques actions de type DDL, entrent en conflit avec les accs de table des requtes en lecture seule.
La suppression d'un tablespace sur le serveur matre entre en conflit avec les requtes sur le serveur standby qui utilisent ce tablespace pour les fichiers temporaires.
La suppression d'une base de donnes sur le serveur matre entre en conflit avec les sessions connectes sur cette base de donnes sur le serveur en attente.
La copie d'un enregistrement nettoy par un VACUUM entre en conflit avec les transactions sur le serveur en attente qui
peuvent toujours voir au moins une des lignes supprimer.
La copie d'un enregistrement nettoy par un VACUUM entre en conflit avec les requtes accdant la page cible sur le serveur en attente, qu'elles voient ou non les donnes supprimer.
Sur le serveur matre, ces cas rsultent en une attente supplmentaire ; l'utilisateur peut choisir d'annuler une des actions en conflit.
Nanmoins, sur le serveur en attente, il n'y a pas de choix possibles : l'action enregistre dans les journaux de transactions est dj
survenue sur le serveur matre et le serveur en standby doit absolument russir l'appliquer. De plus, permettre que
l'enregistrement de l'action attende indfiniment pourrait avoir des effets fortement non dsirables car le serveur en attente sera de
plus en plus en retard par rapport au matre. Du coup, un mcanisme est fourni pour forcer l'annulation des requtes sur le serveur
en attente qui entreraient en conflit avec des enregistrements des journaux de transactions en attente.
423
L'information sur la cohrence est enregistre une fois par checkpoint sur le primaire. Il n'est pas possible d'activer le hot standby
si on lit des WAL gnrs durant une priode pendant laquelle wal_level n'tait pas positionn hot_standby sur le primaire. L'arrive un tat cohrent peut aussi tre retarde si ces deux conditions se prsentent:
Si vous effectuez du log shipping par fichier ("warm standby"), vous pourriez devoir attendre jusqu' l'arrive du prochain fichier
de WAL, ce qui pourrait tre aussi long que le paramtre archive_timeout du primaire.
Certains paramtres sur le standby vont devoir tre revus si ils ont t modifis sur le primaire. Pour ces paramtres, la valeur sur
le standby devra tre gale ou suprieure celle du primaire. Si ces paramtres ne sont pas suffisamment levs le standby refusera de dmarrer. Il est tout fait possible de fournir de nouvelles valeurs plus leves et de redmarrer le serveur pour reprendre la
rcupration. Ces paramtres sont les suivants:
max_connections
max_prepared_transactions
max_locks_per_transaction
Notez encore une fois que certaines de ces commandes sont en fait autorises durant les transactions en "lecture seule" sur le pri425
25.5.5. Avertissements
Il y a plusieurs limitations de Hot Standby. Elles peuvent et seront probablement rsolues dans des versions ultrieures:
Les oprations sur les index hash ne sont pas crits dans la WAL l'heure actuelle, la rcupration ne mettra donc pas ces index jour.
Une connaissance complte des transactions en cours d'excution est ncessaire avant de pouvoir dclencher des instantans.
Des transactions utilisant un grand nombre de sous-transactions ( l'heure actuelle plus de 64) retarderont le dmarrage des
connexions en lecture seule jusqu' compltion de la plus longue transaction en criture. Si cette situation se produit, des messages explicatifs seront envoys dans la trace du serveur.
Des points de dmarrage valides pour les requtes de standby sont gnrs chaque checkpoint sur le matre. Si le standby est
teint alors que le matre est dj teint, il est tout fait possible ne ne pas pouvoir repasser en Hot Standby tant que le primaire n'aura pas t redmarr, afin qu'il gnre de nouveaux points de dmarrage dans les journaux WAL. Cette situation
n'est pas un problme dans la plupart des situations o cela pourrait se produire. Gnralement, si le primaire est teint et plus
disponible, c'est probablement en raison d'un problme srieux qui va de toutes faons forcer la conversion du standby en primaire. Et dans des situations o le primaire est teint intentionnellement, la procdure standard est de promouvoir le matre.
la fin de la rcupration, les AccessExclusiveLocks possds par des transactions prpares ncessiteront deux fois le
nombre d'entres normal dans la table de verrous. Si vous pensez soit excuter un grand nombre de transactions prpares prenant des AccessExclusiveLocks, ou une grosse transaction prenant beaucoup de AccessExclusiveLocks, il est
conseill d'augmenter la valeur de max_locks_per_transaction, peut-tre jusqu' une valeur double de celle du serveur primaire. Vous n'avez pas besoin de prendre ceci en compte si votre paramtre max_prepared_transactions est
0.
Il n'est pas encore possible de passer une transaction en mode d'isolation srialisable tout en supportant le hot standby (voir
Section 13.2.3, Niveau d'Isolation Serializable et Section 13.4.1, Garantir la Cohrence avec Des Transactions Serializable pour plus de dtails). Une tentative de modification du niveau d'isolation d'une transaction srialisable en hot standby
gnrera une erreur.
427
# Windows
archive_cleanup_command (string)
Ce paramtre optionel spcifie une commande d'interprteur qui sera excut chaque point de reprise. Le but de archive_cleanup_command est de fournir un mcanisme de nettoyage des vieux fichiers WAL archivs qui ne sont plus
ncessaires au serveur de standby. Tout %r est remplac par le nom du fichier contenant le dernier point de reprise
(restartpoint) valide. Autrement dit, le fichier le plus ancien qui doit tre conserv pour permettre la rcupration d'tre redmarrable. Du coup, tous les fichiers crs avant %r peuvent tre supprims sans problme. Cette information peut tre
utilise pour tronquer les archives au minimum ncessaire pour redmarrer partir de la restauration en Le module
pg_archivecleanup est souvent utilis dans archive_cleanup_command dans des configurations de standby seuls. Par
exemple :
archive_cleanup_command = 'pg_archivecleanup /mnt/server/archivedir %r'
Notez nanmoins que si plusieurs serveurs en standby sont mis jour partir du mme rpertoire d'archives, vous devez
vous assurer que vous ne supprimez que les journaux de transactions qui ne sont plus utiles tous les serveurs. archive_cleanup_command n'est typiquement utilis que dans des configurations de warm-standby (voir Section 25.2,
Serveurs de Standby par transfert de journaux ). crivez %% pour inclure un vrai caractre %.
Si la commande retourne un code de retour diffrent de zro alors um message de journal WARNING sera crit.
recovery_end_command (chane de caractres)
Ce paramtre spcifie une commande d'interprteur qui sera excute une fois seulement, la fin de la rcupration. Ce paramtre est optionnel. Le but de recovery_end_command est de fournir un mcanisme pour un nettoyage la fin de la
rplication ou de la rcupration. Tout %r est remplac par le nom du fichier contenant le dernier point de reprise valide,
comme dans archive_cleanup_command.
Si la commande retourne un code de retour diffrent de zro alors um message de journal WARNING sera crit et la base
continuera son dmarrage malgr tout. Par contre, si la commande a t termine par un signal, la base n'effectuera pas son
dmarrage.
Configuration de la rcupration
recovery_target_name (string)
Ce paramtre spcifie le point de restauration nomm, cr avec pg_create_restore_point(), qui indiquera la fin de
la restauration. Au plus un paramtre parmi recovery_target_name, recovery_target_time ou recovery_target_xid peut
tre configur. Par dfaut, la restauration se fait jusqu'au dernier journal de transactions disponible.
recovery_target_time (timestamp)
Ce paramtre spcifie l'horodatage (timestamp) jusqu'auquel la rcupration se poursuivra. On ne peut spcifier qu'un seul des
paramtres recovery_target_time, recovery_target_name et recovery_target_xid au plus. Par dfaut, la rcupration
se poursuit jusqu' la fin du journal WAL. Le point prcis d'arrt dpend aussi de recovery_target_inclusive.
recovery_target_xid (chane de caractres)
Ce paramtre spcifie l'identifiant de transaction jusqu'auquel la rcupration se poursuivra. Gardez l'esprit que, bien que les
identifiants de transactions sont assigns squentiellement au dmarrage des transactions, elles peuvent se terminer dans un
ordre numrique diffrent. Les transactions qui seront rcupres sont celles qui auront ralis leur COMMIT avant la transaction spcifie (optionnellement incluse). On ne peut spcifier qu'un seul des paramtres recovery_target_time, recovery_target_name et recovery_target_xid au plus. Par dfaut, la rcupration se poursuit jusqu' la fin du journal WAL. Le
point prcis d'arrt dpend aussi de recovery_target_inclusive.
recovery_target_inclusive (boolen)
Spcifie si il faut s'arrter juste aprs la cible de rcupration spcifie (true), ou juste avant la cible de rcupration
(false). S'applique recovery_target_time comme recovery_target_xid, suivant celui qui est spcifi pour cette rcupration. Ceci indique si les transaction qui ont exactement le mme horodatage ou le mme identifiant de commit, respectivement, seront inclues dans la rcupration. La valeur par dfaut est (true).
recovery_target_timeline (chane de caractres)
Spcifie la ligne de temps (timeline) prcise sur laquelle effectuer la rcupration. Le comportement par dfaut est de rcuprer sur la mme timeline que celle en cours lorsque la sauvegarde de base a t effectue. Configurer ce paramtre latest
permet de restaurer jusqu' la dernire ligne de temps disponible dans les archives, ce qui est utile pour un serveur standby.
Sinon, vous n'aurez besoin de positionner ce paramtre que dans des cas complexes de re-rcupration, o vous aurez besoin
d'atteindre un tat lui mme atteint aprs une rcupration un moment dans le temps (point-in-time recovery). Voir Section 24.3.4, Lignes temporelles (Timelines) pour plus d'informations.
pause_at_recovery_target (boolean)
Spcifie si la restauration doit se mettre en pause quand la cible de restauration est atteinte. La valeur par dfaut est true. Cela
permet l'excution de requtes sur la base de donnes pour vrifier si la cible de restauration est bien celle souhaite. L'tat de
pause peut tre annule en utilisant pg_xlog_replay_resume() (voir Tableau 9.58, Fonctions de contrle de la restauration ), ce qui termine la restauration. Si la cible actuelle de restauration ne correspond pas au point d'arrt souhait, arrtez le serveur, modifiez la configuration de la cible de restauration une cible plus lointaine, et enfin redmarrez pour continuer la restauration.
Cette configuration n'a pas d'effet si hot_standby n'est pas active ou si une cible de restauration n'est pas configure.
Configuration de la rcupration
430
SN
SN
13:17
13:17
0:00 postgres -i
0:00 postgres: writer
SN
13:17
SN
13:18
SN
13:19
SN
13:19
(L'appel appropri de ps varie suivant les diffrentes plateformes, de mme que les dtails affichs. Cet exemple est tir d'un
systme Linux rcent.) Le premier processus affich ici est le processus serveur matre, le processus serveur matre. Les arguments affichs pour cette commande sont les mmes qu' son lancement. Les deux processus suivant sont des processus en tche
de fond lancs automatiquement par le processus matre (le processus stats collector n'est pas prsent si vous avez configur
le systme pour qu'il ne lance pas le rcuprateur de statistiques). Chacun des autres processus est un processus serveur grant
une connexion cliente. Tous ces processus restant initialisent l'affichage de la ligne de commande de la forme
postgres: utilisateur base_de_donnes hte activit
L'utilisateur, la base de donnes et les lments de l'hte (client) restent identiques pendant toute la vie de connexion du client
mais l'indicateur d'activit change. L'activit pourrait tre idle (c'est--dire en attente d'une commande du client), idle in
transaction (en attente du client l'intrieur d'un bloc de BEGIN/COMMIT) ou un nom de commande du type SELECT.
De plus, waiting est ajout si le processus serveur est en attente d'un verrou dtenu par une autre session. Dans l'exemple cidessus, nous pouvons supposer que le processus 1003 attend que le processus 1016 ait termin sa transaction et, du coup, libre
un verrou.
Si vous avez dsactiv update_process_title, alors l'indicateur d'activit n'est pas mis jour ; le titre du processus est configur
une seule fois quand un nouveau processus est lanc. Sur certaines plateformes, ceci permet d'conomiser du temps. Sur
d'autres, cette conomie est insignifiante.
Astuce
Solaris requiert une gestion particulire. Vous devez utiliser /usr/ucb/ps plutt que /bin/ps. Vous devez aussi
utiliser deux options w et non pas seulement une. En plus, votre appel original de la commande postgres doit
avoir un affichage de statut dans ps plus petit que celui fourni par les autres processus serveur. Si vous chouez
dans les trois, l'affichage de ps pour chaque processus serveur sera la ligne de commande originale de postgres.
tions sur les VACUUM et les ANALYZE pour chaque table. Il peut aussi compter le nombre d'appels aux fonctions dfinies par
l'utilisateur ainsi que le temps total dpens par chacune.
PostgreSQL supporte aussi la dtermination de la commande exacte en cours d'excution par les autres processus serveur. Cette
fonctionnalit indpendante ne dpend pas du rcuprateur de statistiques.
Nom de la vue
Description
pg_stat_activity
Une ligne par processus serveur, affichant l'OID de la base de donnes, le nom de la base, l'ID du processus, l'OID de l'utilisateur, son nom, le nom de l'application, l'adresse, le nom de l'hte (si disponible)
et le port du client, la date et l'heure laquelle le client s'est connect, de dbut de la transaction, et de
dbut de la requte, le statut d'attente de verrou du processus et le texte de la requte en cours
d'excution. Les colonnes renvoyant des donnes sur la requte en cours sont disponibles sauf si le paramtre track_activities a t dsactiv. De plus, ces colonnes sont seulement visibles si
l'utilisateur examinant cette vue est un superutilisateur ou est le propritaire du processus en cours de
rapport. Le nom de l'hte du client sera disponible seulement si log_hostname est activ ou s'il a t n432
Nom de la vue
Description
cessaire de le rechercher pendant la phase d'authentification (pg_hba.conf).
pg_stat_bgwriter
Une seule ligne indiquant des statistiques du cluster complet provenant du processus d'criture en tche
de fond : nombre de points de vrification planifis, points de vrification demands, tampons crits
par les points de vrification et parcours de nettoyage, et le nombre de fois o le processus d'criture en
tche de fond a stopp un parcours de nettoyage parce qu'il a crit trop de tampons. Cela inclut aussi
des statistiques sur les tampons partags dont le nombre de tampons crit par les processus serveur
(c'est--dire par autre chose que le processus d'criture en tche de fond), sur le nombre de fois que les
processus serveurs ont excut eux-mmes des appels fsync (normalement, le processus d'criture en
tche de fond s'en occupe mme si le processus serveur a fait les critures), le nombre de tampons allous et l'horodatage de la dernire rinitialisation des statistiques.
pg_stat_database
Une ligne par base de donnes, affichant l'OID de la base de donnes, son nom, le nombre de processus
serveur actifs connects cette base, le nombre total de transactions valides et le nombre de celles qui
ont t annules, le nombre total de blocs disque lus, le nombre total de succs du tampon (c'est--dire
le nombre de lectures de blocs vites en trouvant dj le bloc dans le cache du tampon), le nombre de
lignes renvoyes, rcupres, insres, mises jour et supprimes, le nombre total de requtes annules
cause d'un conflit avec la restauration (sur les serveurs en standby) et l'horodatage de la dernire rinitialisation des statistiques.
pg_stat_database_confli Une ligne par base de donnes, affichant l'OID de la base, son nom et le nombre de requtes qui ont t
cts
annules dans cette base cause de tablespaces supprimes, de dlais dpasss pour les verrous,
d'images de base trop anciennes, de tampons verrouills et de verrous mortels. Ne contiendra que des
informations sur les serveurs en standby car les conflits ne surviennent pas sur les serveurs matres.
pg_stat_replication
Une ligne par processus walsender, affichant l'identifiant du processus, l'OID de l'utilisateur, le nom de
l'utilisateur, le nom de l'application, l'adresse du client, le nom d'hte (si disponible) et le numro de
port, la date et l'heure laquelle le processus serveur a commenc son excution, l'tat du processus et
la position dans les journaux de transactions. De plus, le serveur en standby rapporte la dernire position reue et crite dans les journaux de transactions, la dernire position qu'il a crite sur disque, et la
dernire position qu'il a rejoue. Cette information est aussi affiche ici. Si les noms d'applications du
serveur en standby correspondent un de noms configurs dans synchronous_standby_names,
alors la priorit de synchronisation est aussi affiche ici (cela correspond l'ordre dans lequel les serveurs en standby deviennent le serveur synchrone). Les colonnes dtaillant le travail de la connexion
sont seulement visibles si l'utilisateur qui examine la vue est un superutilisateur. Le nom de l'hte du
client sera disponible seulement si log_hostname est activ ou s'il a t ncessaire de rechercher le nom
d'hte de l'utilisateur pendant la phase d'authentification (pg_hba.conf).
pg_stat_all_tables
Pour chaque table dans la base de donnes en cours (ceci incluant les tables TOAST), l'OID de la table,
le nom du schma et de la table, le nombre de parcours squentiels raliss, le nombre de lignes vivantes rcupres par des parcours squentiels, le nombre de lignes vivantes rcupres par des parcours squentiels, le nombre de parcours d'index raliss (pour tous les index appartenant cette table),
le nombre de lignes vivantes rcupres par les parcours d'index, le nombre d'insertions, de modifications et de suppressions de ligne, le nombre de mises jour de ligne via HOT (donc sans mise jour
spare des index), le nombre de lignes vivantes et mortes, la dernire fois que la table a t la cible
d'un VACUUM manuel (sans l'option FULL), la dernire fois qu'elle a t la cible d'un VACUUM excut par le dmon autovacuum, la dernire fois que la table a t la cible d'un ANALYZE manuel, la
dernire fois qu'elle a t la cible d'un ANALYZE excut par le dmon autovacuum, le nombre de fois
que la table a t la cible d'un VACUUM manuel (sans l'option FULL), le nombre de fois qu'elle a t
la cible d'un VACUUM excut par le dmon autovacuum, le nombre de fois que la table a t la cible
d'un ANALYZE manuel, le nombre de fois qu'elle a t la cible d'un ANALYZE excut par le dmon
autovacuum.
pg_stat_sys_tables
Identique pg_stat_all_tables, sauf que seules les tables systmes sont affiches.
pg_stat_user_tables
Identique pg_stat_all_tables, sauf que seules les tables utilisateurs sont affiches.
pg_stat_xact_all_tables
Similaire pg_stat_all_tables, mais dcompte les actions prises dans la transaction en cours (qui ne
sont pas encore pris en compte dans la vue pg_stat_all_tables et les vues du mme type). Les colonnes
correspondant au nombre de lignes vivantes et mortes, ainsi que celles pour les actions du VACUUM
et de l'ANALYZE ne sont pas prsentes dans cette vue.
pg_stat_xact_sys_tables Identique pg_stat_xact_all_tables, sauf que seules les tables systmes sont affiches.
pg_stat_xact_user_table Identique pg_stat_xact_all_tables,, sauf que seules les tables utilisateurs sont affiches.
s
pg_stat_all_indexes
Pour chaque index de la base de donnes en cours, l'OID de la table et de l'index, le nom du schma, de
433
Nom de la vue
Description
la table et de l'index, le nombre de parcours d'index initis sur cet index, le nombre d'entres de l'index
renvoyes par les parcours d'index, et le nombre de lignes actives de table rcupres par de simples
parcours d'index utilisant cet index.
pg_stat_sys_indexes
Identique pg_stat_all_indexes, sauf que seules les tables systmes sont affiches.
pg_stat_user_indexes
Identique pg_stat_all_indexes, sauf que seules les tables utilisateurs sont affiches.
pg_statio_all_tables
Pour chaque table de la base de donnes en cours (ceci incluant les tables TOAST), l'OID de la table, le
nom du schma et de la table, le nombre de blocs disque lus partir de cette table, le nombre de lectures tampon russies dans tous les index de cette table, le nombre de blocs disque lus et de lectures
tampon russies partir de la table TOAST (si elle existe), et, enfin, le nombre de blocs disque lus et le
nombre de lectures tampon russies partir de l'index de la table TOAST.
pg_statio_sys_tables
Identique pg_statio_all_tables, sauf que seules les tables systmes sont affiches.
pg_statio_user_tables
Identique pg_statio_all_tables, sauf que seules les tables utilisateur sont affiches.
pg_statio_all_indexes
Pour chaque index de la base de donnes en cours, l'OID de la table et de l'index, le nom du schma, de
la table et de l'index, le nombre de blocs disque lus et le nombre de lectures tampon russies pour cet
index.
pg_statio_sys_indexes
Identique pg_statio_all_indexes, sauf que seuls les index systmes sont affichs.
pg_statio_user_indexes
Identique pg_statio_all_indexes, sauf que seuls les index utilisateur sont affichs.
pg_statio_all_sequences Pour chaque squence de la base de donnes en cours, l'OID de la squence, le nom du schma et de la
squence, le nombre de blocs disque lus et le nombre de lectures russies du tampon pour cette squence.
pg_statio_sys_sequences Identique pg_statio_all_sequences, sauf que seules les squences systme sont affiches
(actuellement, aucune squence systme n'est dfinie, donc cette vue est toujours vide)
pg_statio_user_sequence Identique pg_statio_all_sequences, sauf que seules les squences utilisateur sont affiches.
s
pg_stat_user_functions
Pour les fonctions traces, OID de la fonction, schma, nom, nombre d'appels, temps total et temps de
la fonction. Ce dernier est le temps pass uniquement dans la fonction. Le temps total inclus le temps
pass dans les fonctions appeles. Les valeurs sont en millisecondes.
pg_stat_xact_user_funct Similaire pg_stat_user_functions, mais compte seulement les appels pendant la transaction en cours
ions
(qui ne sont pas encore inclus dans pg_stat_user_functions).
Les statistiques par index sont particulirement utiles pour dterminer les index utiliss et leur efficacit.
Les index peuvent tre utiliss soit directement soit via des parcours de bitmap . Dans un parcours de bitmap, les rsultats de
plusieurs index peuvent tre combins via des rgles AND ou OR ; donc il est difficile d'associer des rcuprations de lignes
d'en-ttes individuelles avec des index spcifiques quand un parcours de bitmap est utilis. Du coup, un parcours de bitmap incrmente le nombre dans pg_stat_all_indexes.idx_tup_read pour les index qu'il utilise et il incrmente le nombre
pg_stat_all_tables.idx_tup_fetch pour la table, mais il n'affecte pas pg_stat_all_indexes.idx_tup_fetch.
Note
Avant PostgreSQL 8.1, les totaux idx_tup_read et idx_tup_fetch taient pratiquement toujours gaux.
Maintenant, ils peuvent tre diffrents mme sans considrer les parcours de bitmap parce que idx_tup_read
compte les entres d'index rcupres partir de l'index alors que idx_tup_fetch compte les lignes actives rcupres partir de la table ; ce dernier sera moindre si des lignes mortes ou pas-encore-valides sont rcupres en
utilisant l'index.
Les vues pg_statio_ sont principalement utiles pour dterminer l'efficacit du cache tampon. Quand le nombre de lectures disques
relles est plus petit que le nombre de rcuprations valides par le tampon, alors le cache satisfait la plupart des demandes de lecture sans faire appel au noyau. Nanmoins, ces statistiques ne nous donnent pas l'histoire complte : cause de la faon dont PostgreSQL gre les entres/sorties disque, les donnes qui ne sont pas dans le tampon de PostgreSQL pourraient toujours rsider
dans le tampon d'entres/sorties du noyau et pourraient, du coup, tre toujours rcupres sans ncessiter une lecture physique. Les
utilisateurs intresss pour obtenir des informations plus dtailles sur le comportement des entres/sorties dans PostgreSQL
sont invits utiliser le rcuprateur de statistiques de PostgreSQL avec les outils du systme d'exploitation permettant une vue
de la gestion des entres/sorties par le noyau.
Il existe d'autres faons de regarder les statistiques. Cela se fait en crivant des requtes qui utilisent les mmes fonctions d'accs
434
aux statistiques que les vues standards. Ces fonctions sont listes dans le Tableau 27.2, Fonctions d'accs aux statistiques . Les
fonctions d'accs par base de donnes prennent un OID de la base de donnes comme argument pour identifier la base de donnes
du rapport. Les fonctions par table et par index prennent l'OID de la table ou de l'index. Les fonctions des statistiques pour les appels de fonctions prennent un OID. (notez que seuls les tables et les index de la base de donnes en cours peuvent tre vus par ces
fonctions). Les fonctions d'accs au processus prennent le numro d'identifiant du processus.
Tableau 27.2. Fonctions d'accs aux statistiques
Fonction
Code de Description
retour
pg_stat_get_db_numbackends(oid)
integer
pg_stat_get_db_xact_commit(oid)
bigint
pg_stat_get_db_xact_rollback(oid)
bigint
pg_stat_get_db_blocks_fetched(oid)
bigint
pg_stat_get_db_blocks_hit(oid)
bigint
pg_stat_get_db_tuples_returned(oid)
bigint
pg_stat_get_db_tuples_fetched(oid)
bigint
pg_stat_get_db_tuples_inserted(oid)
bigint
pg_stat_get_db_tuples_updated(oid)
bigint
pg_stat_get_db_tuples_deleted(oid)
bigint
pg_stat_get_db_conflict_tablespace(oid)
bigint
pg_stat_get_db_conflict_lock(oid)
bigint
pg_stat_get_db_conflict_snapshot(oid)
bigint
pg_stat_get_db_conflict_bufferpin(oid)
bigint
pg_stat_get_db_conflict_startup_deadlock(oid)
bigint
pg_stat_get_db_stat_reset_time(oid)
timestamptz
pg_stat_get_numscans(oid)
bigint
pg_stat_get_tuples_returned(oid)
bigint
435
Fonction
Code de Description
retour
quentiels lorsque l'argument est une table,
ou nombre de lignes d'index lues lorsque
l'argument est un index
pg_stat_get_tuples_fetched(oid)
bigint
pg_stat_get_tuples_inserted(oid)
bigint
pg_stat_get_tuples_updated(oid)
bigint
pg_stat_get_tuples_deleted(oid)
bigint
pg_stat_get_tuples_hot_updated(oid)
bigint
pg_stat_get_live_tuples(oid)
bigint
pg_stat_get_dead_tuples(oid)
bigint
pg_stat_get_blocks_fetched(oid)
bigint
pg_stat_get_blocks_hit(oid)
bigint
pg_stat_get_tuples_deleted(oid)
bigint
pg_stat_get_blocks_fetched(oid)
bigint
pg_stat_get_blocks_hit(oid)
bigint
Nombre de requtes de blocs disque trouvs en cache pour les tables ou index
pg_stat_get_last_vacuum_time(oid)
timestamptz
pg_stat_get_last_autovacuum_time(oid)
timestamptz
pg_stat_get_last_analyze_time(oid)
timestamptz
pg_stat_get_last_autoanalyze_time(oid)
timestamptz
pg_stat_get_vacuum_count(oid)
bigint
pg_stat_get_autovacuum_count(oid)
bigint
Nombre de fois qu'un VACUUM a t excut automatiquement sur cette table par le
dmon autovacuum
pg_stat_get_analyze_count(oid)
bigint
pg_stat_get_autoanalyze_count(oid)
bigint
pg_stat_get_xact_numscans(oid)
bigint
436
Fonction
Code de Description
retour
l'argument est un index, pour la transaction
courante
pg_stat_get_xact_tuples_returned(oid)
bigint
Nombre de lignes lues par des parcours squentiels quand l'argument est une table, ou
nombre d'entres d'index renvoyes quand
l'argument est un index, pour la transaction
en cours
pg_stat_get_xact_tuples_fetched(oid)
bigint
pg_stat_get_xact_tuples_inserted(oid)
bigint
pg_stat_get_xact_tuples_updated(oid)
bigint
pg_stat_get_xact_tuples_deleted(oid)
bigint
pg_stat_get_xact_tuples_hot_updated(oid)
bigint
pg_stat_get_xact_blocks_fetched(oid)
bigint
pg_stat_get_xact_blocks_hit(oid)
bigint
pg_backend_pid()
integer
pg_stat_get_activity(integer)
setof
cord
pg_stat_get_function_calls(oid)
bigint
pg_stat_get_function_time(oid)
bigint
Temps pass dans la fonction, en microsecondes. Inclut le temps pass dans les fonctions appeles par cette fonction.
pg_stat_get_function_self_time(oid)
bigint
Temps pass uniquement dans cette fonction. Le temps pass dans les fonctions appeles est exclu.
pg_stat_get_xact_function_calls(oid)
bigint
pg_stat_get_xact_function_time(oid)
bigint
pg_stat_get_xact_function_self_time(oid)
bigint
Temps pass uniquement dans cette fonction pour la transaction en cours. Le temps
pass dans les fonctions appeles est exclu.
pg_stat_get_backend_idset()
Fonction
Code de Description
retour
ger
pg_stat_get_backend_pid(integer)
integer
pg_stat_get_backend_dbid(integer)
oid
pg_stat_get_backend_userid(integer)
oid
pg_stat_get_backend_activity(integer)
text
pg_stat_get_backend_waiting(integer)
boolean
pg_stat_get_backend_activity_start(integer)
pg_stat_get_backend_xact_start(integer)
timesLe moment auquel le processus serveur intamp with diqu a t excut. Seulement si
time zone l'utilisateur est un superutilisateur ou le
mme utilisateur que celui qui a lanc la
session (et que track_activities est
activ)
pg_stat_get_backend_start(integer)
pg_stat_get_backend_client_addr(integer)
inet
pg_stat_get_backend_client_port(integer)
integer
pg_stat_get_bgwriter_timed_checkpoints()
bigint
pg_stat_get_bgwriter_requested_checkpoints()
bigint
438
Fonction
Code de Description
retour
point_segments a t dpass ou parce
que la commande CHECKPOINT a t
lance
pg_stat_get_bgwriter_buf_written_checkpoints()
bigint
pg_stat_get_bgwriter_buf_written_clean()
bigint
pg_stat_get_bgwriter_maxwritten_clean()
bigint
pg_stat_get_bgwriter_stat_reset_time()
timestamptz
pg_stat_get_buf_written_backend()
bigint
pg_stat_get_buf_alloc()
bigint
pg_stat_get_wal_senders()
setof
cord
pg_stat_clear_snapshot()
void
pg_stat_reset()
void
Rinitialise zro tous les compteurs statistiques pour la base de donnes actuelle
(ncessite les droits superutilisateur)
pg_stat_reset_shared(text)
void
pg_stat_reset_single_table_counters(oid)
void
pg_stat_reset_single_function_counters(oid)
void
Rinitialise les statistiques pour une fonction particulire dans la base de donnes en
cours (ncessite les droits du superutilisateur).
Note
pg_stat_get_blocks_fetched moins pg_stat_get_blocks_hit donne le nombre d'appels lancs
pour la table, l'index ou la base de donnes ; mais le nombre de lectures physiques relles est habituellement
moindre cause des tampons du noyau. Les colonnes statistiques *_blks_read utilisent cette soustraction,
c'est--dire lus en cache soustrait aux lus sur disque.
439
Toutes les fonctions accdant aux informations sur les processus sont indexes par numro d'identifiant, sauf que
pg_stat_get_activity est index par PID. La fonction pg_stat_get_backend_idset fournit un moyen agrable de
gnrer une ligne pour chaque processus serveur actif. Par exemple, pour afficher les PID et les requtes en cours pour tous les
processus serveur :
SELECT pg_stat_get_backend_pid(s.backendid) AS procpid,
pg_stat_get_backend_activity(s.backendid) AS current_query
FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;
Visualiser tous les verrous en cours, tous les verrous sur les relations d'une base de donnes particulire ou tous les verrous dtenus par une session PostgreSQL particulire.
Dterminer la relation de la base de donnes disposant de la plupart des verrous non autoriss (et qui, du coup, pourraient tre
une source de contention parmi les clients de la base de donnes).
Dterminer l'effet de la contention des verrous sur les performances gnrales des bases de donnes, ainsi que l'chelle dans laquelle varie la contention sur le trafic de la base de donnes.
Les dtails sur la vue pg_locks apparaissent dans la Section 45.56, pg_locks . Pour plus d'informations sur les verrous et la gestion des concurrences avec PostgreSQL, rfrez-vous au Chapitre 13, Contrle d'accs simultan.
Nom
Paramtres
Aperu
transaction-start
(LocalTransactionId)
transaction-commit
(LocalTransactionId)
Sonde qui se dclenche quand une transaction se termine avec succs. arg0 est
l'identifiant de transaction.
transaction-abort
(LocalTransactionId)
Sonde qui se dclenche quand une transaction choue. arg0 est l'identifiant de
440
Nom
Paramtres
Aperu
transaction.
query-start
(const char *)
Sonde qui se dclenche lorsque le traitement d'une requte commence. arg0 est la
requte.
query-done
(const char *)
Sonde qui se dclenche lorsque le traitement d'une requte se termine. arg0 est la
requte.
query-parse-start
(const char *)
query-parse-done
(const char *)
query-rewrite-start
(const char *)
Sonde qui se dclenche lorsque la rcriture d'une requte commence. arg0 est
la requte.
query-rewrite-done
(const char *)
Sonde qui se dclenche lorsque la rcriture d'une requte se termine. arg0 est
la requte.
query-plan-start
()
query-plan-done
()
query-execute-start
()
query-execute-done
()
statement-status
(const char *)
checkpoint-start
(int)
checkpoint-done
clog-checkpoint-start
(bool)
clog-checkpoint-done
(bool)
Nom
Paramtres
Aperu
pour clog-checkpoint-start.
subtrans-checkpoint-start
(bool)
subtrans-checkpoint-done
(bool)
multixact-checkpoint-start
(bool)
multixact-checkpoint-done
(bool)
buffer-checkpoint-start
(int)
buffer-sync-start
(int, int)
Sonde qui se dclenche quand nous commenons d'crire les tampons modifis
pendant un point de retournement (aprs
identification des tampons qui doivent
tre crits). arg0 est le nombre total de
tampons. arg1 est le nombre de tampons
qui sont modifis et n'ont pas besoin d'tre
crits.
buffer-sync-written
(int)
Sonde qui se dclenche aprs chaque criture d'un tampon lors d'un point de retournement. arg0 est le numro d'identifiant
du tampon.
buffer-sync-done
buffer-checkpoint-sync-start
()
Sonde qui se dclenche une fois les tampons modifis crits par le noyau et avant
de commencer lancer des requtes
fsync.
buffer-checkpoint-done
()
twophase-checkpoint-start
()
Nom
Paramtres
Aperu
est commence.
twophase-checkpoint-done
()
buffer-read-start
buffer-read-done
buffer-flush-start
buffer-flush-done
(ForkNumber, BlockNumber, Oid, Oid, Sonde qui se dclenche quand une deOid)
mande d'criture se termine. (Notez que
ceci ne reflte que le temps pass pour
fournir la donne au noyau ; ce n'est habituellement pas encore crit sur le disque.)
Les arguments sont identiques ceux de
buffer-flush-start.
buffer-write-dirty-start
Nom
Paramtres
Aperu
blespace, de la base de donnes et de la
relation identifiant ainsi prcisment la relation.
buffer-write-dirty-done
wal-buffer-write-dirty-start
()
wal-buffer-write-dirty-done
()
xlog-insert
Sonde qui se dclenche quand un enregistrement est insr dans un journal de transactions. arg0 est le gestionnaire de ressource (rmid) pour l'enregistrement. arg1
contient des informations supplmentaires.
xlog-switch
()
smgr-md-read-start
(ForkNumber, BlockNumber, Oid, Oid, Sonde qui se dclenche au dbut de la lecOid, int)
ture d'un bloc d'une relation. arg0 et arg1
contiennent les numros de fork et de bloc
de la page. arg2, arg3 et arg4 contiennent
respectivement l'OID du tablespace, de la
base de donnes et de la relation identifiant ainsi prcisment la relation. arg5 est
l'identifiant du processus moteur qui a
cr la relation temporaire pour un tampon local ou InvalidBackendId (-1) pour
un tampon partag.
smgr-md-read-done
(ForkNumber, BlockNumber, Oid, Oid, Sonde qui se dclenche la fin de la lecOid, int, int, int)
ture d'un bloc. arg0 et arg1 contiennent les
numros de fork et de bloc de la page.
arg2, arg3 et arg4 contiennent respectivement l'OID du tablespace, de la base de
donnes et de la relation identifiant ainsi
prcisment la relation. arg5 est
l'identifiant du processus moteur qui a
cr la relation temporaire pour un tampon local ou InvalidBackendId (-1) pour
un tampon partag. arg6 est le nombre
d'octets rellement lus alors que arg7 est
le nombre d'octets demands (s'il y a une
diffrence, il y a un problme).
smgr-md-write-start
Nom
Paramtres
Aperu
moteur qui a cr la relation temporaire
pour un tampon local ou InvalidBackendId (-1) pour un tampon partag.
smgr-md-write-done
sort-start
Sonde qui se dclenche quand une opration de tri est dmarr. arg0 indique un tri
de la table, de l'index ou d'un datum. arg1
est true si on force les valeurs uniques.
arg2 est le nombre de colonnes cls. arg3
est le nombre de Ko de mmoire autoris
pour ce travail. arg4 est true si un accs
alatoire au rsultat du tri est requis.
sort-done
(bool, long)
lwlock-acquire
(LWLockId, LWLockMode)
lwlock-release
(LWLockId)
Sonde qui se dclenche quand un LWLock a t relch (mais notez que tout
processus en attente n'a pas encore t rveill). arg0 est l'identifiant du LWLock.
lwlock-wait-start
(LWLockId, LWLockMode)
Sonde qui se dclenche quand un LWLock n'tait pas immdiatement disponible et qu'un processus serveur a commenc attendre la disponibilit du verrou. arg0 est l'identifiant du LWLock.
arg1 est le mode de verrou demand, soit
exclusif soit partag.
lwlock-wait-done
(LWLockId, LWLockMode)
Sonde qui se dclenche quand un processus serveur n'est plus en attente d'un LWLock (il n'a pas encore le verrou). arg0 est
l'identifiant du LWLock. arg1 est le mode
de verrou demand, soit exclusif soit partag.
lwlock-condacquire
(LWLockId, LWLockMode)
445
Nom
Paramtres
Aperu
exclusif soit partag.
lwlock-condacquire-fail
(LWLockId, LWLockMode)
Sonde qui se dclenche quand un LWLock, demand sans attente, n'est pas accept. arg0 est l'identifiant du LWLock.
arg1 est le mode de verrou demand, soit
exclusif soit partag.
lock-wait-start
(unsigned int, unsigned int, unsigned int, Sonde qui se dclenche quand une deunsigned int, unsigned int, LOCKMODE) mande d'un gros verrou (lmgr lock) a
commenc l'attente parce que le verrou
n'tait pas disponible. arg0 arg3 sont les
chmps identifiant l'objet en cours de verrouillage. arg4 indique le type d'objet
verrouiller. arg5 indique le type du verrou
demand.
lock-wait-done
(unsigned int, unsigned int, unsigned int, Sonde qui se dclenche quand une deunsigned int, unsigned int, LOCKMODE) mande d'un gros verrou (lmgr lock) a fini
d'attendre (c'est--dire que le verrou a t
accept). Les arguments sont identiques
ceux de lock-wait-start.
deadlock-found
()
Type
Definition
LocalTransactionId
unsigned int
LWLockId
int
LWLockMode
int
LOCKMODE
int
BlockNumber
unsigned int
Oid
unsigned int
ForkNumber
int
bool
char
self->ts=0;
}
son excution, le script de l'exemple D donne une sortie comme :
# ./txn_count.d `pgrep -n postgres` or ./txn_count.d <PID>
^C
Start
Commit
Total time (ns)
71
70
2312105013
Note
SystemTap utilise une notation diffrente de DTrace pour les scripts de trace, mme si les points de trace sont compatibles. Il est intressant de noter que, lorsque nous avons crit ce texte, les scripts SystemTap doivent rfrencer
les noms des sondes en utilisant des tirets bas doubles la place des tirets simples. Il est prvu que les prochaines
versions de SystemTap corrigent ce problme.
Vous devez vous rappeler que les programmes DTrace doivent tre crits soigneusement, sinon les informations rcoltes pourraient ne rien valoir. Dans la plupart des cas o des problmes sont dcouverts, c'est l'instrumentation qui est errone, pas le systme sous-jacent. En discutant des informations rcupres en utilisant un tel systme, il est essentiel de s'assurer que le script utilis est lui-aussi vrifi et discuter.
D'autres exemples de scripts sont disponibles dans le projet dtrace de PgFoundry.
2.
3.
Inclure pg_trace.h s'il n'est pas dj prsent dans le module contenant les points de sonde, et insrer les macros
TRACE_POSTGRESQL aux emplacements souhaits dans le code source
4.
Exemple : Voici un exemple d'ajout d'une sonde pour tracer toutes les nouvelles transactions par identifiant de transaction.
1.
2.
3.
4.
Aprs une nouvelle compilation et l'excution du nouveau binaire, il faut vrifier que la nouvelle sonde est disponible en excutant la commande DTrace suivante. Vous deviez avoir cette sortie :
# dtrace -ln transaction-start
447
ID
18705
18755
18805
18855
18986
PROVIDER
postgresql49878
postgresql49877
postgresql49876
postgresql49875
postgresql49873
MODULE
postgres
postgres
postgres
postgres
postgres
FUNCTION NAME
StartTransactionCommand
StartTransactionCommand
StartTransactionCommand
StartTransactionCommand
StartTransactionCommand
transaction-start
transaction-start
transaction-start
transaction-start
transaction-start
Il faut faire attention d'autres choses lors de l'ajout de macros de trace dans le code C :
Vous devez faire attention au fait que les types de donnes indiqus pour les paramtres d'une sonde correspondent aux types
de donnes des variables utilises dans la macro. Dans le cas contraire, vous obtiendrez des erreurs de compilation.
Sur la plupart des platformes, si PostgreSQL est construit avec --enable-dtrace, les arguments pour une macro de
trace seront valus chaque fois que le contrle passe dans la macro, mme si aucun traage n'est rellement en cours. Cela a
gnralement peu d'importance si vous rapportez seulement les valeurs de quelques variables locales mais faites bien attention
l'utilisation de fonctions coteuses. Si vous devez le faire, pensez protger la macro avec une vrification pour vous assurer
que la trace est bien active :
if (TRACE_POSTGRESQL_TRANSACTION_START_ENABLED())
TRACE_POSTGRESQL_TRANSACTION_START(some_function(...));
Chaque macro de trace a une macro ENABLED correspondante.
448
relname
| relpages
----------------------+---------bigtable
|
3290
customer
|
3144
Astuce
Certains systmes de fichiers ragissent mal proximit des limites de remplissage. Il est donc prfrable de ne pas
attendre ce moment pour ragir.
Si le systme supporte les quotas disque par utilisateur, la base de donnes est alors soumise au quota de l'utilisateur qui excute le
serveur de base de donnes. Dpasser ce quota a les mmes consquences nfastes qu'un disque plein.
450
29.1. Fiabilit
La fiabilit est une proprit importante de tout systme de base de donnes srieux. PostgreSQL fait tout ce qui est en son
pouvoir pour garantir une fiabilit toute preuve. Un des aspects de cette fiabilit est que toutes les donnes enregistres par
une transaction valide doivent tre stockes dans un espace non volatile, un espace non sensible aux coupures de courant, aux
bogues du systme d'exploitation et aux problmes matriels (sauf en cas de problme sur l'espace non volatile, bien sr). crire
avec succs les donnes sur le stockage permanent de l'ordinateur (disque dur ou un quivalent) est habituellement suffisant
pour cela. En fait, mme si un ordinateur est vraiment endommag, si le disque dur survit, il peut tre plac dans un autre ordinateur avec un matriel similaire et toutes les transactions valides resteront intactes.
Bien que forcer l'enregistrement des donnes priodiquement sur le disque semble tre une opration simple, ce n'est pas le cas.
Comme les disques durs sont beaucoup plus lents que la mmoire principale et les processeurs, plusieurs niveaux de cache
existent entre la mmoire principale de l'ordinateur et les disques. Tout d'abord, il existe le tampon cache du systme
d'exploitation, qui met en cache les blocs disque frquemment utiliss et combine les critures sur le disque. Heureusement, tous
les systmes d'exploitation donne un moyen de forcer les critures du cache disque vers le disque et PostgreSQL utilise ces
fonctions (voir le paramtre wal_sync_method pour voir comment cela se fait).
Ensuite, il pourrait y avoir un cache dans le contrleur du disque dur ; ceci est assez commun sur les cartes contrleur RAID.
Certains de ces caches sont write-through, signifiant que les critures sont envoyes au lecteur ds qu'elles arrivent. D'autres
sont write-back, signifiant que les donnes sont envoyes au lecteur un peu aprs. De tels caches peuvent apporter une faille
dans la fiabilit car la mmoire du cache du disque contrleur est volatile et qu'elle perdra son contenu la prochaine coupure de
courant. Des cartes contrleur de meilleure qualit ont des caches avec batterie (BBU), signifiant que la carte dispose d'une batterie qui maintient le courant dans le cache en cas de perte de courant. Une fois le courant revenu, les donnes seront crites sur
les disques durs.
Et enfin, la plupart des disques durs ont des caches. Certains sont write-through alors que d'autres sont write-back . Les
mmes soucis sur la perte de donnes existent pour ces deux types de cache. Les lecteurs IDE ont principalement des caches
write-back qui ne survivront pas une perte de courantMany solid-state drives (SSD) also have volatile write-back caches.
Ces caches peuvent typiquement tre dsactivs. Nanmoins, la mthode pour le faire dpend du systme d'exploitation et du
type de disque :
Sur Linux, les disques IDE peuvent tre vrifis avec la commande hdparm -I ; le cache en criture est activ si une
toile (*) se trouve derrire le texte Write cache. hdparm -W peut tre utilis pour dsactiver le cache en criture. Les
disques SCSI peuvent tre vrifis en utilisant sdparm. Utilisez sdparm --get=WCE pour vrifier si le cache en criture est
activ et sdparm --clear=WCE pour le dsactiver.
Sur FreeBSD, les disques IDE peuvent tre vrifis avec atacontrol et le cache en criture dsactiv avec
hw.ata.wc=0 dans le fichier de configuration /boot/loader.conf ; les disques SCSI peuvent tre vrifis en utilisant camcontrol identify, et le cache en criture peut tre vrifi et modifi en utilisant sdparm quand cette commande est
disponible.
Sur Solaris, le cache disque en criture est contrl par format -e. (Le systme de fichiers Solaris ZFS est sr, y compris quand le cache disque en criture est activ car il excute ses propres commandes de vidage du cache.)
Sur Windows, si wal_sync_method vaut open_datasync (la valeur par dfaut), le cache en criture peut tre
dsactiv en dcochant My Computer\Open\disk
drive\Properties\Hardware\Properties\Policies\Enable write caching on the disk. Sinon
configurez wal_sync_method fsync ou fsync_writethrough pour dsactiver le cache en criture.
Sur Mac OS X, le cache en criture peut tre vit en configurant wal_sync_method fsync_writethrough.
Les disques SATA rcents (ceux compatibles ATAPI-6 ou suprieurs) proposent une commande pour vider le cache sur le
disque (FLUSH CACHE EXT) alors que les disques SCSI proposent depuis longtemps une commande similaire, SYNCHRONIZE CACHE. Ces commandes ne sont pas directement accessibles PostgreSQL, mais certains systmes de fichiers
(comme ZFS, ext4) peuvent les utiliser pour vider les donnes sur disque pour les disques dont le cache en criture est activ.
Malheureusement, ces systmes de fichiers se comportent de faon non optimale avec des contrleurs disque quips de batterie
(BBU, acronyme de Battery-Backed Unit). Dans ce type de configuration, la commande de synchronisation force l'criture de
toutes les donnes comprises dans le cache sur les disques, liminant ainsi tout l'intrt d'un cache protg par une batterie. Vous
pouvez lancer l'outil pg_test_fsync, disponible dans le code source de PostgreSQL, pour vrifier si vous tes affect. Si vous
l'tes, les amliorations de performance du cache BBU peuvent tre de nouveaux obtenues en dsactivant les barrires d'criture
451
dans la configuration du systme de fichiers ou en reconfigurant le contrleur de disque, si cela est possible. Si les barrires
d'criture sont dsactives, assurez-vous que la batterie reste active. Une batterie dfectueuse peut tre une cause de perte de donnes. Il reste esprer que les concepteurs de systmes de fichiers et de contrleurs disque finissent par s'attaquer ce comportement gnant.
Quand le systme d'exploitation envoie une demande d'criture au systme de stockage, il ne peut pas faire grand chose pour
s'assurer que les donnes sont arrives dans un espace de stockage non volatile. Ce travail incombe l'administrateur : ce dernier
doit s'assurer que tous les composants de stockage assurent l'intgrit des donnes. vitez les contrleurs disques ne disposant pas
de caches protgs par batterie. Au niveau du disque, dsactivez le cache write-back si le disque ne garantit pas que les donnes seront crites avant un arrt. Si vous utilisez des disques SSD, sachez que beaucoup n'honorent pas les commandes de vidage
de cache par dfaut. Vous pouvez tester la fiabilit du comportement du systme disque en utilisant diskchecker.pl.
Un autre risque concernant la perte des donnes est d aux oprations d'criture sur les plateaux du disque. Les plateaux sont diviss en secteur de 512 octets gnralement. Chaque opration de lecture ou criture physique traite un secteur entier. Quand la demande d'criture arrive au lecteur, elle pourrait contenir des multiples de 512 octets (PostgreSQL crit gnralement 8192 octets, soit 16 secteurs, la fois) et le processus d'criture pourrait chouer cause d'une perte de courant tout moment signifiant
que certains octets pourraient tre crits et les autres perdus. Pour se prvenir contre ce type d'chec, PostgreSQL crit priodiquement des images de page complte sur le stockage permanent des journaux de transactions avant de modifier la page relle sur
disque. En effectuant ceci, lors d'une rcupration aprs un arrt brutal, PostgreSQL peut restaurer des pages crites partiellement partir des journaux de transactions. Si vous avez un systme de fichiers qui vous protge contre les critures de pages incompltes (par exemple ZFS), vous pouvez dsactiver la cration des images de page en utilisant le paramtre full_page_writes.
Les contrleurs disques disposant d'une batterie (BBU pour Battery-Backed Unit) n'empchent pas les critures de pages partielles
sauf s'ils garantissent que les donnes sont crites par pages compltes de 8 Ko.
Astuce
Comme les journaux de transaction permettent de restaurer le contenu des fichiers de base de donnes aprs un arrt brutal, les systmes de fichiers journaliss ne sont pas ncessaires pour stocker avec fiabilit les fichiers de donnes ou les journaux de transactions. En fait, la surcharge cause par la journalisation peut rduire les performances, tout spcialement si la journalisation fait que les donnes du systme de fichiers sont envoyes sur disque.
Heureusement, l'envoi des donnes lors de la journalisation peut souvent tre dsactiv avec une option de montage
du systme de fichiers, par exemple data=writeback sur un systme de fichiers Linux ext3. Par contre, les systmes de fichiers journaliss amliorent la rapidit au dmarrage aprs un arrt brutal.
Utiliser les journaux de transaction permet de rduire de faon significative le nombre d'critures sur le disque puisque seul le
journal a besoin d'tre crit sur le disque pour garantir qu'une transaction a t valide plutt que d'crire dans chaque fichier de
donnes modifi par la transaction. Ce journal est crit squentiellement ce qui fait que le cot de synchronisation du journal est
largement moindre que le cot d'criture des pages de donnes. Ceci est tout spcialement vrai pour les serveurs grant beaucoup
de petites transactions touchant diffrentes parties du stockage de donnes. De plus, quand le serveur traite plein de petites transactions en parallle, un fsync du journal des transactions devrait suffire pour enregistrer plusieurs transactions.
Les journaux de transaction rendent possible le support de sauvegarde en ligne et de rcupration un moment, comme dcrit
dans la Section 24.3, Archivage continu et rcupration d'un instantan (PITR) . En archivant les journaux de transaction, nous
pouvons supporter le retour tout instant couvert par les donnes disponibles dans les journaux de transaction : nous installons
simplement une ancienne sauvegarde physique de la base de donnes et nous rejouons les journaux de transaction jusqu'au moment dsir. Qui plus est, la sauvegarde physique n'a pas besoin d'tre une image instantane de l'tat de la base de donnes -- si
elle a t faite pendant une grande priode de temps, alors rejouer les journaux de transaction pour cette priode corrigera toute incohrence interne.
est acceptable.
Comme le dcrit la section prcdente, la validation d'une transaction est habituellement synchrone : le serveur attend que les enregistrements des journaux de transaction soient bien sauvegards sur un disque avant de renvoyer l'information du succs de
l'opration au client. Ce dernier a donc la garantie qu'une transaction valide est stocke de faon sre, donc mme en cas d'arrt
brutal immdiatement aprs. Nanmoins, pour les petites transactions, ce dlai est une partie importante de la dure totale
d'excution de la transaction. Slectionner le mode de validation asynchrone signifie que le serveur renvoie le succs de
l'opration ds que la transaction est termine logiquement, donc avant que les enregistrements du journal de transaction que cette
transaction a gnr ne soient rellement stockes sur disque. Ceci peut apporter une acclration importante pour les petites transactions.
La validation asynchrone introduit le risque des pertes de donnes. Il existe un petit dlai entre le moment o le rapport de la fin
d'une transaction est envoy au client et celui o la transaction est rellement enregistre (c'est--dire le moment o le rsultat de
cette transaction ne pourra pas tre perdu mme en cas d'arrt brutal du serveur). Du coup, la validation asynchrone ne devrait pas
tre utilise si le client se base sur le fait que la transaction est enregistre de faon sre. Par exemple, une banque ne devra pas
utiliser la validation asynchrone pour l'enregistrement d'une transaction sur les oprations sur un compte bancaire. Dans de nombreux autres scnarios, comme la trace d'vnements, il n'y a pas de garantie forte de ce type.
Le risque pris avec l'utilisation de la validation asynchrone concerne la perte de donnes, pas la corruption de donnes. Si le serveur s'arrte brutalement, il rcuprera en rejouant les journaux de transaction jusqu'au dernier enregistrement qui a t envoy au
disque. La base de donnes sera donc dans un tat cohrent mais toutes les transactions qui n'auront pas t enregistres sur disque
n'apparatront pas. L'effet immdiat est donc la perte des dernires transactions. Comme les transactions sont rejoues dans l'ordre
de validation, aucune incohrence ne sera introduite -- par exemple, si la transaction B fait des modifications sur les effets d'une
prcdente transaction A, il n'est pas possible que les effets de A soient perdus alors que les effets de B sont prservs.
L'utilisateur peut slectionner le mode de validation de chaque transaction, donc il est possible d'avoir en mme temps des transactions valides en synchrone et en asynchrone. Une grande flexibilit est permise entre performance et durabilit de certaines transactions. Le mode de validation est contrl par le paramtre utilisateur synchronous_commit, qui peut tre modifi comme tout
autre paramtre utilisateur. Le mode utilis pour toute transaction dpend de la valeur de synchronous_commit au dbut de la
transaction.
Certaines commandes, par exemple DROP TABLE, sont forces en mode synchrone quelque soit la valeur du paramtre synchronous_commit. Ceci a pour but de s'assurer de la cohrence entre le systme de fichiers du serveur et l'tat logique de la
base de donnes. Les commandes grant la validation en deux phases, comme PREPARE TRANSACTION, sont aussi toujours
synchrones.
Si la base de donnes s'arrte brutalement lors du dlai entre une validation asynchrone et l'criture des enregistrements dans le
journal des transactions, les modifications ralises lors de cette transaction seront perdues. La dure de ce dlai est limite car un
processus en tche de fond (le wal writer ) envoie les enregistrements non crits des journaux de transaction sur le disque toutes
les wal_writer_delay millisecondes. La dure maximum actuelle de ce dlai est de trois fois wal_writer_delay car le processus d'criture des journaux de transaction est conu pour favoriser l'criture de pages compltes lors des priodes de grosses activits.
Attention
Un arrt en mode immdiat est quivalent un arrt brutal et causera du coup la perte des validations asynchrones.
La validation asynchrone fournit un comportement diffrent de la simple dsactivation de fsync. fsync est un paramtre pour le
serveur entier qui modifie le comportement de toutes les transactions. Cela dsactive toute logique de PostgreSQL qui tente de
synchroniser les critures aux diffrentes parties de la base de donnes (c'est--dire l'arrt brutal du matriel ou du systme
d'exploitation, par un chec de PostgreSQL lui-mme) pourrait rsulter en une corruption arbitraire de l'tat de la base de donnes. Dans de nombreux scnarios, la validation asynchrone fournit la majorit des amliorations de performances obtenues par la
dsactivation de fsync, mais sans le risque de la corruption de donnes.
commit_delay semble aussi trs similaire la validation asynchrone mais il s'agit en fait d'une mthode de validation synchrone
(en fait, commit_delay est ignor lors d'une validation asynchrone). commit_delay a pour effet l'application d'un dlai juste
avant qu'une validation synchrone tente d'enregistrement les journaux de transaction sur disque, dans l'espoir que la demande de
synchronisation occasionne par les critures puissent aussi servir d'autres transactions valides peu prs en mme temps.
Configurer commit_delay sert seulement quand beaucoup de transactions sont valides en parallle et il est difficile de configurer correctement ce paramtre avec une valeur qui aide plus qu'elle ne dessert.
Dans la squence des transactions, les points de contrles (appels checkpoints) sont des points qui garantissent que les fichiers de
donnes table et index ont t mis jour avec toutes les informations enregistres dans le journal avant le point de contrle. Au
moment du point de contrle, toutes les pages de donnes non propres sont crites sur le disque et une entre spciale, pour le
point de contrle, est crite dans le journal. (Les modifications taient dj envoyes dans les journaux de transactions.) En cas de
dfaillance, la procdure de rcupration recherche le dernier enregistrement d'un point de vrification dans les traces
(enregistrement connus sous le nom de redo log ) partir duquel il devra lancer l'opration REDO. Toute modification effectue sur les fichiers de donnes avant ce point est garantie d'avoir t enregistre sur disque. Du coup, aprs un point de vrification, tous les segments reprsentant des journaux de transaction prcdant celui contenant le redo record ne sont plus ncessaires et peuvent tre soit recycls soit supprims (quand l'archivage des journaux de transaction est activ, ces derniers doivent
tre archivs avant d'tre recycls ou supprims).
CHECKPOINT doit crire toutes les pages de donnes modifies sur disque, ce qui peut causer une charge disque importante. Du
coup, l'activit des CHECKPOINT est dilue de faon ce que les entres/sorties disque commencent au dbut du CHECKPOINT
et se termine avant le dmarrage du prochain CHECKPOINT ; ceci minimise la dgradation des performances lors des CHECKPOINT.
Le processus d'criture en tche de fond lance automatiquement un point de contrle de temps en temps : tous les checkpoint_segments journaux de transaction ou ds que checkpoint_timeout secondes se sont coules. Les paramtres par dfaut sont
respectivement de trois journaux et de 300 secondes (5 minutes). Il est galement possible de forcer la cration d'un point de
contrle en utilisant la commande SQL CHECKPOINT.
La rduction de checkpoint_segments et/ou checkpoint_timeout implique des points de contrle plus frquents. Cela
permet une rcupration plus rapide aprs dfaillance puisqu'il y a moins d'critures synchroniser. Cependant, il faut quilibrer
cela avec l'augmentation du cot d'criture des pages de donnes modifies. Si full_page_writes est configur (ce qui est la valeur
par dfaut), il reste un autre facteur considrer. Pour s'assurer de la cohrence des pages de donnes, la premire modification
d'une page de donnes aprs chaque point de vrification rsulte dans le traage du contenu entier de la page. Dans ce cas, un intervalle de points de vrification plus petit augmentera le volume en sortie des journaux de transaction, diminuant lgrement
l'intrt d'utiliser un intervalle plus petit et impliquant de toute faon plus d'entres/sorties au niveau disque.
Les points de contrle sont assez coteux, tout d'abord parce qu'ils crivent tous les tampons utiliss, et ensuite parce que cela suscite un trafic supplmentaire dans les journaux de transaction, comme indiqu ci-dessus. Du coup, il est conseill de configurer les
paramtres en relation assez haut pour que ces points de contrle ne surviennent pas trop frquemment. Pour une vrification rapide de l'adquation de vos paramtres, vous pouvez configurer le paramtre checkpoint_warning. Si les points de contrle arrivent plus rapidement que checkpoint_warning secondes, un message est affich dans les journaux applicatifs du serveur
recommandant d'accrotre checkpoint_segments. Une apparition occasionnelle d'un message ne doit pas vous alarmer mais,
s'il apparat souvent, alors les paramtres de contrle devraient tre augments. Les oprations en masse, comme les transferts importants de donnes via COPY, pourraient tre la cause de l'apparition d'un tel nombre de messages d'avertissements si vous
n'avez pas configur checkpoint_segments avec une valeur suffisamment haute.
Pour viter de remplir le systme disque avec de trs nombreuses critures de pages, l'criture des pages modifis pendant un point
de vrification est tale sur une priode de temps. Cette priode est contrle par checkpoint_completion_target, qui est donn
comme une fraction de l'intervalle des points de vrification. Le taux d'entres/sorties est ajust pour que le point de vrification se
termine quand la fraction donne de checkpoint_segments journaux de transaction a t consomme ou quand la fraction
donn de checkpoint_timeout secondes s'est coule (la condition que se verra vrifie la premire). Avec une valeur par
dfaut de 0,5, PostgreSQL peut s'attendre terminer chaque point de vrification en moiti moins de temps qu'il ne faudra pour
lancer le prochain point de vrification. Sur un systme trs proche du taux maximum en entre/sortie pendant des oprations normales, vous pouvez augmenter checkpoint_completion_target pour rduire le chargement en entre/sortie d aux
points de vrification. L'inconvnient de ceci est que prolonger les points de vrification affecte le temps de rcupration parce
qu'il faudra conserver plus de journaux de transaction si une rcupration est ncessaire. Bien que checkpoint_completion_target puisse valoir 1.0, il est bien mieux de la configurer une valeur plus basse que a (au maximum 0,9) car les points de vrification incluent aussi d'autres activits en dehors de l'criture des pages modifies. Une valeur de
1,0 peut avoir pour rsultat des points de vrification qui ne se terminent pas temps, ce qui aurait pour rsultat des pertes de performance cause de variation inattendue dans le nombre de journaux ncessaires.
Il y aura toujours au moins un journal de transaction et normalement pas plus de fichiers que (2 + checkpoint_completion_target) * checkpoint_segments + 1 ou checkpoint_segments + wal_keep_segments + 1.
Chaque journal fait normalement 16 Mo (bien que cette taille puisse tre modifie lors de la compilation du serveur). Vous pouvez
utiliser cela pour estimer l'espace disque ncessaire au stockage des journaux de transaction. D'habitude, quand les vieux journaux
ne sont plus ncessaires, ils sont recycls (renomms pour devenir les prochains segments dans une squence numrote). S'il y a
plus de 3 * checkpoint_segments + 1 fichiers cause d'un pic temporaire du taux d'criture des journaux, ceux inutiliss seront effacs au lieu d'tre recycls jusqu' ce que le systme soit en-dessous de cette limite.
Dans le mode de restauration d'archive et dans le mode standby, le serveur ralise priodiquement des restartpoints (points de redmarrage). C'est similaire aux checkpoints lors du fonctionnement normal : le serveur force l'criture de son tat sur disque, met
jour le fichier pg_control pour indiquer que les donnes dj traites des journaux de transactions n'ont plus besoin d'tre
454
parcourues de nouveau, puis recycle les anciens journaux de transactions trouvs dans le rpertoire pg_xlog. Un restartpoint est
dclench si au moins un enregistrement checkpoint a t rejou et chaque fois que checkpoint_timeout secondes se sont
coules depuis le dernier restartpoint. Dans le mode standby, un restartpoint est aussi dclench si checkpoint_segments
journaux de transactions ont t rejous depuis le dernier restartpoint et qu'au moins un enregistrement checkpoint a t rejou.
Les restartpoints ne peuvent tre raliss plus frquemment que les checkpoints du matre car les restartpoints peuvent seulement
tre raliss aux enregistrements de checkpoint.
Il existe deux fonctions WAL internes couramment utilises : LogInsert et LogFlush. LogInsert est utilise pour placer
une nouvelle entre l'intrieur des tampons WAL en mmoire partage. S'il n'y a plus d'espace pour une nouvelle entre, LogInsert devra crire (autrement dit, dplacer dans le cache du noyau) quelques tampons WAL remplis. Ceci n'est pas dsirable
parce que LogInsert est utilise lors de chaque modification bas niveau de la base (par exemple, lors de l'insertion d'une ligne)
quand un verrou exclusif est pos sur des pages de donnes affectes. cause de ce verrou, l'opration doit tre aussi rapide que
possible. Pire encore, crire des tampons WAL peut forcer la cration d'un nouveau journal, ce qui peut prendre beaucoup plus de
temps. Normalement, les tampons WAL doivent tre crits et vids par une requte de LogFlush qui est faite, la plupart du
temps, au moment de la validation d'une transaction pour assurer que les entres de la transaction sont crites vers un stockage
permanent. Sur les systmes avec une importante criture de journaux, les requtes de LogFlush peuvent ne pas arriver assez
souvent pour empcher LogInsert d'avoir crire lui-mme sur disque. Sur de tels systmes, on devrait augmenter le nombre
de tampons WAL en modifiant le paramtre de configuration wal_buffers. Quand full_page_writes est configur et que le systme
est trs occup, configurer cette variable avec une valeur plus importante aide avoir des temps de rponse plus rguliers lors de
la priode suivant chaque point de vrification.
Le paramtre commit_delay dfinit la dure d'endormissement en micro-secondes du processus serveur aprs l'criture d'une entre de validation dans le journal avec LogInsert avant d'excuter un LogFlush. Ce dlai permet aux autres processus du serveur d'ajouter leurs entres de validation dans le journal afin de tout crire vers le disque avec une seule synchronisation du journal. Aucune mise en sommeil n'aura lieu si fsync n'est pas disponible ou si moins de commit_siblings autres sessions sont, ce
moment, dans des transactions actives ; cela vite de dormir quand il est improbable qu'une autre session fasse bientt une validation. Notez que dans la plupart des plate-formes, la rsolution d'une requte d'endormissement est de 10 millisecondes, donc un
commit_delay diffrent de zro et configur entre 1 et 10000 micro-secondes a le mme effet. Les bonnes valeurs pour ce paramtre ne sont pas encore claires ; les essais sont encourags.
Le paramtre wal_sync_method dtermine la faon dont PostgreSQL demande au noyau de forcer les mises jour des journaux
de transaction sur le disque. Toutes les options ont un mme comportement avec une exception, fsync_writethrough, qui
peut parfois forcer une criture du cache disque mme quand d'autres options ne le font pas. Nanmoins, dans la mesure o la fiabilit ne disparat pas, c'est avec des options spcifiques la plate-forme que la rapidit la plus importante sera observe ; vous
pouvez tester la performance de chaque option en utilisant l'outil pg_test_fsync disponible dans les sources de PostgreSQL. Notez
que ce paramtre est ignor si fsync a t dsactiv.
Activer le paramtre de configuration wal_debug ( supposer que PostgreSQL ait t compil avec le support de ce paramtre)
permet d'enregistrer chaque appel WAL LogInsert et LogFlush dans les journaux applicatifs du serveur. Cette option pourrait tre remplace par un mcanisme plus gnral dans le futur.
455
Aprs qu'un point de contrle ait t fait et que le journal ait t crit, la position du point de contrle est sauvegarde dans le fichier pg_control. Donc, au dbut de la restauration, le serveur lit en premier pg_control et ensuite l'entre du point de
contrle ; ensuite, il excute l'opration REDO en parcourant vers l'avant partir de la position du journal indique dans l'entre
du point de contrle. Parce que l'ensemble du contenu des pages de donnes est sauvegard dans le journal la premire modification de page aprs un point de contrle (en supposant que full_page_writes n'est pas dsactiv), toutes les pages changes depuis
le point de contrle seront restaures dans un tat cohrent.
Pour grer le cas o pg_control est corrompu, nous devons permettre le parcours des segments de journaux existants en ordre
inverse -- du plus rcent au plus ancien -- pour trouver le dernier point de vrification. Ceci n'a pas encore t implment.
pg_control est assez petit (moins d'une page disque) pour ne pas tre sujet aux problmes d'criture partielle et, au moment o
ceci est crit, il n'y a eu aucun rapport d'checs de la base de donnes uniquement cause de son incapacit lire pg_control.
Donc, bien que cela soit thoriquement un point faible, pg_control ne semble pas tre un problme en pratique.
456
Avertissement
Sur les systmes ne disposant pas de sockets de domaine Unix, la mthode de tests dmarre un serveur temporaire configur pour accepter toute connexion provenant de la machine locale. Tout utilisateur local peut obtenir
les droits superutilisateur de la base de donnes en se connectant ce serveur et pourrait en principe exploiter
tous les droits de l'utilisateur du systme d'exploitation excutant les tests. De ce fait, il n'est pas recommand
d'utiliser gmake check sur un systme partag avec d'autres utilisateurs. la place, lancez les tests aprs avoir
termin l'installation, comme indiqu dans la section suivante.
Comme cette mthode de tests excute un serveur temporaire, cela ne fonctionnera pas si vous avez construit le serveur en tant
que root, tant donn que le serveur ne dmarre pas en tant que root. La procdure recommande est de ne pas construire en tant
que root ou de raliser les tests aprs avoir termin l'installation.
Si vous avez configur PostgreSQL pour qu'il s'installe dans un emplacement o existe dj une ancienne installation de PostgreSQL et que vous lancez gmake check avant d'installer la nouvelle version, vous pourriez trouver que les tests chouent
parce que les nouveaux programmes essaient d'utiliser les bibliothques partages dj installes (les symptmes typiques sont
des plaintes concernant des symboles non dfinis). Si vous souhaitez lancer les tests avant d'craser l'ancienne installation, vous
devrez construire avec configure --disable-rpath. Nanmoins, il n'est pas recommand d'utiliser cette option pour
l'installation finale.
Les tests de rgression en parallle lancent quelques processus avec votre utilisateur. Actuellement, le nombre maximum est de
vingt scripts de tests en parallle, ce qui signifie 40 processus : il existe un processus serveur, un psql et habituellement un processus parent pour le psql de chaque script de tests. Si votre systme force une limite par utilisateur sur le nombre de processus,
assurez-vous que cette limite est d'au moins 50, sinon vous pourriez obtenir des checs hasardeux dans les tests en parallle. Si
vous ne pouvez pas augmenter cette limite, vous pouvez diminuer le degr de paralllisme en initialisant le paramtre
MAX_CONNECTIONS. Par exemple,
gmake MAX_CONNECTIONS=10 check
ne lance pas plus de dix tests en mme temps.
Tests de rgression
gmake installcheck
ou pour un test parallle
gmake installcheck-parallel
Les tests s'attendront contacter le serveur sur l'hte local et avec le numro de port par dfaut, sauf en cas d'indication contraire
avec les variables d'environnement PGHOST et PGPORT. Les tests seront excutes dans une base de donnes nomme regression ; toute base de donnes existante de mme nom sera supprime. Les tests crent aussi de faon temporaire des objets globaux, comme des utilisateurs tels que regressuserN.
Regression tests for optional procedural languages (other than PL/pgSQL, which is tested by the core tests). These are located
under src/pl.
Regression tests for contrib modules, located under contrib. Not all contrib modules have tests.
When using installcheck mode, these tests will destroy any existing databases named pl_regression,
contrib_regression, isolationtest, regress1, or connectdb, as well as regression.
Tests de rgression
L'encodage de la base de donnes peut tre configur pour des tests sur une installation temporaire ou existante, bien que, dans ce
dernier cas, il doit tre compatible avec la locale d'installation.
src/
Tests de rgression
Tests de rgression
Vous pourriez vous demander pourquoi nous n'ordonnons pas toutes les requtes des tests de rgression explicitement pour supprimer ce problme une fois pour toutes. La raison est que cela rendrait les tests de rgression moins utiles car ils tendraient exercer
des types de plans de requtes produisant des rsultats ordonns l'exclusion de celles qui ne le font pas.
Tests de rgression
pour le test particulier, alors le nomtest de base est le nom de substitut donn dans resultmap.)
Par exemple, pour le test char, le fichier de comparaison char.out contient des rsultats qui sont attendus dans les locales C et
POSIX, alors que le fichier char_1.out contient des rsultats tris comme ils apparaissent dans plusieurs autres locales.
Le mcanisme de meilleure correspondance a t conu pour se dbrouiller avec les rsultats dpendant de la locale mais il peut
tre utilis dans toute situation o les rsultats des tests ne peuvent pas tre prdits facilement partir de la plateforme seule. Une
limitation de ce mcanisme est que le pilote test ne peut dire quelle variante est en fait correcte dans l'environnement en cours ;
il rcuprera la variante qui semble le mieux fonctionner. Du coup, il est plus sr d'utiliser ce mcanisme seulement pour les rsultats variants que vous voulez considrer comme identiquement valides dans tous les contextes.
462
Avertissement
Sur Unix, la cration d'un processus via l'appel systme fork() avec des connexions libpq ouvertes peut amener
des rsultats imprvisibles car les processus parent et enfants partagent les mme sockets et les mmes ressources
du systme d'exploitation. Pour cette raison, un tel usage n'est pas recommand, alors qu'excuter un exec partir du processus enfant pour charger un nouvel excutable est sr.
Note
Sur Windows, il existe un moyen pour amliorer les performances si une connexion seule la base de donnes
est ouverte puis ferme de faon rpte. En interne, libpq appelle WSAStartup() et WSACleanup() respectivement pour le dbut et la fin de la transaction. WSAStartup() incrmente un compteur de rfrence interne
la bibliothque Windows. Ce compteur est dcrment par WSACleanup(). Quand le compteur arrive un,
appeler WSACleanup() libre toutes les ressources et toutes les DLL associes. C'est une opration coteuse.
Pour viter cela, une application peut appeler manuellement WSAStartup() afin que les ressources ne soient
pas libres quand la dernire connexion est ferme.
PQconnectdbParams
tablit une nouvelle connexion au serveur de base de donnes.
PGconn *PQconnectdbParams(const char **keywords, const char **values, int
expand_dbname);
Cette fonction ouvre une nouvelle connexion la base de donnes en utilisant les paramtres partir des deux tableaux termins par un NULL. Le premier, keywords, est dfini comme un tableau de chanes, chacune tant un mot-cl. Le second, values, donne la valeur pour chaque mot-cl. Contrairement PQsetdbLogin ci-dessous, l'ensemble des paramtres peut tre tendu sans changer la signature de la fonction donc son utilisation (ou ses versions non bloquantes, savoir PQconnectStartParams et PQconnectPoll) est recommende pour les nouvelles applications.
Quand expand_dbname est diffrent de zro, la valeur du mot-cl dbname peut tre reconnue comme une chane
conninfo. Voir ci-dessous pour les dtails.
Les tableaux fournis peuvent tre vides pour utiliser tous les paramtres par dfaut ou peuvent contenir un ou plusieurs paramtres. Ils doivent avoir la mme longueur. Le traitement stoppera au premier lment NULL dcouvert dans le tableau
464
libpq - Bibliothque C
keywords.
Les mots cls actuellement reconnus sont :
host
Nom de l'hte sur lequel se connecter. S'il commence avec un slash, il spcifie une communication par domaine Unix plutt
qu'une communication TCP/IP ; la valeur est le nom du rpertoire o le fichier socket est stock. Par dfaut, quand host
n'est pas spcifi, il s'agit d'une communication par socket de domaine Unix dans /tmp (ou tout autre rpertoire de socket
spcifi lors de la construction de PostgreSQL). Sur les machines sans sockets de domaine Unix, la valeur par dfaut est de
se connecter localhost.
hostaddr
Adresse IP numrique de l'hte de connexion. Elle devrait tre au format d'adresse standard IPv4, c'est--dire
172.28.40.9. Si votre machine supporte IPv6, vous pouvez aussi utiliser ces adresses. La communication TCP/IP est toujours utilise lorsqu'une chane non vide est spcifie pour ce paramtre.
Utiliser hostaddr au lieu de host permet l'application d'viter une recherche de nom d'hte, qui pourrait tre importante
pour les applications ayant des contraintes de temps. Un nom d'hte est requis pour les mthodes d'authentification Kerberos,
GSSAPI ou SSPI, ainsi que pour la vrification de certificat SSL en verify-full. Les rgles suivantes sont observes :
Si host est indiqu sans hostaddr, une recherche du nom de l'hte est lance.
Si hostaddr est indiqu sans host, la valeur de hostaddr donne l'adresse rseau de l'hte. La tentative de connexion
chouera si la mthode d'authentification ncessite un nom d'hte.
Si host et hostaddr sont indiqus, la valeur de hostaddr donne l'adresse rseau de l'hte. La valeur de host est
ignore sauf si la mthode d'authentification la rclame, auquel cas elle sera utilise comme nom d'hte.
Notez que l'authentification a de grandes chances d'chouer si host n'est pas identique au nom du serveur pour l'adresse rseau hostaddr. De mme, host plutt que hostaddr est utilis pour identifier la connexion dans ~/.pgpass (voir la
Section 31.14, Fichier de mots de passe ).
Sans un nom ou une adresse d'hte, libpq se connectera en utilisant un socket local de domaine Unix. Sur des machines sans
sockets de domaine Unix, il tentera une connexion sur localhost.
port
Numro de port pour la connexion au serveur ou extension du nom de fichier pour des connexions de domaine Unix.
dbname
Nom de la base de donnes. Par dfaut, la mme que le nom utilisateur.
user
Nom de l'utilisateur PostgreSQL qui se connecte. Par dfaut, il s'agit du nom de l'utilisateur ayant lanc l'application.
password
Mot de passe utiliser si le serveur demande une authentification par mot de passe.
connect_timeout
Attente maximum pour une connexion, en secondes (saisie comme une chane d'entier dcimaux). Zro ou non spcifi signifie une attente indfinie. Utiliser un dcompte de moins de deux secondes n'est pas recommand.
client_encoding
Ceci configure le paramtre client_encoding pour cette connexion. En plus des valeurs acceptes par l'option serveur
correspondante, vous pouvez utiliser auto pour dterminer le bon encodage partir de la locale courante du client (variable
d'environnement LC_CTYPE sur les systmes Unix).
options
Ajout d'options en ligne de commande envoyer au serveur l'excution. Par exemple, en le configurant -c geqo=off,
cela configure la valeur de la session pour le paramtre geqo off. Pour une discussion dtaille des options disponibles,
voir Chapitre 18, Configuration du serveur.
application_name
Prcise une valeur pour le paramtre de configuration application_name.
fallback_application_name
Indique une valeur de secours pour le paramtre de configuration application_name. Cette valeur sera utilise si aucune valeur
n'est donne application_name via un paramtre de connexion ou la variable d'environnement. L'indication d'un nom
de secours est utile pour les programmes outils gnriques qui souhaitent configurer un nom d'application par dfaut mais permettrait sa surcharge par l'utilisateur.
keepalives
465
libpq - Bibliothque C
Contrle si les paramtres TCP keepalives ct client sont utiliss. La valeur par dfaut est de 1, signifiant ainsi qu'ils sont
utiliss. Vous pouvez le configurer 0, ce qui aura pour effet de les dsactiver si vous n'en voulez pas. Ce paramtre est ignor pour les connexions ralises via un socket de domaine Unix.
keepalives_idle
Contrle le nombre de secondes d'inactivit aprs lequel TCP doit envoyer un message keepalive au server. Une valeur de zro utilise la valeur par dfaut du systme. Ce paramtre est ignor pour les connexions ralises via un socket de domaine
Unix ou si les paramtres keepalives sont dsactivs. Ce paramtre est uniquement support sur les systmes o les options
TCP_KEEPIDLE ou TCP_KEEPALIVE sont disponibles et sur Windows ; pour les autres systmes, ce paramtre n'a pas
d'effet.
keepalives_interval
Contrle le nombre de secondes aprs lequel un message TCP keepalive doit tre retransmis si le serveur ne l'a pas acquitt.
Une valeur de zro utilise la valeur par dfaut du systme. Ce paramtre est uniquement support sur les systmes o l'option
TCP_KEEPINTVL est disponible et sur Windows ; pour les autres systmes, ce paramtre n'a pas d'effet.
keepalives_count
Contrle le nombre de messages TCP keepalives pouvant tre perdus avant que la connexion du client au serveur ne soit
considre comme perdue. Une valeur de zro utilise la valeur par dfaut du systme. Ce paramtre est uniquement support
sur les systmes o l'option TCP_KEEPCNT est disponible et sur Windows ; pour les autres systmes, ce paramtre n'a pas
d'effet.
tty
Ignor (auparavant, ceci indiquait o envoyer les traces de dbogage du serveur).
sslmode
Cette option dtermine si ou avec quelle priorit une connexion TCP/IP SSL scurise sera ngocie avec le serveur. Il existe
six modes :
disable
essaie seulement une connexion non SSL
allow
essaie en premier lieu une connexion non SSL ; si cette tentative choue, essaie une connexion SSL
prefer (default)
essaie en premier lieu une connexion SSL ; si cette tentative choue, essaie une connexion non SSL
require
essaie seulement une connexion SSL. Si un certificat racine d'autorit est prsent, vrifie le certificat de la mme faon que si
verify-ca tait spcifi
verify-ca
essaie seulement une connexion SSL et vrifie que le certificat client est cr par une autorit de certificats (CA) de confiance
verify-full
essaie seulement une connexion SSL, vrifie que le certificat client est cr par un CA de confiance et que le nom du serveur
correspond bien celui du certificat
Voir Section 31.17, Support de SSL pour une description dtaille de comment ces options fonctionnent.
sslmode est ignor pour la communication par socket de domaine Unix. Si PostgreSQL est compil sans le support de
SSL, l'utilisation des options require, verify-ca et verify-full causera une erreur alors que les options allow et
prefer seront acceptes mais libpq ne sera pas capable de ngocier une connexion SSL.
Cette option est obsolte et remplace par l'option sslmode.
Si initialise 1, une connexion SSL au serveur est requise (ce qui est quivalent un sslmode require). libpq refusera
alors de se connecter si le serveur n'accepte pas une connexion SSL. Si initialise 0 (la valeur par dfaut), libpq ngociera le
type de connexion avec le serveur (quivalent un sslmode prefer). Cette option est seulement disponible si
PostgreSQL est compil avec le support SSL.
sslcert
Ce paramtre indique le nom du fichier du certificat SSL client, remplaant le
~/.postgresql/postgresql.crt. Ce paramtre est ignor si la connexion n'utilise pas SSL.
fichier
par
dfaut,
sslkey
Ce paramtre indique l'emplacement de la cl secrte utilise pour le certificat client. Il peut soit indiquer un nom de fichier
qui sera utilis la place du fichier ~/.postgresql/postgresql.key par dfaut, soit indiquer un cl obtenue par un
moteur externe (les moteurs sont des modules chargeables d'OpenSSL). La spcification d'un moteur externe devrait
consister en un nom de moteur et un identifiant de cl spcifique au moteur, les deux spars par une virgule. Ce paramtre
466
libpq - Bibliothque C
libpq - Bibliothque C
PGconn *PQsetdbLogin(const
const
const
const
const
const
const
char
char
char
char
char
char
char
*pghost,
*pgport,
*pgoptions,
*pgtty,
*dbName,
*login,
*pwd);
C'est le prdcesseur de PQconnectdb avec un ensemble fixe de paramtres. Cette fonction a les mmes fonctionnalits
sauf que les paramtres manquants seront toujours initialiss avec leur valeurs par dfaut. crire NULL ou une chane vide
pour un de ces paramtres fixes dont vous souhaitez utiliser la valeur par dfaut.
Si dbName contient un signe =, il est pris pour une chane conninfo exactement de la mme faon que si elle tait passe
PQconnectdb, et le reste des paramtres est ensuite appliqu comme ci-dessus.
PQsetdb
Cre une nouvelle connexion sur le serveur de bases de donnes.
PGconn *PQsetdb(char
char
char
char
char
*pghost,
*pgport,
*pgoptions,
*pgtty,
*dbName);
C'est une macro faisant appel PQsetdbLogin avec des pointeurs nuls pour les paramtres login et pwd. Elle est fournie
pour une compatibilit ascendante des trs vieux programmes.
PQconnectStartParams, PQconnectStart, PQconnectPoll
Cre une connexion au serveur de bases de donnes d'une faon non bloquante.
PGconn *PQconnectStartParams(const char **keywords, const char **values, int
expand_dbname);
PGconn *PQconnectStart(const char *conninfo);
PostgresPollingStatusType PQconnectPoll(PGconn *conn);
Ces trois fonctions sont utilises pour ouvrir une connexion au serveur de bases de donnes d'une faon telle que le thread de
votre application n'est pas bloqu sur les entres/sorties distantes en demandant la connexion. Le but de cette approche est que
l'attente de la fin des entres/sorties peut se faire dans la boucle principale de l'application plutt qu' l'intrieur de PQconnectdbParams ou PQconnectdb, et donc l'application peut grer des oprations en parallle d'autres activits.
Avec PQconnectStartParams, la connexion la base de donnes est faite en utilisant les paramtres partir des tableaux keywords et values, et contrle par expand_dbname, comme dcrit ci-dessus pour PQconnectdbParams.
Avec PQconnectStart, la connexion la base de donnes est faite en utilisant les paramtres provenant de la chane
conninfo comme dcrit ci-dessus pour PQconnectdb.
Ni PQconnectStartParams ni PQconnectStart ni PQconnectPoll ne bloqueront, aussi longtemps qu'un certain
nombre de restrictions est respect :
Les paramtres hostaddr et host sont utiliss de faon approprie pour vous assurer que la requte de nom et la requte inverse ne soient pas lances. Voir la documentation de ces paramtres avec PQconnectdbParams ci-dessus
pour les dtails.
Si vous appelez PQtrace, assurez-vous que l'objet de flux dans lequel vous enregistrez les traces ne bloquera pas.
Assurez-vous que le socket soit dans l'tat appropri avant d'appeler PQconnectPoll, comme dcrit ci-dessous.
libpq - Bibliothque C
coup, une boucle : si le dernier retour de PQconnectPoll(conn) est PGRES_POLLING_READING, attendez que la socket soit prte pour lire (comme indiqu par select(), poll() ou une fonction systme similaire). Puis, appelez de nouveau PQconnectPoll(conn). En revanche, si le dernier retour de PQconnectPoll(conn) est
PGRES_POLLING_WRITING, attendez que la socket soit prte pour crire, puis appelez de nouveau PQconnectPoll(conn). Si vous devez encore appeler PQconnectPoll, c'est--dire juste aprs l'appel de PQconnectStart,
continuez comme s'il avait renvoy PGRES_POLLING_WRITING. Continuez cette boucle jusqu' ce que PQconnectPoll(conn) renvoie PGRES_POLLING_FAILED, indiquant que la procdure de connexion a chou ou
PGRES_POLLING_OK, indiquant le succs de la procdure de connexion.
tout moment pendant la connexion, le statut de cette connexion pourrait tre vrifi en appelant PQstatus. Si le rsultat
est CONNECTION_BAD, alors la procdure de connexion a chou ; si, au contraire, elle renvoie CONNECTION_OK, alors
la connexion est prte. Ces deux tats sont dtectables partir de la valeur de retour de PQconnectPoll, dcrite ci-dessus.
D'autres tats pourraient survenir lors (et seulement dans ce cas) d'une procdure de connexion asynchrone. Ils indiquent l'tat
actuel de la procdure de connexion et pourraient tre utile pour fournir un retour l'utilisateur. Ces statuts sont :
CONNECTION_STARTED
Attente de la connexion raliser.
CONNECTION_MADE
Connexion OK ; attente d'un envoi.
CONNECTION_AWAITING_RESPONSE
Attente d'une rponse du serveur.
CONNECTION_AUTH_OK
Authentification reue ; attente de la fin du lancement du moteur.
CONNECTION_SSL_STARTUP
Ngociation du cryptage SSL.
CONNECTION_SETENV
Ngociation des paramtrages de l'environnement.
Notez que, bien que ces constantes resteront (pour maintenir une compatibilit), une application ne devrait jamais se baser sur
un ordre pour celles-ci ou sur tout ou sur le fait que le statut fait partie de ces valeurs documents. Une application pourrait
faire quelque chose comme a :
switch(PQstatus(conn))
{
case CONNECTION_STARTED:
feedback = "Connexion en cours...";
break;
case CONNECTION_MADE:
feedback = "Connect au serveur...";
break;
.
.
.
default:
feedback = "Connexion...";
}
Le paramtre de connexion connect_timeout est ignor lors de l'utilisation PQconnectPoll ; c'est de la responsabilit
de l'application de dcider quand une priode de temps excessive s'est coule. Sinon, PQconnectStart suivi par une
boucle PQconnectPoll est quivalent PQconnectdb.
Notez que si PQconnectStart renvoie un pointeur non nul, vous devez appeler PQfinish lorsque vous en avez termin
avec lui, pour supprimer la structure et tous les blocs mmoires qui lui sont associs. Ceci doit tre fait mme si la tentative de
connexion choue ou est abandonne.
PQpingParams
PQpingParams renvoie le statut du serveur. Elle accepte les mmes paramtres de connexions que PQconnectdbParams, dcrite ci-dessus. Nanmoins, il n'est pas ncessaire de fournir un nom d'utilisateur, un mot de passe ou un nom de
base de donnes correct pour obtenir le statut du serveur.
PGPing PQpingParams(const char **keywords, const char **values, int expand_dbname);
La fonction renvoie une des valeurs suivantes :
469
libpq - Bibliothque C
PQPING_OK
Le serveur est en cours d'excution et semble accepter les connexions.
PQPING_REJECT
Le serveur est en cours d'excution mais est dans un tat qui lui interdit les connexions (dmarrage, arrt ou restauration aprs
un arrt brutal).
PQPING_NO_RESPONSE
Le serveur ne peut pas tre contact. Cela peut indiquer que le serveur n'est pas en cours d'excution ou qu'il y a une erreur
dans les paramtres de connexion fournis (par exemple un mauvais numro de port), ou encore qu'il y ait un problme rseau
(par exemple, un pare-feu qui bloque la demande de connexion).
PQPING_NO_ATTEMPT
Aucune tentative n'a t faite pour contacter le serveur car les paramtres fournis sont l'vidence mauvais ou parce qu'il y a
un problme du ct client (par exemple, un manque de mmoire).
PQping
PQping renvoie le statut du serveur. Elle accepte les mmes paramtres de connexions que PQconnectdb, dcrite cidessus. Nanmoins, il n'est pas ncessaire de fournir un nom d'utilisateur, un mot de passe ou un nom de base de donnes correct pour obtenir le statut du serveur.
PGPing PQping(const char *conninfo);
Les valeurs renvoyes sont identiques celles de PQpingParams.
Astuce
Les dveloppeurs d'application libpq devraient tre attentif au maintien de leur abstraction PGconn. Utilisez les
fonctions d'accs dcrites ci-dessous pour obtenir le contenu de PGconn. Rfrence les champs internes de PGconn
en utilisant libpq-int.h n'est pas recommand parce qu'ils sont sujets modification dans le futur.
Les fonctions suivantes renvoient les valeurs des paramtres utiliss pour la connexion. Ces valeurs sont fixes pour la dure de vie
de l'objet PGconn.
PQdb
Renvoie le nom de la base de donnes de la connexion.
char *PQdb(const PGconn *conn);
PQuser
Renvoie le nom d'utilisateur utilis pour la connexion.
char *PQuser(const PGconn *conn);
PQpass
Renvoie le mot de passe utilis pour la connexion.
char *PQpass(const PGconn *conn);
PQhost
Renvoie le nom d'hte du serveur utilis pour la connexion.
char *PQhost(const PGconn *conn);
PQport
Renvoie le numro de port utilis pour la connexion.
char *PQport(const PGconn *conn);
PQtty
Renvoie le TTY de dbogage pour la connexion (ceci est obsolte car le serveur ne fait plus attention au paramtrage du TTY
470
libpq - Bibliothque C
Attention
PQtransactionStatus donnera des rsultats incorrects lors de l'utilisation d'un serveur PostgreSQL
7.3 qui a dsactiv le paramtre autocommit. La fonctionnalit autocommit, ct serveur, est obsolte et
n'existe pas dans les versions serveur ultrieures.
PQparameterStatus
Recherche un paramtrage actuel du serveur.
const char *PQparameterStatus(const PGconn *conn, const char *paramName);
Certaines valeurs de paramtres sont reportes par le serveur automatiquement ou lorsque leur valeurs changent. PQparameterStatus peut tre utilis pour interroger ces paramtrages. Il renvoie la valeur actuelle d'un paramtre s'il est connu et
NULL si le paramtre est inconnu.
Les paramtres reports pour la version actuelle incluent server_version, server_encoding, client_encoding,
application_name, is_superuser, session_authorization, datestyle, IntervalStyle, TimeZone,
integer_datetimes et standard_conforming_strings. (server_encoding, TimeZone et integer_datetimes n'taient pas rapports dans les versions antrieures la 8.0 ; standard_conforming_strings
n'tait pas rapport dans les versions antrieures la 8.1; IntervalStyle n'tait pas rapport dans les versions antrieures
la 8.4; application_name n'tait pas rapport dans les versions antrieures la 9.0). Notez que server_version,
server_encoding et integer_datetimes ne peuvent pas changer aprs le lancement du serveur.
Les serveurs utilisant un protocole antrieur la 3.0 ne reportent pas la configuration des paramtres mais libpq inclut la logique pour obtenir des valeurs pour server_version et client_encoding. Les applications sont encourages utiliser PQparameterStatus plutt qu'un code ad-hoc modifiant ces valeurs (nanmoins, attention, les connexions pr-3.0,
changeant client_encoding via SET aprs le lancement de la connexion, ne seront pas refltes par PQparameterStatus). Pour server_version, voir aussi PQserverVersion, qui renvoie l'information dans un format numrique
qui est plus facile comparer.
Si aucune valeur n'est indique pour standard_conforming_strings, les applications pourraient supposer qu'elle
vaut off, c'est--dire que les antislashs sont traits comme des chappements dans les chanes littrales. De plus, la prsence
de ce paramtre pourrait tre pris comme une indication que la syntaxe d'chappement d'une chane (E'...') est accepte.
471
libpq - Bibliothque C
Bien que le pointeur renvoy est dclar const, il pointe en fait vers un stockage mutable associ avec la structure PGconn.
Il est dconseill de supposer que le pointeur restera valide pour toutes les requtes.
PQprotocolVersion
Interroge le protocole interface/moteur lors de son utilisation.
int PQprotocolVersion(const PGconn *conn);
Les applications souhaitent utiliser ceci pour dterminer si certaines fonctionnalits sont supportes. Actuellement, les seules
valeurs possible sont 2 (protocole 2.0), 3 (protocole 3.0) ou zro (mauvaise connexion). La version du protocole ne changera
pas aprs la fin du lancement de la connexion mais cela pourrait tre chang thoriquement avec une rinitialisation de la
connexion. Le protocole 3.0 sera normalement utilis lors de la communication avec les serveurs PostgreSQL 7.4 ou ultrieures ; les serveurs antrieurs la 7.4 supportent uniquement le protocole 2.0 (le protocole 1.0 est obsolte et non support
par libpq).
PQserverVersion
Renvoie un entier reprsentant la version du moteur.
int PQserverVersion(const PGconn *conn);
Les applications pourraient utiliser ceci pour dterminer la version du serveur de la base de donnes auquel ils sont connects.
Le numro est form en convertissant les nombres majeur, mineur et de rvision en un nombre deux chiffres dcimaux et en
leur assemblant. Par exemple, la version 8.1.5 sera renvoye en tant que 80105 et la version 8.2 sera renvoye en tant que
80200 (les zros au dbut ne sont pas affichs). Zro est renvoye si la connexion est mauvaise.
PQerrorMessage
Renvoie le dernier message d'erreur gnr par une opration sur la connexion.
char *PQerrorMessage(const PGconn* conn);
Pratiquement toutes les fonctions libpq initialiseront un message pour PQerrorMessage en cas d'chec. Notez que, par la
convention libpq, un rsultat non vide de PQerrorMessage peut tre sur plusieurs lignes et contiendra un retour chariot
la fin. L'appelant ne devrait pas librer directement le rsultat. Il sera libr quand la poigne PGconn associe est passe
PQfinish. Vous ne devriez pas supposer que la chane rsultante reste identique suite toutes les oprations sur la structure
PGconn.
PQsocket
Obtient le descripteur de fichier du socket de la connexion au serveur. Un descripteur valide sera plus grand ou gal 0 ; un
rsultat de -1 indique qu'aucune connexion au serveur n'est actuellement ouverte (ceci ne changera pas lors de l'opration normale mais pourra changer lors d'une configuration de l'initialisation ou lors d'une rinitialisation).
int PQsocket(const PGconn *conn);
PQbackendPID
Renvoie l'identifiant du processus (PID) du serveur grant cette connexion.
int PQbackendPID(const PGconn *conn);
Le PID du moteur est utile pour des raisons de dbogage et pour la comparaison avec les messages NOTIFY (qui incluent le
PID du processus serveur lanant la notification). Notez que le PID appartient un processus excut sur l'hte du serveur de
bases de donnes et non pas sur l'hte local !
PQconnectionNeedsPassword
Renvoie true (1) si la mthode d'authentification de la connexion ncessite un mot de passe, mais qu'aucun n'est disponible.
Renvoie false (0) sinon.
int PQconnectionNeedsPassword(const PGconn *conn);
Cette fonction peut tre utilise aprs une tentative choue de connexion pour dcider de la demande d'un utilisateur pour un
mot de passe.
PQconnectionUsedPassword
Renvoie true (1) si la mthode d'authentification de la connexion a utilis un mot de passe. Renvoie false (0) sinon.
int PQconnectionUsedPassword(const PGconn *conn);
472
libpq - Bibliothque C
Cette fonction peut tre utilise aprs une connexion, russie ou en chec, pour dtecter si le serveur demande un mot de
passe.
PQgetssl
Retourne la structure SSL utilise dans la connexion ou NULL si SSL n'est pas utilis.
SSL *PQgetssl(const PGconn *conn);
Cette structure peut tre utilise pour vrifier les niveaux de cryptage, pour vrifier les certificats du serveur, et plus. Rfrezvous la documentation d'OpenSSL pour plus d'informations sur cette structure.
Vous pouvez dfinir USE_SSL pour obtenir le bon prototype de cette fonction. Faire cela inclura automatiquement ssl.h
partir d'OpenSSL.
libpq - Bibliothque C
Le nombre de paramtres fournis ; il s'agit de la longueur des tableaux paramTypes[], paramValues[], paramLengths[] et paramFormats[]. (Les pointeurs de tableau peuvent tre NULL quand nParams vaut zro.)
paramTypes[]
Spcifie, par OID, les types de donnes affecter aux symboles de paramtres. Si paramTypes est NULL ou si tout lment
spcifique du tableau est zro, le serveur infre un type de donne pour le symbole de paramtre de la mme faon qu'il le ferait pour une chane litrale sans type.
paramValues[]
Spcifie les vraies valeurs des paramtres. Un pointeur nul dans ce tableau signifie que le paramtre correspondant est
NULL ; sinon, le pointeur pointe vers une chane texte termine par un octet nul (pour le format texte) ou vers des donnes binaires dans le format attendu par le serveur (pour le format binaire).
paramLengths[]
Spcifie les longueurs des donnes relles des paramtres du format binaire. Il est ignor pour les paramtres NULL et les paramtres de format texte. Le pointeur du tableau peut tre NULL quand il n'y a pas de paramtres binaires.
paramFormats[]
Spcifie si les paramtres sont du texte (placez un zro dans la ligne du tableau pour le paramtre correspondant) ou binaire
(placez un un dans la ligne du tableau pour le paramtre correspondant). Si le pointeur du tableau est nul, alors tous les paramtres sont prsums tre des chanes de texte.
Les valeurs passes dans le format binaire ncessitent de connatre la reprsentation interne attendue par le moteur. Par
exemple, les entiers doivent tre passs dans l'ordre rseau pour les octets. Passer des valeurs numeric requiert de connatre le
format
de
stockage
du
serveur,
comme
implment
dans
src/backend/utils/adt/numeric.c::numeric_send()
et
src/backend/utils/adt/numeric.c::numeric_recv().
resultFormat
Indiquez zro pour obtenir les rsultats dans un format texte et un pour les obtenir dans un format binaire. (Il n'est actuellement pas possible d'obtenir des formats diffrents pour des colonnes de rsultats diffrentes bien que le protocole le permette.)
Le principal avantage de PQexecParams sur PQexec est que les valeurs de paramtres pourraient tre spars partir de la
chane de commande, vitant ainsi le besoin de guillemets et d'chappements.
Contrairement PQexec, PQexecParams autorise au plus une commande SQL dans une chane donne (il peut y avoir des
points-virgules mais pas plus d'une commande non vide). C'est une limitation du protocole sous-jacent mais cela a quelque utilit
comme dfense supplmentaire contre les attaques par injection de SQL.
Astuce
Spcifier les types de paramtres via des OID est difficile, tout particulirement si vous prfrez ne pas coder en
dur les valeurs OID particulires dans vos programmes. Nanmoins, vous pouvez viter de le faire mme dans des
cas o le serveur lui-mme ne peut pas dterminer le type du paramtre ou choisit un type diffrent de celui que
vous voulez. Dans le texte de commande SQL, attachez une conversion explicite au symbole de paramtre pour
montrer le type de donnes que vous enverrez. Par exemple :
SELECT * FROM ma_table WHERE x = $1::bigint;
Ceci impose le traitement du paramtre $1 en tant que bigint alors que, par dfaut, il se serait vu affect le mme
type que x. Forcer la dcision du type de paramtre, soit de cette faon soit en spcifiant l'OID du type numrique,
est fortement recommand lors de l'envoi des valeurs des paramtres au format binaire car le format binaire a
moins de redondance que le format texte et, du coup, il y a moins de chance que le serveur dtecte une erreur de
correspondance de type pour vous.
PQprepare
Soumet une requte pour crer une instruction prpare avec les paramtres donns et attends la fin de son excution.
PGresult *PQprepare(PGconn *conn,
const char *stmtName,
const char *query,
int nParams,
const Oid *paramTypes);
PQprepare cre une instruction prpare pour une excution ultrieure avec PQexecPrepared. Cette fonction autorise
les commandes utilises de faon rpt tre analyses et planifies qu'une seule fois, plutt qu' chaque excution. PQ474
libpq - Bibliothque C
prepare est uniquement support par les connexions utilisant le protocole 3.0 et ses versions ultrieures ; elle chouera avec
le protocole 2.0.
La fonction cre une instruction prpare nomme stmtName partir de la chane query, devant contenir une seule commande SQL. stmtName pourrait tre une chane vide pour crer une instruction non nomme, auquel cas toute instruction
non nomme dj existante est automatiquement remplace par cette dernire. Une erreur sera rapporte si le nom de
l'instruction est dj dfinie dans la session en cours. Si des paramtres sont utiliss, ils sont rfrencs dans la requte avec
$1, $2, etc. nParams est le nombre de paramtres pour lesquels des types sont prdfinis dans le tableau paramTypes[]
(le pointeur du tableau pourrait tre NULL quand nParams vaut zro). paramTypes[] spcifie les types de donnes affecter aux symboles de paramtres par leur OID. Si paramTypes est NULL ou si un lment particulier du tableau vaut zro, le serveur affecte un type de donnes au symbole du paramtre de la mme faon qu'il le ferait pour une chane littrale
non type. De plus, la requte pourrait utiliser des symboles de paramtre avec des nombres plus importants que nParams ;
les types de donnes seront aussi infrs pour ces symboles. (Voir PQdescribePrepared comme un moyen de trouver les
types de donnes infrs.)
Comme avec PQexec, le rsultat est normalement un objet PGresult dont le contenu indique le succs ou l'chec ct serveur. Un rsultat NULL indique un manque de mmoire ou une incapacit envoyer la commande. Utilisez PQerrorMessage pour obtenir plus d'informations sur de telles erreurs.
Les instructions prpares avec PQexecPrepared peuvent aussi tre cres en excutant les instructions SQL PREPARE(7).
De plus, bien qu'il n'y ait aucune fonction libpq pour supprimer une instruction prpare, l'instruction SQL DEALLOCATE(7)
peut tre utilise dans ce but.
PQexecPrepared
Envoie une requte pour excuter une instruction spare avec les paramtres donns, et attend le rsultat.
PGresult *PQexecPrepared(PGconn *conn,
const char *stmtName,
int nParams,
const char * const *paramValues,
const int *paramLengths,
const int *paramFormats,
int resultFormat);
PQexecPrepared est identique PQexecParams mais la commande excuter est spcifie en nommant l'instruction
prpare prcdemment au lieu de donner une chane de requte. Cette fonctionnalit permet aux commandes utilises de
faon rpte d'tre analyses et planifies seulement une fois plutt que chaque fois qu'ils sont excuts. L'instruction doit
avoir t prpare prcdemment dans la session en cours. PQexecPrepared est support seulement dans les connexions
du protocole 3.0 et ses versions ultrieures ; il chouera lors de l'utilisation du protocole 2.0.
Les paramtres sont identiques PQexecParams, sauf que le nom d'une instruction prpare est donn au lieu d'une chane
de requte et le paramtre paramTypes[] n'est pas prsente (il n'est pas ncessaire car les types des paramtres de
l'instruction prpare ont t dtermins la cration).
PQdescribePrepared
Soumet une requte pour obtenir des informations sur l'instruction prpare indique et attend le retour de la requte.
PGresult *PQdescribePrepared(PGconn *conn, const char *stmtName);
PQdescribePrepared permet une application d'obtenir des informations si une instruction prpare prcdemment.
PQdescribePrepared est seulement support avec des connexions utilisant le protocole 3.0 et ultrieures ; il chouera
lors de l'utilisation du protocole 2.0.
stmtName peut tre "" ou NULL pour rfrencer l'instruction non nomme. Sinon, ce doit tre le nom d'une instruction prpare existante. En cas de succs, un PGresult est renvoy avec le code retour PGRES_COMMAND_OK. Les fonctions PQnparams et PQparamtype peuvent utiliser ce PGresult pour obtenir des informations sur les paramtres d'une instruction
prpare, et les fonctions PQnfields, PQfname, PQftype, etc fournissent des informations sur les colonnes rsultantes
(au cas o) de l'instruction.
PQdescribePortal
Soumet une requte pour obtenir des informations sur le portail indiqu et attend le retour de la requte.
PGresult *PQdescribePortal(PGconn *conn, const char *portalName);
PQdescribePortal permet une application d'obtenir des informations sur un portail prcdemment cr. (libpq ne fournit pas d'accs direct aux portails mais vous pouvez utiliser cette fonction pour inspecter les proprits d'un curseur cr avec
475
libpq - Bibliothque C
la commande SQL DECLARE CURSOR.) PQdescribePortal est seulement support dans les connexions via le protocole 3.0 et ultrieurs ; il chouera lors de l'utilisation du protocole 2.0.
portalName peut tre "" ou NULL pour rfrencer un portail sans nom. Sinon, il doit correspondre au nom d'un portail
existant. En cas de succs, un PGresult est renvoy avec le code de retour PGRES_COMMAND_OK. Les fonctions PQnfields, PQfname, PQftype, etc peuvent utiliser ce PGresult pour obtenir des informations sur les colonnes rsultats (au
cas o) du portail.
La structure PGresult encapsule le rsultat renvoy par le serveur. Les dveloppeurs d'applications libpq devraient faire attention
au maintien de l'abstraction de PGresult. Utilisez les fonctions d'accs ci-dessous pour obtenir le contenu de PGresult. vitez la rfrence aux champs de la structure PGresult car ils sont sujets des changements dans le futur.
PQresultStatus
Renvoie l'tat du rsultat d'une commande.
ExecStatusType PQresultStatus(const PGresult *res);
PQresultStatus peut renvoyer une des valeurs suivantes :
PGRES_EMPTY_QUERY
La chane envoye au serveur tait vide.
PGRES_COMMAND_OK
Fin avec succs d'une commande ne renvoyant aucune donne.
PGRES_TUPLES_OK
Fin avec succs d'une commande renvoyant des donnes (telle que SELECT ou SHOW).
PGRES_COPY_OUT
Dbut de l'envoi ( partir du serveur) d'un flux de donnes.
PGRES_COPY_IN
Dbut de la rception (sur le serveur) d'un flux de donnes.
PGRES_BAD_RESPONSE
La rponse du serveur n'a pas t comprise.
PGRES_NONFATAL_ERROR
Une erreur non fatale (une note ou un avertissement) est survenue.
PGRES_FATAL_ERROR
Une erreur fatale est survenue.
PGRES_COPY_BOTH
Lancement du transfert de donnes Copy In/Out (vers et partir du serveur). Ceci est seulement utilis par la rplication en
flux.
Si le statut du rsultat est PGRES_TUPLES_OK, alors les fonctions dcrites ci-dessous peuvent tre utilises pour rcuprer
les lignes renvoyes par la requte. Notez qu'une commande SELECT qui arrive rcuprer aucune ligne affichera toujours
PGRES_TUPLES_OK. PGRES_COMMAND_OK est pour les commandes qui ne peuvent jamais renvoyer de lignes (INSERT,
UPDATE, etc.). Une rponse PGRES_EMPTY_QUERY pourrait indiquer un bogue dans le logiciel client.
Un rsultat de statut PGRES_NONFATAL_ERROR ne sera jamais renvoy directement par PQexec ou d'autres fonctions
d'excution de requtes ; les rsultats de ce type sont passs l'excuteur de notifications (voir la Section 31.11, Traitement
des messages ).
PQresStatus
Convertit le type numr renvoy par PQresultStatus en une constante de type chane dcrivant le code d'tat.
L'appelant ne devrait pas librer le rsultat.
char *PQresStatus(ExecStatusType status);
PQresultErrorMessage
Renvoie le message d'erreur associ avec la commande ou une chane vide s'il n'y a pas eu d'erreurs.
char *PQresultErrorMessage(const PGresult *res);
S'il y a eu une erreur, la chane renvoye incluera un retour chariot en fin. L'appelant ne devrait pas librer directement le rsultat. Il sera libr quand la poigne PGresult associe est passe PQclear.
Suivant immdiatement un appel PQexec ou PQgetResult, PQerrorMessage (sur la connexion) renverra la mme
chane que PQresultErrorMessage (sur le rsultat). Nanmoins, un PGresult conservera son message d'erreur jusqu'
476
libpq - Bibliothque C
destruction alors que le message d'erreur de la connexion changera lorsque des oprations suivantes seront ralises. Utiliser
PQresultErrorMessage quand vous voulez connatre le statut associ avec un PGresult particulier ; utilisez PQerrorMessage lorsque vous souhaitez connatre le statut partir de la dernire opration sur la connexion.
PQresultErrorField
Renvoie un champ individuel d'un rapport d'erreur.
char *PQresultErrorField(const PGresult *res, int fieldcode);
fieldcode est un identifiant de champ d'erreur ; voir les symboles lists ci-dessous. NULL est renvoy si PGresult n'est
pas un rsultat d'erreur ou d'avertissement, ou n'inclut pas le champ spcifi. Les valeurs de champ n'incluront normalement
pas un retour chariot en fin. L'appelant ne devrait pas librer directement le rsultat. Il sera libr quand la poigne PGresult
associe est passe PQclear.
Les codes de champs suivants sont disponibles :
PG_DIAG_SEVERITY
La svrit ; le contenu du champ peut tre ERROR, FATAL ou PANIC dans un message d'erreur, ou WARNING, NOTICE,
DEBUG, INFO ou LOG dans un message de notification, ou une traduction localise de ceux-ci. Toujours prsent.
PG_DIAG_SQLSTATE
Le code SQLSTATE de l'erreur. Ce code identifie le type d'erreur qui est survenu ; il peut tre utilis par des interfaces qui
ralisent les oprations spcifiques (telles que la gestion des erreurs) en rponse une erreur particulire de la base de donnes. Pour une liste des codes SQLSTATE possibles, voir l'Annexe A, Codes d'erreurs de PostgreSQL. Ce champ n'est pas
localisable et est toujours prsent.
PG_DIAG_MESSAGE_PRIMARY
Le principal message d'erreur, comprhensible par un humain (typiquement sur une ligne). Toujours prsent.
PG_DIAG_MESSAGE_DETAIL
Dtail : un message d'erreur secondaire et optionnel proposant plus d'informations sur le problme. Pourrait tre compos de
plusieurs lignes.
PG_DIAG_MESSAGE_HINT
Astuce : une suggestion supplmentaire sur ce qu'il faut faire suite ce problme. Elle a pour but de diffrer du dtail car elle
offre un conseil (potentiellement inappropri) plutt que des faits tablis. Pourrait tre compos de plusieurs lignes.
PG_DIAG_STATEMENT_POSITION
Une chane contenant un entier dcimal indiquant le position du curseur d'erreur comme index dans la chane d'instruction originale. Le premier caractre se trouve l'index 1 et les positions sont mesures en caractres, et non pas en octets.
PG_DIAG_INTERNAL_POSITION
Ceci est dfini de la mme faon que le champ PG_DIAG_STATEMENT_POSITION mais c'est utilis quand la position du
curseur fait rfrence une commande gnre en interne plutt qu'une soumise par le client. Le champ
PG_DIAG_INTERNAL_QUERY apparatra toujours quand ce champ apparat.
PG_DIAG_INTERNAL_QUERY
Le texte d'une commande choue, gnre en interne. Ceci pourrait tre, par exemple, une requte SQL lance par une fonction PL/pgSQL.
PG_DIAG_CONTEXT
Une indication du contexte dans lequel l'erreur est apparue. Actuellement, cela inclut une trace de la pile d'appels des fonctions actives de langages de procdures et de requtes gnres en interne. La trace a une entre par ligne, la plus rcente se
trouvant au dbut.
PG_DIAG_SOURCE_FILE
Le nom du fichier contenant le code source o l'erreur a t rapporte.
PG_DIAG_SOURCE_LINE
Le numro de ligne dans le code source o l'erreur a t rapporte.
PG_DIAG_SOURCE_FUNCTION
Le nom de la fonction dans le code source o l'erreur a t rapporte.
Le client est responsable du formatage des informations affiches suivant ses besoins ; en particulier, il doit supprimer les
longues lignes si ncessaires. Les caractres de retour chariot apparaissant dans les champs de message d'erreur devraient tre
traits comme des changements de paragraphes, pas comme des changements de lignes.
Les erreurs gnres en interne par libpq auront une svrit et un message principal mais aucun autre champ. Les erreurs renvoyes par un serveur utilisant un protocole antrieure la 3.0 inclueront la svrit, le message principal et, quelques fois, un
message dtaill mais aucun autre champ.
477
libpq - Bibliothque C
Notez que les champs d'erreurs sont seulement disponibles pour les objets PGresult, et non pas pour les objets PGconn ; il
n'existe pas de fonction PQerrorField.
PQclear
Libre le stockage associ avec un PGresult. Chaque rsultat de commande devrait tre libr via PQclear lorsqu'il n'est
plus ncessaire.
void PQclear(PGresult *res);
Vous pouvez conserver un objet PGresult aussi longtemps que vous en avez besoin ; il ne part pas lorsque vous lancez une
nouvelle commande, mme pas si vous fermez la connexion. Pour vous en dbarrasser, vous devez appeler PQclear. En cas
d'oubli, ceci rsultera en des pertes mmoires pour votre application.
foo
BAR
0
0
-1
1
PQftable
Renvoie l'OID de la table partir de laquelle la colonne donne a t rcupre. Les numros de colonnes commencent zro
mais les colonnes des tables ont des numros diffrents de zro.
478
libpq - Bibliothque C
libpq - Bibliothque C
PQgetvalue
Renvoie la valeur d'un seul champ d'une seule ligne d'un PGresult. Les numros de lignes et de colonnes commencent zro.
L'appelant ne devrait pas librer directement le rsultat. Il sera libr quand la poigne PGresult associe est passe PQclear.
char* PQgetvalue(const PGresult *res,
int row_number,
int column_number);
Pour les donnes au format texte, la valeur renvoye par PQgetvalue est une reprsentation au format chane de caractres
termine par un octet nul de la valeur du champ. Pour les donnes au format binaire, la valeur dans la reprsentation binaire
est dtermine par le type de la donne, fonctions typsend et typreceive (la valeur est en fait suivie d'un octet zro dans
ce cas aussi mais ce n'est pas rellement utile car la valeur a des chances de contenir d'autres valeurs NULL embarques).
Une chane vide est renvoye si la valeur du champ est NULL. Voir PQgetisnull pour distinguer les valeurs NULL des
valeurs de chane vide.
Le pointeur renvoy par PQgetvalue pointe vers le stockage qui fait partie de la structure PGresult. Personne ne devrait
modifier les donnes vers lesquelles il pointe et tout le monde devrait copier explicitement les donnes dans un autre stockage
s'il n'est pas utilis aprs la dure de vie de la struture PGresult.
PQgetisnull
Teste un champ pour savoir s'il est nul. Les numros de lignes et de colonnes commencent zro.
int PQgetisnull(const PGresult *res,
int row_number,
int column_number);
Cette fonction renvoie 1 si le champ est nul et 0 s'il contient une valeur non NULL (notez que PQgetvalue renverra une
chane vide, et non pas un pointeur nul, pour un champ nul).
PQgetlength
Renvoie la longueur relle de la valeur d'un champ en octet. Les numros de lignes et de colonnes commencent zro.
int PQgetlength(const PGresult *res,
int row_number,
int column_number);
C'est la longueur relle des donnes pour la valeur particulire des donnes, c'est--dire la taille de l'objet point par PQgetvalue. Pour le format textuel, c'est identique strlen(). Pour le format binaire, c'est une information essentielle. Notez
que personne ne devrait se fier PQfsize pour obtenir la taille relle des donnes.
PQnparams
Renvoie le nombre de paramtres d'une instruction prpare.
int PQnparams(const PGresult *res);
Cette fonction est seulement utile pour inspecter le rsultat de PQdescribePrepared. Pour les autres types de requtes, il
renverra zro.
PQparamtype
Renvoie le type de donne du paramtre indiqu de l'instruction. Le numrotage des paramtres commence 0.
Oid PQparamtype(const PGresult *res, int param_number);
Cette fonction est seulement utile pour inspecyer le rsultat de PQdescribePrepared. Pour les autres types de requtes, il
renverra zro.
PQprint
Affiche toutes les lignes et, optionnellement, les noms des colonnes dans le flux de sortie spcifi.
void PQprint(FILE* fout,
/* flux de sortie */
const PGresult *res,
const PQprintOpt *po);
typedef struct
{
480
libpq - Bibliothque C
pqbool
header;
481
libpq - Bibliothque C
PQescapeLiteral chappe une chane pour l'utiliser dans une commande SQL. C'est utile pour insrer des donnes
comme des constantes dans des commandes SQL. Certains caractres, comme les guillemets et les antislashs, doivent tre
traits avec des caractres d'chappement pour viter qu'ils soient traits d'aprs leur signification spciale par l'analyseur
SQL. PQescapeLiteral ralise cette opration.
PQescapeLiteral renvoie une version chappe du paramtre str dans une mmoire alloue avec malloc(). Cette
mmoire devra tre libre en utilisant PQfreemem() quand le rsultat ne sera plus utile. Un octet zro de fin n'est pas requis et ne doit pas tre compt dans length. (Si un octet zro de fin est dcouvert avant la fin du traitement des length octets, PQescapeLiteral s'arrte au zro ; ce comportement est identique celui de strncpy.) Les caractres spciaux de
la chane en retour ont t remplacs pour qu'ils puissent tre traits correctement par l'analyseur de chanes de
PostgreSQL. Un octet zro final est aussi ajout. Les guillemets simples qui doivent entourer les chanes litrales avec PostgreSQL sont inclus dans la chane rsultante.
En cas d'erreur, PQescapeLiteral renvoit NULL et un message convenable est stock dans l'objet conn.
Astuce
Il est particulirement important de faire un chappement propre lors de l'utilisation de chanes provenant d'une
source qui n'est pas forcment de confiance. Sinon, il existe un risque de scurit : vous vous exposez une attaque de type injection SQL avec des commandes SQL non voulues injectes dans votre base de donnes.
Notez qu'il n'est pas ncessaire ni correct de faire un chappement quand une valeur est pass en tant que paramtre spar
dans PQexecParams ou ce type de routine.
PQescapeIdentifier
char *PQescapeIdentifier(PGconn *conn, const char *str, size_t length);
PQescapeIdentifier chappe une chane pour qu'elle puisse tre utilis en tant qu'identifiant SQL, par exemple pour le
nom d'une table, d'une colonne ou d'une fonction. C'est utile quand un identifiant fourni par un utilisateur pourrait contenir
des caractres spciaux qui pourraient autrement ne pas tre interprts comme faisant parti de l'identifiant par l'analyseur
SQL ou lorsque l'identifiant pourrait contenir des caractres en majuscule, auquel cas le casse doit tre prserve.
PQescapeIdentifier renvoit une version du paramtre str chappe comme doit l'tre un identifiant SQL, dans une
mmoire alloue avec malloc(). Cette mmoire doit tre libre en utilisant PQfreemem() quand le rsultat n'est plus
ncessaire. Un octet zro de fin n'est pas ncessaire et ne doit pas tre comptabilis dans length. (Si un octet zro de fin est
trouv avant le traitement des length octets, PQescapeIdentifier s'arrte au zro ; ce comportement est identique
celui de strncpy.) Les caractres spciaux de la chane en retour ont t remplacs pour que ce dernier soit trait proprement comme un identifiant SQL. Un octet zro de fin est aussi ajout. La chane de retour sera aussi entoure de guillemets
doubles.
En cas d'erreur, PQescapeIdentifier renvoit NULL et un message d'erreur convenable est stocke dans l'objet conn.
Astuce
Comme avec les chanes litrales, pour empcher les attaques d'injection SQL, les identifiants SQL doivent
tre chapps lorsqu'elles proviennent de source non sre.
PQescapeStringConn
size_t PQescapeStringConn (PGconn *conn,
char *to, const char *from, size_t length,
int *error);
PQescapeStringConn chappe les chanes litrales de la mme faon que PQescapeLiteral. Contrairement
PQescapeLiteral, l'appelant doit fournir un tampon d'une taille approprie. De plus, PQescapeStringConn n'ajoute
pas de guillemets simples autour des chanes litrales de PostgreSQL ; elles doivent tre ajoutes dans la commande SQL
o ce rsultat sera insr. Le paramtre from pointe vers le premier caractre d'une chane chapper, et le paramtre
length prcise le nombre d'octets contenus dans cette chane. Un octet zro de fin n'est pas ncessaire et ne doit pas tre
comptabilis dans length. (Si un octet zro de fin est trouv avant le traitement des length octets, PQescapeStringConn s'arrte au zro ; ce comportement est identique celui de strncpy.) to doit pointer vers un tampon qui peut contenir
au moins un octet de plus que deux fois la valeur de length, sinon le comportement de la fonction n'est pas connue. Le
482
libpq - Bibliothque C
libpq - Bibliothque C
Le paramtre from pointe vers une chane de telle faon qu'elle pourrait provenir de PQgetvalue lorsque la colonne est de
type bytea. PQunescapeBytea convertit cette reprsentation de la chane en sa reprsentation binaire. Elle renvoie un
pointeur vers le tampon allou avec malloc(), ou NULL en cas d'erreur, et place la taille du tampon dans to_length. Le
rsultat doit tre libr en utilisant PQfreemem lorsque celui-ci n'est plus ncessaire.
Cette conversion n'est pas l'inverse exacte de PQescapeBytea car la chane n'est pas chappe avec PQgetvalue. Cela
signifie en particulier qu'il n'y a pas besoin de rflchir la mise entre guillemets de la chane, et donc pas besoin d'un paramtre PGconn.
PQexec attend que la commande se termine. L'application pourrait avoir d'autres travaux raliser (comme le rafraichissement de l'interface utilisateur), auquel cas il ne voudra pas tre bloqu en attente de la rponse.
Comme l'excution de l'application cliente est suspendue en attendant le rsultat, il est difficile pour l'application de dcider
qu'elle voudrait annuler la commande en cours (c'est possible avec un gestionnaire de signaux mais pas autrement).
PQexec ne peut renvoyer qu'une structure PGresult. Si la chane de commande soumise contient plusieurs commandes SQL,
toutes les structures PGresult sont annules par PQexec, sauf la dernire.
Les applications qui n'apprcient pas ces limitations peuvent utiliser la place les fonctions sous-jacentes partir desquelles
PQexec est construit : PQsendQuery et PQgetResult. Il existe aussi PQsendQueryParams, PQsendPrepare, PQsendQueryPrepared, PQsendDescribePrepared et PQsendDescribePortal, pouvant tre utilises avec PQgetResult pour dupliquer les fonctionnalits de respectivement PQexecParams, PQprepare, PQexecPrepared, PQdescribePrepared et PQdescribePortal.
PQsendQuery
Soumet une commande au serveur sans attendre le(s) rsultat(s). 1 est renvoy si la commande a t correctement envoye et
0 dans le cas contraire (auquel cas, utilisez la fonction PQerrorMessage pour obtenir plus d'informations sur l'chec).
int PQsendQuery(PGconn *conn, const char *command);
Aprs un appel russi PQsendQuery, appelez PQgetResult une ou plusieurs fois pour obtenir les rsultats. PQsendQuery ne peut pas tre appel de nouveau (sur la mme connexion) tant que PQgetResult ne renvoie pas de pointeur nul,
indiquant que la commande a termin.
PQsendQueryParams
Soumet une commande et des paramtres spars au serveur sans attendre le(s) rsultat(s).
int PQsendQueryParams(PGconn *conn,
const char *command,
int nParams,
const Oid *paramTypes,
const char * const *paramValues,
const int *paramLengths,
const int *paramFormats,
int resultFormat);
Ceci est quivalent PQsendQuery sauf que les paramtres de requtes peuvent tre spcifis partir de la chane de requte. Les paramtres de la fonction sont grs de faon identique PQexecParams. Comme PQexecParams, cela ne
fonctionnera pas pour les connexions utilisant le protocole 2.0 et cela ne permettra qu'une seule commande dans la chane de
requte.
PQsendPrepare
Envoie une requte pour crer une instruction prpare avec les paramtres donns et redonne la main sans attendre la fin de
son excution.
int PQsendPrepare(PGconn *conn,
const char *stmtName,
const char *query,
int nParams,
const Oid *paramTypes);
484
libpq - Bibliothque C
Ceci est la version asynchrone de PQprepare : elle renvoie 1 si elle a t capable d'envoyer la requte, 0 sinon. Aprs un
appel termin avec succs, appelez PQgetResult pour dterminer si le serveur a cr avec succs l'instruction prpare.
Les paramtres de la fonction sont grs de faon identique PQprepare. Comme PQprepare, cela ne fonctionnera pas
sur les connexions utilisant le protocole 2.0.
PQsendQueryPrepared
Envoie une requte pour excuter une instruction prpare avec des paramtres donns sans attendre le(s) rsultat(s).
int PQsendQueryPrepared(PGconn *conn,
const char *stmtName,
int nParams,
const char * const *paramValues,
const int *paramLengths,
const int *paramFormats,
int resultFormat);
Ceci est similaire PQsendQueryParams mais la commande excuter est spcifie en nommant une instruction prcdemment prpare au lieu de donner une chane contenant la requte. Les paramtres de la fonction sont grs de faon identique PQexecPrepared. Comme PQexecPrepared, cela ne fonctionnera pas pour les connexions utilisant le protocole
2.0.
PQsendDescribePrepared
Soumet une requte pour obtenir des informations sur l'instruction prpare indique sans attendre sa fin.
int PQsendDescribePrepared(PGconn *conn, const char *stmtName);
Ceci est la version asynchrone de PQdescribePrepared : elle renvoie 1 si elle a t capable d'envoyer la requte, 0 dans
le cas contraire. Aprs un appel russi, appelez PQgetResult pour obtenir les rsultats. Les paramtres de la fonction sont
grs de faon identique PQdescribePrepared. Comme PQdescribePrepared, cela ne fontionnera pas avec les
connexions utilisant le protocole 2.0.
PQsendDescribePortal
Soumet une requte pour obtenir des informations sur le portail indiqu sans attendre la fin de la commande.
int PQsendDescribePortal(PGconn *conn, const char *portalName);
Ceci est la version asynchrone de PQdescribePortal : elle renvoie 1 si elle a t capable d'envoyer la requte, 0 dans le
cas contraire. Aprs un appel russi, appelez PQgetResult pour obtenir les rsultats. Les paramtres de la fonction sont grs de faon identique PQdescribePortal. Comme PQdescribePortal, cela ne fontionnera pas avec les
connexions utilisant le protocole 2.0.
PQgetResult
Attend le prochain rsultat d'un appel prcdant PQsendQuery, PQsendQueryParams, PQsendPrepare ou PQsendQueryPrepared, et le renvoie. Un pointeur nul est renvoy quand la commande est termine et qu'il n'y aura plus de
rsultats.
PGresult *PQgetResult(PGconn *conn);
PQgetResult doit tre appel de faon rpt jusqu' ce qu'il retourne un pointeur nul indiquant que la commande s'est termine (si appel un moment o aucune commande n'est active, PQgetResult renverra seulement un pointeur nul la
fois). Chaque rsultat non nul provenant de PQgetResult devrait tre trait en utilisant les mmes fonctions d'accs
PGresult que celles prcdemment dcrites. N'oubliez pas de librer chaque objet rsultat avec PQclear une fois que vous
en avez termin. Notez que PQgetResult bloquera seulement si la commande est active et que les donnes ncessaires en
rponse n'ont pas encore t lues par PQconsumeInput.
Note
Mme quand PQresultStatus indique une erreur fatale, PQgetResult doit tre appel jusqu' ce qu'il
renvoie un pointeur nul pour permettre libpq de traiter l'information sur l'erreur correctement.
Utiliser PQsendQuery et PQgetResult rsout un des problmes de PQexec : si une chane de commande contient plusieurs
commandes SQL, les rsultats de ces commandes peuvent tre obtenus individuellement (ceci permet une simple forme de traitement en parallle : le client peut grer les rsultats d'une commande alors que le serveur travaille sur d'autres requtes de la mme
chane de commandes). Nanmoins, appeler PQgetResult causera toujours un blocage du client jusqu' la fin de la prochaine
commande SQL. Ceci est vitable en utilisant proprement deux fonctions supplmentaires :
485
libpq - Bibliothque C
PQconsumeInput
Si l'entre est disponible partir du serveur, consommez-la.
int PQconsumeInput(PGconn *conn);
PQconsumeInput renvoie normalement 1 indiquant aucune erreur , mais renvoie zro s'il y a eu une erreur (auquel cas
PQerrorMessage peut tre consult). Notez que le rsultat ne dit pas si des donnes ont t rcupres en entre. Aprs
avoir appel PQconsumeInput, l'application devrait vrifier PQisBusy et/ou PQnotifies pour voir si leur tat a chang.
PQconsumeInput pourrait tre appel mme si l'application n'est pas encore prpar grer un rsultat ou une notification.
La fonction lira les donnes disponibles et les sauvegardera dans un tampon indiquant ainsi qu'une lecture d'un select()
est possible. L'application peut donc utiliser PQconsumeInput pour effacer la condition select() immdiatement, puis
pour examiner les rsultats autant que possible.
PQisBusy
Renvoie 1 si une commande est occupe, c'est--dire que PQgetResult bloquerait en attendant une entre. Un zro indiquerait que PQgetResult peut tre appel avec l'assurance de ne pas tre bloqu.
int PQisBusy(PGconn *conn);
PQisBusy ne tentera pas lui-mme de lire les donnes partir du serveur ; du coup, PQconsumeInput doit tre appel
d'abord ou l'tat occup ne s'arrtera jamais.
Une application typique de l'utilisation de ces fonctions aura une boucle principale utilisant select() ou poll() pour attendre
toutes les conditions auxquelles il doit rpondre. Une des conditions sera la disponibilit des donnes partir du serveur, ce qui signifie des donnes lisibles pour select() sur le descripteur de fichier identifi par PQsocket. Lorsque la boucle principale
dtecte la disponibilit de donnes, il devrait appeler PQconsumeInput pour lire l'en-tte. Il peut ensuite appeler PQisBusy
suivi par PQgetResult si PQisBusy renvoie false (0). Il peut aussi appeler PQnotifies pour dtecter les messages NOTIFY (voir la Section 31.7, Notification asynchrone ).
Un client qui utilise PQsendQuery/PQgetResult peut aussi tenter d'annuler une commande en cours de traitement par le serveur ; voir la Section 31.5, Annuler des requtes en cours d'excution . Mais quelque soit la valeur renvoye par PQcancel,
l'application doit continuer avec la squence normale de lecture du rsultat en utilisant PQgetResult. Une annulation russie
causera simplement une fin plus rapide de la commande.
En utilisant les fonctions dcrites ci-dessus, il est possible d'viter le blocage pendant l'attente de donnes du serveur. Nanmoins,
il est toujours possible que l'application se bloque en attendant l'envoi vers le serveur. C'est relativement peu frquent mais cela
peut arriver si de trs longues commandes SQL ou donnes sont envoyes (c'est bien plus probable si l'application envoie des donnes via COPY IN). Pour empcher cette possibilit et russir des oprations de bases de donnes totalement non bloquantes, les
fonctions supplmentaires suivantes pourraient tre utilises.
PQsetnonblocking
Initialise le statut non bloquant de la connexion.
int PQsetnonblocking(PGconn *conn, int arg);
Initialise l'tat de la connexion non bloquant si arg vaut 1 et bloquant si arg vaut 0. Renvoie 0 si OK, -1 en cas d'erreur.
Dans l'tat non bloquant, les appels PQsendQuery, PQputline, PQputnbytes et PQendcopy ne bloqueront pas
mais renverront la place une erreur s'ils ont besoin d'tre de nouveau appels.
Notez que PQexec n'honore pas le mode non bloquant ; s'il est appel, il agira d'une faon bloquante malgr tout.
PQisnonblocking
Renvoie le statut bloquant de la connexion la base de donnes.
int PQisnonblocking(const PGconn *conn);
Renvoie 1 si la connexion est en mode non bloquant, 1 dans le cas contraire.
PQflush
Tente de vider les donnes des queues de sortie du serveur. Renvoie 0 en cas de succs (ou si la queue d'envoi est vide), -1 en
cas d'chec quelque soit la raison ou 1 s'il a t incapable d'envoyer encore toutes les donnes dans la queue d'envoi (ce cas
arrive seulement si la connexion est non bloquante).
int PQflush(PGconn *conn);
486
libpq - Bibliothque C
Aprs avoir envoy une commande ou des donnes dans une connexion non bloquante, appelez PQflush. S'il renvoie 1, attendez
que la socket soit disponible en criture et appelez-la de nouveau ; rptez cela jusqu' ce qu'il renvoie 0. Une fois que PQflush
renvoie 0, attendez que la socket soit disponible en lecture puis lisez la rponse comme dcrit ci-dessus.
Astuce
Cette interface est quelque peu obsolte car vous pourriez raliser les mmes choses avec des performances similaires et plus de fonctionnalits en initialisant une instruction prpare pour dfinir l'appel de fonction. Puis, excuter l'instruction avec une transmission binaire des paramtres et des substitutions de rsultats pour un appel de fonction chemin rapide.
487
libpq - Bibliothque C
La fonction PQfn demande l'excution d'une fonction du serveur via l'interface de chemin rapide :
PGresult* PQfn(PGconn* conn,
int fnid,
int *result_buf,
int *result_len,
int result_is_int,
const PQArgBlock *args,
int nargs);
typedef struct
{
int len;
int isint;
union
{
int *ptr;
int integer;
} u;
} PQArgBlock;
L'argument fnid est l'OID de la fonction excuter. args et nargs dfinissent les paramtres passer la fonction ; ils
doivent correspondre la liste d'arguments dclars de la fonction. Quand le champ isint d'une structure est vrai, la valeur de
u.integer est envoye au serveur en tant qu'entier de la longueur indique (qui doit tre 1, 2 ou 4 octets) ; les bons changes
d'octets se passent. Quand isint est faux, le nombre d'octets indiqu sur *u.ptr est envoy au traitement ; les donnes doivent
tre dans le format attendu par le serveur pour la transmission binaire du type de donnes de l'argument de la fonction. result_buf est le tampon dans lequel placer le code de retour. L'appelant doit avoir allou suffisamment d'espace pour stocker le
code de retour (il n'y a pas de vrification !). La longueur actuelle du rsultat sera renvoy dans l'entier point par result_len.
Si un rsultat sur un entier de 1, 2 ou 4 octets est attendu, initialisez result_is_int 1, sinon initialisez-le 0. Initialiser result_is_int 1 fait que libpq change les octets de la valeur si ncessaire, de faon ce que la bonne valeur int soit dlivre
pour la machine cliente. Quand result_is_int vaut 0, la chane d'octets au format binaire envoye par le serveur est renvoye
non modifie.
PQfn renvoie toujours un pointeur PGresult valide. L'tat du rsultat devrait tre vrifi avant que le rsultat ne soit utilis. Le demandeur est responsable de la libration de la structure PGresult avec PQclear lorsque celle-ci n'est plus ncessaire.
Notez qu'il n'est pas possible de grer les arguments nuls, les rsultats nuls et les rsultats d'ensembles nuls en utilisant cette interface.
Aprs avoir trait un objet PGnotify renvoy par PQnotifies, assurez-vous de librer le pointeur PQfreemem. Il est suffisant
de librer le pointeur PGnotify ; les champs relname et extra ne reprsentent pas des allocations spares (le nom de ces
champs est historique ; en particulier, les noms des canaux n'ont pas besoin d'tre lis aux noms des relations.)
Exemple 31.2, Deuxime exemple de programme pour libpq donne un programme d'exemple illustrant l'utilisation d'une noti488
libpq - Bibliothque C
fication asynchrone.
PQnotifies ne lit pas rellement les donnes partir du serveur ; il renvoie simplement les messages prcdemment absorbs
par une autre fonction de libpq. Dans les prcdentes versions de libpq, la seule faon de s'assurer une rception temps des messages NOTIFY consistait soumettre constamment des commandes de soumission, mme vides, puis de vrifier PQnotifies
aprs chaque PQexec. Bien que ceci fonctionnait, cela a t abandonn cause de la perte de puissance.
Une meilleure faon de vrifier les messages NOTIFY lorsque vous n'avez pas de commandes utiles excuter est d'appeler PQconsumeInput puis de vrifier PQnotifies. Vous pouvez utiliser select() pour attendre l'arrive des donnes partir du
serveur, donc en utilisant aucune puissance du CPU sauf lorsqu'il y a quelque chose faire (voir PQsocket pour obtenir le numro du descripteur de fichiers utiliser avec select()). Notez que ceci fonctionnera bien que vous soumettez les commandes
avec PQsendQuery/PQgetResult ou que vous utilisez simplement PQexec. Nanmoins, vous devriez vous rappeler de vrifier PQnotifies aprs chaque PQgetResult ou PQexec pour savoir si des notifications sont arrives lors du traitement de la
commande.
Note
Ces valeurs de donnes supplmentaires sont seulement disponibles en utilisant le protocole 3.0. Lors de
l'utilisation du protocole 2.0, toutes ces fonctions renvoient 0.
489
libpq - Bibliothque C
PQputCopyData
Envoie des donnes au serveur pendant un tat COPY_IN.
int PQputCopyData(PGconn *conn,
const char *buffer,
int nbytes);
Transmet les donnes de COPY dans le tampon spcifi (buffer), sur nbytes octets, au serveur. Le rsultat vaut 1 si les
donnes ont t envoyes, zro si elles n'ont pas t envoyes car la tentative pourrait bloquer (ce cas n'est possible que lors
d'une connexion en mode non bloquant) ou -1 si une erreur s'est produite (utilisez PQerrorMessage pour rcuprer des dtails si la valeur de retour vaut -1. Si la valeur vaut zro, attendez qu'il soit prt en criture et r-essayez).
L'application pourrait diviser le flux de donnes de COPY dans des chargements de tampon de taille convenable. Les limites
n'ont pas de signification smantique lors de l'envoi. Le contenu du flux de donnes doit correspondre au format de donnes
attendu par la commande COPY ; voir COPY(7) pour des dtails.
PQputCopyEnd
Envoie une indication de fin de transfert au serveur lors de l'tat COPY_IN.
int PQputCopyEnd(PGconn *conn,
const char *errormsg);
Termine l'opration COPY_IN avec succs si errormsg est NULL. Si errormsg n'est pas NULL alors COPY choue, la
chane pointe par errormsg tant utilise comme message d'erreur (nanmoins, vous ne devriez pas supposer que ce message d'erreur prcis reviendra du serveur car le serveur pourrait avoir dj choue sur la commande COPY pour des raisons
qui lui sont propres). Notez aussi que l'option forant l'chec ne fonctionnera pas lors de l'utilisation de connexions avec un
protocole pre-3.0.
Le rsultat est 1 si la donne de fin a t envoye, zro si elle ne l'a pas t car cette tentative serait bloquante (ce cas est uniquement possible si la connexion est dans un mode non bloquant) ou -1 si une erreur est survenue (utilisez PQerrorMessage pour rcuprer les dtails si le code de retour est -1. Si la valeur vaut zro, attendez que le serveur soit prt en criture
et r-essayez de nouveau).
Aprs un appel russi PQputCopyEnd, appelez PQgetResult pour obtenir le statut de rsultat final de la commande
COPY. Vous pouvez attendre que le rsultat soit disponible de la mme faon. Puis, retournez aux oprations normales.
libpq - Bibliothque C
COPY. Vous pourriez attendre la disponibilit de ce rsultat comme d'habitude. Puis, retournez aux oprations habituelles.
Note
Avant le protocole 3.0 de PostgreSQL, il tait ncessaire pour l'application d'envoyer explicitement les deux
caractres \. comme ligne finale pour indiquer qu'il a termin l'envoi des donnes du COPY data. Bien que
ceci fonctionne toujours, cette mthode est abandonne et la signification spciale de \. pourrait tre suppri491
libpq - Bibliothque C
me dans une prochaine version. Il est suffisant d'appeler PQendcopy aprs avoir envoy les vraies donnes.
PQputnbytes
Envoie une chane non termine par un octet nul au serveur. Renvoie 0 si tout va bien et EOF s'il n'a pas t capable d'envoyer
la chane.
int PQputnbytes(PGconn *conn,
const char *buffer,
int nbytes);
C'est exactement comme PQputline sauf que le tampon de donne n'a pas besoin d'tre termin avec un octet nul car le
nombre d'octets envoys est spcifi directement. Utilisez cette procdure pour envoyer des donnes binaires.
PQendcopy
Se synchronise avec le serveur.
int PQendcopy(PGconn *conn);
Cette fonction attend que le serveur ait termin la copie. Il devrait soit indiquer quand la dernire chane a t envoye au serveur en utilisant PQputline soit le moment o la dernire chane a t reue du serveur en utilisant PGgetline. Si ce
n'est pas fait, le serveur renverra un out of sync (perte de synchronisation) au client. Suivant le retour de cette fonction, le
serveur est prt recevoir la prochaine commande SQL. Le code de retour 0 indique un succs complet et est diffrent de zro
dans le cas contraire (utilisez PQerrorMessage pour rcuprer des dtails sur l'chec).
Lors de l'utilisation de PQgetResult, l'application devrait rpondre un rsultat PGRES_COPY_OUT en excutant PQgetline de faon rpte, suivi par un PQendcopy une fois la ligne de terminaison aperue. Il devrait ensuite retourner
la boucle PQgetResult jusqu' ce que PQgetResult renvoie un pointeur nul. De faon similaire, un rsultat
PGRES_COPY_IN est trait par une srie d'appels PQputline suivis par un PQendcopy, ensuite retour la boucle PQgetResult. Cet arrangement vous assurera qu'une commande COPY intgre dans une srie de commandes SQL sera excute correctement.
Les anciennes applications soumettent un COPY via PQexec et assument que la transaction est faite aprs un PQendcopy.
Ceci fonctionnera correctement seulement si COPY est la seule commande SQL dans la chane de commandes.
libpq - Bibliothque C
PQERRORS_VERBOSE
} PGVerbosity;
PGVerbosity PQsetErrorVerbosity(PGconn *conn, PGVerbosity verbosity);
PQsetErrorVerbosity initialise le mode de verbosit, renvoyant le paramtrage prcdant de cette connexion. Dans le
mode terse, les messages renvoys incluent seulement la svrit, le texte principal et la position ; ceci tiendra normalement
sur une seule ligne. Le mode par dfaut produit des messages qui inclut ces champs ainsi que les champs dtail, astuce ou
contexte (ils pourraient tre sur plusieurs lignes). Le mode VERBOSE inclut tous les champs disponibles. Modifier la verbosit n'affecte pas les messages disponibles partir d'objets PGresult dj existants, seulement ceux crs aprs.
PQtrace
Active les traces de communication entre client et serveur dans un flux fichier de dbogage.
void PQtrace(PGconn *conn, FILE *stream);
Note
Sur Windows, si la bibliothque libpq et une application sont compiles avec des options diffrentes, cet appel
de fonction arrtera brutalement l'application car la reprsentation interne des pointeurs FILE diffre. Spcifiquement, les options multi-threaded/single-threaded release/debug et static/dynamic devraient tre identiques
pour la bibliothque et les applications qui l'utilisent.
PQuntrace
Dsactive les traces commences avec PQtrace.
void PQuntrace(PGconn *conn);
libpq - Bibliothque C
libpq - Bibliothque C
La fonction fera automatiquement grossir le tableau de lignes internes des rsultats, si ncessaire. Nanmoins, l'argument
tup_num doit tre infrieur ou gal PQntuples, ceci signifiant que la fonction peut seulement faire grossir le tableau des
lignes une ligne la fois. Mais tout champ d'une ligne existante peut tre modifi dans n'importe quel ordre. Si une valeur
field_num existe dj, elle sera crase. Si len vaut 1 ou si value est NULL, la valeur du champ sera configure la valeur SQL NULL. value est copi dans le stockage priv du rsultat, donc n'est plus ncessaire au retour de la fonction. Si la
fonction choue, la valeur de retour est zro. Dans le cas contraire, elle a une valeur diffrente de zro.
PQresultAlloc
Alloue un stockage supplmentaire pour un objet PGresult.
void *PQresultAlloc(PGresult *res, size_t nBytes);
Toute mmoire alloue avec cette fonction est libre quand res est efface. Si la fonction choue, la valeur de retour vaut
NULL. Le rsultat est garanti d'tre correctement align pour tout type de donnes, comme pour un malloc.
PQlibVersion
Renvoie la version de libpq en cours d'utilisation.
int PQlibVersion(void);
Le rsultat de cette fonction peut tre utilis pour dterminer, l'excution, si certaines fonctionnalits spcifiques sont disponibles dans la version charge de libpq. Par exemple, cette fonction peut tre utilise pour dterminer les options de
connexions disponibles pour PQconnectdb ou si la sortie hex du type bytea ajoute par PostgreSQL 9.0 est supporte.
Le nombre est form par conversion des numros majeur, mineur et de rvision en nombre deux chiffres et en les concatnant les uns aux autres. Par exemple, la version 9.1 sera renvoye en tant que 90100, alors que la version 9.1.2 sera renvoye
en tant que 90102 (Les zros en dbut de chiffres ne sont pas affiches).
Note
Cette fonction apparat en version 9.1 de PostgreSQL, donc elle ne peut pas tre utilise pour dtecter des
fonctionnalits des versions prcdentes car l'dition de lien crera une dpendance sur la version 9.1.
libpq - Bibliothque C
Quand un message de note ou d'avertissement est reu du serveur ou gnr de faon interne par libpq, la fonction de rception du
message est appele. Le message lui est pass sous la forme d'un PGresult PGRES_NONFATAL_ERROR (ceci permet au receveur d'extraire les champs individuels en utilisant PQresultErrorField ou le message complet prformat en utilisant PQresultErrorMessage). Le mme pointeur void pass PQsetNoticeReceiver est aussi renvoy (ce pointeur peut tre
utilis pour accder un tat spcifique de l'application si ncessaire).
Le receveur de messages par dfaut extrait simplement le message (en utilisant PQresultErrorMessage) et le passe au systme de traitement du message.
Ce dernier est responsable de la gestion du message de note ou d'avertissement donn au format texte. La chane texte du message
est passe avec un retour chariot supplmentaire, plus un pointeur sur void identique celui pass PQsetNoticeProcessor
(ce pointeur est utilis pour accder un tat spcifique de l'application si ncessaire).
Le traitement des messages par dfaut est simplement
static void
defaultNoticeProcessor(void * arg, const char * message)
{
fprintf(stderr, "%s", message);
}
Une fois que vous avez initialis un receveur ou une fonction de traitement des messages, vous devez vous attendre ce que la
fonction soit appele aussi longtemps que l'objet PGconn ou qu'un objet PGresult ralis partir de celle-ci existent. la cration
d'un PGresult, les pointeurs de gestion actuels de PGconn sont copis dans PGresult pour une utilisation possible par des fonctions
comme PQgetvalue.
libpq - Bibliothque C
L'vnement de rinitialisation de connexion est dclench aprs un PQreset ou un PQresetPoll. Dans les deux cas,
l'vnement est seulement dclench si la r-initialisation est russie. Si la procdure choue, la rinitialisation de connexion
chouera ; la structure PGconn est place dans le statut CONNECTION_BAD et PQresetPoll renverra
PGRES_POLLING_FAILED.
typedef struct
{
PGconn *conn;
} PGEventConnReset;
Quand un vnement PGEVT_CONNRESET est reu, le pointeur evtInfo doit tre converti en un PGEventConnReset *.
Bien que le PGconn a t rinitialis, toutes les donnes de l'vnement restent inchanges. Cet vnement doit tre utilis
pour r-initialiser/recharger/re-requter tout instanceData associ. Notez que mme si la procdure d'vnement choue
traiter PGEVT_CONNRESET, elle recevra toujours un vnement PGEVT_CONNDESTROY la fermeture de la connexion.
PGEVT_CONNDESTROY
L'vnement de destruction de la connexion est dclenche en rponse PQfinish. Il est de la responsabilit de la procdure de l'vnement de nettoyer proprement ses donnes car libpq n'a pas les moyens de grer cette mmoire. Un chec du
nettoyage amnera des pertes mmoire.
typedef struct
{
PGconn *conn;
} PGEventConnDestroy;
Quand un vnement PGEVT_CONNDESTROY est reu, le pointeur evtInfo doit tre converti en un PGEventConnDestroy
*. Cet vnement est dclench avant que PQfinish ne ralise d'autres nettoyages. La valeur de retour de la procdure est
ignore car il n'y a aucun moyen d'indiquer un chec de PQfinish. De plus, un chec de la procdure ne doit pas annuler le
nettoyage de la mmoire non dsire.
PGEVT_RESULTCREATE
L'vnement de cration de rsultat est dclench en rponse l'utilisation d'une fonction d'excution d'une requte, par
exemple PQgetResult. Cet vnement sera dclench seulement aprs la cration russie du rsultat.
typedef struct
{
PGconn *conn;
PGresult *result;
} PGEventResultCreate;
Quand un vnement PGEVT_RESULTCREATE est reu, le pointeur evtInfo doit tre converti en un PGEventResultCreate *. Le paramtre conn est la connexion utilise pour gnrer le rsultat. C'est le moment idal pour initialiser tout
instanceData qui doit tre associ avec le rsultat. Si la procdure choue, le rsultat sera effac et l'chec sera propag.
Le procdure d'vnement ne doit pas tenter un PQclear sur l'objet rsultat lui-mme. Lors du renvoi d'un code d'chec, tout
le nettoyage doit tre fait car aucun vnement PGEVT_RESULTDESTROY ne sera envoy.
PGEVT_RESULTCOPY
L'vnement de copie du rsultat est dclench en rponse un PQcopyResult. Cet vnement se dclenchera seulement
une fois la copie termine. Seules les procdures qui ont gres avec succs l'vnement PGEVT_RESULTCREATE ou
PGEVT_RESULTCOPY pour le rsultat source recevront les vnements PGEVT_RESULTCOPY.
typedef struct
{
const PGresult *src;
PGresult *dest;
} PGEventResultCopy;
Quand un vnement PGEVT_RESULTCOPY est reu, le pointeur evtInfo doit tre converti en un PGEventResultCopy *.
Le rsultat rsultat src correspond ce qui a t copi alors que le rsultat dest correspond la destination. Cet vnement
peut tre utilis pour fournir une copie complte de instanceData, ce que PQcopyResult ne peut pas faire. Si la procdure choue, l'opration complte de copie chouera et le rsultat dest sera effac. Au renvoi d'un code d'chec, tout le nettoyage doit tre ralis car aucun vnement PGEVT_RESULTDESTROY ne sera envoy pour le rsultat de destination.
497
libpq - Bibliothque C
PGEVT_RESULTDESTROY
L'vnement de destruction de rsultat est dclench en rponse la fonction PQclear. C'est de la responsabilit de
l'vnement de nettoyer proprement les donnes de l'vnement car libpq n'a pas cette capacit en matire de gestion de mmoire. Si le nettoyage choue, cela sera la cause de pertes mmoire.
typedef struct
{
PGresult *result;
} PGEventResultDestroy;
Quand un vnement PGEVT_RESULTDESTROY est reu, le pointeur evtInfo doit tre converti en un PGEventResultDestroy *. Cet vnement est dclench avant que PQclear ne puisse faire de nettoyage. La valeur de retour de la procdure est
ignore car il n'existe aucun moyen d'indiquer un chec partir de PQclear. De plus, un chec de la procdure ne doit pas
annuler le nettoyage de la mmoire non dsire.
Attention
Sur Windows, les fonctions peuvent avoir deux adresses diffrentes : une visible de l'extrieur de la DLL et
une visible de l'intrieur. Il faut faire attention que seule une de ces adresses est utilise avec les fonctions
d'vnement de la libpq, sinon une confusion en rsultera. La rgle la plus simple pour crire du code qui fonctionnera est de s'assurer que les procdures d'vnements sont dclares static. Si l'adresse de la procdure
doit tre disponible en dehors de son propre fichier source, il faut exposer une fonction spare pour renvoyer
l'adresse.
libpq - Bibliothque C
Initialise instanceData de la connexion pour la procdure proc avec data. Cette fonction renvoit zro en cas d'chec et
autre chose en cas de russite. (L'chec est seulement possible si proc n'a pas t correctement enregistr dans le rsultat.)
int PQsetInstanceData(PGconn *conn, PGEventProc proc, void *data);
PQinstanceData
Renvoie le instanceData de la connexion associe avec connproc ou NULL s'il n'y en a pas.
void *PQinstanceData(const PGconn *conn, PGEventProc proc);
PQresultSetInstanceData
Initialise le instanceData du rsultat pour la procdure proc avec data. Cette fonction renvoit zro en cas d'chec et
autre chose en cas de russite. (L'chec est seulement possible si proc n'a pas t correctement enregistr dans le rsultat.)
int PQresultSetInstanceData(PGresult *res, PGEventProc proc, void *data);
PQresultInstanceData
Renvoie le instanceData du rsultat associ avec proc ou NULL s'il n'y en a pas.
void *PQresultInstanceData(const PGresult *res, PGEventProc proc);
libpq - Bibliothque C
PQfinish(conn);
return 1;
}
/* la connexion instanceData est disponible */
data = PQinstanceData(conn, myEventProc);
/* Envoit un PGEVT_RESULTCREATE myEventProc */
res = PQexec(conn, "SELECT 1 + 1");
/* le rsultat instanceData est disponible */
data = PQresultInstanceData(res, myEventProc);
/* Si PG_COPYRES_EVENTS est utilis, envoit un PGEVT_RESULTCOPY myEventProc */
res_copy = PQcopyResult(res, PG_COPYRES_TUPLES | PG_COPYRES_EVENTS);
/* le rsultat instanceData est disponible si PG_COPYRES_EVENTS a t
* utilis lors de l'appel PQcopyResult.
*/
data = PQresultInstanceData(res_copy, myEventProc);
/* Les deux fonctions de nettoyage envoient PGEVT_RESULTDESTROY myEventProc */
PQclear(res);
PQclear(res_copy);
/* Envoit un PGEVT_CONNDESTROY myEventProc */
PQfinish(conn);
return 0;
}
static int
myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
{
switch (evtId)
{
case PGEVT_REGISTER:
{
PGEventRegister *e = (PGEventRegister *)evtInfo;
mydata *data = get_mydata(e->conn);
/* associe des donnes spcifiques de l'application avec la connexion */
PQsetInstanceData(e->conn, myEventProc, data);
break;
}
case PGEVT_CONNRESET:
{
PGEventConnReset *e = (PGEventConnReset *)evtInfo;
mydata *data = PQinstanceData(e->conn, myEventProc);
if (data)
memset(data, 0, sizeof(mydata));
break;
}
case PGEVT_CONNDESTROY:
{
PGEventConnDestroy *e = (PGEventConnDestroy *)evtInfo;
mydata *data = PQinstanceData(e->conn, myEventProc);
/* libre les donnes instancies car la connexion est en cours de
destruction */
if (data)
free_mydata(data);
break;
}
case PGEVT_RESULTCREATE:
500
libpq - Bibliothque C
{
PGEventResultCreate *e = (PGEventResultCreate *)evtInfo;
mydata *conn_data = PQinstanceData(e->conn, myEventProc);
mydata *res_data = dup_mydata(conn_data);
/* associe des donnes spcifiques l'application avec les rsultats
(copi de la connexion) */
PQsetResultInstanceData(e->result, myEventProc, res_data);
break;
}
case PGEVT_RESULTCOPY:
{
PGEventResultCopy *e = (PGEventResultCopy *)evtInfo;
mydata *src_data = PQresultInstanceData(e->src, myEventProc);
mydata *dest_data = dup_mydata(src_data);
/* associe des donnes spcifiques l'application avec les rsultats
(copi d'un rsultat) */
PQsetResultInstanceData(e->dest, myEventProc, dest_data);
break;
}
case PGEVT_RESULTDESTROY:
{
PGEventResultDestroy *e = (PGEventResultDestroy *)evtInfo;
mydata *data = PQresultInstanceData(e->result, myEventProc);
/* libre les donnes instancies car le rsultat est en cours de
destruction */
if (data)
free_mydata(data);
break;
}
/* unknown event id, just return TRUE. */
default:
break;
}
return TRUE; /* event processing succeeded */
}
PGHOSTADDR se comporte de la mme faon que le paramtre de configuration hostaddr. Elle peut tre initialise avec
PGHOST pour viter la surcharge des recherches DNS.
PGPASSWORD se comporte de la mme faon que le paramtre de configuration password. L'utilisation de cette variable
d'environnement n'est pas recommande pour des raisons de scurit (certains systmes d'exploitation autorisent les utilisateurs autres que root voir les variables d'environnement du processus via ps) ; la place, considrez l'utilisation du fichier
~/.pgpass (voir la Section 31.14, Fichier de mots de passe ).
PGPASSFILE spcifie le nom du fichier de mot de passe utiliser pour les recherches. Sa valeur par dfaut est ~/.pgpass
(voir la Section 31.14, Fichier de mots de passe ).
501
libpq - Bibliothque C
PGSERVICEFILE indique le nom du fichier service de connexion par utilisateur. S'il n'est pas configur, sa valeur par dfaut
est ~/.pg_service.conf (voir Section 31.15, Fichier des connexions de service ).
PGREALM initialise le domaine Kerberos utiliser avec PostgreSQL s'il est diffrent du domaine local. Si PGREALM est initialis, les applications libpq tenteront une authentification avec les serveurs de ce domaine et utiliseront les fichiers tickets spars pour viter les conflits avec les fichiers tickets locaux. Cette variable d'environnement est seulement utilise si
l'authentification Kerberos est slectionne par le serveur.
PGSSLKEY spcifie le jeton matriel qui stocke la cl secrte pour le certificat client. La valeur de cette variable doit consister
d'un nom de moteur spar par une virgule (les moteurs sont les modules chargeables d'OpenSSL) et un identifiant de cl
spcifique au moteur. Si elle n'est pas configure, la cl secrte doit tre conserve dans un fichier.
Les variables d'environnement par dfaut peuvent tre utilises pour spcifier le comportement par dfaut de chaque session PostgreSQL (voir aussi les commandes ALTER ROLE(7) et ALTER DATABASE(7) pour des moyens d'initialiser le comportement par dfaut sur des bases par utilisateur ou par bases de donnes).
PGDATESTYLE initialise le style par dfaut de la reprsentation de la date et de l'heure (quivalent SET datestyle TO
...).
PGTZ initialise le fuseau horaire par dfaut (quivalent SET timezone TO ...).
PGGEQO initialise le mode par dfaut pour l'optimiseur gnrique de requtes (quivalent SET geqo TO ...).
Rfrez-vous la commande SQL SET(7) pour plus d'informations sur des valeurs correctes pour ces variables d'environnement.
Les variables d'environnement suivantes dterminent le comportement interne de libpq ; elles surchargent les valeurs internes par
dfaut.
PGSYSCONFDIR configure le rpertoire contenant le fichier pg_service.conf et dans une future version d'autres fichiers
de configuration globaux au systme.
PGLOCALEDIR configure le rpertoire contenant les fichiers locale pour l'internationalisation des messages.
502
libpq - Bibliothque C
(Vous pouvez ajouter en commentaire dans le fichier cette ligne que vous prcdez d'un dise (#).) Chacun des quatre premiers
champs pourraient tre une valeur littrale ou * (qui correspond tout). La premire ligne ralisant une correspondance pour les
paramtres de connexion sera utilise (du coup, placez les entres plus spcifiques en premier lorsque vous utilisez des jokers). Si
une entre a besoin de contenir : ou \, chappez ce caractre avec \. Un nom d'hte localhost correspond la fois une
connexion TCP (nom d'hte localhost) et une connexion par socket de domaine Unix (pghost vide ou le rpertoire par dfaut du socket) provenant de la machine locale. Dans un serveur en standby, le nom de la base de donnes replication correspond aux connexions ralises par le serveur matre pour la rplication en flux. Le champ database est d'une utilit limite car
les utilisateurs ont le mme mot de passe pour toutes les bases de donnes de la mme instance.
Sur les systmes Unix, les droits sur .pgpass doivent interdire l'accs au groupe et au reste du monde ; faites-le par cette commande : chmod 0600 ~/.pgpass. Si les droits sont moins stricts que cela, le fichier sera ignor. Sur Microsoft Windows, il est suppos que le fichier est stock dans un rpertoire qui est scuris, donc aucune vrification des droits n'est effectue.
libpq - Bibliothque C
uniqueMember: dbname=mabase
uniqueMember: user=monutilisateur_base
uniqueMember: sslmode=require
amnera l'excution de l'URL LDAP suivante :
ldap://ldap.masocit.com/dc=masocit,dc=com?uniqueMember?one?(cn=mabase)
Vous pouvez mlanger des entres d'un fichier de service standard avec des recherches par LDAP. Voici un exemple complet dans
pg_service.conf :
# seuls l'hte et le port sont stocks dans LDAP,
# spcifiez explicitement le nom de la base et celui de l'utilisateur
[customerdb]
dbname=clients
user=utilisateurappl
ldap://ldap.acme.com/cn=serveur,cn=hosts?pgconnectinfo?base?(objectclass=*)
Note
Pour une compatibilit ascendantes avec les anciennes versions de PostgreSQL, si un certificat racine d'autorit
existe, le comportement de sslmode=require sera identique celui de verify-ca. Cela signifie que le certificat du serveur est valid par l'autorit de certificat. Il ne faut pas se baser sur ce comportement. Les applications
qui ont besoin d'une validation du certificat doivent toujours utiliser verify-ca ou verify-full.
libpq - Bibliothque C
Si le serveur rclame un certificat de confiance du client, libpq enverra le certificat stock dans le fichier
~/.postgresql/postgresql.crt du rpertoire personnel de l'utilisateur. Le certificat doit tre sign par une des autorits
(CA) de confiance du serveur. Un fichier de cl priv correspondant ~/.postgresql/postgresql.key doit aussi tre prsent. Le fichier de cl prive ne doit pas permettre son accs pour le groupe ou pour le reste du monde ; cela se fait avec la commande chmod 0600 ~/.postgresql/postgresql.key. Sur Microsoft Windows, ces fichiers sont nomms
%APPDATA%\postgresql\postgresql.crt et %APPDATA%\postgresql\postgresql.key, et il n'existe pas de
vrification de droits car ce rpertoire est prsum scuris. L'emplacement des fichiers certificat et cl peut tre surcharg par les
paramtres de connexion sslcert et sslkey, ou les variables d'environnement PGSSLCERT et PGSSLKEY.
Dans certains cas, le certificat du client peut tre sign par une autorit de certificat intermdiaire , plutt que par un qui est directement accept par le serveur. Pour utiliser un tel certificat, ajoutez le certificat de l'autorit signataire du fichier postgresql.crt, alors son certificat de l'autorit parente, et ainsi de suite jusqu' arriver l'autorit racine qui est accept par le serveur. Le certificat racine doit tre inclus dans chaque cas o postgresql.crt contient plus d'un certificat.
Notez que root.crt liste les autorits de certificat de haut-niveau qui sont considres de confiance pour les certificats serveur
signataires. En principe, il n'a pas besoin de lister l'autorit de certificats qui a sign le certificat du client, bien que dans la plupart
des cas, l'autorit du certificat sera aussi de confiance pour les certificats serveur.
sslmode
disable
Non
Non
allow
Peut-tre
Non
505
libpq - Bibliothque C
sslmode
prefer
Peut-tre
Non
require
Oui
Non
verify-ca
Oui
Depends on CA-policy
verify-full
Oui
Oui
La diffrence entre verify-ca et verify-full dpend de la politique du CA racine. Si un CA publique est utilis, verify-ca permet les connexions un serveur que quelqu'un d'autre a pu enregistrer avec un CA accept. Dans ce cas, verifyfull devrait toujours tre utilis. Si un CA local est utilis, voire mme un certificat sign soi-mme, utiliser verify-ca fournit souvent suffisamment de protection.
La valeur par dfaut pour sslmode est prefer. Comme l'indique la table ci-dessus, cela n'a pas de sens d'un point de vue de la
scurit, et cela ne promet qu'une surcharge en terme de performance si possible. C'est uniquement fourni comme valeur par dfaut pour la compatibilit ascendante, et n'est pas recommand pour les dploiements de serveurs ncessitant de la scurit.
Fichier
Contenu
Effet
~/.postgresql/root.crt
vrifie que le certificat du serveur est sign par une autorit de confiance
~/.postgresql/root.crl
506
libpq - Bibliothque C
PQinitOpenSSL
Permet aux applications de slectionner les bibliothques de scurit initialiser.
void PQinitOpenSSL(int do_ssl, int do_crypto);
Quand do_ssl est diffrent de zro, libpq initialisera la bibliothque OpenSSL avant d'ouvrir une connexion la base de
donnes. Quand do_crypto est diffrent de zro, la bibliothque libcrypto sera initialise. Par dfaut (si PQinitOpenSSL n'est pas appel), les deux bibliothques sont initialises. Quand le support de SSL n'est pas intgr, cette fonction
est prsente mais ne fait rien.
Si votre application utilise et initialise soit OpenSSL soit libcrypto, vous devez appeler cette fonction avec des zros pour
les paramtres appropris avant d'ouvrir la premire connexion la base de donnes. De plus, assurez-vous que vous avez fait
cette initialisation avant d'ouvrir une connexion la base de donnes.
PQinitSSL
Permet aux applications de slectionner les bibliothques de scurit initialiser.
void PQinitSSL(int do_ssl);
Cette fonction est quivalent PQinitOpenSSL(do_ssl, do_ssl). C'est suffisant pour les applications qui initialisent
la fois OpenSSL etlibcrypto ou aucune des deux.
PQinitSSL est prsente depuis PostgreSQL 8.0, alors que PQinitOpenSSL a t ajoute dans PostgreSQL 8.4, donc
PQinitSSL peut tre prfre pour les applications qui ont besoin de fonctionner avec les anciennes versions de libpq.
507
libpq - Bibliothque C
function `main':
`PGconn' undeclared (first use in this function)
`PGresult' undeclared (first use in this function)
`CONNECTION_BAD' undeclared (first use in this function)
`PGRES_COMMAND_OK' undeclared (first use in this function)
`PGRES_TUPLES_OK' undeclared (first use in this function)
Pointez votre compilateur sur le rpertoire o les fichiers d'en-tte de PostgreSQL ont t installs en fournissant l'option
-Irpertoire votre compilateur (dans certains cas, le compilateur cherchera dans le rpertoire en question par dfaut,
donc vous pouvez omettre cette option). Par exemple, votre ligne de commande de compilation devrait ressembler ceci :
cc -c -I/usr/local/pgsql/include testprog.c
Si vous utilisez des makefiles, alors ajoutez cette option la variable CPPFLAGS :
CPPFLAGS += -I/usr/local/pgsql/include
S'il existe une chance pour que votre programme soit compil par d'autres utilisateurs, alors vous ne devriez pas coder en dur
l'emplacement du rpertoire. la place, vous pouvez excuter l'outil pg_config pour trouver o sont placs les fichiers
d'en-tte sur le systme local :
$ pg_config --includedir
/usr/local/include
Un chec sur la spcification de la bonne option au compilateur rsultera en un message d'erreur tel que
testlibpq.c:8:22: libpq-fe.h: No such file or directory
Lors de l'dition des liens du programme final, spcifiez l'option -lpq de faon ce que les bibliothques libpq soient intgres, ainsi que l'option -Lrpertoire pour pointer le compilateur vers le rpertoire o les bibliothques libpq rsident (de
nouveau, le compilateur cherchera certains rpertoires par dfaut). Pour une portabilit maximale, placez l'option -L avant
l'option -lpq. Par exemple :
cc -o testprog testprog1.o testprog2.o -L/usr/local/pgsql/lib -lpq
Vous pouvez aussi rcuprer le rpertoire des bibliothques en utilisant pg_config :
$ pg_config --libdir
/usr/local/pgsql/lib
Les messages d'erreurs, pointant vers des problmes de ce style, pourraient ressembler ce qui suit.
testlibpq.o: In function
testlibpq.o(.text+0x60):
testlibpq.o(.text+0x71):
testlibpq.o(.text+0xa4):
`main':
undefined reference to `PQsetdbLogin'
undefined reference to `PQstatus'
undefined reference to `PQerrorMessage'
508
libpq - Bibliothque C
/*
* testlibpq.c
*
*
Test the C version of libpq, the PostgreSQL frontend library.
*/
#include <stdio.h>
#include <stdlib.h>
#include <libpq-fe.h>
static void
exit_nicely(PGconn *conn)
{
PQfinish(conn);
exit(1);
}
int
main(int argc,
{
const char
PGconn
PGresult
int
int
char **argv)
*conninfo;
*conn;
*res;
nFields;
i,
j;
/*
* If the user supplies a parameter on the command line, use it as the
* conninfo string; otherwise default to setting dbname=postgres and using
* environment variables or defaults for all other connection parameters.
*/
if (argc > 1)
conninfo = argv[1];
else
conninfo = "dbname = postgres";
/* Make a connection to the database */
conn = PQconnectdb(conninfo);
/* Check to see that the backend connection was successfully made */
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s",
PQerrorMessage(conn));
exit_nicely(conn);
}
/*
* Our test case here involves using a cursor, for which we must be inside
* a transaction block. We could do the whole thing with a single
* PQexec() of "select * from pg_database", but that's too trivial to make
* a good example.
*/
/* Start a transaction block */
res = PQexec(conn, "BEGIN");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "BEGIN command failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
/*
* Should PQclear PGresult whenever it is no longer needed to avoid memory
* leaks
*/
PQclear(res);
509
libpq - Bibliothque C
/*
* Fetch rows from pg_database, the system catalog of databases
*/
res = PQexec(conn, "DECLARE myportal CURSOR FOR select * from pg_database");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "DECLARE CURSOR failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
PQclear(res);
res = PQexec(conn, "FETCH ALL in myportal");
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
fprintf(stderr, "FETCH ALL failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
/* first, print out the attribute names */
nFields = PQnfields(res);
for (i = 0; i < nFields; i++)
printf("%-15s", PQfname(res, i));
printf("\n\n");
/* next, print out the rows */
for (i = 0; i < PQntuples(res); i++)
{
for (j = 0; j < nFields; j++)
printf("%-15s", PQgetvalue(res, i, j));
printf("\n");
}
PQclear(res);
/* close the portal ... we don't bother to check for errors ... */
res = PQexec(conn, "CLOSE myportal");
PQclear(res);
/* end the transaction */
res = PQexec(conn, "END");
PQclear(res);
/* close the connection to the database and cleanup */
PQfinish(conn);
return 0;
}
/*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
testlibpq2.c
Test of the asynchronous notification interface
Start this program, then from psql in another window do
NOTIFY TBL2;
Repeat four times to get this program to exit.
Or, if you want to get fancy, try this:
populate a database with the following commands
(provided in src/test/examples/testlibpq2.sql):
CREATE TABLE TBL1 (i int4);
CREATE TABLE TBL2 (i int4);
510
libpq - Bibliothque C
*
*
CREATE RULE r1 AS ON INSERT TO TBL1 DO
*
(INSERT INTO TBL2 VALUES (new.i); NOTIFY TBL2);
*
* and do this four times:
*
*
INSERT INTO TBL1 VALUES (10);
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/time.h>
#include <libpq-fe.h>
static void
exit_nicely(PGconn *conn)
{
PQfinish(conn);
exit(1);
}
int
main(int argc,
{
const char
PGconn
PGresult
PGnotify
int
char **argv)
*conninfo;
*conn;
*res;
*notify;
nnotifies;
/*
* If the user supplies a parameter on the command line, use it as the
* conninfo string; otherwise default to setting dbname=postgres and using
* environment variables or defaults for all other connection parameters.
*/
if (argc > 1)
conninfo = argv[1];
else
conninfo = "dbname = postgres";
/* Make a connection to the database */
conn = PQconnectdb(conninfo);
/* Check to see that the backend connection was successfully made */
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s",
PQerrorMessage(conn));
exit_nicely(conn);
}
/*
* Issue LISTEN command to enable notifications from the rule's NOTIFY.
*/
res = PQexec(conn, "LISTEN TBL2");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "LISTEN command failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
/*
* should PQclear PGresult whenever it is no longer needed to avoid memory
* leaks
*/
PQclear(res);
511
libpq - Bibliothque C
/* shouldn't happen */
FD_ZERO(&input_mask);
FD_SET(sock, &input_mask);
if (select(sock + 1, &input_mask, NULL, NULL, NULL) < 0)
{
fprintf(stderr, "select() failed: %s\n", strerror(errno));
exit_nicely(conn);
}
/* Now check for input */
PQconsumeInput(conn);
while ((notify = PQnotifies(conn)) != NULL)
{
fprintf(stderr,
"ASYNC NOTIFY of '%s' received from backend PID %d\n",
notify->relname, notify->be_pid);
PQfreemem(notify);
nnotifies++;
}
}
fprintf(stderr, "Done.\n");
/* close the connection to the database and cleanup */
PQfinish(conn);
return 0;
}
/*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
testlibpq3.c
Test out-of-line parameters and binary I/O.
Before running this, populate a database with the following commands
(provided in src/test/examples/testlibpq3.sql):
CREATE TABLE test1 (i int4, t text, b bytea);
INSERT INTO test1 values (1, 'joe''s place', '\\000\\001\\002\\003\\004');
INSERT INTO test1 values (2, 'ho there', '\\004\\003\\002\\001\\000');
The expected output is:
tuple 0: got
i = (4 bytes) 1
t = (11 bytes) 'joe's place'
b = (5 bytes) \000\001\002\003\004
512
libpq - Bibliothque C
* tuple 0: got
* i = (4 bytes) 2
* t = (8 bytes) 'ho there'
* b = (5 bytes) \004\003\002\001\000
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <libpq-fe.h>
/* for ntohl/htonl */
#include <netinet/in.h>
#include <arpa/inet.h>
static void
exit_nicely(PGconn *conn)
{
PQfinish(conn);
exit(1);
}
/*
* This function prints a query result that is a binary-format fetch from
* a table defined as in the comment above. We split it out because the
* main() function uses it twice.
*/
static void
show_binary_results(PGresult *res)
{
int
i,
j;
int
i_fnum,
t_fnum,
b_fnum;
/* Use
i_fnum
t_fnum
b_fnum
/*
* The binary representation of INT4 is in network byte order, which
* we'd better coerce to the local byte order.
*/
ival = ntohl(*((uint32_t *) iptr));
/*
* The binary representation
* was nice enough to append
* as a C string.
*
* The binary representation
* include embedded nulls so
*/
513
libpq - Bibliothque C
char **argv)
*conninfo;
*conn;
*res;
*paramValues[1];
paramLengths[1];
paramFormats[1];
binaryIntVal;
/*
* If the user supplies a parameter on the command line, use it as the
* conninfo string; otherwise default to setting dbname=postgres and using
* environment variables or defaults for all other connection parameters.
*/
if (argc > 1)
conninfo = argv[1];
else
conninfo = "dbname = postgres";
/* Make a connection to the database */
conn = PQconnectdb(conninfo);
/* Check to see that the backend connection was successfully made */
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s",
PQerrorMessage(conn));
exit_nicely(conn);
}
/*
* The point of this program is to illustrate use of PQexecParams() with
* out-of-line parameters, as well as binary transmission of data.
*
* This first example transmits the parameters as text, but receives the
* results in binary format. By using out-of-line parameters we can
* avoid a lot of tedious mucking about with quoting and escaping, even
* though the data is text. Notice how we don't have to do anything
* special with the quote mark in the parameter value.
*/
/* Here is our out-of-line parameter value */
paramValues[0] = "joe's place";
res = PQexecParams(conn,
"SELECT * FROM test1 WHERE t = $1",
1,
/* one param */
NULL,
/* let the backend deduce param type */
paramValues,
NULL,
/* don't need param lengths since text */
NULL,
/* default to all text params */
1);
/* ask for binary results */
514
libpq - Bibliothque C
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
fprintf(stderr, "SELECT failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
show_binary_results(res);
PQclear(res);
/*
* In this second example we transmit an integer parameter in binary
* form, and again retrieve the results in binary form.
*
* Although we tell PQexecParams we are letting the backend deduce
* parameter type, we really force the decision by casting the parameter
* symbol in the query text. This is a good safety measure when sending
* binary parameters.
*/
/* Convert integer value "2" to network byte order */
binaryIntVal = htonl((uint32_t) 2);
/* Set up parameter arrays for PQexecParams */
paramValues[0] = (char *) &binaryIntVal;
paramLengths[0] = sizeof(binaryIntVal);
paramFormats[0] = 1;
/* binary */
res = PQexecParams(conn,
"SELECT * FROM test1 WHERE i = $1::int4",
1,
/* one param */
NULL,
/* let the backend deduce param type */
paramValues,
paramLengths,
paramFormats,
1);
/* ask for binary results */
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
fprintf(stderr, "SELECT failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
show_binary_results(res);
PQclear(res);
/* close the connection to the database and cleanup */
PQfinish(conn);
return 0;
}
515
32.1. Introduction
Tous les objets larges sont placs dans une seule table systme appele pg_largeobject. PostgreSQL supporte aussi un
systme de stockage appel TOAST qui stocke automatiquement les valeurs ne tenant pas sur une page de la base de donnes dans une aire de stockage secondaire par table. Ceci rend partiellement obsolte la fonctionnalit des objets larges. Un
avantage restant des objets larges est qu'il autorise les valeurs de plus de 2 Go en taille alors que les champs TOAST peuvent
tre d'au plus 1 Go. Nanmoins, les objets larges peuvent tre modifis au hasard en utilisant une API de lecture/criture qui est
plus efficace que la ralisation de telles oprations utilisant TOAST.
Objets larges
517
Objets larges
Objets larges
nom
donnees
text,
oid
);
SELECT lo_creat(-1);
SELECT lo_create(43213);
SELECT lo_unlink(173454);
/*-------------------------------------------------------------*
* testlo.c-*
test utilisant des objets larges avec libpq
*
* Copyright (c) 1994, Regents of the University of California
*
*-------------------------------------------------------------*/
#include <stdio.h>
#include "libpq-fe.h"
#include "libpq/libpq-fs.h"
#define BUFSIZE
1024
/*
* importFile
*
importe le fichier "in_filename" dans la base de donnes
*
en tant qu'objet "lobjOid"
*
*/
Oid
importFile(PGconn *conn, char *filename)
{
Oid
lobjId;
int
lobj_fd;
char
buf[BUFSIZE];
int
nbytes,
tmp;
519
Objets larges
int
fd;
/*
* ouvre le fichier lire
*/
fd = open(filename, O_RDONLY, 0666);
if (fd < 0)
{
/* error */
fprintf(stderr, "can't open unix file %s\n", filename);
}
/*
* cre l'objet large
*/
lobjId = lo_creat(conn, INV_READ | INV_WRITE);
if (lobjId == 0)
fprintf(stderr, "can't create large object\n");
lobj_fd = lo_open(conn, lobjId, INV_WRITE);
/*
* lit le fichier Unix crit dans le fichier inversion
*/
while ((nbytes = read(fd, buf, BUFSIZE)) > 0)
{
tmp = lo_write(conn, lobj_fd, buf, nbytes);
if (tmp < nbytes)
fprintf(stderr, "error while reading large object\n");
}
(void) close(fd);
(void) lo_close(conn, lobj_fd);
return lobjId;
}
void
pickout(PGconn *conn, Oid lobjId, int start, int len)
{
int
lobj_fd;
char
*buf;
int
nbytes;
int
nread;
lobj_fd = lo_open(conn, lobjId, INV_READ);
if (lobj_fd < 0)
{
fprintf(stderr, "can't open large object %d\n",
lobjId);
}
lo_lseek(conn, lobj_fd, start, SEEK_SET);
buf = malloc(len + 1);
nread = 0;
while (len - nread > 0)
{
nbytes = lo_read(conn, lobj_fd, buf, len - nread);
buf[nbytes] = ' ';
fprintf(stderr, ">>> %s";, buf);
nread += nbytes;
}
free(buf);
fprintf(stderr, "\n");
lo_close(conn, lobj_fd);
}
void
overwrite(PGconn *conn, Oid lobjId, int start, int len)
520
Objets larges
{
int
char
int
int
int
lobj_fd;
*buf;
nbytes;
nwritten;
i;
Objets larges
*/
while ((nbytes = lo_read(conn, lobj_fd, buf, BUFSIZE)) > 0)
{
tmp = write(fd, buf, nbytes);
if (tmp < nbytes)
{
fprintf(stderr, "error while writing %s\n",
filename);
}
}
(void) lo_close(conn, lobj_fd);
(void) close(fd);
return;
}
void
exit_nicely(PGconn *conn)
{
PQfinish(conn);
exit(1);
}
int
main(int argc, char **argv)
{
char
*in_filename,
*out_filename;
char
*database;
Oid
lobjOid;
PGconn
*conn;
PGresult
*res;
if (argc != 4)
{
fprintf(stderr, "Usage: %s database_name in_filename out_filename\n",
argv[0]);
exit(1);
}
database = argv[1];
in_filename = argv[2];
out_filename = argv[3];
/*
* initialise la connexion
*/
conn = PQsetdb(NULL, NULL, NULL, NULL, database);
/* check to see that the backend connection was successfully made */
if (PQstatus(conn) == CONNECTION_BAD)
{
fprintf(stderr, "Connection to database '%s' failed.\n", database);
fprintf(stderr, "%s", PQerrorMessage(conn));
exit_nicely(conn);
}
res = PQexec(conn, "begin");
PQclear(res);
/*
/*
printf("as large object %d.\n", lobjOid);
printf("picking out bytes 1000-2000 of the large object\n");
pickout(conn, lobjOid, 1000, 1000);
522
Objets larges
523
33.1. Le Concept
Un programme SQL embarqu est compos de code crit dans un langage de programmation ordinaire, dans notre cas le C, mlang avec des commandes SQL dans des sections spcialement balises. Pour compiler le programme, le code source (*.pgc)
passe d'abord dans un prprocesseur pour SQL embarqu, qui le convertit en un programme C ordinaire (*.c), afin qu'il puisse
ensuite tre trait par un compilateur C. (Pour les dtails sur la compilation et l'dition de lien dynamique voyez Section 33.10,
Traiter des Programmes en SQL Embarqu ). Les applications ECPG converties appellent les fonctions de la librairie libpq
au travers de la librairie SQL embarque (ecpgli), et communique avec le server PostgreSQL au travers du protocole clientserveur normal.
Le SQL embarqu a des avantages par rapport aux autres mthodes de manipulation du SQL dans le code C. Premirement, il
s'occupe du laborieux passage d'information de et vers les variables de votre programme C. Deuximement, le code SQL du programme est vrifi la compilation au niveau syntaxique. Troisimement, le SQL embarqu en C est support par beaucoup
d'autres bases de donnes SQL. L'implmentation PostgreSQL est conue pour correspondre ce standard autant que possible, et il est habituellement possible de porter du SQL embarqu d'autres bases SQL vers PostgreSQL assez simplement.
Comme dj expliqu prcdemment, les programmes crits pour du SQL embarqu sont des programmes C normaux, avec du
code spcifique insr pour excuter des oprations lies la base de donnes. Ce code spcifique est toujours de la forme:
EXEC SQL ...;
Ces ordres prennent, syntaxiquement, la place d'un ordre SQL. En fonction de l'ordre lui-mme, ils peuvent apparatre au niveau
global ou l'intrieur d'une fonction. Les ordres SQL embarqus suivent les rgles habituelles de sensibilit la casse du code
SQL, et pas celles du C.
Les sections suivantes expliquent tous les ordres SQL embarqus.
nomdb[@nomhte][:port]
tcp:postgresql://nomhte[:port][/nomdb][?options]
unix:postgresql://nomhte[:port][/nomdb][?options]
une rfrence une variable caractre contenant une des formes prcdentes (voyez les exemples)
DEFAULT
Si vous spcifiez la chaine de connection de faon littrale (c'est dire, pas par une rfrence une variable) et que vous ne mettez pas la valeur entre guillemets, alors les rgles d'insensibilit la casse du SQL normal sont appliques. Dans ce cas, vous
pouvez aussi mettre entre guillemets doubles chaue paramtre individuel sparment au besoin. En pratique, il y a probablement
moins de risques d'erreur utiliser une chane de caractres entre simples guillemets, ou une rfrence une variable. La cible
de connexion DEFAULT initie une connexion la base de donnes par dfaut avec l'utilisateur par dfaut. Il n'est pas ncessaire
de prciser sparment un nom d'utilisateur ou un nom de connexion dans ce cas.
524
nomutilisateur
nomutilisateur/motdepasse
Comme prcdemment, les paramtres nomutilisateur et motdepasse peuvent tre un identifiant SQL, une chane SQL
littrale, ou une rfrence une variable caractre.
Le nom-connexion est utilis pour grer plusieurs connexions dans un programme. Il peut tre omis si le programme n'utilise
qu'une connexion. La connexion la plus rcemment ouverte devient la connexion courante, qui est utilise par dfaut quand un
ordre SQL doit tre excut (voyez plus bas dans ce chapitre).
Voici quelques exemples d'ordres CONNECT:
EXEC SQL CONNECT TO mabase@sql.mondomaine.com;
EXEC SQL CONNECT TO unix:postgresql://sql.mondomaine.com/mabase AS maconnexion USER
john;
EXEC SQL BEGIN DECLARE SECTION;
const char *cible = "mabase@sql.mondomaine.com";
const char *utilisateur = "john";
EXEC SQL END DECLARE SECTION;
...
EXEC SQL CONNECT TO :cible USER :utilisateur;
La dernire forme utilie la variante dont on parlait prcdemment sous le nom de rfrence par variable. Vous verrez dans les sections finales comment des variables C peuvent tre utilises dans des ordres SQL quand vous les prfixez par deux-points.
Notez que le format de la cible de connexion n'est pas spcifi dans le standard SQL. Par consquent si vous voulez dvelopper
des applications portables, vous pourriez vouloir utiliser quelque chose ressemblant au dernier exemple pour encapsuler la cible de
connexion quelque part.
main()
{
EXEC SQL CONNECT TO basetest1 AS con1 USER utilisateurtest;
EXEC SQL CONNECT TO basetest2 AS con2 USER utilisateurtest;
EXEC SQL CONNECT TO basetest3 AS con3 USER utilisateurtest;
/* Cette requte serait excut dans la dernire base ouverte "basetest3". */
EXEC SQL SELECT current_database() INTO :nomdb;
printf("courante=%s (devrait tre basetest3)\n", nomdb);
/* Utiliser "AT" pour excuter une requte dans "basetest2" */
EXEC SQL AT con2 SELECT current_database() INTO :nomdb;
printf("courante=%s (devrait tre basetest2)\n", nomdb);
/* Switch the courante connection to "basetest1". */
EXEC SQL SET CONNECTION con1;
EXEC SQL SELECT current_database() INTO :nomdb;
printf("courante=%s (devrait tre basetest1)\n", nomdb);
EXEC SQL DISCONNECT ALL;
return 0;
}
Cet exemple devrait produire cette sortie:
courante=basetest3 (devrait tre basetest3)
courante=basetest2 (devrait tre basetest2)
courante=basetest1 (sdevrait tre basetest1)
nom-connexion
DEFAULT
CURRENT
ALL
Note
La commande DECLARE ne dclenche pas rellement l'envoi d'un ordre au serveur PostgreSQL. Le curseur est
ouvert dans le processus serveur (en utilisant la commande DECLARE) au moment o la commande OPEN est
excute.
hte. Par consquent, les variables du programme C sont appeles variables htes.
Une autre faon d'changer des valeurs entre les serveurs PostgreSQL et les applications ECPG est l'utilisation de descripteurs
SQL, dcrits dans Section 33.7, Utiliser les Zones de Descripteur .
33.4.1. Overview
Passer des donnes entre le programme en C et les ordres SQL est particulirement simple en SQL embarqu. Plutt que d'avoir
un programme qui conne des donnes dans un ordre SQL, ce qui entrane des complications varies, comme protger correctement
la valeur, vous pouvez simplement crire le nom d'une variable C dans un ordre SQL, prfixe par un deux-points. Par exemple:
EXEC SQL INSERT INTO unetable VALUES (:v1, 'foo', :v2);
Cet ordre fait rfrence deux variables C appeles v1 et v2 et utilise aussi une chane SQL classique, pour montrer que vous
n'tes pas oblig de vous cantonner un type de donnes ou l'autre.
Cette faon d'insrer des variables C dans des ordres SQL fonctionne partout o une expression de valeur est attendue dans un
ordre SQL.
x = 4;
foo[16], bar[16];
Comme vous pouvez le voir, vous pouvez optionnellement assigner une valeur initiale une variable. La porte de la variable est
dtermine par l'endroit o se trouve la section de dclaration dans le programme. Vous pouvez aussi dclarer des variables avec
la syntaxe suivante, qui cre une section declare implicite:
EXEC SQL int i = 4;
Vous pouvez avoir autant de sections de dclaration que vous voulez dans un programme.
Ces dclarations sont aussi envoyes dans le fichier produit comme des variables C normales, il n'est donc pas ncessaire de les
dclarer une seconde fois. Les variables qui n'ont pas besoin d'tre utilises dans des commandes SQL peuvent tre dclares normalement l'extrieur de ces sections spciales.
La dfinition d'une structure ou d'un union doit aussi tre prsente dans une section DECLARE. Sinon, le prprocesseur ne peut pas
traiter ces types, puisuq'il n'en connait pas la dfinition.
smallint
short
integer
int
bigint
decimal
decimala
numeric
numericb
real
float
double precision
double
serial
int
bigserial
oid
unsigned int
char[n+1], VARCHAR[n+1]c
name
char[NAMEDATALEN]
timestamp
timestampd
interval
intervale
date
datef
boolean
boolg
Ce type ne peut tre accd qu' travers des fonctions spciales de librairie. Voyez Section 33.4.4.2, Accder des Types de Donnes Spciaux .
Ce type ne peut tre accd qu' travers des fonctions spciales de librairie. Voyez Section 33.4.4.2, Accder des Types de Donnes Spciaux .
c
dclar dans ecpglib.h
d
Ce type ne peut tre accd qu' travers des fonctions spciales de librairie. Voyez Section 33.4.4.2, Accder des Types de Donnes Spciaux .
e
Ce type ne peut tre accd qu' travers des fonctions spciales de librairie. Voyez Section 33.4.4.2, Accder des Types de Donnes Spciaux .
f
Ce type ne peut tre accd qu' travers des fonctions spciales de librairie. Voyez Section 33.4.4.2, Accder des Types de Donnes Spciaux .
g
dclar dans ecpglib.h si non natif
b
Voici une mthode pour manipuler des variables timestamp dans l'application hte ECPG.
Tout d'abord, le programme doit inclure le fichier d'en-tte pour le type timestamp:
531
#include <pgtypes_timestamp.h>
Puis, dclarez une variable hte comme type timestamp dans la section declare:
EXEC SQL BEGIN DECLARE SECTION;
timestamp ts;
EXEC SQL END DECLARE SECTION;
Et aprs avoir lu une valeur dans la variable hte, traitez la en utilisant les fonctions de la librairie pgtypes. Dans l'exemple qui
suit, la valeur timestamp est convertie sous forme texte (ASCII) avec la fonction PGTYPEStimestamp_to_asc():
EXEC SQL SELECT now()::timestamp INTO :ts;
printf("ts = %s\n", PGTYPEStimestamp_to_asc(ts));
Cet exemple affichere des rsultats de ce type:
ts = 2010-06-27 18:03:56.949343
Par ailleurs, le type DATE peut tre manipul de la mme faon. Le programme doit inclure pgtypes_date.h, dclarer une
variable hte comme tant du type date et convertir une valeur DATE dans sa forme texte en utilisant la fonction PGTYPESdate_to_asc(). Pour plus de dtails sur les fonctions de la librairie pgtypes, voyez Section 33.6, Librairie pgtypes .
33.4.4.2.2. interval
La manipulation du type interval est aussi similaire aux types timestamp et date. Il est ncessaire, par contre, d'allouer de la mmoire pour une valeur de type interval de faon explicite. Ou dit autrement, l'espace mmoire pour la variable doit tre alloue du
tas, et non de la pile.
Voici un programme de dmonstration:
#include <stdio.h>
#include <stdlib.h>
#include <pgtypes_interval.h>
int
main(void)
{
EXEC SQL BEGIN DECLARE SECTION;
interval *in;
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT TO testdb;
in = PGTYPESinterval_new();
EXEC SQL SELECT '1 min'::interval INTO :in;
printf("interval = %s\n", PGTYPESinterval_to_asc(in));
PGTYPESinterval_free(in);
EXEC SQL COMMIT;
EXEC SQL DISCONNECT ALL;
return 0;
}
33.4.4.2.3. numeric, decimal
La manipulation des types numeric et decimal est similaire au type interval: elle requiert de dfinir d'un pointeur, d'allouer de la
mmoire sur le tas, et d'accder la variable au mouyen des fonctions de librairie pgtypes. Pour plus de dtails sur les fonctions de
la librairie pgtypes, voyez Section 33.6, Librairie pgtypes .
Aucune fonction n'est fournie spcifiquement pour le type decimal. Une application doit le convertir vers une variable numeric en
utilisant une fonction de la librairie pgtypes pour pouvoir le traiter.
Voici un programme montrant la manipulation des variables de type numeric et decimal.
532
#include <stdio.h>
#include <stdlib.h>
#include <pgtypes_numeric.h>
EXEC SQL WHENEVER SQLERROR STOP;
int
main(void)
{
EXEC SQL BEGIN DECLARE SECTION;
numeric *num;
numeric *num2;
decimal *dec;
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT TO testdb;
num = PGTYPESnumeric_new();
dec = PGTYPESdecimal_new();
EXEC SQL SELECT 12.345::numeric(4,2), 23.456::decimal(4,2) INTO :num, :dec;
printf("numeric = %s\n", PGTYPESnumeric_to_asc(num, 0));
printf("numeric = %s\n", PGTYPESnumeric_to_asc(num, 1));
printf("numeric = %s\n", PGTYPESnumeric_to_asc(num, 2));
/* Convertir le decimal en numeric pour montrer une valeur dcimale. */
num2 = PGTYPESnumeric_new();
PGTYPESnumeric_from_decimal(dec, num2);
printf("decimal = %s\n", PGTYPESnumeric_to_asc(num2, 0));
printf("decimal = %s\n", PGTYPESnumeric_to_asc(num2, 1));
printf("decimal = %s\n", PGTYPESnumeric_to_asc(num2, 2));
PGTYPESnumeric_free(num2);
PGTYPESdecimal_free(dec);
PGTYPESnumeric_free(num);
EXEC SQL COMMIT;
EXEC SQL DISCONNECT ALL;
return 0;
}
Il y a deux cas d'utilisations pour des tableaux comme variables htes. Le premier est une faon de stocker des chanes de texte
dans des char[] ou VARCHAR[], comme expliqu Section 33.4.4.1, Manipuler des Chanes de Caractres . Le second cas
d'utilisation est de rcuprer plusieurs enregistrements d'une requte sans utiliser de curseur. Sans un tableau, pour traiter le rsultat d'une requte de plusieurs lignes, il est ncessaire d'utiliser un curseur et la commande FETCH. Mais avec une variable hte de
type variable, plusieurs enregistrements peuvent tre rcuprs en une seule fois. La longueur du tableau doit tre dfinie pour
pouvoir recevoir tous les enregistrements d'un coup, sans quoi un buffer overflow se produira probablement.
Les exemples suivants parcourent la table systme pg_database et montrent tous les OIDs et noms des bases de donnes disponibles:
int
main(void)
{
EXEC SQL BEGIN DECLARE SECTION;
int dbid[8];
char dbname[8][16];
int i;
EXEC SQL END DECLARE SECTION;
533
Une structure dont les noms des membres correspondent aux noms de colonnes du rsultat d'une requte peut tre utilise pour rcuprer plusieurs colonnes d'un coup. La structure permet de grer plusieurs valeurs de colonnes dans une seule variable hte.
L'exemple suivant rcupre les OIDs, noms, et tailles des bases de donnes disponibles partir de la table systme
pg_database, et en utilisant la fonction pg_database_size(). Dans cet exemple, une variable structure dbinfo_t avec
des membres dont les noms correspondent chaque colonnes du rsultat du SELECT est utilise pour rcuprer une ligne de rsultat sans avoir besoin de mettre plusieurs variables htes dans l'ordre FETCH.
EXEC SQL BEGIN DECLARE SECTION;
typedef struct
{
int oid;
char datname[65];
long long int size;
} dbinfo_t;
dbinfo_t dbval;
EXEC SQL END DECLARE SECTION;
memset(&dbval, 0, sizeof(dbinfo_t));
EXEC SQL DECLARE cur1 CURSOR FOR SELECT oid, datname, pg_database_size(oid) AS size
FROM pg_database;
EXEC SQL OPEN cur1;
/* quand la fin du jeu de donnes est atteint, sortir de la boucle while */
EXEC SQL WHENEVER NOT FOUND DO BREAK;
while (1)
{
/* Rcuprer plusieurs colonnes dans une structure. */
EXEC SQL FETCH FROM cur1 INTO :dbval;
/* Afficher les membres de la structure. */
printf("oid=%d, datname=%s, size=%lld\n", dbval.oid, dbval.datname,
dbval.size);
}
EXEC SQL CLOSE cur1;
534
Cet exemple montre le rsultat suivant. (Les valeurs exactes dpendent du contexte.)
oid=1, datname=template1, size=4324580
oid=11510, datname=template0, size=4243460
oid=11511, datname=postgres, size=4324580
oid=313780, datname=testdb, size=8183012
Les variables htes structures absorbent autant de colonnes que la structure a de champs. Des colonnes additionnelles peuvent
tre assignes d'autres variables htes. Par exemple, le programme ci-dessus pourrait tre restructur comme ceci, avec la variable size hors de la structure:
EXEC SQL BEGIN DECLARE SECTION;
typedef struct
{
int oid;
char datname[65];
} dbinfo_t;
dbinfo_t dbval;
long long int size;
EXEC SQL END DECLARE SECTION;
memset(&dbval, 0, sizeof(dbinfo_t));
EXEC SQL DECLARE cur1 CURSOR FOR SELECT oid, datname, pg_database_size(oid) AS size
FROM pg_database;
EXEC SQL OPEN cur1;
/* quand la fin du jeu de donnes est atteint, sortir de la boucle while */
EXEC SQL WHENEVER NOT FOUND DO BREAK;
while (1)
{
/* Rcuprer plusieurs colonnes dans une structure. */
EXEC SQL FETCH FROM cur1 INTO :dbval, :size;
/* Afficher les membres de la structure. */
printf("oid=%d, datname=%s, size=%lld\n", dbval.oid, dbval.datname, size);
}
EXEC SQL CLOSE cur1;
33.4.4.3.3. Typedefs
Utilisez le mot cl typedef pour faire correspondre de nouveaux types aux types existants.
EXEC SQL BEGIN DECLARE SECTION;
typedef char mychartype[40];
typedef long serial_t;
EXEC SQL END DECLARE SECTION;
Notez que vous pourriez aussi utiliser:
EXEC SQL TYPE serial_t IS long;
Cette dclaration n'a pas besoin de faire partie d'une section declare.
33.4.4.3.4. Pointeurs
Vous pouvez dclarer des pointeurs vers les types les plus communs. Notez toutefois que vous ne pouvez pas utiliser des pointeurs
comme variables cibles de requtes sans auto-allocation. Voyez Section 33.7, Utiliser les Zones de Descripteur pour plus
d'information sur l'auto-allocation.
EXEC SQL BEGIN DECLARE SECTION;
535
int
*intp;
char **charp;
EXEC SQL END DECLARE SECTION;
33.4.5.1. Tableaux
Les tableaux au niveau SQL ne sont pas supports directement dans ECPG. Il n'est pas possible de mettre simplement en correspondance un tableau SQL avec une variable hte de type tableau. Cela entranera un comportement indfini. Quelques contournements existent, toutefois.
Si une requte accde aux lments d'un tableau sparment, cela vite l'utilisation des tableaux dans ECPG. Dans ce cas, une variable hte avec un type qui peut tre mis en correspondance avec le type de l'lment devrait tre utilis. Par exemple, si le type
d'une colonne est un tableau d'integer, une variable hte de type int peut tre utilise. Par ailleurs, si le type de l'lment est varchar, ou text, une variable hte de type char[] ou VARCHAR[] peut tre utilise.
Voici un exemple. Prenez la table suivante:
CREATE TABLE t3 (
ii integer[]
);
testdb=> SELECT * FROM t3;
ii
------------{1,2,3,4,5}
(1 row)
Le programme de dmonstration suivant rcupre le 4me lment du tableau et le stocke dans une variable hte de type int: type
int:
EXEC SQL BEGIN DECLARE SECTION;
int ii;
EXEC SQL END DECLARE SECTION;
EXEC SQL DECLARE cur1 CURSOR FOR SELECT ii[4] FROM t3;
EXEC SQL OPEN cur1;
EXEC SQL WHENEVER NOT FOUND DO BREAK;
while (1)
{
EXEC SQL FETCH FROM cur1 INTO :ii ;
printf("ii=%d\n", ii);
}
EXEC SQL CLOSE cur1;
Cet exemple affiche le rsultat suivant:
ii=4
Pour mettre en correspondance de multiples lments de tableaux avec les multiples lments d'une variable hte tableau, chaque
lment du tableau doit tre gr sparment, par exemple; for example:
EXEC SQL BEGIN DECLARE SECTION;
int ii_a[8];
EXEC SQL END DECLARE SECTION;
EXEC SQL DECLARE cur1 CURSOR FOR SELECT ii[1], ii[2], ii[3], ii[4] FROM t3;
EXEC SQL OPEN cur1;
536
}
EXEC SQL CLOSE cur1;
Pour amliorer cet exemple, les variables htes qui vont stocker les valeurs dans la commande FETCH peuvent tre rassembles
sous forme de structure, voyez Section 33.4.4.3.2, Structures . Pour passer la structure, l'exemple peut-tre modifi comme ci
dessous. Les deux variables htes, intval et textval, deviennent membres de comp_t, et la structure est spcifie dans la
commande FETCH.
EXEC SQL BEGIN DECLARE SECTION;
typedef struct
{
int intval;
varchar textval[33];
} comp_t;
comp_t compval;
EXEC SQL END DECLARE SECTION;
/* Mettre chaque lment de la colonne de type composite dans la liste SELECT. */
EXEC SQL DECLARE cur1 CURSOR FOR SELECT (compval).intval, (compval).textval FROM t4;
EXEC SQL OPEN cur1;
EXEC SQL WHENEVER NOT FOUND DO BREAK;
while (1)
{
/* Mettre toutes les valeurs de la liste SELECT dans une structure. */
EXEC SQL FETCH FROM cur1 INTO :compval;
printf("intval=%d, textval=%s\n", compval.intval, compval.textval.arr);
}
EXEC SQL CLOSE cur1;
Bien qu'une structure soit utilise dans la commande FETCH, les noms d'attributs dans la clause SELECT sont spcifis un par
un. Cela peut tre amlior en utilisant un * pour demander tous les attributs de la valeur de type composite.
...
EXEC SQL DECLARE cur1 CURSOR FOR SELECT (compval).* FROM t4;
EXEC SQL OPEN cur1;
EXEC SQL WHENEVER NOT FOUND DO BREAK;
while (1)
{
/* Mettre toutes les valeurs de la liste SELECT dans une structure. */
EXEC SQL FETCH FROM cur1 INTO :compval;
printf("intval=%d, textval=%s\n", compval.intval, compval.textval.arr);
}
...
De cette faon, les types composites peuvent tre mis en correspondance avec des structures de faon quasi transparentes, alors
qu'ECPG ne comprend pas lui-mme le type composite.
Et pour finir, il est aussi possible de stocker les valeurs de type composite dans leur reprsentation externe de type chane dans des
variables htes de type char[] ou VARCHAR[]. Mais de cette faon, il n'est pas facilement possible d'accder aux champs de la
valeur dans le programme hte.
plex_out(). L'exemple suivant insre les valeurs de type complexe (1,1) et (3,3) dans les colonnes a et b, et les slectionne partir de la table aprs cela.
EXEC SQL BEGIN DECLARE SECTION;
varchar a[64];
varchar b[64];
EXEC SQL END DECLARE SECTION;
EXEC SQL INSERT INTO test_complex VALUES ('(1,1)', '(3,3)');
EXEC SQL DECLARE cur1 CURSOR FOR SELECT a, b FROM test_complex;
EXEC SQL OPEN cur1;
EXEC SQL WHENEVER NOT FOUND DO BREAK;
while (1)
{
EXEC SQL FETCH FROM cur1 INTO :a, :b;
printf("a=%s, b=%s\n", a.arr, b.arr);
}
EXEC SQL CLOSE cur1;
Cet exemple affiche le rsultat suivant:
a=(1,1), b=(3,3)
Un autre contournement est d'viter l'utilisation directe des types dfinis par l'utilisateur dans ECPG et la place crer une fonction ou un cast qui convertit entre le type dfini par l'utilisateur et un type primitif que ECPG peut traiter. Notez, toutefois, que les
conversions de types, particulirement les implicites, ne devraient tre introduits dans le systme de typage qu'avec la plus grande
prudence.
For example,
CREATE FUNCTION create_complex(r double, i double) RETURNS complex
LANGUAGE SQL
IMMUTABLE
AS $$ SELECT $1 * complex '(1,0')' + $2 * complex '(0,1)' $$;
After this definition, the following
EXEC SQL BEGIN DECLARE SECTION;
double a, b, c, d;
EXEC SQL END DECLARE SECTION;
a
b
c
d
=
=
=
=
1;
2;
3;
4;
33.4.6. Indicateurs
Les exemples prcdents ne grent pas les valeurs nulles. En fait, les exemples de rcupration de donnes remonteront une erreur
si ils rcuprent une valeur nulle de la base. Pour tre capable de passer des valeurs nulles la base ou d'un rcuprer, vous devez
rajouter une seconde spcification de variable hte chaque variable hte contenant des donnes. Cette seconde variable est appele l'indicateur et contient un drapeau qui indique si le datum est null, dans quel cas la valeur de la vraie variable hte est ignore.
Voici un exemple qui gre la rcupration de valeurs nulles correctement:
539
540
Le type numeric permet de faire des calculs de prcision arbitraire. Voyez Section 8.1, Types numriques pour le type quivalent dans le serveur PostgreSQL. En raison de cette prcision arbitraire cette variable doit pouvoir s'tendre et se rduire dynamiquement. C'est pour cela que vous ne pouvez crer des variables numeric que sur le tas, en utilisant les fonctions PGTYPESnumeric_new et PGTYPESnumeric_free. Le type dcimal, qui est similaire mais de prcision limite, peut tre cr sur la
pile ou sur le tas.
Les fonctions suivantes peuvent tre utilises pour travailler avec le type numeric:
PGTYPESnumeric_new
Demander un pointeur vers une variable numrique nouvellement alloue.
numeric *PGTYPESnumeric_new(void);
PGTYPESnumeric_free
Dsallouer un type numrique, librer toute sa mmoire.
void PGTYPESnumeric_free(numeric *var);
PGTYPESnumeric_from_asc
Convertir un type numrique partir de sa notation chane.
numeric *PGTYPESnumeric_from_asc(char *str, char **endptr);
Les formats valides sont par exemple: -2, .794, +3.44, 592.49E07 or -32.84e-4. Si la valeur peut tre convertie correctement, un pointeur valide est retourn, sinon un pointeur NULL. l'heure actuelle ECPG traite toujours la chaine en entier, il n'est donc pas possible pour le moment de stocker l'adresse du premier caractre invalide dans *endptr. Vous pouvez
sans risque positionner endptr NULL.
PGTYPESnumeric_to_asc
Retourne un pointeur vers la chane alloue par malloc qui contient la reprsentation chane du type numrique num.
char *PGTYPESnumeric_to_asc(numeric *num, int dscale);
La valeur numrique sera affiche avec dscale chiffres dcimaux, et sera arrondie si ncessaire.
PGTYPESnumeric_add
Ajoute deux variables numriques une troisime.
int PGTYPESnumeric_add(numeric *var1, numeric *var2, numeric *result);
La fonction additionne les variables var1 et var2 dans la variable rsultat result. La fonction retourne 0 en cas de succs
et -1 en cas d'erreur.
PGTYPESnumeric_sub
Soustrait deux variables numriques et retourne le rsultat dans une troisime.
int PGTYPESnumeric_sub(numeric *var1, numeric *var2, numeric *result);
La fonction soustrait la variable var2 de la variable var1. Le rsultat de l'opration est stock dans la variable result. La
fonction retourne 0 en cas de succs et -1 en cas d'erreur.
PGTYPESnumeric_mul
Multiplie deux valeurs numeric et retourne le rsultat dans une troisime.
int PGTYPESnumeric_mul(numeric *var1, numeric *var2, numeric *result);
La fonction multiplie la variable var2 de la variable var1. Le rsultat de l'opration est stock dans la variable result. La
fonction retourne 0 en cas de succs et -1 en cas d'erreur.
PGTYPESnumeric_div
Divise deux valeurs numeric et retourne le rsultat dans une troisime.
int PGTYPESnumeric_div(numeric *var1, numeric *var2, numeric *result);
La fonction divise la variable var2 de la variable var1. Le rsultat de l'opration est stock dans la variable result. La
542
PGTYPESnumeric_from_int
Convertit une variable int en variable numeric.
int PGTYPESnumeric_from_int(signed int int_val, numeric *var);
Cette fonction accepte une variable de type signed int et la stocke dans la variable numeric var. La fonction retourne 0 en cas
de russite, et -1 en cas d'chec.
PGTYPESnumeric_from_long
Convertit une variable long int en variable numeric.
int PGTYPESnumeric_from_long(signed long int long_val, numeric *var);
Cette fonction accepte une variable de type signed long int et la stocke dans la variable numeric var. La fonction retourne 0
en cas de russite, et -1 en cas d'chec.
PGTYPESnumeric_copy
Copie une variable numeric dans une autre.
int PGTYPESnumeric_copy(numeric *src, numeric *dst);
Cette fonction copie la valeur de la variable vers laquelle src pointe dans la variable vers laquelle dst. Elle retourne 0 en
cas de russite et -1 en cas d'chec.
PGTYPESnumeric_from_double
Convertit une variable de type double en variable numeric.
int
Cette fonction accepte une variable de type double et la stocke dans la variable numeric dst. La fonction retourne 0 en cas de
russite, et -1 en cas d'chec.
PGTYPESnumeric_to_double
Convertit une variable de type numeric en double.
int PGTYPESnumeric_to_double(numeric *nv, double *dp)
Cette fonction convertit la valeur numeric de la variable vers la quelle nv pointe vers la variable double vers laquelle dp
pointe. Elle retourne 0 en cas de russite et -1 en cas d'chec, les cas de dpassement de capacit inclus. En cas de dpassement, la variable globale errno sera positionne PGTYPES_NUM_OVERFLOW en plus.
PGTYPESnumeric_to_int
Convertit une variable de type numeric en int.
int PGTYPESnumeric_to_int(numeric *nv, int *ip);
Cette fonction convertit la valeur numeric de la variable vers la quelle nv pointe vers la variable int vers laquelle ip pointe.
Elle retourne 0 en cas de russite et -1 en cas d'chec, les cas de dpassement de capacit inclus. En cas de dpassement, la
variable globale errno sera positionne PGTYPES_NUM_OVERFLOW en plus.
PGTYPESnumeric_to_long
Convertit une variable de type numeric en long.
543
Entre
Sortie
January 8, 1999
January 8, 1999
1999-01-08
January 8, 1999
1/8/1999
January 8, 1999
1/18/1999
01/02/03
February 1, 2003
1999-Jan-08
January 8, 1999
Jan-08-1999
January 8, 1999
544
Entre
Sortie
08-Jan-1999
January 8, 1999
99-Jan-08
January 8, 1999
08-Jan-99
January 8, 1999
08-Jan-06
January 8, 2006
Jan-08-99
January 8, 1999
19990108
990108
1999.008
J2451187
Julian day
January 8, 99 BC
PGTYPESdate_to_asc
Retourne la reprsentation textuelle d'une variable date.
char *PGTYPESdate_to_asc(date dDate);
La fonction reoit la date dDate comme unique paramtre. Elle retournera la date dans la forme 1999-01-18, c'est--dire
le format YYYY-MM-DD.
PGTYPESdate_julmdy
Extrait les valeurs pour le jour, le mois et l'anne d'une variable de type date.
void PGTYPESdate_julmdy(date d, int *mdy);
La fonction reoit la date d et un pointeur vers un tableau de 3 valeurs entires mdy. Le nom de variable indique l'ordre squentiel: mdy[0] contiendra le numro du mois, mdy[1] contiendra le numro du jour et mdy[2] contiendra l'anne.
PGTYPESdate_mdyjul
Cre une valeur date partir d'un tableau de 3 entiers qui spcifient le jour, le mois et l'anne de la date.
void PGTYPESdate_mdyjul(int *mdy, date *jdate);
Cette fonction reoit le tableau des 3 entiers (mdy) comme premier argument, et son second argument est un pointeur vers la
variable de type date devant contenir le rsultat de l'opration.
PGTYPESdate_dayofweek
Retourne un nombre reprsentant le jour de la semaine pour une valeur date.
int PGTYPESdate_dayofweek(date d);
La fonction reoit la variable date d comme seul argument et retourne un entier qui indique le jour de la semaine pour cette
date. this date.
0 - Dimanche
1 - Lundi
2 - Mardi
3 - Mercredi
4 - Jeudi
5 - Vendredi
6 - Samedi
PGTYPESdate_today
Rcuprer la date courante.
void PGTYPESdate_today(date *d);
545
Cette fonction reoin un pointeur vers une variable date (d) qu'il positionne la date courante.
PGTYPESdate_fmt_asc
Converir une variable de type date vers sa reprsentation textuelle en utilisant un masque de formatage.
int PGTYPESdate_fmt_asc(date dDate, char *fmtstring, char *outbuf);
La fonction reoit la date convertir (dDate), le masque de formatage (fmtstring) et la chane qui contiendra la reprsentation textuelle de la date (outbuf).
En cas de succs, 0 est retourn, et une valeur ngative si une erreur s'est produite.
Les littraux suivants sont les spcificateurs de champs que vous pouvez utiliser:
Tout autre caractre est recopi tel quel dans la chane de sortie.
Tableau 33.3, Formats d'Entre Valides pour PGTYPESdate_fmt_asc indique quelques formats possibles. Cela vous
donnera une ide de comment utiliser cette fonction. Toutes les lignes de sortie reposent sur la mme date: Le 23 novembre
1959.
Tableau 33.3. Formats d'Entre Valides pour PGTYPESdate_fmt_asc
Format
Rsultat
mmddyy
112359
ddmmyy
231159
yymmdd
591123
yy/mm/dd
59/11/23
yy mm dd
59 11 23
yy.mm.dd
59.11.23
.mm.yyyy.dd.
.11.1959.23.
mmm dd yyyy
Nov 23 1959
yyyy dd mm
1959 23 11
PGTYPESdate_defmt_asc
Utiliser un masque de formatage pour convertir une chane de caractre char* en une valeur de type date.
int PGTYPESdate_defmt_asc(date *d, char *fmt, char *str);
La fonction reoit un pointeur vers la valeur de date qui devrait stocker le rsultat de l'opration (d), le masque de formatage
utiliser pour traiter la date (fmt) et la chane de caractres char* C contenant la reprsentation textuelle de la date (str). La
reprsentation textuelle doit correspondre au masque de formatage. Toutefois, vous n'avez pas besoin d'avoir une correspondance exacte entre la chane et le masque de formatage. La fonction n'analyse qu'en ordre squentiel et cherche les litraux yy
ou yyyy qui indiquent la position de l'anne, mm qui indique la position du mois et dd qui indique la position du jour.
Tableau 33.4, Formats d'Entre Valides pour rdefmtdate indique quelques formats possibles. Cela vous donnera une
ide de comment utiliser cette fonction
546
Format
Chane
Rsultat
ddmmyy
21-2-54
1954-02-21
ddmmyy
2-12-54
1954-12-02
ddmmyy
20111954
1954-11-20
ddmmyy
130464
1964-04-13
mmm.dd.yyyy
MAR-12-1967
1967-03-12
yy/mm/dd
1954-02-03
mmm.dd.yyyy
041269
1969-04-12
yy/mm/dd
dd-mm-yy
mmm.dd.yyyy
9/14/58
1958-09-14
yy/mm/dd
47/03/29
1947-03-29
mmm.dd.yyyy
oct 28 1975
1975-10-28
mmddyy
1985-11-14
Entre
Rsultat
1999-01-08 04:05:06
1999-01-08 04:05:06
1999-01-08 04:05:06
1999-Jan-08 04:05:06.789-8
Entre
Rsultat
J2451187 04:05-08:00
1999-01-08
ignored)
04:05:00
(time
zone
specifier
PGTYPEStimestamp_to_asc
Convertit une date vers une chane char* C.
char *PGTYPEStimestamp_to_asc(timestamp tstamp);
Cette fonction reoin le timestamp tstamp comme seul argument et retourne une chane alloue qui contient la reprsentation textuelle du timestamp.
PGTYPEStimestamp_current
Rcupre le timestamp courant.
void PGTYPEStimestamp_current(timestamp *ts);
Cette fonction rcupre le timestamp courant et le sauve dans la variable timestamp vers laquelle ts pointe.
PGTYPEStimestamp_fmt_asc
Convertit une variable timestamp vers un char* C en utilisant un masque de formatage.
int PGTYPEStimestamp_fmt_asc(timestamp *ts, char *output, int str_len, char
*fmtstr);
Cette fonction reoin ut pointeur vers le timestamp convertir comme premier argument (ts), un pointeur vers le tampon de
sortie (output), la longueur maximale qui a t alloue pour le tampon de sortie (str_len) et le masque de formatage
utiliser pour la conversion (fmtstr).
En cas de russite, la fonction retourne 0, et une valeur ngative en cas d'erreur.
Vous pouvez utiliser les spcificateurs de format suivant pour le masque de formatage. Les spcificateurs sont les mmes que
ceux utiliss dans la fonction strftime de la libc. Tout spcificateur ne correspondant pas du formatage sera copi
dans le tampon de sortie.
%C - est remplac par (anne / 100) sous forme de nombre dcimal; les chiffres seuls sont prcds par un zro.
%d - est remplac par le jour du mois sous forme de nombre dcimal (01-31).
%E* %O* - Extensions locales POSIX Les squences: %Ec %EC %Ex %EX %Ey %EY %Od %Oe %OH %OI %Om %OM %OS
%Ou %OU %OV %Ow %OW %Oy sont supposes fournir des reprsentations alternatives.
De plus, %OB est implment pour reprsenter des noms de mois alternatifs (utilis seul, sans jour mentionn).
%e - est remplac par le jour du mois comme nombre dcimal (1-31); les chiffres seuls sont prcds par un blanc.
%G - est remplac par une anne comme nombre dcimal avec le sicle. L'anne courante est celle qui contient la plus
grande partie de la semaine (Lundi est le premier jour de la semaine).
%g - est remplac par la mme anne que dans %G, mais comme un nombre dcimal sans le sicle. (00-99).
%H - est remplac par l'heure (horloge sur 24 heures) comme nombre dcimal (00-23).
%h - comme %b.
%I - est remplac par l'heure (horloge sur 12 heures) comme nombre dcimal(01-12).
548
%k - est remplac par l'heure (horloge sur 24 heures) comme nombre dcimal (0-23); les chiffres seuls sont prcds par
un blanc.
%l - est remplac par l'heure (horloge sur 12 heures) comme nombre dcimal (1-12); les chiffres seuls sont prcds par
un blanc.
%p - est remplac par la reprsentation nationale de ante meridiem ou post meridiem suivant la valeur approprie.
%U - est remplac par le numro de la semaine dans l'anne (Dimanche est le premier jour de la semaine) comme nombre
dcimal(00-53).
%u - est remplac par le jour de la semaine (Lundi comme premier jour de la semaine) comme nombre dcimal (1-7).
%V - est remplac par le numro de la semaine dans l'anne (Lundi est le premier jour de la semaine) comme nombre dcimal (01-53). Si l'anne contenant le 1er Janvier a 4 jours ou plus dans la nouvelle anne, alors c'est la semaine numro 1;
sinon, c'est la dernire semaine de l'anne prcdente, et la semaine suivante est la semaine 1.
%W - est remplac par le numro de la semaine dans l'anne (Lundi est le premier jour de la semaine) comme nombre dcimal (00-53).
%w - est remplac par le jour de la semaine (Dimanche comme premier jour de la semaine) comme nombre dcimal (0-6).
%y - est remplac par l'anne sans le sicle comme un nombre dcimal (00-99).
%z - est remplac par le dcalage de la zone de temps par rapport UTC; un signe plus initial signifie l'est d'UTC, un
signe moins l'ouest d'UTC, les heures et les minutes suivent avec deux chiffres chacun et aucun dlimiteur entre eux
(forme commune pour les enttes de date spcifis par la RFC 822).
%-* - extension de la libc GNU. Ne pas faire de padding (bourrage) sur les sorties numriques.
PGTYPEStimestamp_sub
Soustraire un timestamp d'un autre et sauver le rsultat dans une variable de type interval.
int PGTYPEStimestamp_sub(timestamp *ts1, timestamp *ts2, interval *iv);
Cette fonction soustrait la variable timestamp vers laquelle pointe ts2 de la variable de timestamp vers laquelle ts1 pointe,
549
PGTYPES_DATE_ERR_ENOTDMY
Il n'a pas t possible de trouver la correspondance dans l'assignement jour/mois/anne de la fonction PGTYPESdate_defmt_asc.
PGTYPES_DATE_BAD_DAY
Un jour de mois invalide a t trouv par la fonction the PGTYPESdate_defmt_asc.
PGTYPES_DATE_BAD_MONTH
Une valeur de mois invalide a t trouve par la fonction the PGTYPESdate_defmt_asc.
PGTYPES_TS_BAD_TIMESTAMP
Une chane de timestamp invalide a t passe la fonction PGTYPEStimestamp_from_asc, ou une valeur invalide de
timestamp a t passe la fonction PGTYPEStimestamp_to_asc.
PGTYPES_TS_ERR_EINFTIME
Une valeur infinie de timestamp a t recontre dans un context qui ne peut pas la manipuler.
553
Dans les ordres EXECUTE, DECLARE and OPEN, l'effet des mots cls INTO and USING est diffrent. Une zone de descripteur peut aussi tre construite manuellement pour fournir les paramtres d'entr pour une requte ou un curseur et USING SQL
DESCRIPTOR name est la faon de passer les paramtres d'entre une requte paramtrise. L'ordre pour construire une zone
de descripteur SQL est ci-dessous:
EXEC SQL SET DESCRIPTOR name VALUE num field = :hostvar;
PostgreSQL supporte la rcupration de plus d'un enregistrement dans un ordre FETCH et les variables htes dans ce cas doivent
tre des tableaux. Par exemple:
EXEC SQL BEGIN DECLARE SECTION;
int id[5];
EXEC SQL END DECLARE SECTION;
EXEC SQL FETCH 5 FROM mycursor INTO SQL DESCRIPTOR mydesc;
EXEC SQL GET DESCRIPTOR mydesc VALUE 1 :id = DATA;
2.
3.
Dclarer une SQLDA pour les paramtres d'entres, et les initialiser (allocation mmoire, positionnement des paramtres).
4.
5.
Rcuprer les enregistrements du curseur, et les stocker dans une SQLDA de sortie.
6.
Lire les valeurs de la SQLDA de sortie vers les variables htes (avec conversion si ncessaire).
7.
Fermer le curseur.
8.
Astuce
La structure de la SQLDA de PostgreSQL est similaire celle de DB2 Universal Database d'IBM, des informations
techniques sur la SQLDA de DB2 peuvent donc aider mieux comprendre celle de PostgreSQL.
33.7.2.1.1. Structure sqlda_t
554
Le type de structure sqlda_t est le type de la SQLDA proprement dit. Il contient un enregistrement. Et deux ou plus sqlda_t
peuvent tre connectes par une liste chane par le pointeur du champ desc_next, reprsentant par consquent une collection
ordonne d'enregistrements. Par consquent, quand deux enregistrements ou plus sont rcuprs, l'application peut les lire en suivant le pointeur desc_next dans chaque nud sqlda_t.
La dfinition de sqlda_t est:
struct sqlda_struct
{
char
sqldaid[8];
long
sqldabc;
short
sqln;
short
sqld;
struct sqlda_struct *desc_next;
struct sqlvar_struct sqlvar[1];
};
typedef struct sqlda_struct sqlda_t;
La signification des champs est:
sqldaid
Elle contient la chane littrale "SQLDA ".
sqldabc
Il contient la taille de l'espace allou en octets.
sqln
Il content le nombre de paramtres d'entre pour une requte paramtrique, dans le cas o il est pass un ordre OPEN, DECLARE ou EXECUTE utilisant le mot cl USING. Dans le cas o il sert de sortie un ordre SELECT, EXECUTE ou
FETCH statements, sa valeur est la mme que celle du champ sqld.
sqld
Il contient le nombre de champs du rsultat.
desc_next
Si la requte retourne plus d'un enregistrement, plusieurs structures SQLDA chanes sont retournes, et desc_next
contient un pointeur vers l'lment suivant (enregistrement) de la liste.
sqlvar
C'est le tableau des colonnes du rsultat.
33.7.2.1.2. Structure de sqlvar_t
Le type structure sqlvar_t contient la valeur d'une colonne et les mtadonnes telles que son type et sa longueur. La dfinition du
type est:
struct sqlvar_struct
{
short
sqltype;
short
sqllen;
char
*sqldata;
short
*sqlind;
struct sqlname sqlname;
};
typedef struct sqlvar_struct sqlvar_t;
La signification des champs est:
sqltype
Contient l'identifiant de type du champ. Pour les valeurs, voyez enum ECPGttype dans ecpgtype.h.
sqllen
Contient la longueur binaire du champ, par exemple 4 octets pour ECPGt_int.
sqldata
Pointe vers la donne. Le format de la donne est dcrit dans Section 33.4.4, Correspondance de Type .
555
sqlind
Pointe vers l'indicateur de nullit. 0 signifie non nul, -1 signifie nul. null.
sqlname
Le nom du champ.
33.7.2.1.3. Structure struct sqlname
Une structure struct sqlname contient un nom de colonne. Il est utilis comme membre de la structure sqlvar_t. La dfinition de la
structure est:
#define NAMEDATALEN 64
struct sqlname
{
short
char
};
length;
data[NAMEDATALEN];
2.
Excuter des commandes FETCH/EXECUTE/DESCRIBE pour traiter une requte en spcifiant la SQLDA dclare.
3.
Vrifier le nombre d'enregistrements dans le rsultat en inspectant sqln, un membre de la structure sqlda_t.
4.
Rcuprer les valeurs de chaque colonne des membres sqlvar[0], sqlvar[1], etc., de la structure sqlda_t.
5.
Aller l'enregistrement suivant (sqlda_t structure) en suivant le pointeur desc_next, un membre de la structure sqlda_t.
6.
556
Dans la boucle, faire une autre boucle pour rcuprer chaque colonne de donnes (sqlvar_t) de l'enregistrement.
for (i = 0; i < cur_sqlda->sqld; i++)
{
sqlvar_t v = cur_sqlda->sqlvar[i];
char *sqldata = v.sqldata;
short sqllen = v.sqllen;
...
}
Pour rcuprer une valeur de colonne, vrifiez la valeur de sqltype. Puis, suivant le type de la colonne, basculez sur une faon
approprie de copier les donnes du champ sqlvar vers une variable hte.
char var_buf[1024];
switch (v.sqltype)
{
case ECPGt_char:
memset(&var_buf, 0, sizeof(var_buf));
memcpy(&var_buf, sqldata, (sizeof(var_buf) <= sqllen ? sizeof(var_buf) - 1 :
sqllen));
break;
case ECPGt_int: /* integer */
memcpy(&intval, sqldata, sqllen);
snprintf(var_buf, sizeof(var_buf), "%d", intval);
break;
...
}
2.
3.
Allouer une zone mmorie (comme structure sqlda_t) pour la SQLDA d'entre.
4.
5.
Voici un exemple.
D'abord, crer une requte prpare.
EXEC SQL BEGIN DECLARE SECTION;
char query[1024] = "SELECT d.oid, * FROM pg_database d, pg_stat_database s WHERE d.oid
= s.datid AND (d.datname = ? OR d.oid = ?)";
EXEC SQL END DECLARE SECTION;
EXEC SQL PREPARE stmt1 FROM :query;
Puis, allouer de la mmoire pour une SQLDA, et positionner le nombre de paramtres d'entrne dans sqln, une variable membre
de la structure<sqlda_t>. Quand deux paramtres d'entre ou plus sont requis pour la requte prpare, l'application doit allouer de
la mmoire supplmentaire qui est calcule par (nombre de paramtres -1) * sizeof<sqlvar_t>. Les exemples affichs ici allouent
de l'espace mmoire pour deux paramtres d'entre.
sqlda_t *sqlda2;
sqlda2 = (sqlda_t *) malloc(sizeof(sqlda_t) + sizeof(sqlvar_t));
557
#include
#include
#include
#include
#include
<stdlib.h>
<string.h>
<stdlib.h>
<stdio.h>
<unistd.h>
561
Des fonctions de rappel (callbacks) peuvent tre configures pour traiter les conditions d'avertissement et d'erreur en utilisant
562
la commande WHENEVER.
Des informations dtailles propos de l'erreur ou de l'avertissement peuvent tre obtenues de la variable sqlca.
}
...
EXEC SQL SELECT ...;
...
}
/*
* WRONG
*/
int main(int argc, char *argv[])
{
...
set_error_handler();
...
EXEC SQL SELECT ...;
...
}
static void set_error_handler(void)
{
EXEC SQL WHENEVER SQLERROR STOP;
}
33.8.2. sqlca
Pour une gestion plus approfondie des erreurs, l'interface SQL embarque fournit une variable globale appele sqlca (SQL communication area, ou zone de communication SQL) qui a la structure suivante:
struct
{
char sqlcaid[8];
long sqlabc;
long sqlcode;
struct
{
int sqlerrml;
char sqlerrmc[SQLERRMC_LEN];
} sqlerrm;
char sqlerrp[8];
long sqlerrd[6];
char sqlwarn[8];
char sqlstate[5];
} sqlca;
(Dans un programme multi-thread, chaque thread rcupre automatiquement sa propre copie de sqlca. Ce fonctionnement est
similaire celui de la variable C globale errno.) errno.)
sqlca couvre la fois les avertissements et les erreurs. Si plusieurs avertissements ou erreurs se produisent durant l'excution
d'un ordre, alors sqlca ne contiendra d'informations que sur le dernier.
Si aucune erreur ne s'est produite durant le dernier ordre SQL, sqlca.sqlcode vaudra 0 sqlca.sqlstate vaudra
"00000". Si un avertissement ou erreur s'est produit, alors sqlca.sqlcode sera ngatif sqlca.sqlstate sera diffrent de
"00000". Une valeur positive de sqlca.sqlcode indique une condition sans gravit comme le fait que la dernire requte ait
retourn zro enregistrements. sqlcode et sqlstate sont deux diffrents schemas de code d'erreur; les dtails sont fournis
plus bas.
Si le dernier ordre SQL a russi, alors sqlca.sqlerrd[1] contient l'OID de la ligne traite, si applicable, et sqlca.sqlerrd[2] contient le nombre d'enregistrements traits ou retourns, si applicable la commande.
En cas d'erreur ou d'avertissement, sqlca.sqlerrm.sqlerrmc contiendra une chaine qui dcrira une erreur. Le champ sqlca.sqlerrm.sqlerrml contiendra la longueur du message d'erreur qui est stock dans sqlca.sqlerrm.sqlerrmc (le
rsultat de strlen(), par rellement intressant pour un programmeur C). Notez que certains messages sont trop longs pour tenir dans le tableau de taille fixe sqlerrmc; ils seront tronqus.
En cas d'avertissement, sqlca.sqlwarn[2] est positionn W. (Dans tous les autres cas, il est positionn quelque chose de
diffrent de W.) Si sqlca.sqlwarn[1] est positionn W, alors une valeur a t tronque quand elle a t stocke dans une variable hte. sqlca.sqlwarn[0] est positionn W si n'importe lequel des autres lments est positionn pour indiquer un aver564
tissement.
Les champs sqlcaid, sqlcabc, sqlerrp, et les lments restants de sqlerrd et sqlwarn ne contiennent pour le moment
aucune information utile.
La structure sqlca n'est pas dfinie dans le standard SQL, mais est implmente dans plusieurs autres systmes de base de donnes. Les dfinitions sont similaires dans leur principe, mais si vous voulez crire des applications portables, vous devriez tudier
les diffrentes implmentations de faon attentive.
Voici un exemple qui combine l'utilisation de WHENEVER et de sqlca, en affichant le contenu de sqlca quand une erreur se
produit. Cela pourrait tre utile pour dboguer ou prototyper des applications, avant d'installer un gestionnaire d'erreurs plus
user-friendly .
EXEC SQL WHENEVER SQLERROR CALL print_sqlca();
void
print_sqlca()
{
fprintf(stderr, "==== sqlca ====\n");
fprintf(stderr, "sqlcode: %ld\n", sqlca.sqlcode);
fprintf(stderr, "sqlerrm.sqlerrml: %d\n", sqlca.sqlerrm.sqlerrml);
fprintf(stderr, "sqlerrm.sqlerrmc: %s\n", sqlca.sqlerrm.sqlerrmc);
fprintf(stderr, "sqlerrd: %ld %ld %ld %ld %ld %ld\n",
sqlca.sqlerrd[0],sqlca.sqlerrd[1],sqlca.sqlerrd[2],
sqlca.sqlerrd[3],sqlca.sqlerrd[4],sqlca.sqlerrd[5]);
fprintf(stderr, "sqlwarn: %d %d %d %d %d %d %d %d\n", sqlca.sqlwarn[0],
sqlca.sqlwarn[1], sqlca.sqlwarn[2],
sqlca.sqlwarn[3],
sqlca.sqlwarn[4], sqlca.sqlwarn[5],
sqlca.sqlwarn[6],
sqlca.sqlwarn[7]);
fprintf(stderr, "sqlstate: %5s\n", sqlca.sqlstate);
fprintf(stderr, "===============\n");
}
Le rsultat pourrait ressembler ce qui suit (ici une erreur due un nom de table mal saisi):
==== sqlca ====
sqlcode: -400
sqlerrm.sqlerrml: 49
sqlerrm.sqlerrmc: relation "pg_databasep" does not exist on line 38
sqlerrd: 0 0 0 0 0 0
sqlwarn: 0 0 0 0 0 0 0 0
sqlstate: 42P01
===============
Il n'y a pas, toutefois, de correspondance un un ou un plusieurs entre les deux schmas (c'est en fait du plusieurs plusieurs),
vous devriez donc consulter la liste globale SQLSTATE dans Annexe A, Codes d'erreurs de PostgreSQL au cas par cas.
Voici les valeurs de SQLCODE assignes:
0 (ECPG_NO_ERROR)
Indique pas d'erreur. (SQLSTATE 00000)
100 (ECPG_NOT_FOUND)
C'est un tat sans danger indicant que la dernire commande a rcupr ou trait zro enregistrements, ou que vous tes au
bout du curseur. (SQLSTATE 02000)
Quand vous bouclez sur un curseur, vous pourriez utiliser ce code comme faon de dtecter quand arrter la boucle, comme
ceci:
while (1)
{
EXEC SQL FETCH ... ;
if (sqlca.sqlcode == ECPG_NOT_FOUND)
break;
}
Mais WHENEVER NOT FOUND DO BREAK fait en fait cela en interne, il n'y a donc habituellement aucun avantage crire
ceci de faon explicite.
-12 (ECPG_OUT_OF_MEMORY)
Indique que votre mmoire virtuelle est puise. La valeur numrique est dfinie comme -ENOMEM. (SQLSTATE YE001)
-200 (ECPG_UNSUPPORTED)
Indique que le prprocesseur a gnr quelque chose que la librairie ne connait pas. Peut-tre tes vous en train d'utiliser des
versions incompatibles du prprocesseur et de la librairie. (SQLSTATE YE002)
-201 (ECPG_TOO_MANY_ARGUMENTS)
Cela signifie que la commande a spcifi plus de variables hte que la commande n'en attendait. (SQLSTATE 07001 or
07002)
-202 (ECPG_TOO_FEW_ARGUMENTS)
Cela signifie que la commande a spcifi moins de variables htes que la commande n'en attendait. (SQLSTATE 07001 or
07002)
-203 (ECPG_TOO_MANY_MATCHES)
Cela signifie que la requte a retourn pluiseurs enregistrements mais que l'ordre n'tait capable d'en recevoir qu'un (par
exemple parce que les variables spcifies ne sont pas des tableaux. (SQLSTATE 21000)
-204 (ECPG_INT_FORMAT)
La variable hte est du type int et la donne dans la base de donnes est d'un type diffrent et contient une valeur qui ne peut
pas tre interprte comme un int. La librairie utilise strtol() pour cette conversion. (SQLSTATE 42804).
-205 (ECPG_UINT_FORMAT)
La variable hte est du type unsigned int et la donne dans la base de donnes est d'un type diffrent et contient une valeur qui
ne peut pas tre interprte comme un unsigned int. La librairie utilise strtoul() pour cette conversion. (SQLSTATE
42804).
-206 (ECPG_FLOAT_FORMAT)
La variable hte est du type float et la donne dans la base de donnes est d'un type diffrent et contient une valeur qui ne peut
pas tre interprte comme un float. La librairie utilise strtod() pour cette conversion. (SQLSTATE 42804).
-207 (ECPG_NUMERIC_FORMAT)
La variable hte est du type numeric et la donne dans la base de donnes est d'un type diffrent et contient une valeur qui ne
peut pas tre interprte comme un numeric. (SQLSTATE 42804).
-208 (ECPG_INTERVAL_FORMAT)
La variable hte est du type interval et la donne dans la base de donnes est d'un type diffrent et contient une valeur qui ne
peut pas tre interprte comme un interval. (SQLSTATE 42804).
-209 (ECPG_DATE_FORMAT)
La variable hte est du type date et la donne dans la base de donnes est d'un type diffrent et contient une valeur qui ne peut
pas tre interprte comme un date. (SQLSTATE 42804).
-210 (ECPG_TIMESTAMP_FORMAT)
566
La variable hte est du type timestamp et la donne dans la base de donnes est d'un type diffrent et contient une valeur qui
ne peut pas tre interprte comme un timestamp. (SQLSTATE 42804).
-211 (ECPG_CONVERT_BOOL)
Cela signifie que la variable hte est de type bool et que la donne dans la base n'est ni 't' ni 'f'. (SQLSTATE 42804)
-212 (ECPG_EMPTY)
L'ordre envoy au serveur PostgreSQL tait vide. (Cela ne peut normalement pas arriver dans un programme SQL embarqu, cela pourrait donc laisser supposer une erreur interne.) (SQLSTATE YE002)
-213 (ECPG_MISSING_INDICATOR)
Une valeur null a t retourne et aucune variable d'indicateur null n'a t fournie. (SQLSTATE 22002)
-214 (ECPG_NO_ARRAY)
Une variable ordinaire a t utilise un endroit qui ncessite un tableau. (SQLSTATE 42804)
-215 (ECPG_DATA_NOT_ARRAY)
La base a retourn une variable ordinaire un endroir qui ncessite une variable de tableau. (SQLSTATE 42804)
-220 (ECPG_NO_CONN)
Le programme a essay d'utiliser une connexion qui n'existe pas. (SQLSTATE 08003)
-221 (ECPG_NOT_CONN)
Le programme a essay d'utiliser une connexion qui existe mais n'est pas ouverte. (C'est une erreur interne.) (SQLSTATE
YE002)
-230 (ECPG_INVALID_STMT)
L'ordre que vous essayez d'excuter n'a pas t prpar. (SQLSTATE 26000)
-239 (ECPG_INFORMIX_DUPLICATE_KEY)
Erreur de cl en doublon, violation de contrainte unique (mode de compatibilit Informix). (SQLSTATE 23505)
-240 (ECPG_UNKNOWN_DESCRIPTOR)
Le descripteur spcifi n'a pas t trouv. L'ordre que vous essayez d'utiliser n'a pas t prpar. (SQLSTATE 33000)
-241 (ECPG_INVALID_DESCRIPTOR_INDEX)
L'index de descripteur spcifi tait hors de porte. (SQLSTATE 07009)
-242 (ECPG_UNKNOWN_DESCRIPTOR_ITEM)
Un objet de descripteur invalide a t demand. (C'est une erreur interne.) (SQLSTATE YE002)
-243 (ECPG_VAR_NOT_NUMERIC)
Durant l'excution d'un ordre dynamique, la base a retourn une valeur numeric et la variable hte n'tait pas numeric.
(SQLSTATE 07006)
-244 (ECPG_VAR_NOT_CHAR)
Durant l'excution d'un ordre dynamique, la base a retourn une valeur non numeric et la variable hte tait numeric.
(SQLSTATE 07006)
-284 (ECPG_INFORMIX_SUBSELECT_NOT_ONE)
Un rsultat de la sous-requte n'tait pas un enregistrement seul (mode de compatibilit Informix). (SQLSTATE 21000)
-400 (ECPG_PGSQL)
Une erreur cause par le serveur PostgreSQL. Le message contient le message d'erreur du serveur PostgreSQL.
-401 (ECPG_TRANS)
Le serveur PostgreSQL a signal que nous ne pouvons pas dmarrer, valider ou annuler la transaction. (SQLSTATE 08007)
-402 (ECPG_CONNECT)
La tentative de connexion la base n'a pas russi. (SQLSTATE 08001)
-403 (ECPG_DUPLICATE_KEY)
Erreur de cl duplique, violation d'une contrainte unique. (SQLSTATE 23505)
-404 (ECPG_SUBSELECT_NOT_ONE)
Un rsultat de la sous-requte n'est pas un enregistrement unique. (SQLSTATE 21000)
-602 (ECPG_WARNING_UNKNOWN_PORTAL)
Un nom de curseur invalide a t spcifi. (SQLSTATE 34000)
-603 (ECPG_WARNING_IN_TRANSACTION)
Transaction en cours. (SQLSTATE 25001)
567
-604 (ECPG_WARNING_NO_TRANSACTION)
Il n'y a pas de transaction active (en cours). (SQLSTATE 25P01)
-605 (ECPG_WARNING_PORTAL_EXISTS)
Un nom de curseur existant a t spcifi. (SQLSTATE 42P03)
rpertoire courant
/usr/local/include
/usr/include
Mais quand EXEC SQL INCLUDE "filename" est utilis, seul le rpertoire courant est parcouru.
Dans chaque rpertoire, le prprocesseur recherchera d'abord le nom de fichier tel que spcifi, et si non trouv, rajoutera .h au
nom de fichier et essaiera nouveau (sauf si le nom de fichier spcifi a dj ce suffixe).
Notez que EXEC SQL INCLUDE est diffrent de:
#include <filename.h>
parce que ce fichier ne serait pas soumis au prprocessing des commandes SQL. Naturellement, vous pouvez continuer d'utiliser la
directive C #include pour inclure d'autres fichiers d'entte. files.
Note
Le nom du fichier inclure est sensible la casse, mme si le reste de la commante EXEC SQL INCLUDE suit les
rgles normales de sensibilit la casse de SQL.
SQL
SQL
SQL
SQL
SQL
SQL
SQL
ifndef TZVAR;
SET TIMEZONE TO 'GMT';
elif TZNAME;
SET TIMEZONE TO TZNAME;
else;
SET TIMEZONE TO TZVAR;
endif;
un endroit qui n'est pas recherch par dfaut, vous devrez ajouter une option comme -I/usr/local/pgsql/include
la ligne de commande de compilation.
Pour lier un programme SQL embarqu, vous aurez besoin d'inclure la librairie libecpg, comme ceci:
cc -o myprog prog1.o prog2.o ... -lecpg
De nouveau, vous pourriez avoir besoin d'ajouter une option comme -L/usr/local/pgsql/lib la ligne de commande.
Si vous grez le processus de compilation d'un projet de grande taille en utilisant make, il serait pratique d'inclure la rgle implicite suivante vos makefiles:
ECPG = ecpg
%.c: %.pgc
$(ECPG) $<
La syntaxe complte de la commande ecpg est dtaille dans ecpg(1).
La librairie ecpg est thread-safe par dfaut. Toutefois, vous aurez peut-tre besoin d'utiliser des options de ligne de commande
spcifiques aux threads pour compiler votre code client.
ECPGdebug(int on, FILE *stream) active les traces de dboggage si appel avec une valeur diffrente de 0 en premier argument. La trace contient tous les ordres SQL avec toutes les variables d'entres insres, et les rsultats du serveur
PostgreSQL. Cela peut tre trs utile quand vous tes la recherche d'erreurs dans vos ordres SQL.
Note
Sous Windows, si les librairies ecpg et les applications sont compiles avec des options diffrentes, cet appel de
fonction fera planter l'application parce que la reprsentation interne des pointeurs FILE diffre. En particulier,
les options multithreaded/single-threaded, release/debug, et static/dynamic doivent tre les mmes pour la librairie et toutes les applications qui l'utilisent.
Note
C'est une mauvaise ide de manipuler les descripteurs de connexion la base de donne faits par ecpg directement avec des routines de libpq.
ECPGstatus(int lineno, const char* nom_connexion) retoure vrai si vous tes connect une base et faux
sinon. nom_connexion peut valoir NULL si une seule connexion est utilise.
sur les fonctions d'interfaage avec les large objects, voyez Chapitre 32, Objets larges.
Les fonctions large object doivent tre appeles dans un bloc de transaction, donc quand autocommit est off, les commandes BEGIN doivent tre effectues explicitement.
Exemple 33.2, Programme ECPG Accdant un Large Object montre un programme de dmonstration sur les faons de crer,
crire et lire un large object dans une application ECPG.
Exemple 33.2. Programme ECPG Accdant un Large Object
#include
#include
#include
#include
<stdio.h>
<stdlib.h>
<libpq-fe.h>
<libpq/libpq-fs.h>
*conn;
loid;
fd;
buf[256];
buflen = 256;
buf2[256];
rc;
memset(buf, 1, buflen);
EXEC SQL CONNECT TO testdb AS con1;
conn = ECPGget_PGconn("con1");
printf("conn = %p\n", conn);
/* crer */
loid = lo_create(conn, 0);
if (loid < 0)
printf("lo_create() failed: %s", PQerrorMessage(conn));
printf("loid = %d\n", loid);
/* test d'criture */
fd = lo_open(conn, loid, INV_READ|INV_WRITE);
if (fd < 0)
printf("lo_open() failed: %s", PQerrorMessage(conn));
printf("fd = %d\n", fd);
rc = lo_write(conn, fd, buf, buflen);
if (rc < 0)
printf("lo_write() failed\n");
rc = lo_close(conn, fd);
if (rc < 0)
printf("lo_close() failed: %s", PQerrorMessage(conn));
/* read test */
fd = lo_open(conn, loid, INV_READ);
if (fd < 0)
printf("lo_open() failed: %s", PQerrorMessage(conn));
printf("fd = %d\n", fd);
rc = lo_read(conn, fd, buf2, buflen);
if (rc < 0)
printf("lo_read() failed\n");
571
rc = lo_close(conn, fd);
if (rc < 0)
printf("lo_close() failed: %s", PQerrorMessage(conn));
/* vrifier */
rc = memcmp(buf, buf2, buflen);
printf("memcmp() = %d\n", rc);
/* nettoyer */
rc = lo_unlink(conn, loid);
if (rc < 0)
printf("lo_unlink() failed: %s", PQerrorMessage(conn));
EXEC SQL COMMIT;
EXEC SQL DISCONNECT ALL;
return 0;
}
}
TestCpp::~TestCpp()
{
EXEC SQL DISCONNECT ALL;
}
Ce code gnrera une erreur comme celle qui suit:
ecpg test_cpp.pgc
test_cpp.pgc:28: ERROR: variable "dbname" is not declared
Pour viter ce problme de porte, la mthode test pourrait tre modifie pour utiliser une variable locale comme stockage intermdiaire. Mais cette approche n'est qu'un mauvais contournement, parce qu'elle rend le code peu lgant et rduit la performance.
void TestCpp::test()
{
EXEC SQL BEGIN DECLARE SECTION;
char tmp[1024];
EXEC SQL END DECLARE SECTION;
EXEC SQL SELECT current_database() INTO :tmp;
strlcpy(dbname, tmp, sizeof(tmp));
printf("current_database = %s\n", dbname);
}
test_mod.h
Un fichier d'entte avec les dclarations des fonctions du module C (test_mod.pgc). Il est inclus par test_cpp.cpp.
Ce fichier devra avoir un bloc extern "C" autour des dclarations, parce qu'il sera li partir d'un module C++.
#ifdef __cplusplus
extern "C" {
#endif
void db_connect();
void db_test();
void db_disconnect();
#ifdef __cplusplus
}
#endif
test_cpp.cpp
Le code principal de l'application, incluant la routine main, et dans cet exemple une classe C++.
#include "test_mod.h"
class TestCpp
{
public:
TestCpp();
void test();
~TestCpp();
};
TestCpp::TestCpp()
{
db_connect();
}
void
TestCpp::test()
{
db_test();
}
TestCpp::~TestCpp()
{
db_disconnect();
}
int
main(void)
{
TestCpp *t = new TestCpp();
t->test();
return 0;
}
Pour constuire l'application, procdez comme suit. Convertissez test_mod.pgc en test_mod.c en lanant ecpg, et gnrez
test_mod.o en compilant test_mod.c avec le compilateur C:
ecpg -o test_mod.c test_mod.pgc
cc -c test_mod.c -o test_mod.o
Puis, gnrez test_cpp.o en compilant test_cpp.cpp avec le compilateur C++:
c++ -c test_cpp.cpp -o test_cpp.o
574
Finalement, liez ces objets, test_cpp.o et test_mod.o, dans un excutable, en utilisant le compilateur C++:
c++ test_cpp.o test_mod.o -lecpg -o test_cpp
575
Nom
ALLOCATE DESCRIPTOR alloue une zone de descripteur SQL
Synopsis
ALLOCATE DESCRIPTOR name
Description
ALLOCATE DESCRIPTOR alloue une nouvelle zone de descripteur SQL nomme, qui pourra tre utilise pour changer des
donnes netre le serveure PostgreSQL et le programme hte.
Les zones de descripteur devraient tre libres aprs utilisation avec la commande DEALLOCATE DESCRIPTOR.
Paramtres
name
Un nom de descripeur SQL, sensible la casse. Il peut tre un identifiant SQL ou une variable hte.
Exemple
EXEC SQL ALLOCATE DESCRIPTOR mydesc;
Compatibilit
ALLOCATE DESCRIPTOR est spcifi par le standard SQL.
Voyez aussi
DEALLOCATE DESCRIPTOR, GET DESCRIPTOR, SET DESCRIPTOR
576
Nom
CONNECT tablit une connexion la base de donnes
Synopsis
CONNECT TO connection_target [ AS nom_connexion ] [ USER connection_user_name ]
CONNECT TO DEFAULT
CONNECT connection_user_name
DATABASE connection_target
Description
La commande CONNECT tablit une connexion entre le client et le seurveur PostgreSQL.
Paramtres
connection_target
connection_target spcifie le serveur cible de la connexion dans une des formes suivantes:
[ database_name ] [ @host ] [ :port ]
Se connecter par TCP/IP
unix:postgresql://host [ :port ] / [ database_name ] [ ?connection_option ]
Se connecter par une socket de domaine Unix
tcp:postgresql://host [ :port ] / [ database_name ] [ ?connection_option ]
Se connecter par TCP/IP
constante de type chane SQL
contient une valeur d'une des formes prcdentes
variable hte
variable hte du type char[] ou VARCHAR[] contenant une valeur d'une des formes prcdentes
connection_object
Un identifiant optionnel pour la connexion, afin qu'on puisse y faire rfrence dans d'autres commandes. Cela peut tre un
identifiant SQL ou une variable hte.
connection_user
Le nom d'utilisateur pour une connexion la base de donnes.
Ce paramtre peut aussi spcifier un nom d'utilisateur et un mot de passe, en utilisant une des formes user_name/password, user_name IDENTIFIED BY password, or user_name USING password.
Nom d'utilisateur et mot de passe peuvent tre des identifiants SQL, des constantes de type chane, ou des variables htes.
DEFAULT
Utiliser tous les paramtres de connexion par dfaut, comme dfini par libpq.
Exemples
Voici plusieurs variantes pour spcifier des paramtres de connexion:
EXEC SQL CONNECT
EXEC SQL CONNECT
EXEC SQL CONNECT
connectuser;
EXEC SQL CONNECT
EXEC SQL CONNECT
EXEC SQL CONNECT
EXEC SQL CONNECT
EXEC SQL CONNECT
EXEC SQL CONNECT
EXEC SQL CONNECT
EXEC SQL CONNECT
TO "connectdb" AS main;
TO "connectdb" AS second;
TO "unix:postgresql://200.46.204.71/connectdb" AS main USER
TO
TO
TO
TO
TO
TO
TO
TO
TO
TO
TO
TO
TO
TO
connectdb AS :id;
connectdb AS main USER connectuser/connectdb;
connectdb AS main;
connectdb@localhost AS main;
tcp:postgresql://localhost/ USER connectdb;
tcp:postgresql://localhost/connectdb USER connectuser IDENTIFIED BY
Voici un programme exemple qui illustre l'utilisation de variables htes pour spcifier des paramtres de connexion:
int
main(void)
{
EXEC SQL BEGIN DECLARE
char *dbname
=
char *user
=
char *connection =
SECTION;
"testdb";
/* nom de la base */
"testuser"; /* nom d'utilisateur pour la connexion */
"tcp:postgresql://localhost:5432/testdb";
/* chane de connexion */
char ver[256];
/* buffer pour contenir la chane de version */
EXEC SQL END DECLARE SECTION;
ECPGdebug(1, stderr);
EXEC SQL CONNECT TO :dbname USER :user;
EXEC SQL SELECT version() INTO :ver;
EXEC SQL DISCONNECT;
printf("version: %s\n", ver);
EXEC SQL CONNECT TO :connection USER :user;
EXEC SQL SELECT version() INTO :ver;
EXEC SQL DISCONNECT;
printf("version: %s\n", ver);
return 0;
}
Compatibilit
CONNECT est spcifi dans le standard SQL, mais le format des paramtres de connexion est spcifique l'implmentation.
Voyez aussi
DISCONNECT, ???
578
Nom
DEALLOCATE DESCRIPTOR dsalloue une zone de descripteur SQL
Synopsis
DEALLOCATE DESCRIPTOR name
Description
DEALLOCATE DESCRIPTOR dsalloue une zone de descripteur SQL nomme.
Parameters
name
Le nom du descripteur qui va tre dsallou. Il est sensible la casse. Cela peut-tre un identifiant SQL ou une variable hte.
Exemples
EXEC SQL DEALLOCATE DESCRIPTOR mydesc;
Compatibilit
DEALLOCATE DESCRIPTOR est spcifi dans le standard SQL
See Also
ALLOCATE DESCRIPTOR, GET DESCRIPTOR, SET DESCRIPTOR
579
Nom
DECLARE definit un curseur
Synopsis
DECLARE
WITHOUT
DECLARE
WITHOUT
Description
DECLARE dclare un cusreur pour itrer sur le jeu de rsultat d'une requte prpare. Cette commande a une smantique lgrement diffrente de celle de l'ordre SQL direct DECLARE: L ou ce dernier excute une requte et prpare le jeu de rsultat pour
la rcupration, cette commande SQL embarqu se contente de dclarer un nom comme variable de boucle pour itrer sur le
rsultat d'une requte; l'excution relle se produit quand le curseur est ouvert avec la commande OPEN.
Paramtres
nom_curseur
Un nom de curseur, sensible la casse. Cela peut tre un identifiant SQL ou une variable hte.
nom_prepare
Le nom de l'une requte prpare, soit comme un identifiant SQL ou comme une variable hte.
query
Une commande SELECT(7) ou VALUES(7) qui fournira les enregistrements que le curseur devra retourner.
Pour la signification des options du curseur, voyez DECLARE(7).
Exemples
Exemples de dclaration de curseur pour une requte:
EXEC SQL DECLARE C CURSOR FOR SELECT * FROM My_Table;
EXEC SQL DECLARE C CURSOR FOR SELECT Item1 FROM T;
EXEC SQL DECLARE cur1 CURSOR FOR SELECT version();
Un exemple de dclaration de curseur pour une requte prpare:
EXEC SQL PREPARE stmt1 AS SELECT version();
EXEC SQL DECLARE cur1 CURSOR FOR stmt1;
Compatibilit
DECLARE est spcifi dans le standard SQL.
Voyez aussi
OPEN, CLOSE(7), DECLARE(7)
580
Nom
DESCRIBE obtient des informations propos d'une requte prpare ou d'un jeu de rsultat
Synopsis
DESCRIBE [ OUTPUT ] nom_prepare USING [ SQL ] DESCRIPTOR nom_descripteur
DESCRIBE [ OUTPUT ] nom_prepare INTO [ SQL ] DESCRIPTOR nom_descripteur
DESCRIBE [ OUTPUT ] nom_prepare INTO nom_sqlda
Description
DESCRIBE rcupre des informations sur les mtadonnes propos des colonnes de rsultat contenues dans une requte prpare, sans dclencher la rcupration d'un enregistrement.
Parameters
nom_prepare
Le nom d'une requte prpare. Cela peut tre un identifiant SQL ou une variable hte.
nom_descripteur
Un nom de descriteur. Il est sensible la casse. Cela peut tre un identifiant SQL ou une variable hte.
nom_sqlda
Le nom d'une variable SQLDA.
Exemples
EXEC
EXEC
EXEC
EXEC
EXEC
SQL
SQL
SQL
SQL
SQL
Compatibilit
DESCRIBE est spcifi dans le standard SQL.
Voyez aussi
ALLOCATE DESCRIPTOR, GET DESCRIPTOR
581
Nom
DISCONNECT met fin une connexion de base de donnes
Synopsis
DISCONNECT
DISCONNECT
DISCONNECT
DISCONNECT
nom_connexion
[ CURRENT ]
DEFAULT
ALL
Description
DISCONNECT ferme une connexion (ou toutes les connexions) la base de donnes.
Paramtres
nom_connexion
Une connexion la base tablie par la commande CONNECT.
CURRENT
Ferme la connexion courante , qui est soit la connexion ouverte la plus rcemment, soit la connexion spcifie par la commande SET CONNECTION. C'est aussi la valeur par dfaut si aucun argument n'est donn la commande DISCONNECT.
DEFAULT
Ferme la connexion par dfaut.
ALL
Ferme toutes les connexions ouvertes.
Exemples
int
main(void)
{
EXEC SQL
EXEC SQL
EXEC SQL
EXEC SQL
CONNECT
CONNECT
CONNECT
CONNECT
TO
TO
TO
TO
testdb
testdb
testdb
testdb
AS
AS
AS
AS
return 0;
}
Compatibilit
DISCONNECT est spcifi dans le standard SQL.
Voyez aussi
CONNECT, ???
582
Nom
EXECUTE IMMEDIATE prpare et excute un ordre dynamique
Synopsis
EXECUTE IMMEDIATE chaine
Description
EXECUTE IMMEDIATE prpare et excute immdiatement un ordre SQL spcifi dynamiquement, sans rcuprer les enregistrements du rsultat.
Paramtres
chaine
Une chane C littrale ou une variable hte contenant l'ordre SQL excuter.
Exemples
Voici un exemple qui excute un ordre INSERT en utilisant EXECUTE IMMEDIATE et une variable hte appele commande:
sprintf(commande, "INSERT INTO test (name, amount, letter) VALUES ('db: ''r1''', 1,
'f')");
EXEC SQL EXECUTE IMMEDIATE :commande;
Compatibility
EXECUTE IMMEDIATE est spcifi dans le standard SQL.
583
Nom
GET DESCRIPTOR rcupre des informations d'une zone de descripteur SQL
Synopsis
GET DESCRIPTOR nom_descripteur :cvariable = element_entete_descripteur [, ... ]
GET DESCRIPTOR nom_descripteur VALUE numero_colonne :cvariable = element_descripteur [,
... ]
Description
GET DESCRIPTOR rcupre des informations propos du rsultat d'une requte partir d'une zone de descripteur SQL et les
stocke dans des variables htes. Une zone de descripteur est d'ordinaire remplie en utilisant FETCH ou SELECT avant d'utiliser
cette commande pour transfrer l'information dans des variables du langage hte.
Cette commande a deux formes: la premire forme rcupre les objets de l'entte du descripteur, qui s'appliquent au jeu de rsultat dans son ensemble. Un exemple est le nombre d'enregistrements. La seconde forme, qui ncessite le nombre de colonnes
comme paramtre additionnel, rcupre des informations sur une colonne particulire. Par exemple, le type de la colonne, et la valeur relle de la colonne.
Paramtres
nom_descripteur
Un nom de descripteur.
element_entete_descripteur
Un marqueur identifiant de quel objet de l'entte rcuprer l'information. Seul COUNT, qui donne le nombre de colonnes dans
le rsultat, est actuellement support.
numero_colonne
Le numro de la colonne propos duquel on veut rcuprer des informations. Le compte commence 1.
element_descripteur
Un marqueur identifiant quel lment d'information rcuprer d'une colonne. Voyez Section 33.7.1, Zones de Descripteur
SQL nommes pour une liste d'objets supports.
cvariable
Une variable hte qui recevra les donnes rcupres de la zone de descripteur.
Exemples
Un exemple de rcupration du nombre de colonnes dans un rsultat:
EXEC SQL GET DESCRIPTOR d :d_count = COUNT;
Un exemple de rcupration de la longueur des donnes de la premire colonne:
EXEC SQL GET DESCRIPTOR d VALUE 1 :d_returned_octet_length = RETURNED_OCTET_LENGTH;
Un exemple de rcupration des donnes de la seconde colonne en tant que chane:
EXEC SQL GET DESCRIPTOR d VALUE 2 :d_data = DATA;
Voici un exemple pour la procdure complte, lors de l'excution de SELECT current_database(); et montrant le nombre
de colonnes, la longueur de la colonne, et la donnes de la colonne:
int
main(void)
{
EXEC SQL BEGIN DECLARE SECTION;
int d_count;
584
char d_data[1024];
int d_returned_octet_length;
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT TO testdb AS con1 USER testuser;
EXEC SQL ALLOCATE DESCRIPTOR d;
/* Dclarer un curseur, l'ouvrir, et assigner un descripteur au curseur */
EXEC SQL DECLARE cur CURSOR FOR SELECT current_database();
EXEC SQL OPEN cur;
EXEC SQL FETCH NEXT FROM cur INTO SQL DESCRIPTOR d;
/* Rcuprer le nombre total de colonnes */
EXEC SQL GET DESCRIPTOR d :d_count = COUNT;
printf("d_count
= %d\n", d_count);
/* Rcuprer la longueur d'une colonne retourne */
EXEC SQL GET DESCRIPTOR d VALUE 1 :d_returned_octet_length = RETURNED_OCTET_LENGTH;
printf("d_returned_octet_length = %d\n", d_returned_octet_length);
/* Rcuprer la conlonne retourne en tant que chane */
EXEC SQL GET DESCRIPTOR d VALUE 1 :d_data = DATA;
printf("d_data
= %s\n", d_data);
/* Fermer */
EXEC SQL CLOSE cur;
EXEC SQL COMMIT;
EXEC SQL DEALLOCATE DESCRIPTOR d;
EXEC SQL DISCONNECT ALL;
return 0;
}
Quand l'exemple est excut, son rsultat ressemble ceci:
d_count
= 1
d_returned_octet_length = 6
d_data
= testdb
Compatibilit
GET DESCRIPTOR est spcifi dans le standard SQL.
Voir aussi
ALLOCATE DESCRIPTOR, SET DESCRIPTOR
585
Nom
OPEN ouvre un curseur dynamique
Synopsis
OPEN nom_curseur
OPEN nom_curseur USING valeur [, ... ]
OPEN nom_curseur USING SQL DESCRIPTOR nom_descripteur
Description
OPEN ouvre un curseur et optionnellement lie (bind) les valeurs aux conteneurs (placeholders) dans la dclaration du curseur. Le
curseur doit pralablement avoir t dclar avec la commande DECLARE. L'excution d'OPEN dclenche le dbut de
l'excution de la requte sur le serveur.
Paramtres
nom_curseur
Le nom du curseur ouvrir. Cela peut tre un identifiant SQL ou une variable hte.
valeur
Une valeur lier au placeholder du curseur. Cela peut tre une constante SQL, une variable hte, ou une variable hte avec
indicateur.
nom_descripteur
Le nom du descripteur contenant les valeurs attacher aux placeholders du curseur. Cela peut tre un identifiant SQL ou une
variable hte.
Exemples
EXEC
EXEC
EXEC
EXEC
SQL
SQL
SQL
SQL
OPEN
OPEN
OPEN
OPEN
a;
d USING 1, 'test';
c1 USING SQL DESCRIPTOR mydesc;
:curname1;
Compatibilit
OPEN est spcifie dans le standard SQL.
Voir aussi
DECLARE, CLOSE(7)
586
Nom
PREPARE prpare un ordre pour son excution
Synopsis
PREPARE nom FROM chane
Description
PREPARE prpare l'excution d'un ordre spcifi dynamiquement sous forme d'une chane. C'est diffrent des ordres SQL directs
PREPARE(7), qui peuvent aussi tre utiliss dans des programmes embarqus. La commande EXECUTE(7) peut tre utilise
pour excuter les deux types de requtes prpares.
Paramtres
nom_prepare
Un identifiant pour la requte prpare.
chane
Une chane littrale C ou une variable hte contenant un ordre SQL prparable, soit SELECT, INSERT, UPDATE ou DELETE.
Exemples
char *stmt = "SELECT * FROM test1 WHERE a = ? AND b = ?";
EXEC SQL ALLOCATE DESCRIPTOR outdesc;
EXEC SQL PREPARE foo FROM :stmt;
EXEC SQL EXECUTE foo USING SQL DESCRIPTOR indesc INTO SQL DESCRIPTOR outdesc;
Compatibilit
PREPARE est spcifi dans le standard SQL.
Voir aussi
CONNECT, DISCONNECT
587
Nom
SET DESCRIPTOR positionne des informations dans une zone de descripteur SQL
Synopsis
SET DESCRIPTOR nom_descripteur objet_entete_descripteur = valeur [, ... ]
SET DESCRIPTOR nom_descripteur VALUE numero objet_descripteur = valeur [, ...]
Description
SET DESCRIPTOR remplit une zone de descripteur SQL de valeurs. La zone de descripteur est habituellement utilise pour lier
les paramtres lors d'une excution de requte prpare
Cette commande a deux formes: la premire forme s'applique l' entte du descripteur, qui est indpendant des donnes spcifiques. La seconde forme assigne des valeurs aux donnes, identifies par un numro.
Paramtres
nom_descripteur
Un nom de descripteur.
objet_entete_descripteur
Un identifiant pour spcifier quelle information de l'entte est concerne. Seul COUNT, qui sert indiquer le nombre de descripteurs, est support pour le moment.
number
Le numro de l'objet du descripteur modifier. Le compte commence 1.
objet_descripteur
Un identifiant spcifiant quelle information du descripteur est concerne. Voyez Section 33.7.1, Zones de Descripteur SQL
nommes pour une liste des identifiants supports.
valeur
Une valeur stocker dans l'objet descripteur. Cela peut tre une constante SQL ou une variable hte.
Exemples
EXEC
EXEC
EXEC
EXEC
EXEC
SQL
SQL
SQL
SQL
SQL
SET
SET
SET
SET
SET
DESCRIPTOR
DESCRIPTOR
DESCRIPTOR
DESCRIPTOR
DESCRIPTOR
indesc
indesc
indesc
indesc
indesc
COUNT
VALUE
VALUE
VALUE
VALUE
=
1
1
2
2
1;
DATA = 2;
DATA = :val1;
INDICATOR = :val1, DATA = 'some string';
INDICATOR = :val2null, DATA = :val2;
Compatibilit
SET DESCRIPTOR est spcifi dans le standard SQL.
Voyez aussi
ALLOCATE DESCRIPTOR, GET DESCRIPTOR
588
Nom
TYPE dfinit un nouveau type de donnes
Synopsis
TYPE nom_type IS ctype
Description
La commande TYPE dfinit un nouveau type C. C'est quivalent mettre un typedef dans une section declare.
Cette commande n'est reconnue que quand ecpg est excute avec l'option -c.
Paramtres
nom_type
Le nom du nouveau type. Ce doit tre un nom de type valide en C.
ctype
Une spcification de type C.
Exemples
EXEC SQL TYPE customer IS
struct
{
varchar name[50];
int
phone;
};
EXEC SQL TYPE cust_ind IS
struct ind
{
short
name_ind;
short
phone_ind;
};
EXEC
EXEC
EXEC
EXEC
EXEC
SQL
SQL
SQL
SQL
SQL
TYPE
TYPE
TYPE
TYPE
TYPE
c IS char reference;
ind IS union { int integer; short smallint; };
intarray IS int[AMOUNT];
str IS varchar[BUFFERSIZ];
string IS char[11];
Compatibilit
La commande TYPE est une extension PostgreSQL.
590
Nom
VAR dfinit une variable
Synopsis
VAR nomvar IS ctype
Description
La commande VAR affecte un nouveau type de donnes C une variable hte. La variable de l'hte doit avoir t dfini pralablement dans une section declare.
Parameters
nomvar
Un nom de variable C.
ctype
Une spcification de type C.
Exemples
Exec sql begin declare section;
short a;
exec sql end declare section;
EXEC SQL VAR a IS int;
Compatibilit
La commande VAR est une extension PostgreSQL.
591
Nom
WHENEVER spcifie l'action effectuer quand un ordre SQL entrane le dclenchement d'une classe d'exception
Synopsis
WHENEVER { NOT FOUND | SQLERROR | SQLWARNING } action
Description
Dfinit un comportement qui sera appel dans des cas spciaux ( enregistrements non trouvs, avertissements ou erreurs SQL)
dans le rsultat de l'excution SQL.
Paramtres
Voyez Section 33.8.1, Mettre en Place des Callbacks pour une description des paramtres.
Exemples
EXEC
EXEC
EXEC
EXEC
EXEC
EXEC
EXEC
EXEC
EXEC
EXEC
EXEC
SQL
SQL
SQL
SQL
SQL
SQL
SQL
SQL
SQL
SQL
SQL
WHENEVER
WHENEVER
WHENEVER
WHENEVER
WHENEVER
WHENEVER
WHENEVER
WHENEVER
WHENEVER
WHENEVER
WHENEVER
Une application classique est l'utilisation de WHENEVER NOT FOUND BREAK pour grer le bouclage sur des jeux de rsultats:
int
main(void)
{
EXEC SQL
EXEC SQL
EXEC SQL
EXEC SQL
Compatibilit
WHENEVER est spcifi dans le standard SQL, mais la plupart des actions sont des extensions PostgreSQL.
592
Note
Il ne doit par y avoir d'espace entre le $ et la directive de prprocesseur qui le suit, c'est dire include, define,
ifdef, etc. Sinon, le prprocesseur comprendra le mot comme une variable hte.
Il y a deux modes de compatibilit: INFORMIX, INFORMIX_SE
Quand vous liez des programmes qui sont dans ce mode de compatibilit, rappelez vous de lier avec libcompat qui est fournie
avec ECPG.
En plus du sucre syntaxique expliqu prcdemment, le mode de compatibilit Informix porte d'ESQL vers ECPG quelques
fonctions pour l'entre, la sortie et la transformation des donnes, ainsi que pour le SQL embarqu.
Le mode de compatibilit Informix est fortement connect la librairie pgtypeslib d'ECPG. pgtypeslib met en correspondance
les types de donnes SQL et les types de donnes du programme hte C et la plupart des fonctions additionnelles du mode de
compatibilit Informix vous permettent de manipuler ces types C des programmes htes. Notez toutefois que l'tendue de cette
compatibilit est limite. Il n'essaye pas de copier le comportement d'Informix; il vous permet de faire plus ou mois les mmes
oprations et vou fournit des fonctions qui ont le mme nom et ont la base le mme comportement, mais ce n'est pas un produit
de remplacement transparent si vous utilisez Informix l'heure actuelle. De plus, certains types de donnes sont diffrents. Par
exemple, les types datetime et interval de PostgreSQL ne savent pas traiter des ranges comme par exemple YEAR TO
MINUTE, donc vous n'aurez pas de support pour cela dans ECPG non plus.
FREE nom_curseur
En raison des diffrences sur la faon dont ECPG fonctionne par rapport l'ESQL/C d'Informix (c'est dire quelles tapes
sont purement des transformations grammaticales et quelles tapes s'appuient sur la librairie sous-jacente), il n'y a pas d'ordre
FREE nom_curseur dans ECPG. C'est parce que, dans ECPG, DECLARE CURSOR ne gnre pas un appel de fonction
la librairie qui utilise le nom du curseur. Ce qui implique qu'il n'y a pas grer les curseurs SQL l'excution dans la librairie
ECPG, seulement dans le serveur PostgreSQL.
FREE nom_requete
593
sqlvar_t;
sqlda_t;
et
le
test
de
non-rgression
src/inter-
1, si la valeur pointe par arg1 est plus grande que celle pointe par arg2.
-1 si la valeur pointe par arg1 est plus petite que la valeur pointe par arg2.
deccopy
Copie une valeur decimal.
void deccopy(decimal *src, decimal *target);
La fonction reoin un pointeur vers la valeur decimal qui doit tre copie comme premier argument (src) et un pointeur vers
la structure de type decimale cible (target) comme second argument.
deccvasc
Convertit une valeur de sa reprsentation ASCII vers un type decimal.
int deccvasc(char *cp, int len, decimal *np);
La fonction reoit un pointeur vers une chane qui contient la reprsentation chane du nombre convertir (cp) ainsi que sa
longueur len. np est un pointeur vers la valeur decimal dans laquelle sauver le rsultat de l'opration.
Voici quelques formats valides: -2, .794, +3.44, 592.49E07 ou -32.84e-4.
La fonction retourne 0 en cas de succs. Si un dpassement ou un soupassement se produisent,
ECPG_INFORMIX_NUM_OVERFLOW ou ECPG_INFORMIX_NUM_UNDERFLOW est retourn. Si la reprsentation ASCII
n'a pas pu tre interprte, ECPG_INFORMIX_BAD_NUMERIC est retourn ou ECPG_INFORMIX_BAD_EXPONENT si le
596
597
598
La fonction reoit la reprsentation textuelle d'une date convertir (str) et un pointeur vers une variable de type date (d).
Cette fonction ne vous permet pas de fournir un masque de formatage. Il utilise le format par dfaut d'Informix qui est mm/
dd/yyyy. En interne, cette fonction est implmente au travers de rdefmtdate. Par consquent, rstrdate n'est pas
plus rapide et si vous avez le choix, vous devriez opter pour rdefmtdate, qui vous permet de spcifier le masque de formatage explicitement.
La fonction retourne les mmes valeurs que rdefmtdate.
rtoday
Rcupre la date courante.
void rtoday(date *d);
La fonction reoit un poiteur vers une variable de type date (d) qu'elle positionne la date courante.
En interne, cette fonction utilise la fonction PGTYPESdate_today.
rjulmdy
Extrait les valeurs pour le jour, le mois et l'anne d'une variable de type date.
int rjulmdy(date d, short mdy[3]);
La fonction reoit la date d et un pointeur vers un tableau de 3 entiers courts mdy. Le nom de la variable indique l'ordre squentiel: mdy[0] contiendra le numro du mois, mdy[1] contiendra le numro du jour, et mdy[2] contiendra l'anne.
La fonction retourne toujours 0 pour le moment.
En interne, cette fonction utilise la fonction PGTYPESdate_julmdy.
rdefmtdate
Utilise un masque de formatage pour convertir une chane de caractre vers une valeur de type date.
int rdefmtdate(date *d, char *fmt, char *str);
La fonction reoit un pointeur vers une valeur date qui devra contenir le rsultat de l'opration (d), le masque de formatage
utiliser pour traiter la date (fmt) et la chane de caractre char* C qui contient la reprsentation textuelle de la date (str). La
reprsentation textuelle doit correspondre au masque de formatage. La fonction n'analyse qu'en ordre squentiel et recherche
les littraux yy ou yyyy qui indiquent la position de l'anne, mm qui indique la position du mois et dd qui indique la position
du jour.
La fonction retourne les valeurs suivantes:
ECPG_INFORMIX_ENOSHORTDATE - La date ne contient pas de dlimiteur entre le jour, le mois et l'anne. Dans ce
cas, la chane en entre doit faire exactement 6 ou 8 caractres, mais ce n'est pas le cas.
En interne, cette fonction est implmente en utilisant la fonction PGTYPESdate_defmt_asc. Voyez la rfrence cet
endroi pour la table d'exemples.
rfmtdate
Convertit une variable de type date vers sa reprsentation textuelle en utilisant un masque de formatage.
int rfmtdate(date d, char *fmt, char *str);
La fonction reoin une date convertir (d), le masque de formatage (fmt) et la chane qui contiendra la reprsentation textuelle de la date (str).
La fonction retourne 0 en cas de succs et une valeur ngative
En interne, cette fonction utilise la fonction PGTYPESdate_fmt_asc, voyez la rfrence pour des exemples.
599
rmdyjul
Cre une valeur date partir d'un tableau de 3 entiers courts qui spcifient le jour, le mois et l'anne de la date.
int rmdyjul(short mdy[3], date *d);
La fonction reoit le tableau des 3 entiers courst (mdy) et un pointeur vers une variable de type date qui contiendra le rsultat
de l'opration.
La fonction retourne toujours 0 l'heure actuelle.
En interne la fonction est implmente en utilisante la fonction PGTYPESdate_mdyjul.
rdayofweek
Retourne un nombre reprsentant le jour de la semaine pour une valeur de date.
int rdayofweek(date d);
La fonction reoit la variable date d comme seul argument et retourne un entier qui indique le jour de la semaine pour cette
date.
0 - Dimanche
1 - Lundi
2 - Mardi
3 - Mercredi
4 - Jeudi
5 - Vendredi
6 - Samedi
& (ampersand) - si cette position tait blanc sans cela, mettez y un zro.
, (virgule) - Groupe les nombres de 4 chiffres ou plus en groupes de 3 chiffres spars par des virgules.
( - ceci remplace le signe moins devant une valeur ngative. Le signe moins n'apparatra pas.
601
$ - le symbole montaire.
rupshift
Passe une chane en majuscule.
void rupshift(char *str);
La fonction reoit un pointeur vers une chane et convertit tous ses caractres en majuscules.
byleng
Retourne le nombre de caracres dans une chane sans compter les blancs finaux.
int byleng(char *str, int len);
La fonction attend une chane de longueur fixe comme premier argument (str) et sa longueur comme second argument
(len). Elle retourne le nombre de caractres significatifs, c'est dire la longueur de la chane sans ses blancs finaux.
ldchar
Copie une chane de longueur fixe vers une chane termine par un NUL.
void ldchar(char *src, int len, char *dest);
La fonction reoit la chane de longueur fixe copier (src), sa longueur (len) et un pointeur vers la mmoire destinataire
(dest). Notez que vous aurez besoin de rserver au moins len+1 octets pour la chaine vers laquelle pointe dest. Cette
fonction copie au plus len octets vers le nouvel emplacement (moins si la chane source a des blancs finaux) et ajoute le terminateur NUL.
rgetmsg
int rgetmsg(int msgnum, char *s, int maxsize);
Cette fonction existe mais n'est pas implmente pour le moment!
rtypalign
int rtypalign(int offset, int type);
Cette fonction existe mais n'est pas implmente pour le moment!
rtypmsize
int rtypmsize(int type, int len);
Cette fonction existe mais n'est pas implmente pour le moment!
rtypwidth
int rtypwidth(int sqltype, int sqllen);
Cette fonction existe mais n'est pas implmente pour le moment!
rsetnull
Set a variable to NULL.
int rsetnull(int t, char *ptr);
La fonction reoit un entier qui indique le type de variable et un pointeur vers la variable elle mme, transtyp vers un pointeur char*.
The following types exist:
";
";
ECPG_INFORMIX_BAD_MONTH
Les fonctions retournent cette valeur si une mauvaise valeur pour un mois a t trouve lors de l'analyse d'une date. En interne
elle est dfinie -1205 (la dfinition Informix).
ECPG_INFORMIX_BAD_DAY
Les fonctions retournent cette valeur si une mauvaise valeur pour un jour a t trouve lors de l'analyse d'une date. En interne
elle est dfinie -1206 (la dfinition Informix).
ECPG_INFORMIX_ENOSHORTDATE
Les fonctions retournent cette valeur si une routine d'analyse a besoin d'une reprsentation courte de date mais que la chane
passe n'tait pas de la bonne longueur. En interne elle est dfinie -1206 (la dfinition Informix).
ECPG_INFORMIX_DATE_CONVERT
Les fonctions retournent cette valeur si une erreur s'est produite durant un formatage de date. En interne, elle est dfinie 1210 (la dfinition Informix).
ECPG_INFORMIX_OUT_OF_MEMORY
Les fonctions retournent cette valeur si elles se sont retrouves court de mmoire durant leur fonctionnement. En interne,
elle est dfinie -1211 (la dfinition Informix).
ECPG_INFORMIX_ENOTDMY
Les fonctions retournent cette valeur si la routine d'analyse devait recevoir un masque de formatage (comme mmddyy) mai
que tous les champs n'taient pas lists correctement. En interne, elle est dfinie -1212 (la dfinition Informix).
ECPG_INFORMIX_BAD_NUMERIC
Les fonctions retournent cette valeur soit parce qu'une routine d'analyse ne peut pas analyser la reprsentation textuelle d'une
valeur numrique parce qu'elle contient des erreurs, soit parce qu'une routine ne peut pas terminer un calcul impliquant des
variables numeric parce qu'au moins une des variables numeric est invalide. En interne, elle est dfinie -1213 (la dfinition
Informix).
ECPG_INFORMIX_BAD_EXPONENT
Les fonctions retournent cette valeur si elles n'ont pas russi analyser l'exposant de la reprsentation textuelle d'une valeur
numrique. En interne, elle est dfinie -1216 (la dfinition Informix).
ECPG_INFORMIX_BAD_DATE
Les fonctions retournent cette valeur si une chane de date invalide leur a t passe. En interne, elle est dfinie -1218 (la dfinition Informix).
ECPG_INFORMIX_EXTRA_CHARS
Les fonctions retournent cette valeur si trop de caractres ont t trouvs dans la reprsentation textuelle d'un format date. En
interne, elle est dfinie -1264 (la dfinition Informix).
connues au moment de la compilation mais qui doivent tout de mme faire partie de la commande. Aux endroits o ces variables doivent tre positionnes, la chane contient des ?.
Variables d'Entre
Chaque variable d'entre entrane la cration de dix arguments. (Voir plus bas.)
ECPGt_EOIT
Un enum annonant qu'il n'y a pas de variable d'entres supplmentaires.
Variables de Sortie
Chaque variable de sortie entrane la cration de dix arguments. (Voir plus bas.) Ces variables sont renseignes par la fonction.
ECPGt_EORT
Un enum annonant qu'il n'y a plus de variables.
Pour chaque variable qui fait partie d'une commande SQL, la fonction reoit dix arguments:
1. Le type sous forme de symbole spcial.
2. Un pointeur vers la valeur ou un pointeur vers le pointeur.
3. La taille de la variable si elle est char ou varchar.
4. Le nombre d'lments du tableau (pour les fetch sur tableau).
5. Le dcalage vers le prochain lment du tableau (pour les fetch sur tableau).
6. Le type de la variable indicateur sous forme de symbole special.
7. Un pointeur vers la variable indicateur.
8. 0
9. Le nombre d'lments du tableau d'indicateurs (pour les fetch sur tableau).
10 Le dcalage vers le prochain lment du tableau d'indicateurs (pour les fetch sur tableau).
.
Notez que toutes les commandes SQL ne sont pas traites de cette faon. Par exemple, un ordre d'ouverture de curseur comme:
Notez que toutes les commandes SQL ne sont pas traites de cette faon. Par exemple, un ordre d'ouverture de curseur comme:
EXEC SQL OPEN cursor;
n'est pas copi vers la sortie. la place, la commande de curseur DECLARE est utilise l'endroit de la commande OPEN parce
qu'elle ouvre effectivement le curseur.
Voici un exemple complet expliquant la sortie du prprocesseur sur un fichier foo.pgc (quelques dtails pourraient changer en
fonction de la version exacte du prprocesseur):
EXEC SQL BEGIN DECLARE SECTION;
int index;
int result;
EXEC SQL END DECLARE SECTION;
...
EXEC SQL SELECT res INTO :result FROM mytable WHERE index = :index;
is translated into:
/* Processed by ecpg (2.6.0) */
/* These two include files are added by the preprocessor */
#include <ecpgtype.h>;
#include <ecpglib.h>;
/* exec sql begin declare section */
#line 1 "foo.pgc"
int index;
int result;
/* exec sql end declare section */
605
...
ECPGdo(__LINE__, NULL, "SELECT res FROM mytable WHERE index = ?
ECPGt_int,&(index),1L,1L,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(result),1L,1L,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 147 "foo.pgc"
",
(L'indentation est ajoute ici pour amliorer la lisibilit et n'est pas quelque chose que le prprocesseur effectue).
606
Note
En demandant des informations sur les contraintes dans la base de donnes, il est possible qu'une requte
conforme au standard s'attendant ne rcuprer qu'une ligne en rcupre en fait plusieurs. Ceci est d au fait que
le standard SQL requiert que les noms des contraintes soient uniques dans un mme schma mais PostgreSQL
ne force pas cette restriction. Les noms de contraintes crs automatiquement par PostgreSQL vitent les doublons dans le le mme schma mais les utilisateurs peuvent spcifier explicitement des noms existant dj.
Ce problme peut apparatre lors de la consultation de vues du schma d'informations, comme par exemple
check_constraint_routine_usage, check_constraints, domain_constraints et referential_constraints. Certaines autres vues ont des problmes similaires mais contiennent le nom de la
table pour aider distinguer les lignes dupliques, par exemple constraint_column_usage,
constraint_table_usage, table_constraints.
34.1. Le schma
Le schma d'information est lui-mme un schma nomm information_schema. Ce schma existe automatiquement dans
toutes les bases de donnes. Le propritaire de ce schma est l'utilisateur initial du cluster. Il a naturellement tous les droits sur
ce schma, dont la possibilit de le supprimer (mais l'espace gagn ainsi sera minuscule).
Par dfaut, le schma d'information n'est pas dans le chemin de recherche des schmas. Il est donc ncessaire d'accder tous
les objets qu'il contient via des noms qualifis. Comme les noms de certains objets du schma d'information sont des noms gnriques pouvant survenir dans les applications utilisateur, il convient d'tre prudent avant de placer le schma d'information
dans le chemin.
607
Schma d'information
34.3. information_schema_catalog_name
information_schema_catalog_name est une table qui contient en permanence une ligne et une colonne contenant le nom
de la base de donnes courante (catalogue courant dans la terminologie SQL).
Tableau 34.1. Colonnes de information_schema_catalog_name
Nom
Type de donnes
Description
catalog_name
sql_identifier
34.4. administrable_role_authorizations
La vue administrable_role_authorizations identifie tous les rles pour lesquelles l'utilisateur courant possde
l'option ADMIN.
Tableau 34.2. Colonnes de administrable_role_authorizations
Nom
Type de donnes
Description
grantee
sql_identifier
Nom du rle pour lequel cette appartenance de rle a t donne (peut tre
l'utilisateur courant ou un rle diffrent
dans le cas d'appartenances de rles imbriques).
role_name
sql_identifier
is_grantable
yes_or_no
Toujours YES
34.5. applicable_roles
La vue applicable_roles identifie tous les rles dont l'utilisateur courant peut utiliser les droits. Cela signifie qu'il y a certaines chanes de donnation des droits de l'utilisateur courant au rle en question. L'utilisateur lui-mme est un rle applicable.
L'ensemble de rles applicables est habituellement utilis pour la vrification des droits.
Tableau 34.3. Colonnes de applicable_roles
Nom
Type de donnes
Description
grantee
sql_identifier
role_name
sql_identifier
is_grantable
yes_or_no
34.6. attributes
La vue attributes contient des informations sur les attributs des types de donnes composites dfinis dans la base. (La vue ne
donne pas d'informations sur les colonnes de table, qui sont quelque fois appeles attributs dans le contexte de PostgreSQL.)
Tableau 34.4. Colonnes de attributes
Nom
Type de donnes
Description
udt_catalog
sql_identifier
udt_schema
sql_identifier
Schma d'information
Nom
Type de donnes
Description
udt_name
sql_identifier
attribute_name
sql_identifier
Nom de l'attribut
ordinal_position
cardinal_number
attribute_default
character_data
is_nullable
yes_or_no
data_type
character_data
character_maximum_length
cardinal_number
character_octet_length
cardinal_number
character_set_catalog
sql_identifier
character_set_schema
sql_identifier
character_set_name
sql_identifier
collation_catalog
sql_identifier
collation_schema
sql_identifier
collation_name
sql_identifier
numeric_precision
cardinal_number
numeric_precision_radix
cardinal_number
numeric_scale
cardinal_number
Schma d'information
Nom
Type de donnes
Description
pour cet attribut. L'chelle indique le
nombre de chiffres significatifs droite du
point dcimal. Elle peut tre exprime en
dcimal (base 10) ou en binaire (base 2)
comme le prcise la colonne numeric_precision_radix. Pour tous
les autres types de donnes, cette colonne
est NULL.
datetime_precision
cardinal_number
interval_type
character_data
interval_precision
character_data
attribute_udt_catalog
sql_identifier
attribute_udt_schema
sql_identifier
attribute_udt_name
sql_identifier
scope_catalog
sql_identifier
scope_schema
sql_identifier
scope_name
sql_identifier
maximum_cardinality
cardinal_number
Toujours NULL car les tableaux ont toujours une cardinalit maximale dans PostgreSQL
dtd_identifier
sql_identifier
is_derived_reference_attribu yes_or_no
te
Voir aussi dans Section 34.15, columns , une vue structure de faon similaire, pour plus d'informations sur certaines colonnes.
34.7. character_sets
La vue character_sets identifie les jeux de caractres disponibles pour la base de donnes courante. Comme PostgreSQL ne
supporte pas plusieurs jeux de caractres dans une base de donnes, cette vue n'en affiche qu'une, celle qui correspond
l'encodage de la base de donnes.
Les termes suivants sont utiliss dans le standard SQL :
610
Schma d'information
Nom
Type de donnes
Description
character_set_catalog
sql_identifier
Les jeux de caractres ne sont pas actuellement implments comme des objets du
schma, donc cette colonne est NULL.
character_set_schema
sql_identifier
Les jeux de caractres ne sont pas actuellement implments comme des objets du
schma, donc cette colonne est NULL.
character_set_name
sql_identifier
character_repertoire
sql_identifier
form_of_use
sql_identifier
default_collate_catalog
sql_identifier
default_collate_schema
sql_identifier
default_collate_name
sql_identifier
34.8. check_constraint_routine_usage
La vue check_constraint_routine_usage identifie les routines (fonctions et procdures) utilises par une contrainte de
vrification. Seules sont prsentes les routines qui appartiennent un rle couramment actif.
Tableau 34.6. Colonnes de check_constraint_routine_usage
611
Schma d'information
Nom
Type de donnes
Description
constraint_catalog
sql_identifier
constraint_schema
sql_identifier
constraint_name
sql_identifier
Nom de la contrainte
specific_catalog
sql_identifier
specific_schema
sql_identifier
specific_name
sql_identifier
34.9. check_constraints
La vue check_constraints contient toutes les contraintes de vrification dfinies sur une table ou un domaine, possdes par
un rle couramment actif (le propritaire d'une table ou d'un domaine est le propritaire de la contrainte).
Tableau 34.7. Colonnes de check_constraints
Nom
Type de donnes
Description
constraint_catalog
sql_identifier
constraint_schema
sql_identifier
constraint_name
sql_identifier
Nom de la contrainte
check_clause
character_data
34.10. collations
La vue collations contient les collationnements disponibles dans la base de donnes courante.
Tableau 34.8. Colonnes de collations
Nom
Type de donnes
Description
collation_catalog
sql_identifier
collation_schema
sql_identifier
collation_name
sql_identifier
pad_attribute
character_data
34.11. collation_character_set_applicability
La vue collation_character_set_applicability identifie les jeux de caractres applicables aux collationnements
disponibles. Avec PostgreSQL, il n'existe qu'un jeu de caractres par base de donnes (voir les explications dans Section 34.7,
character_sets ), donc cette vue ne fournit pas beaucoup d'informations utiles.
Tableau 34.9. Colonnes de collation_character_set_applicability
Nom
Type de donnes
Description
collation_catalog
sql_identifier
612
Schma d'information
Nom
Type de donnes
Description
collationnement (toujours la base de donnes courante)
collation_schema
sql_identifier
collation_name
sql_identifier
character_set_catalog
sql_identifier
Les jeux de caractres ne sont pas actuellement implments comme des objets du
schma, donc cette colonne est NULL.
character_set_schema
sql_identifier
Les jeux de caractres ne sont pas actuellement implments comme des objets du
schma, donc cette colonne est NULL.
character_set_name
sql_identifier
34.12. column_domain_usage
La vue column_domain_usage identifie toutes les colonnes (d'une table ou d'une vue) utilisant un domaine dfini dans la
base de donnes courante et possd par un rle couramment actif.
Tableau 34.10. Colonnes de column_domain_usage
Nom
Type de donnes
Description
domain_catalog
sql_identifier
domain_schema
sql_identifier
domain_name
sql_identifier
Nom du domaine
table_catalog
sql_identifier
table_schema
sql_identifier
table_name
sql_identifier
Nom de la table
column_name
sql_identifier
Nom de la colonne
34.13. column_privileges
La vue column_privileges identifie tous les droits octroys sur les colonnes un rle couramment actif ou par un rle couramment actif. Il existe une ligne pour chaque combinaison colonne, donneur (grantor) et receveur (grantee).
Si un droit a t donn sur une table entire, il s'affichera dans cette vue comme un droit sur chaque colonne, mais seulement pour
les types de droits o la granularit par colonne est possible : SELECT, INSERT, UPDATE, REFERENCES.
Tableau 34.11. Colonnes de column_privileges
Nom
Type de donnes
Description
grantor
sql_identifier
grantee
sql_identifier
table_catalog
sql_identifier
table_schema
sql_identifier
table_name
sql_identifier
column_name
sql_identifier
Nom de la colonne
privilege_type
character_data
Schma d'information
Nom
Type de donnes
Description
is_grantable
yes_or_no
34.14. column_udt_usage
La vue column_udt_usage identifie toutes les colonnes qui utilisent les types de donnes possds par un rle actif. Avec
PostgreSQL, les types de donnes internes se comportent comme des types utilisateur, ils apparaissent aussi ici. Voir aussi la
Section 34.15, columns pour plus de dtails.
Tableau 34.12. Colonnes de column_udt_usage
Nom
Type de donnes
Description
udt_catalog
sql_identifier
udt_schema
sql_identifier
udt_name
sql_identifier
table_catalog
sql_identifier
table_schema
sql_identifier
table_name
sql_identifier
Nom de la table.
column_name
sql_identifier
Nom de la colonne.
34.15. columns
La vue columns contient des informations sur toutes les colonnes de table (et colonnes de vue) de la base. Les colonnes systme
(oid, etc.) ne sont pas incluses. Seules les colonnes auxquelles l'utilisateur a accs (par proprit ou par privilges) sont affiches.
Tableau 34.13. Colonnes de columns
Nom
Type de donnes
Description
table_catalog
sql_identifier
table_schema
sql_identifier
table_name
sql_identifier
Nom de la table
column_name
sql_identifier
Nom de la colonne
ordinal_position
cardinal_number
column_default
character_data
is_nullable
yes_or_no
data_type
character_data
Le type de donnes de la colonne, s'il s'agit d'un type interne ou ARRAY s'il s'agit d'un tableau (dans ce cas, voir la
vue element_types), USER-DEFINED dans les autres
cas (le type est alors identifi dans udt_name et colonnes
associes). Si la colonne est fonde sur un domaine, cette
colonne est une rfrence au type sous-jacent du domaine
(et le domaine est identifi dans domain_name et colonnes associes).
character_maximum_length
cardinal_number
Schma d'information
Nom
Type de donnes
Description
chane de bits, la longueur maximale dclare ; NULL pour
tous les autres types de donnes ou si aucune longueur
maximale n'a t dclare.
character_octet_length
cardinal_number
numeric_precision
cardinal_number
numeric_precision_radix
cardinal_number
numeric_scale
cardinal_number
Si data_type identifie un type numeric exact, cette colonne contient l'chelle (dclare ou implicite) du type pour
ce domaine. L'chelle indique le nombre de chiffres significatifs la droite du point dcimal. Elle peut tre exprime
en dcimal (base 10) ou en binaire (base 2), comme indiqu
dans la colonne numeric_precision_radix. Pour
tous les autres types de donnes, cette colonne est NULL.
datetime_precision
cardinal_number
Si data_type identifie une date, une heure, un horodatage ou un interval, cette colonne contient la prcision en
secondes (dclare ou implicite) pour cet attribut,
c'est--dire le nombre de chiffres dcimaux suivant le point
dcimal de la valeur en secondes. Pour tous les autres types
de donnes, cette colonne est NULL.
interval_type
character_data
interval_precision
character_data
character_set_catalog
sql_identifier
character_set_schema
sql_identifier
character_set_name
sql_identifier
collation_catalog
sql_identifier
collation_schema
sql_identifier
collation_name
sql_identifier
domain_catalog
sql_identifier
Si la colonne a un type domaine, le nom de la base de donnes o le type est dfini (toujours la base de donnes courante), sinon NULL.
domain_schema
sql_identifier
domain_name
sql_identifier
udt_catalog
sql_identifier
Nom de la base de donnes o le type de donnes de la colonne (le type sous-jacent du domaine, si applicable) est dfini (toujours la base de donnes courante).
udt_schema
sql_identifier
Schma d'information
Nom
Type de donnes
Description
type sous-jacent du domaine, si applicable) est dfini.
udt_name
sql_identifier
scope_catalog
sql_identifier
scope_schema
sql_identifier
scope_name
sql_identifier
maximum_cardinality
cardinal_number
Toujours NULL car les tableaux ont toujours une cardinalit maximale illimite avec PostgreSQL.
dtd_identifier
sql_identifier
Un identifiant du descripteur du type de donnes de la colonne, unique parmi les descripteurs de type de donnes
contenus dans la table. Ceci est principalement utile pour
joindre d'autres instances de ces identifiants. (Le format
spcifique de l'identifiant n'est pas dfini et rien ne permet
d'assurer qu'il restera inchang dans les versions futures.)
is_self_referencing
yes_or_no
is_identity
yes_or_no
identity_generation
character_data
identity_start
character_data
identity_increment
character_data
identity_maximum
character_data
identity_minimum
character_data
identity_cycle
yes_or_no
is_generated
character_data
generation_expression
character_data
is_updatable
yes_or_no
Puisqu'en SQL les possibilits de dfinir les types de donnes sont nombreuses, et que PostgreSQL offre des possibilits supplmentaires, leur reprsentation dans le schma d'information peut s'avrer complexe.
La colonne data_type est suppose identifier le type de donnes interne sous-jacent de la colonne. Avec PostgreSQL, cela
signifie que le type est dfini dans le schma du catalogue systme pg_catalog. Cette colonne est utile si l'application sait grer
les types internes (par exemple, formater les types numriques diffremment ou utiliser les donnes dans les colonnes de prcision). Les colonnes udt_name, udt_schema et udt_catalog identifient toujours le type de donnes sous-jacent de la colonne mme si la colonne est base sur un domaine.
Puisque PostgreSQL traite les types internes comme des types utilisateur, les types internes apparaissent aussi ici. Il s'agit d'une
extension du standard SQL.
Toute application conue pour traiter les donnes en fonction du type peut utiliser ces colonnes, car, dans ce cas, il importe peu de
savoir si la colonne est effectivement fonde sur un domaine. Si la colonne est fonde sur un domaine, l'identit du domaine est
616
Schma d'information
stocke dans les colonnes domain_name, domain_schema et domain_catalog. Pour assembler les colonnes avec leurs
types de donnes associs et traiter les domaines comme des types spars, on peut crire coalesce(domain_name,
udt_name), etc.
34.16. constraint_column_usage
La vue constraint_column_usage identifie toutes les colonnes de la base de donnes courante utilises par des contraintes.
Seules sont affiches les colonnes contenues dans une table possde par un rle connect. Pour une contrainte de vrification,
cette vue identifie les colonnes utilises dans l'expression de la vrification. Pour une contrainte de cl trangre, cette vue identifie les colonnes que la cl trangre rfrence. Pour une contrainte d'unicit ou de cl primaire, cette vue identifie les colonnes
contraintes.
Tableau 34.14. Colonnes de constraint_column_usage
Nom
Type de donnes
Description
table_catalog
sql_identifier
table_schema
sql_identifier
Nom du schma contenant la table contenant la colonne utilise par certaines contraintes
table_name
sql_identifier
column_name
sql_identifier
constraint_catalog
sql_identifier
constraint_schema
sql_identifier
constraint_name
sql_identifier
Nom de la contrainte
34.17. constraint_table_usage
La vue constraint_table_usage identifie toutes les tables de la base de donnes courante utilises par des contraintes et
possdes par un rle actuellement activ. (Cela diffre de la vue table_constraints qui identifie toutes les contraintes et la
table o elles sont dfinies.) Pour une contrainte de cl trangre, cette vue identifie la table que la cl trangre rfrence. Pour
une contrainte d'unicit ou de cl primaire, cette vue identifie simplement la table laquelle appartient la contrainte. Les
contraintes de vrification et les contraintes de non nullit (NOT NULL) ne sont pas incluses dans cette vue.
Tableau 34.15. Colonnes de constraint_table_usage
Nom
Type de donnes
Description
table_catalog
sql_identifier
table_schema
sql_identifier
table_name
sql_identifier
constraint_catalog
sql_identifier
constraint_schema
sql_identifier
constraint_name
sql_identifier
Nom de la contrainte
34.18. data_type_privileges
La vue data_type_privileges identifie tous les descripteurs de type de donnes auxquels l'utilisateur a accs, parce qu'il en
est le propritaire ou parce qu'il dispose de quelque droit sur le descripteur. Un descripteur de type de donnes est cr lorsqu'un
type de donnes est utilis dans la dfinition d'une colonne de table, d'un domaine ou d'une fonction (en tant que paramtre ou
617
Schma d'information
code de retour). Il stocke alors quelques informations sur l'utilisation du type de donnes (par exemple la longueur maximale dclare, si applicable). Chaque descripteur de type de donnes se voit affecter un identifiant unique parmi les descripteurs de type
de donnes affects un objet (table, domaine, fonction). Cette vue n'est probablement pas utile pour les applications, mais elle est
utilise pour dfinir d'autres vues dans le schma d'information.
Tableau 34.16. Colonnes de data_type_privileges
Nom
Type de donnes
Description
object_catalog
sql_identifier
object_schema
sql_identifier
object_name
sql_identifier
object_type
character_data
dtd_identifier
sql_identifier
L'identifiant du descripteur de type de donnes, unique parmi les descripteurs de type de donnes pour le mme objet.
34.19. domain_constraints
La vue domain_constraints contient toutes les contraintes appartenant aux domaines dfinis dans la base courante.
Tableau 34.17. Colonnes de domain_constraints
Nom
Type de donnes
Description
constraint_catalog
sql_identifier
constraint_schema
sql_identifier
constraint_name
sql_identifier
Nom de la contrainte
domain_catalog
sql_identifier
domain_schema
sql_identifier
domain_name
sql_identifier
Nom du domaine
is_deferrable
yes_or_no
initially_deferred
yes_or_no
34.20. domain_udt_usage
La vue domain_udt_usage identifie tous les domaines utilisant les types de donnes possds par un rle actif. Sous PostgreSQL, les types de donnes internes se comportent comme des types utilisateur. Ils sont donc inclus ici.
Tableau 34.18. Colonnes de domain_udt_usage
Nom
Type de donnes
Description
udt_catalog
sql_identifier
Nom de la base de donnes de dfinition du type de donnes domaine (toujours la base de donnes courante)
udt_schema
sql_identifier
udt_name
sql_identifier
domain_catalog
sql_identifier
Schma d'information
Nom
Type de donnes
Description
domain_schema
sql_identifier
domain_name
sql_identifier
Nom du domaine
34.21. domains
La vue domains contient tous les domaines dfinis dans la base de donnes courante.
Tableau 34.19. Colonnes de domains
Nom
Type de donnes
Description
domain_catalog
sql_identifier
domain_schema
sql_identifier
domain_name
sql_identifier
Nom du domaine
data_type
character_data
character_maximum_length
cardinal_number
Si le domaine a un type caractre ou chane de bits, la longueur maximale dclare ; NULL pour tous les autres types
de donnes ou si aucune longueur maximale n'a t dclare.
character_octet_length
cardinal_number
character_set_catalog
sql_identifier
character_set_schema
sql_identifier
character_set_name
sql_identifier
collation_catalog
sql_identifier
collation_schema
sql_identifier
collation_name
sql_identifier
numeric_precision
cardinal_number
numeric_precision_radix
cardinal_number
numeric_scale
cardinal_number
Schma d'information
Nom
Type de donnes
Description
autres types de donnes, cette colonne est NULL.
datetime_precision
cardinal_number
interval_type
character_data
interval_precision
character_data
domain_default
character_data
udt_catalog
sql_identifier
udt_schema
sql_identifier
udt_name
sql_identifier
scope_catalog
sql_identifier
scope_schema
sql_identifier
scope_name
sql_identifier
maximum_cardinality
cardinal_number
Toujours NULL car les tableaux n'ont pas de limite maximale de cardinalit dans PostgreSQL
dtd_identifier
sql_identifier
Un identifiant du descripteur de type de donnes du domaine, unique parmi les descripteurs de type de donnes
restant dans le domaine (ce qui est trivial car un domaine
contient seulement un descripteur de type de donnes). Ceci
est principalement utile pour joindre d'autres instances de
tels identifiants (le format spcifique de l'identifiant n'est
pas dfini et il n'est pas garanti qu'il restera identique dans
les versions futures).
34.22. element_types
La vue element_types contient les descripteurs de type de donnes des lments de tableaux. Lorsqu'une colonne de table,
domaine, paramtre de fonction ou code de retour de fonction est dfinie comme un type tableau, la vue respective du schma
d'information contient seulement ARRAY dans la colonne data_type. Pour obtenir des informations sur le type d'lment du tableau, il est possible de joindre la vue respective avec cette vue. Par exemple, pour afficher les colonnes d'une table avec les types
de donnes et les types d'lment de tableau, si applicable, on peut crire :
SELECT c.column_name, c.data_type, e.data_type AS element_type
FROM information_schema.columns c LEFT JOIN information_schema.element_types e
ON ((c.table_catalog, c.table_schema, c.table_name, 'TABLE', c.dtd_identifier)
= (e.object_catalog, e.object_schema, e.object_name, e.object_type,
e.collection_type_identifier))
WHERE c.table_schema = '...' AND c.table_name = '...'
ORDER BY c.ordinal_position;
Cette vue n'inclut que les objets auxquels l'utilisateur courant a accs, parce que propritaire ou disposant de quelque privilge.
Tableau 34.20. Colonnes de element_types
Nom
Type de donnes
Description
object_catalog
sql_identifier
object_schema
sql_identifier
object_name
sql_identifier
object_type
character_data
Schma d'information
Nom
Type de donnes
Description
ROUTINE (le tableau est utilis par un paramtre ou le type
du code de retour de cette fonction).
collection_type_identifier
sql_identifier
data_type
character_data
character_maximum_length
cardinal_number
character_octet_length
cardinal_number
character_set_catalog
sql_identifier
character_set_schema
sql_identifier
character_set_name
sql_identifier
collation_catalog
sql_identifier
collation_schema
sql_identifier
collation_name
sql_identifier
numeric_precision
cardinal_number
numeric_precision_radix
cardinal_number
numeric_scale
cardinal_number
datetime_precision
cardinal_number
interval_type
character_data
interval_precision
character_data
domain_default
character_data
udt_catalog
sql_identifier
udt_schema
sql_identifier
udt_name
sql_identifier
scope_catalog
sql_identifier
scope_schema
sql_identifier
Schma d'information
Nom
Type de donnes
Description
scope_name
sql_identifier
maximum_cardinality
cardinal_number
Toujours NULL car les tableaux n'ont pas de limite maximale de cardinalit dans PostgreSQL
dtd_identifier
sql_identifier
34.23. enabled_roles
La vue enabled_roles identifie les rles actuellement actifs . Les rles actifs sont dfinis rcursivement comme
l'utilisateur courant avec tous les rles qui ont t donns aux rles activs avec l'hritage automatique. En d'autres termes, ce sont
les rles dont l'utilisateur courant est automatiquement membre, par hritage direct ou indirect.
Pour la vrification des permissions, l'ensemble des rles applicables est appliqu, ce qui peut tre plus large que l'ensemble
des rles actifs. Il est, de ce fait, gnralement prfrable d'utiliser la vue applicable_roles la place de celle-ci ; voir aussi
l.
Tableau 34.21. Colonnes de enabled_roles
Nom
Type de donnes
Description
role_name
sql_identifier
34.24. foreign_data_wrapper_options
La vue foreign_data_wrapper_options contient toutes les options dfinies par les wrappers de donnes distantes dans la
base de donnes en cours. Seuls les wrappers accessibles par l'utilisateur connect sont affichs (qu'il soit propritaire ou qu'il ait
des droits dessus).
Tableau 34.22. Colonnes de foreign_data_wrapper_options
Nom
Type de donnes
Description
foreign_data_wrapper_catalog sql_identifier
foreign_data_wrapper_name
sql_identifier
Nom du wrapper
option_name
sql_identifier
option_value
character_data
Valeur de l'option
34.25. foreign_data_wrappers
La vue foreign_data_wrappers contient tous les wrappers de donnes distantes dfinis dans le base de donnes en cours.
Seuls sont affichs les wrappers pour lesquels l'utilisateur connect a accs (qu'il soit propritaire ou qu'il ait des droits dessus).
Tableau 34.23. Colonnes de foreign_data_wrappers
Nom
Type de donnes
Description
foreign_data_wrapper_catalog sql_identifier
foreign_data_wrapper_name
sql_identifier
Nom du wrapper
authorization_identifier
sql_identifier
library_name
character_data
Schma d'information
Nom
Type de donnes
Description
foreign_data_wrapper_language
character_data
34.26. foreign_server_options
La vue foreign_server_options contient toutes les options dfinies pour les serveurs distants de la base de donnes en
cours. Ne sont affichs que les serveurs distants pour lesquels l'utilisateur connect a des droits (qu'il soit propritaire ou qu'il ait
quelques droits dessus).
Tableau 34.24. Colonnes de foreign_server_options
Nom
Type de donnes
Description
foreign_server_catalog
sql_identifier
foreign_server_name
sql_identifier
option_name
sql_identifier
option_value
character_data
Valeur de l'option
34.27. foreign_servers
La vue foreign_servers contient tous les serveurs distants dfinis dans la base en cours. Ne sont affichs que les serveurs
distants pour lesquels l'utilisateur connect a des droits (qu'il soit propritaire ou qu'il ait quelques droits dessus).
Tableau 34.25. Colonnes de foreign_servers
Nom
Type de donnes
Description
foreign_server_catalog
sql_identifier
foreign_server_name
sql_identifier
foreign_data_wrapper_catalog sql_identifier
foreign_data_wrapper_name
sql_identifier
foreign_server_type
character_data
foreign_server_version
character_data
authorization_identifier
sql_identifier
34.28. foreign_table_options
La vue foreign_table_options contient toutes les options dfinies pour les tables distantes de la base de donnes courante.
Seules sont affiches les tables distantes accessibles par l'utilisateur courant (soit parce qu'il en est le propritaire soit parce qu'il
dispose de droits particuliers).
Tableau 34.26. Colonnes de foreign_table_options
Nom
Type de donnes
Description
foreign_table_catalog
sql_identifier
Schma d'information
Nom
Type de donnes
Description
table distante (toujours la base de donnes
courante)
foreign_table_schema
sql_identifier
foreign_table_name
sql_identifier
foreign_server_catalog
sql_identifier
foreign_server_name
sql_identifier
option_name
sql_identifier
option_value
character_data
Valeur de l'option
34.29. foreign_tables
La vue foreign_tables contient toutes les tables distantes dfinies dans la base de donnes courantes. Seules sont affiches
les tables distantes accessibles par l'utilisateur courant (soit parce qu'il en est le propritaire soit parce qu'il dispose de droits particuliers).
Tableau 34.27. Colonnes de foreign_tables
Nom
Type de donnes
Description
foreign_table_catalog
sql_identifier
foreign_table_schema
sql_identifier
foreign_table_name
sql_identifier
foreign_server_catalog
sql_identifier
foreign_server_name
sql_identifier
34.30. key_column_usage
La vue key_column_usage identifie toutes les colonnes de la base de donnes courante restreintes par une contrainte unique,
cl primaire ou cl trangre. Les contraintes de vrification ne sont pas incluses dans cette vue. Seules sont affiches les colonnes
auxquelles l'utilisateur a accs, parce qu'il est le propritaire de la table ou qu'il dispose de quelque privilge.
Tableau 34.28. Colonnes de key_column_usage
Nom
Type de donnes
Description
constraint_catalog
sql_identifier
constraint_schema
sql_identifier
constraint_name
sql_identifier
Nom de la contrainte
table_catalog
sql_identifier
table_schema
sql_identifier
table_name
sql_identifier
column_name
sql_identifier
Schma d'information
Nom
Type de donnes
Description
ordinal_position
cardinal_number
position_in_unique_constraint cardinal_number
Pour une contrainte de type cl trangre, la position ordinale de la colonne rfrence dans sa contrainte d'unicit (la
numrotation commence 1) ; sinon null
34.31. parameters
La vue parameters contient des informations sur les paramtres (arguments) de toutes les fonctions de la base de donnes courante. Seules sont affiches les fonctions auxquelles l'utilisateur courant a accs, parce qu'il en est le propritaire ou qu'il dispose
de quelque privilge.
Tableau 34.29. Colonnes de parameters
Nom
Type de donnes
Description
specific_catalog
sql_identifier
specific_schema
sql_identifier
specific_name
sql_identifier
ordinal_position
cardinal_number
parameter_mode
character_data
is_result
yes_or_no
as_locator
yes_or_no
parameter_name
sql_identifier
data_type
character_data
character_maximum_length
cardinal_number
character_octet_length
cardinal_number
character_set_catalog
sql_identifier
character_set_schema
sql_identifier
character_set_name
sql_identifier
collation_catalog
sql_identifier
collation_schema
sql_identifier
collation_name
sql_identifier
numeric_precision
cardinal_number
Schma d'information
Nom
Type de donnes
Description
numeric_precision_radix
cardinal_number
numeric_scale
cardinal_number
datetime_precision
cardinal_number
interval_type
character_data
interval_precision
character_data
udt_catalog
sql_identifier
Nom de la base de donnes sur laquelle est dfini le paramtre (toujours la base de donnes courante)
udt_schema
sql_identifier
udt_name
sql_identifier
scope_catalog
sql_identifier
scope_schema
sql_identifier
scope_name
sql_identifier
maximum_cardinality
cardinal_number
dtd_identifier
sql_identifier
Un identifiant du descripteur de type de donnes du paramtre, unique parmi les descripteurs de type de donnes
restant dans la fonction. Ceci est principalement utile pour
raliser une jointure avec les autres instances de tels identifiants (le format spcifique de l'identifiant n'est pas dfini et
il n'est pas garanti qu'il reste identique dans les prochaines
versions).
34.32. referential_constraints
La vue referential_constraints contient toutes les contraintes rfrentielles (cls trangres) au sein de la base de donnes courante. Seuls sont affichs les contraintes pour lesquelles l'utilisateur connect a accs en criture sur la table rfrenante
(parce qu'il est le propritaire ou qu'il a d'autres droits que SELECT).
Tableau 34.30. Colonnes de referential_constraints
Nom
Type de donnes
Description
constraint_catalog
sql_identifier
constraint_schema
sql_identifier
constraint_name
sql_identifier
Nom de la contrainte
unique_constraint_catalog
sql_identifier
unique_constraint_schema
sql_identifier
unique_constraint_name
sql_identifier
match_option
character_data
626
Schma d'information
Nom
Type de donnes
Description
update_rule
character_data
Rgle de mise jour associe la contrainte de cl trangre : CASCADE, SET NULL, SET DEFAULT, RESTRICT ou NO ACTION.
delete_rule
character_data
Rgle de suppression associe la contrainte de cl trangre : CASCADE, SET NULL, SET DEFAULT, RESTRICT ou NO ACTION.
34.33. role_column_grants
La vue role_column_grants identifie tous les privilges de colonne octroys pour lesquels le donneur ou le bnficiaire est
un rle actuellement actif. Plus d'informations sous column_privileges. La seule diffrence relle entre cette vue et column_privileges est que cette vue omet les colonnes qui ont t rendues accessibles l'utilisateur actuel en utilisant la commande GRANT pour PUBLIC.
Tableau 34.31. Colonnes de role_column_grants
Nom
Type de donnes
Description
grantor
sql_identifier
grantee
sql_identifier
table_catalog
sql_identifier
table_schema
sql_identifier
table_name
sql_identifier
column_name
sql_identifier
Nom de la colonne
privilege_type
character_data
is_grantable
yes_or_no
34.34. role_routine_grants
La vue role_routine_grants identifie tous les privilges de routine octriys lorsque le donneur ou le bnficiaire est un
rle actif. Plus d'informations sous routine_privileges. La seule diffrence relle entre cette vue et routine_privileges est que cette vue omet les colonnes qui ont t rendues accessibles l'utilisateur actuel en utilisant la commande GRANT pour PUBLIC.
Tableau 34.32. Colonnes de role_routine_grants
Nom
Type de donnes
Description
grantor
sql_identifier
grantee
sql_identifier
specific_catalog
sql_identifier
specific_schema
sql_identifier
specific_name
sql_identifier
routine_catalog
sql_identifier
routine_schema
sql_identifier
routine_name
sql_identifier
privilege_type
character_data
Schma d'information
Nom
Type de donnes
Description
is_grantable
yes_or_no
34.35. role_table_grants
La vue role_table_grants identifie tous les privilges de tables octroys lorsque le donneur ou le bnficiaire est un rle
actif. Plus d'informations sous table_privileges. La seule diffrence relle entre cette vue et table_privileges est
que cette vue omet les colonnes qui ont t rendues accessibles l'utilisateur actuel en utilisant la commande GRANT pour PUBLIC.
Tableau 34.33. Colonnes de role_table_grants
Nom
Type de donnes
Description
grantor
sql_identifier
grantee
sql_identifier
table_catalog
sql_identifier
table_schema
sql_identifier
table_name
sql_identifier
Nom de la table
privilege_type
character_data
is_grantable
yes_or_no
with_hierarchy
yes_or_no
34.36. role_usage_grants
La vue role_usage_grants identifie les privilges d'USAGE sur diffrents types d'objets o le donneur ou le receveur des
droits est un rle actuellement activ. Plus d'informations sous usage_privileges. Dans le futur, cette vue pourrait contenir
des informations plus utiles. La seule diffrence relle entre cette vue et usage_privileges est que cette vue omet les colonnes qui ont t rendues accessibles l'utilisateur actuel en utilisant la commande GRANT pour PUBLIC.
Tableau 34.34. Colonnes de role_usage_grants
Nom
Type de donnes
Description
grantor
sql_identifier
grantee
sql_identifier
object_catalog
sql_identifier
object_schema
sql_identifier
object_name
sql_identifier
Nom de l'objet
object_type
character_data
privilege_type
character_data
Toujours USAGE
is_grantable
yes_or_no
34.37. routine_privileges
La vue routine_privileges identifie tous les droits sur les fontions un rle actuellement activ ou par un rle actuellement activ. Il existe une ligne pour chaque combinaison fonction, donneur, bnficiaire.
628
Schma d'information
Nom
Type de donnes
Description
grantor
sql_identifier
grantee
sql_identifier
specific_catalog
sql_identifier
specific_schema
sql_identifier
specific_name
sql_identifier
routine_catalog
sql_identifier
routine_schema
sql_identifier
routine_name
sql_identifier
privilege_type
character_data
is_grantable
yes_or_no
34.38. routines
La vue routines contient toutes les fonctions de la base de donnes courante. Seules sont affiches les fonctions auxquelles
l'utilisateur courant a accs (qu'il en soit le propritaire ou dispose de de privilges).
Tableau 34.36. Colonnes de routines
Nom
Type de donnes
Description
specific_catalog
sql_identifier
specific_schema
sql_identifier
specific_name
sql_identifier
routine_catalog
sql_identifier
routine_schema
sql_identifier
routine_name
sql_identifier
routine_type
character_data
module_catalog
sql_identifier
module_schema
sql_identifier
module_name
sql_identifier
udt_catalog
sql_identifier
udt_schema
sql_identifier
udt_name
sql_identifier
Schma d'information
Nom
Type de donnes
Description
data_type
character_data
character_maximum_length
cardinal_number
character_octet_length
cardinal_number
character_set_catalog
sql_identifier
character_set_schema
sql_identifier
character_set_name
sql_identifier
collation_catalog
sql_identifier
collation_schema
sql_identifier
collation_name
sql_identifier
numeric_precision
cardinal_number
numeric_precision_radix
cardinal_number
numeric_scale
cardinal_number
datetime_precision
cardinal_number
interval_type
character_data
interval_precision
character_data
type_udt_catalog
sql_identifier
type_udt_schema
sql_identifier
type_udt_name
sql_identifier
scope_catalog
sql_identifier
scope_schema
sql_identifier
scope_name
sql_identifier
maximum_cardinality
cardinal_number
Toujours NULL car il n'y a pas de limite maximale la cardinalit des tableaux dans PostgreSQL
dtd_identifier
sql_identifier
Schma d'information
Nom
Type de donnes
Description
routine_body
character_data
routine_definition
character_data
external_name
character_data
Si la fonction est une fonction C, le nom externe (link symbol) de la fonction ; sinon NULL. (Il s'agit de la mme valeur que celle affiche dans routine_definition).
external_language
character_data
parameter_style
character_data
is_deterministic
yes_or_no
sql_data_access
character_data
is_null_call
yes_or_no
sql_path
character_data
schema_level_routine
yes_or_no
Toujours YES. (L'oppos serait une mthode d'un type utilisateur, fonctionnalit non disponible dans PostgreSQL).
max_dynamic_result_sets
cardinal_number
is_user_defined_cast
yes_or_no
is_implicitly_invocable
yes_or_no
security_type
character_data
to_sql_specific_catalog
sql_identifier
to_sql_specific_schema
sql_identifier
to_sql_specific_name
sql_identifier
as_locator
yes_or_no
created
time_stamp
last_altered
time_stamp
new_savepoint_level
yes_or_no
is_udt_dependent
yes_or_no
result_cast_from_data_type
character_data
Schma d'information
Nom
Type de donnes
Description
greSQL
result_cast_as_locator
yes_or_no
result_cast_char_max_length
cardinal_number
result_cast_char_octet_length character_data
result_cast_char_set_catalog
sql_identifier
result_cast_char_set_schema
sql_identifier
result_cast_char_set_name
sql_identifier
result_cast_collation_catalog sql_identifier
result_cast_collation_schema
sql_identifier
result_cast_collation_name
sql_identifier
result_cast_numeric_precision cardinal_number
recardinal_number
sult_cast_numeric_precision_r
adix
result_cast_numeric_scale
cardinal_number
result_cast_datetime_precision
character_data
result_cast_interval_type
character_data
result_cast_interval_precision
character_data
result_cast_type_udt_catalog
sql_identifier
result_cast_type_udt_schema
sql_identifier
result_cast_type_udt_name
sql_identifier
result_cast_scope_catalog
sql_identifier
result_cast_scope_schema
sql_identifier
result_cast_scope_name
sql_identifier
recardinal_number
sult_cast_maximum_cardinality
result_cast_dtd_identifier
sql_identifier
34.39. schemata
632
Schma d'information
La vue schemata contient tous les schmas de la base de donnes courante dont un rle actif est propritaire.
Tableau 34.37. Colonnes de schemata
Nom
Type de donnes
Description
catalog_name
sql_identifier
Nom de la base de donnes dans laquelle se trouve le schma (toujours la base de donnes courante)
schema_name
sql_identifier
Nom du schma
schema_owner
sql_identifier
default_character_set_catalog sql_identifier
default_character_set_schema
sql_identifier
default_character_set_name
sql_identifier
sql_path
character_data
34.40. sequences
La vue sequences contient toutes les squences dfinies dans la base courante. Seules sont affiches les squences auxquelles
l'utilisateur courant a accs (qu'il en soit le propritaire ou dispose de privilges).
Tableau 34.38. Colonnes de sequences
Nom
Type de donnes
Description
sequence_catalog
sql_identifier
sequence_schema
sql_identifier
sequence_name
sql_identifier
Nom de la squence
data_type
character_data
numeric_precision
cardinal_number
numeric_precision_radix
cardinal_number
numeric_scale
cardinal_number
start_value
character_data
minimum_value
character_data
Schma d'information
Nom
Type de donnes
Description
maximum_value
character_data
increment
character_data
L'incrment de la squence
cycle_option
yes_or_no
Notez qu'en accord avec le standard SQL, les valeurs de dmarrage, minimale, maximale et d'incrment sont renvoyes en tant
que chanes de caractres.
34.41. sql_features
La table sql_features contient des informations sur les fonctionnalits officielles dfinies dans le standard SQL et supportes
par PostgreSQL. Ce sont les mmes informations que celles prsentes dans l'Annexe D, Conformit SQL. D'autres informations de fond y sont disponibles.
Tableau 34.39. Colonnes de sql_features
Nom
Type de donnes
Description
feature_id
character_data
feature_name
character_data
sub_feature_id
character_data
Chane identifiant la sous-fonctionnalit ou chane de longueur NULL s'il ne s'agit pas d'une sous-fonctionnalit
sub_feature_name
character_data
Nom descriptif de la sous-fonctionnalit ou chane de longueur NULL s'il ne s'agit pas d'une sous-fonctionnalit
is_supported
yes_or_no
is_verified_by
character_data
Toujours NULL car le groupe de dveloppement PostgreSQL ne ralise pas de tests formels sur la conformit des
fonctionnalits
comments
character_data
34.42. sql_implementation_info
La table sql_inplementation_info contient des informations sur diffrents aspects que le standard SQL laisse la discrtion de l'implantation. Ces informations n'ont de rel intrt que dans le contexte de l'interface ODBC ; les utilisateurs des autres
interfaces leur trouveront certainement peu d'utilit. Pour cette raison, les lments dcrivant l'implantation ne sont pas dcrits ici ;
ils se trouvent dans la description de l'interface ODBC.
Tableau 34.40. Colonnes de sql_implementation_info
Nom
Type de donnes
Description
implementation_info_id
character_data
implementation_info_name
character_data
integer_value
cardinal_number
character_value
character_data
comments
character_data
34.43. sql_languages
634
Schma d'information
La table sql_languages contient une ligne par langage li au SQL support par PostgreSQL. PostgreSQL supporte le
SQL direct et le SQL intgr dans le C ; cette table ne contient pas d'autre information.
Cette table a t supprime du standard SQL dans SQL:2008, donc il n'y a pas d'enregistrements faisant rfrence aux standards
ultrieurs SQL:2003.
Tableau 34.41. Colonnes de sql_languages
Nom
Type de donnes
Description
sql_language_source
character_data
sql_language_year
character_data
sql_language_conformance
character_data
sql_language_integrity
character_data
sql_language_implementation
character_data
Toujours NULL
sql_language_binding_style
character_data
sql_language_programming_language
character_data
34.44. sql_packages
La table sql_packages contient des informations sur les paquets de fonctionnalits dfinis dans le standard SQL supports par
PostgreSQL. On se rfrera l'Annexe D, Conformit SQL pour des informations de base sur les paquets de fonctionnalits.
Tableau 34.42. Colonnes de sql_packages
Nom
Type de donnes
Description
feature_id
character_data
feature_name
character_data
is_supported
yes_or_no
is_verified_by
character_data
Toujours NULL car le groupe de dveloppement de PostgreSQL ne ralise pas de tests formels pour la conformit
des fonctionnalits
comments
character_data
34.45. sql_parts
La table sql_parts contient des informations sur les parties du standard SQL supportes par PostgreSQL.
Tableau 34.43. Colonnes de sql_parts
Nom
Type de donnes
Description
feature_id
character_data
feature_name
character_data
Schma d'information
Nom
Type de donnes
Description
is_supported
yes_or_no
YES si cette partie est compltement supporte par la version actuelle de PostgreSQL, NO dans le cas contraire
is_verified_by
character_data
comments
character_data
34.46. sql_sizing
La table sql_sizing contient des informations sur les diffrentes limites de tailles et valeurs maximales dans PostgreSQL.
Ces informations ont pour contexte principal l'interface ODBC ; les utilisateurs des autres interfaces leur trouveront probablement
peu d'utilit. Pour cette raison, les lments de taille individuels ne sont pas dcrits ici ; ils se trouvent dans la description de
l'interface ODBC.
Tableau 34.44. Colonnes de sql_sizing
Nom
Type de donnes
Description
sizing_id
cardinal_number
sizing_name
character_data
supported_value
cardinal_number
comments
character_data
34.47. sql_sizing_profiles
La table sql_sizing_profiles contient des informations sur les valeurs sql_sizing requises par diffrents profils du
standard SQL. PostgreSQL ne garde pas trace des profils SQL, donc la table est vide.
Tableau 34.45. Colonnes de sql_sizing_profiles
Nom
Type de donnes
Description
sizing_id
cardinal_number
sizing_name
character_data
profile_id
character_data
required_value
cardinal_number
comments
character_data
34.48. table_constraints
La vue table_constraints contient toutes les contraintes appartenant aux tables possdes par l'utilisateur courant ou pour
lesquelles l'utilisateur courant dispose de certains droits diffrents de SELECT.
Tableau 34.46. Colonnes de table_constraints
636
Schma d'information
Nom
Type de donnes
Description
constraint_catalog
sql_identifier
constraint_schema
sql_identifier
constraint_name
sql_identifier
Nom de la contrainte
table_catalog
sql_identifier
table_schema
sql_identifier
table_name
sql_identifier
Nom de la table
constraint_type
character_data
is_deferrable
yes_or_no
initially_deferred
yes_or_no
34.49. table_privileges
La vue table_privileges identifie tous les privilges accords, un rle actif ou par une rle actif, sur des tables ou vues. Il
y a une ligne par combinaison table, donneur, bnficiaire.
Tableau 34.47. Colonnes de table_privileges
Nom
Type de donnes
Description
grantor
sql_identifier
grantee
sql_identifier
table_catalog
sql_identifier
table_schema
sql_identifier
table_name
sql_identifier
Nom de la table
privilege_type
character_data
is_grantable
yes_or_no
with_hierarchy
yes_or_no
34.50. tables
La vue tables contient toutes les tables et vues dfinies dans la base de donnes courantes. Seules sont affiches les tables et
vues auxquelles l'utilisateur courant a accs (parce qu'il en est le propritaire ou qu'il possde certains privilges).
Tableau 34.48. Colonnes de tables
Nom
Type de donnes
Description
table_catalog
sql_identifier
table_schema
sql_identifier
table_name
sql_identifier
Nom de la table
table_type
character_data
Type de table : BASE TABLE pour une table de base persistante (le type de table normal), VIEW pour une vue, FOREIGN TABLE pour une table distante ou LOCAL TEMPORARY pour une table temporaire
self_referencing_column_name
sql_identifier
Schma d'information
Nom
Type de donnes
Description
greSQL.
reference_generation
character_data
user_defined_type_catalog
sql_identifier
user_defined_type_schema
sql_identifier
user_defined_type_name
sql_identifier
is_insertable_into
yes_or_no
is_typed
yes_or_no
commit_action
character_data
34.51. triggered_update_columns
Pour les triggers de la base de donnes actuelle qui spcifient une liste de colonnes (comme UPDATE OF colonne1, colonne2), la vue triggered_update_columns identifie ces colonnes. Les triggers qui ne spcifient pas une liste de colonnes ne sont pas inclus dans cette vue. Seules sont affiches les colonnes que l'utilisateur actuel possde ou que l'utilisateur a des
droits autre que SELECT.
Tableau 34.49. Colonnes de triggered_update_columns
Nom
Type de donnes
Description
trigger_catalog
sql_identifier
trigger_schema
sql_identifier
trigger_name
sql_identifier
Nom du dclencheur
event_object_catalog
sql_identifier
event_object_schema
sql_identifier
event_object_table
sql_identifier
event_object_column
sql_identifier
34.52. triggers
La vue triggers contient tous les triggers dfinis dans la base de donnes actuelles sur les tables et vues que l'utilisateur actuel
possde ou sur lesquels il a d'autres droits que le SELECT.
Tableau 34.50. Colonnes de triggers
Nom
Type de donnes
Description
trigger_catalog
sql_identifier
trigger_schema
sql_identifier
Schma d'information
Nom
Type de donnes
Description
trigger_name
sql_identifier
Nom du trigger
event_manipulation
character_data
event_object_catalog
sql_identifier
event_object_schema
sql_identifier
event_object_table
sql_identifier
action_order
cardinal_number
action_condition
character_data
action_statement
character_data
action_orientation
character_data
action_timing
character_data
action_reference_old_table
sql_identifier
action_reference_new_table
sql_identifier
action_reference_old_row
sql_identifier
action_reference_new_row
sql_identifier
created
time_stamp
Les dclencheurs dans PostgreSQL ont deux incompatibilits avec le standard SQL qui affectent leur reprsentation dans le
schma d'information.
Premirement, les noms des dclencheurs sont locaux chaque table sous PostgreSQL, et ne sont pas des objets du schma indpendants. De ce fait, il peut exister des dclencheurs de mme noms au sein d'un schma, pour peu qu'ils s'occupent de tables
diffrentes. (trigger_catalog et trigger_schema sont les champs qui dcrivent effectivement la table sur laquelle est
dfini le dclencheur.)
Deuximement, les dclencheurs peuvent tre dfinis pour s'excuter sur plusieurs vnements sous PostgreSQL (c'est--dire
ON INSERT OR UPDATE) alors que le standard SQL n'en autorise qu'un. Si un dclencheur est dfini pour s'excuter sur plusieurs vnements, il est reprsent sur plusieurs lignes dans le schma d'information, une pour chaque type d'vnement.
En consquence, la cl primaire de la vue triggers est en fait (trigger_catalog, trigger_schema,
event_object_table, trigger_name, event_manipulation) et non (trigger_catalog, trigger_schema, trigger_name) comme le spcifie le standard SQL. Nanmoins, si les dclencheurs sont dfinis de manire
conforme au standard SQL (des noms de dclencheurs uniques dans le schma et un seul type d'vnement par dclencheur), il n'y
a pas lieu de se proccuper de ces deux incompatibilits.
Note
Avant PostgreSQL 9.1, les colonnes action_timing, action_reference_old_table, action_reference_new_table, action_reference_old_row et action_reference_new_row de
cette vue taient nommes respectivement condition_timing, condition_reference_old_table,
condition_reference_new_table,
condition_reference_old_row
et
condi639
Schma d'information
tion_reference_new_row. Cela refltaient leur nommage dans le standard SQL:1999. Le nouveau nommage
est conforme SQL:2003 et les versions ultrieures.
34.53. usage_privileges
La vue usage_privileges identifie les privilges d'USAGE accords sur diffrents objets un rle actif ou par un rle actif.
Sous PostgreSQL, cela s'applique aux domaines. Puisqu'il n'y a pas de rels privilges sur les domaines sous PostgreSQL,
cette vue est affiche les privilges USAGE implicitement octroys PUBLIC pour tous les collationnements, domaines, wrappers
de donnes distantes et serveurs distants. Il y a une ligne pour chaque combinaison d'objet, de donneur et de receveur.
Comme les collations et les domaines n'ont pas de vrais droits dans PostgreSQL, cette vue affiche des droits USAGE implicites,
non donnables d'autres, et donns par le propritaire PUBLIC pour tous les collationnements et tous les domaines. Les autres
types d'objets affichent nanmoins de vrais droits.
Tableau 34.51. Colonnes de usage_privileges
Nom
Type de donnes
Description
grantor
sql_identifier
grantee
sql_identifier
object_catalog
sql_identifier
object_schema
sql_identifier
object_name
sql_identifier
Nom de l'objet
object_type
character_data
privilege_type
character_data
Toujours USAGE
is_grantable
yes_or_no
34.54. user_mapping_options
La vue user_mapping_options contient toutes les options dfinies pour les correspondances d'utilisateur dfinies dans la
base de donnes en cours. Seules sont affiches les correspondances pour lesquelles le serveur distant correspondant peut tre accd par l'utilisateur connect (qu'il en soit le propritaire ou qu'il ait quelques droits dessus).
Tableau 34.52. Colonnes de user_mapping_options
Nom
Type de donnes
Description
authorization_identifier
sql_identifier
foreign_server_catalog
sql_identifier
foreign_server_name
sql_identifier
option_name
sql_identifier
option_value
character_data
Schma d'information
34.55. user_mappings
La vue user_mappings contient toutes les correspondances utilisateurs dfinies dans la base de donnes en cours. Seules sont
affiches les correspondances pour lesquelles le serveur distant correspondant peut tre accd par l'utilisateur connect (qu'il en
soit le propritaire ou qu'il ait quelques droits dessus).
Tableau 34.53. Colonnes de user_mappings
Nom
Type de donnes
Description
authorization_identifier
sql_identifier
foreign_server_catalog
sql_identifier
foreign_server_name
sql_identifier
34.56. view_column_usage
La vue view_column_usage identifie toutes les colonnes utilises dans l'expression de la requte d'une vue (l'instruction SELECT dfinissant la vue). Une colonne n'est incluse que si la table contenant la colonne appartient un rle actif.
Note
Les colonnes des tables systme ne sont pas incluses. Cela sera probablement corrig un jour.
Tableau 34.54. Colonnes de view_column_usage
Nom
Type de donnes
Description
view_catalog
sql_identifier
view_schema
sql_identifier
view_name
sql_identifier
Nom de la vue
table_catalog
sql_identifier
table_schema
sql_identifier
table_name
sql_identifier
column_name
sql_identifier
34.57. view_routine_usage
La vue view_routine_usage identifie toutes les routines (fonctions et procdures) utilises dans la requte d'une vue
(l'instruction SELECT qui dfinit la vue). Une routine n'est incluse que si la routine appartient un rle actif.
Tableau 34.55. Colonnes de view_routine_usage
Nom
Type de donnes
Description
table_catalog
sql_identifier
table_schema
sql_identifier
table_name
sql_identifier
Nom de la vue
641
Schma d'information
Nom
Type de donnes
Description
specific_catalog
sql_identifier
specific_schema
sql_identifier
specific_name
sql_identifier
34.58. view_table_usage
La vue view_table_usage identifie toutes les tables utilises dans l'expression de la requte d'une vue (l'instruction SELECT
dfinissant la vue). Une table n'est incluse que son propritaire est un rle actif.
Note
Les tables systme ne sont pas incluses. Cela sera probablement corrig un jour.
Tableau 34.56. Colonnes de view_table_usage
Nom
Type de donnes
Description
view_catalog
sql_identifier
view_schema
sql_identifier
view_name
sql_identifier
Nom de la vue
table_catalog
sql_identifier
table_schema
sql_identifier
table_name
sql_identifier
34.59. views
La vue views contient toutes les vues dfinies dans la base de donnes courantes. Seules sont affiches les vues auxquelles
l'utilisateur a accs (parce qu'il en est le propritaire ou qu'il dispose de privilges).
Tableau 34.57. Colonnes de views
Nom
Type de donnes
Description
table_catalog
sql_identifier
table_schema
sql_identifier
table_name
sql_identifier
Nom de la vue
view definition
character_data
check_option
character_data
is_updatable
yes_or_no
YES si la vue est actualisable (autorise UPDATE et DELETE), NO dans le cas contraire
is_insertable_into
yes_or_no
is_trigger_updatable
yes_or_no
is_trigger_deletable
yes_or_no
Schma d'information
Nom
Type de donnes
Description
l'opration DELETE, NO dans le cas
is_trigger_insertable_into
yes_or_no
643
35.1. L'extensibilit
PostgreSQL est extensible parce qu'il opre grce un systme de catalogues. Quiconque est familier des systmes de bases
de donnes relationnelles standard sait que les informations concernant les bases, les tables, les colonnes, etc. y sont stockes
dans ce qu'on nomme communment des catalogues systmes (certains systmes appellent cela le dictionnaire de donnes). Pour
l'utilisateur, les catalogues ressemblent des tables ordinaires, mais le SGBD y enregistre ses registres internes. la diffrence
des autres systmes, PostgreSQL enregistre beaucoup d'informations dans ses catalogues : non seulement l'information
concernant les tables et les colonnes, mais aussi l'information concernant les types de donnes, les fonctions, les mthodes
d'accs, etc.
Ces tables peuvent tre modifies par l'utilisateur. Qui plus est, puisque PostgreSQL fonde ses oprations sur ces tables, il
peut tre tendu par les utilisateurs. En comparaison, les systmes de bases de donnes conventionnels ne peuvent tre tendus
qu'en modifiant les procdures dans le code source ou en installant des modules spcifiquement crits par le vendeur de SGBD.
De plus, le serveur PostgreSQL peut incorporer du code utilisateur par chargement dynamique. C'est--dire que l'utilisateur
peut indiquer un fichier de code objet (par exemple une bibliothque partage) qui code un nouveau type ou une nouvelle fonction et PostgreSQL le charge au besoin. Il est encore plus facile d'ajouter au serveur du code crit en SQL. La possibilit de
modifier son fonctionnement la vole fait de PostgreSQL un outil unique pour le prototypage rapide de nouvelles applications et de structures de stockage.
35.2.4. Pseudo-types
645
tendre SQL
Il existe quelques pseudo-types pour des besoins particuliers. Les pseudo-types ne peuvent pas apparatre comme champs de
table ou comme attributs de types composites, mais ils peuvent tre utiliss pour dclarer les types des arguments et des rsultats
de fonctions. Dans le systme de typage, ils fournissent un mcanisme d'identification des classes spciales de fonctions. La Tableau 8.24, Pseudo-Types donne la liste des pseudo-types qui existent.
fonctions en langage de requte (fonctions crites en SQL, Section 35.4, Fonctions en langage de requtes (SQL) )
fonctions en langage procdural (fonctions crites, par exemple, en PL/pgSQL ou PL/Tcl, Section 35.7, Fonctions en langage de procdures )
Chaque type de fonction peut accepter comme arguments (paramtres) des types de base, des types composites ou une combinaison de ceux-ci. De plus, chaque sorte de fonction peut renvoyer un type de base ou un type composite. Les fonctions pourraient
aussi tre dfinies pour renvoyer des ensembles de valeurs de base ou de valeurs composites.
De nombreuses sortes de fonctions peuvent accepter ou renvoyer certains pseudo-types (comme les types polymorphes) mais avec
des fonctionnalits varies. Consultez la description de chaque type de fonction pour plus de dtails.
Il est plus facile de dfinir des fonctions SQL aussi allons-nous commencer par celles-ci. La plupart des concepts prsents pour
les fonctions SQL seront aussi grs par les autres types de fonctions.
Lors de la lecture de ce chapitre, il peut tre utile de consulter la page de rfrence de la commande CREATE FUNCTION(7)
646
tendre SQL
pour mieux comprendre les exemples. Quelques exemples extraits de ce chapitre peuvent tre trouvs dans les fichiers
funcs.sql et funcs.c du rpertoire du tutoriel de la distribution source de PostgreSQL.
tendre SQL
un
---1
Notez que nous avons dfini un alias de colonne avec le nom resultat dans le corps de la fonction pour se rfrer au rsultat de
la fonction mais cet alias n'est pas visible hors de la fonction. En effet, le rsultat est nomm un au lieu de resultat.
Il est presque aussi facile de dfinir des fonctions SQL acceptant des types de base comme arguments. Dans l'exemple suivant, remarquez comment nous faisons rfrence aux arguments dans le corps de la fonction avec $1 et $2.
CREATE FUNCTION ajoute(integer, integer) RETURNS integer AS $$
SELECT $1 + $2;
$$ LANGUAGE SQL;
SELECT ajoute(1, 2) AS reponse;
reponse
--------3
Voici une fonction plus utile, qui pourrait tre utilise pour dbiter un compte bancaire :
CREATE FUNCTION tf1 (integer, numeric) RETURNS integer AS $$
UPDATE banque
SET balance = balance - $2
WHERE no_compte = $1;
SELECT 1;
$$ LANGUAGE SQL;
Un utilisateur pourrait excuter cette fonction pour dbiter le compte 17 de 100 000 euros ainsi :
SELECT tf1(17, 100.000);
Dans la pratique, on prfrera vraisemblablement un rsultat plus utile que la constante 1. Une dfinition plus probable est :
CREATE FUNCTION tf1 (integer, numeric) RETURNS numeric AS $$
UPDATE banque
SET balance = balance - $2
WHERE no_compte = $1;
SELECT balance FROM banque WHERE no_compte = $1;
$$ LANGUAGE SQL;
qui ajuste le solde et renvoie sa nouvelle valeur. La mme chose peut se faire en une commande en utilisant la clause RETURNING :
CREATE FUNCTION tf1 (integer, numeric) RETURNS numeric AS $$
UPDATE banque
SET balance = balance - $2
WHERE no_compte = $1
RETURNING balance;
$$ LANGUAGE SQL;
648
tendre SQL
L'ordre de la liste du SELECT doit tre exactement le mme que celui dans lequel les colonnes apparaissent dans la table associe au type composite (donner des noms aux colonnes dans le corps de la fonction, comme nous l'avons fait dans l'exemple,
n'a aucune interaction avec le systme).
Vous devez transtyper les expressions pour concorder avec la dfinition du type composite ou bien vous aurez l'erreur suivante :
ERROR:
tendre SQL
Astuce
L'quivalence entre la notation fonctionnelle et la notation d'attribut rend possible l'utilisation de fonctions sur des
types composites pour muler les champs calculs . Par exemple, en utilisant la dfinition prcdente pour
double_salaire(emp), nous pouvons crire
SELECT emp.nom, emp.double_salaire FROM emp;
Une application utilisant ceci n'aurait pas besoin d'tre consciente directement que double_salaire n'est pas
une vraie colonne de la table (vous pouvez aussi muler les champs calculs avec des vues).
En raison de ce comportement, il est dconseill de nommer une fonction prenant un unique argument de type composite avec l'identifiant de l'un des champs de ce type composite.
Une autre faon d'utiliser une fonction renvoyant un type composite est de l'appeler comme une fonction de table, comme dcrit
dans la Section 35.4.7, Fonctions SQL comme sources de table .
tendre SQL
WHERE no_compte = $1
RETURNING balance;
$$ LANGUAGE SQL;
Dans cet exemple, le premier paramtre a comme nom acct_no, et le second paramtre debit. En ce qui concerne la fonction
SQL, ces noms sont de la dcoration. Vous devez toujours faire rfrence aux paramtres avec la notation $1, $2, etc dans le
corps de la fonction. (Certains langages de procdure vous autorisent utiliser les noms des paramtres la place.) Nanmoins, les
noms des paramtres peuvent tre utiles dans un but de documentation. Quand une fonction a beaucoup de paramtres, il est aussi
utile d'utiliser les noms lors de l'appel la fonction, comme dcrit dans Section 4.3, Fonctions appelantes .
tendre SQL
-- doesn't work
Vous ne pouvez pas vraiment crire cela, ou tout du moins cela ne correspondra pas la dfinition de la fonction. Un paramtre
marqu VARIADIC correspond une ou plusieurs occurrences de son type d'lment, et non pas de son propre type.
Quelque fois, il est utile de pouvoir passer un tableau dj construit une fonction variadic ; ceci ets particulirement intressant
quand une fonction variadic veut passer son paramtre tableau une autre fonction. Vous pouvez faire cela en spcifiant VARIADIC dans l'appel :
SELECT mleast(VARIADIC ARRAY[10, -1, 5, 4.4]);
Ceci empche l'expansion du paramtre variadic de la fonction dans le type des lments, ce qui permet la valeur tableau de correspondre. VARIADIC peut seulement tre attach au dernier argument d'un appel de fonction.
Les paramtres de l'lment tableau gnrs partir d'un paramtre variadic sont traits comme n'ayant pas de noms propres. Cela
signifie qu'il n'est pas possible d'appeler une fonction variadic en utilisant des arguments nomms (Section 4.3, Fonctions appelantes ), sauf quand vous spcifiez VARIADIC. Par exemple, ceci fonctionnera :
SELECT mleast(VARIADIC arr := ARRAY[10, -1, 5, 4.4]);
mais pas cela :
SELECT mleast(arr := 10);
SELECT mleast(arr := ARRAY[10, -1, 5, 4.4]);
35.4.6. Fonctions SQL SQL avec des valeurs par dfaut pour les arguments
Les fonctions peuvent tre dclares avec des valeurs par dfaut pour certains des paramtres en entre ou pour tous. Les valeurs
par dfaut sont insres quand la fonction est appele avec moins d'arguments que priori ncessaires. Comme les arguments
peuvent seulement tre omis partir de la fin de la liste des arguments, tous les paramtres aprs un paramtres disposant d'une
valeur par dfaut disposeront eux-aussi d'une valeur par dfaut. (Bien que l'utilisation de la notation avec des arguments nomms
pourrait autoriser une relche de cette restriction, elle est toujours force pour que la notation des arguments de position fonctionne correctement.)
Par exemple :
CREATE FUNCTION foo(a int, b int DEFAULT 2, c int DEFAULT 3)
RETURNS int
LANGUAGE SQL
AS $$
SELECT $1 + $2 + $3;
$$;
SELECT foo(10, 20, 30);
foo
----60
(1 row)
SELECT foo(10, 20);
foo
----652
tendre SQL
33
(1 row)
SELECT foo(10);
foo
----15
(1 row)
SELECT foo(); -- chec car il n'y a pas de valeur par dfaut pour le premier argument
ERROR: function foo() does not exist
Le signe = peut aussi tre utilis la place du mot cl DEFAULT,
653
tendre SQL
Note
Si la dernire commande d'une fonction est INSERT, UPDATE ou DELETE avec une clause RETURNING, cette
commande sera toujours excute jusqu' sa fin, mme si la fonction n'est pas dclare avec SETOF ou que la requte appelante ne renvoie pas toutes les lignes rsultats. Toutes les lignes supplmentaires produites par la clause
RETURNING sont silencieusement abandonnes mais les modifications de table sont pris en compte (et sont toutes
termines avant que la fonction ne se termine).
654
tendre SQL
Il est permis d'avoir des arguments polymorphes avec un type de renvoi fixe, mais non l'inverse. Par exemple :
CREATE FUNCTION est_plus_grand(anyelement, anyelement) RETURNS bool AS $$
SELECT $1 > $2;
$$ LANGUAGE SQL;
SELECT est_plus_grand(1, 2);
est_plus_grand
---------------f
(1 row)
CREATE FUNCTION fonction_invalide() RETURNS anyelement AS $$
SELECT 1;
$$ LANGUAGE SQL;
ERROR: cannot determine result datatype
DETAIL: A function returning a polymorphic type must have at least one
polymorphic argument.
Le polymorphisme peut tre utilis avec les fonctions qui ont des arguments en sortie. Par exemple :
CREATE FUNCTION dup (f1 anyelement, OUT f2 anyelement, OUT f3 anyarray)
AS 'select $1, array[$1,$1]' LANGUAGE SQL;
SELECT * FROM dup(22);
f2 |
f3
----+--------22 | {22,22}
(1 row)
655
tendre SQL
Le polymorphisme peut aussi tre utilis avec des fonctions variadic. Par exemple :
CREATE FUNCTION anyleast (VARIADIC anyarray) RETURNS anyelement AS $$
SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);
$$ LANGUAGE SQL;
SELECT anyleast(10, -1, 5, 4);
anyleast
----------1
(1 row)
SELECT anyleast('abc'::text, 'def');
anyleast
---------abc
(1 row)
CREATE FUNCTION concat_values(text, VARIADIC anyarray) RETURNS text AS $$
SELECT array_to_string($2, $1);
$$ LANGUAGE SQL;
SELECT concat_values('|', 1, 4, 2);
concat_values
--------------1|4|2
(1 row)
656
tendre SQL
Une fonction VOLATILE peut tout faire, y compris modifier la base de donnes. Elle peut renvoyer diffrents rsultats sur des
appels successifs avec les mmes arguments. L'optimiseur ne fait aucune supposition sur le comportement de telles fonctions.
Une requte utilisant une fonction volatile r-valuera la fonction chaque ligne o sa valeur est ncessaire.
Une fonction STABLE ne peut pas modifier la base de donnes et est garantie de renvoyer les mmes rsultats si elle est appele avec les mmes arguments pour toutes les lignes l'intrieur d'une mme instruction. Cette catgorie permet l'optimiseur
d'optimiser plusieurs appels de la fonction dans une seule requte. En particulier, vous pouvez utiliser en toute scurit une expression contenant une telle fonction dans une condition de parcours d'index (car un parcours d'index valuera la valeur de la
comparaison une seule fois, pas une fois pour chaque ligne, utiliser une fonction VOLATILE dans une condition de parcours
d'index n'est pas valide).
Une fonction IMMUTABLE ne peut pas modifier la base de donnes et est garantie de toujours renvoyer les mmes rsultats si
elle est appele avec les mmes arguments. Cette catgorie permet l'optimiseur de pr-valuer la fonction quand une requte
l'appelle avec des arguments constants. Par exemple, une requte comme SELECT ... WHERE x = 2 + 2 peut tre simplifie pour obtenir SELECT ... WHERE x = 4 car la fonction sous-jacente de l'oprateur d'addition est indique IMMUTABLE.
Pour une meilleure optimisation des rsultats, vous devez mettre un label sur les fonctions avec la catgorie la plus volatile valide
pour elles.
657
tendre SQL
Toute fonction avec des effets de bord doit tre indique comme VOLATILE, de faon ce que les appels ne puissent pas tre optimiss. Mme une fonction sans effets de bord doit tre indique comme VOLATILE si sa valeur peut changer l'intrieur d'une
seule requte ; quelques exemples sont random(), currval(), timeofday().
Un autre exemple important est que la famille de fonctions current_timestamp est qualifie comme STABLE car leurs valeurs ne changent pas l'intrieur d'une transaction.
Il y a relativement peu de diffrences entre les catgories STABLE et IMMUTABLE en considrant les requtes interactives qui
sont planifies et immdiatement excutes : il importe peu que la fonction soit excute une fois lors de la planification ou une
fois au lancement de l'excution de la requte mais cela fait une grosse diffrence si le plan est sauvegard et utilis plus tard. Placer un label IMMUTABLE sur une fonction quand elle ne l'est pas vraiment pourrait avoir comme consquence de la considrer
prmaturment comme une constante lors de la planification et rsulterait en une valeur errone lors d'une utilisation ultrieure de
ce plan d'excution. C'est un danger qui arrive lors de l'utilisattion d'instructions prpares ou avec l'utilisation de langages de
fonctions mettant les plans d'excutions en cache (comme PL/pgSQL).
Pour les fonctions crites en SQL ou dans tout autre langage de procdure standard, la catgorie de volatibilit dtermine une
deuxime proprit importante, savoir la visibilit de toute modification de donnes effectues par la commande SQL qui a appel la fonction. Une fonction VOLATILE verra les changements, une fonction STABLE ou IMMUTABLE ne les verra pas. Ce
comportement est implante en utilisant le comportement par images de MVCC (voir Chapitre 13, Contrle d'accs simultan) :
les fonctions STABLE et IMMUTABLE utilisent une image tablie au lancement de la requte appelante alors que les fonctions
VOLATILE obtiennent une image fraiche au dbut de chaque requte qu'elles excutent.
Note
Les fonctions crites en C peuvent grer les images de la faon qu'elles le souhaitent, mais il est prfrable de coder
les fonctions C de la mme faon.
cause du comportement base d'images, une fonction contenant seulement des commandes SELECT peut tre indique
STABLE en toute scurit mme s'il slectionne des donnes partir de tables qui pourraient avoir subi des modifications entre
temps par des requtes concurrentes. PostgreSQL excutera toutes les commandes d'une fonction STABLE en utilisant l'image
tablie par la requte appelante et n'aura qu'une vision fige de la base de donnes au cours de la requte.
Ce mme comportement d'images est utilis pour les commandes SELECT l'intrieur de fonctions IMMUTABLE. Il est gnralement dconseill de slectionner des tables de la base de donnes l'intrieur de fonctions IMMUTABLE car l'immutabilit sera
rompue si le contenu de la table change. Nanmoins, PostgreSQL ne vous force pas ne pas le faire.
Une erreur commune est de placer un label sur une fonction IMMUTABLE quand son rsultat dpend d'un paramtre de configuration. Par exemple, une fonction qui manipule des types date/heure pourrait bien avoir des rsultats dpendant du paramtre timezone. Pour tre scurises, de telles fonctions devraient avoir le label STABLE la place.
Note
Avant PostgreSQL version 8.0, le prrequis que les fonctions STABLE et IMMUTABLE ne pouvaient pas modifier la base de donnes n'tait pas contraint par le systme. Les versions 8.0 et ultrieures le contraignent en rclamant que les fonctions SQL et les fonctions de langages de procdures de ces catgories ne contiennent pas de
commandes SQL autre que SELECT (ceci n'a pas t compltement test car de telles fonctions pourraient toujours appeler des fonctions VOLATILE qui modifient la base de donnes. Si vous le faites, vous trouverez que la
fonction STABLE ou IMMUTABLE n'est pas au courant des modifications effectues sur la base de donnes par la
fonction appele, car elles sont caches depuis son image).
tendre SQL
Les fonctions internes sont des fonctions crites en C qui ont t lies de faon statique dans le serveur PostgreSQL. Le
corps de la dfinition de la fonction spcifie le nom en langage C de la fonction, qui n'est pas obligatoirement le mme que le
nom dclar pour l'utilisation en SQL (pour des raisons de rtro compatibilit, un corps vide est accept pour signifier que le nom
de la fonction en langage C est le mme que le nom SQL).
Normalement, toutes les fonctions internes prsentes dans le serveur sont dclares pendant l'initialisation du groupe de base de
donnes (voir Section 17.2, Crer un groupe de base de donnes ) mais un utilisateur peut utiliser la commande CREATE
FUNCTION pour crer des noms d'alias supplmentaires pour une fonction interne. Les fonctions internes sont dclares dans la
commande CREATE FUNCTION avec le nom de langage internal. Par exemple, pour crer un alias de la fonction sqrt :
CREATE FUNCTION racine_carree(double precision) RETURNS double precision
'dsqrt'
LANGUAGE internal
STRICT;
AS
Note
Toutes les fonctions prdfinies ne sont pas internes (au sens explicit ci-dessus). Quelques fonctions prdfinies sont crites en SQL.
tendre SQL
L'identifiant utilisateur sous lequel fonctionne le serveur PostgreSQL doit pouvoir suivre le chemin jusqu'au fichier que vous essayez de charger. Une erreur frquente revient dfinir le fichier ou un rpertoire suprieur comme non lisible et/ou non excutable par l'utilisateur postgres.
Dans tous les cas, le nom de fichier donn dans la commande CREATE FUNCTION est enregistr littralement dans les catalogues systmes, de sorte que, si le fichier doit tre nouveau charg, la mme procdure sera applique.
Note
PostgreSQL ne compilera pas une fonction C automatiquement. Le fichier objet doit tre compil avant d'tre rfrenc dans une commande CREATE FUNCTION. Voir la Section 35.9.6, Compiler et lier des fonctions charges dynamiquement pour des informations complmentaires.
Pour s'assurer qu'un fichier objet chargeable dynamiquement n'est pas charg dans un serveur incompatible, PostgreSQL vrifie
que le fichier contient un bloc magique avec un contenu appropri. Ceci permet au serveur de dtecter les incompatibilits videntes comme du code compilet pour une version majeure diffrente de PostgreSQL. Un bloc magique est requis partir de
PostgreSQL 8.2. Pour inclure un bloc magique, crivez ceci dans un (et seulement un) des fichiers source du module, aprs
avoir inclus l'en-tte fmgr.h :
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
Le test #ifdef peut tre omis si le code n'a pas besoin d'tre compil avec des versions de PostgreSQL antrieures la 8.2.
Aprs avoir t utilis pour la premire fois, un fichier objet charg dynamiquement est conserv en mmoire. Les futurs appels de
fonction(s) dans ce fichier pendant la mme session provoqueront seulement une lgre surcharge due la consultation d'une table
de symboles. Si vous devez forcer le chargement d'un fichier objet, par exemple aprs une recompilation, commencez une nouvelle session.
De faon optionnelle, un fichier charg dynamiquement peut contenir des fonctions d'initialisation et de terminaison. Si le fichier
inclut une fonction nomme _PG_init, cette fonction sera appele immdiatement aprs le chargement du fichier. La fonction
ne reoit aucun paramtre et doit renvoyer void. Si le fichier inclut une fonction nomme _PG_fini, cette fonction sera appele
tout juste avant le dchargement du fichier. De la mme faon, la fonction ne reoit aucun paramtre et doit renvoyer void. Notez
que _PG_fini sera seulement appele lors du dchargement du fichier, pas au moment de la fin du processus. (Actuellement, les
dchargements sont dsactivs et ne surviendront jamais, bien que cela puisse changer un jour.)
Les types par valeur peuvent seulement avoir une longueur de 1, 2 ou 4 octets (galement 8 octets si sizeof(Datum) est de
huit octets sur votre machine). Vous devriez tre attentif lors de la dfinition de vos types de sorte qu'ils aient la mme taille sur
toutes les architectures. Par exemple, le type long est dangereux car il a une taille de quatre octets sur certaines machines et huit
octets sur d'autres, alors que le type int est de quatre octets sur la plupart des machines Unix. Une implmentation raisonnable du
type int4 sur une machine Unix pourrait tre
/* entier sur quatre octets, pass par valeur */
typedef int int4;
D'autre part, les types longueur fixe d'une taille quelconque peuvent tre passs par rfrence. Par exemple, voici
l'implmentation d'un type PostgreSQL :
/* structure de 16 octets, passe par rfrence */
typedef struct
660
tendre SQL
{
double
} Point;
x, y;
Seuls des pointeurs vers de tels types peuvent tre utiliss en les passant dans et hors des fonctions PostgreSQL. Pour renvoyer
une valeur d'un tel type, allouez la quantit approprie de mmoire avec palloc, remplissez la mmoire alloue et renvoyez un
pointeur vers elle (de plus, si vous souhaitez seulement renvoyer la mme valeur qu'un de vos arguments en entre qui se trouve
du mme type, vous pouvez passer le palloc supplmentaire et simplement renvoyer le pointeur vers la valeur en entre).
Enfin, tous les types longueur variable doivent aussi tre passs par rfrence. Tous les types longueur variable doivent commencer avec un champ d'une longueur d'exactement quatre octets et toutes les donnes devant tre stockes dans ce type doivent
tre localises dans la mmoire la suite immdiate de ce champ longueur. Le champ longueur contient la longueur totale de la
structure, c'est--dire incluant la longueur du champ longueur lui-mme.
Un autre point important est d'viter de laisser des bits non initialiss dans les structures de types de donnes ;; par exemple, prenez bien soin de remplir avec des zros tous les octets de remplissage qui sont prsents dans les structures de donnes des fins
d'alignement. A dfaut, des constantes logiquement quivalentes de vos types de donnes pourraient tre considres comme ingales par l'optimiseur, impliquant une planification inefficace (bien que les rsultats puissent malgr tout tre corrects).
Avertissement
Ne jamais modifier le contenu d'une valeur en entre passe par rfrence. Si vous le faites, il y a de forts risques
pour que vous russissiez corrompre les donnes sur disque car le pointeur que vous avez reu pourrait bien pointer directement vers un tampon disque. La seule exception cette rgle est explique dans la Section 35.10,
Agrgats utilisateur .
Comme exemple, nous pouvons dfinir le type text comme ceci :
typedef struct {
int4 length;
char data[1];
} text;
Il est vident que le champ dclar ici n'est pas assez long pour contenir toutes les chanes possibles. Comme il est impossible de
dclarer une structure de taille variable en C, nous nous appuyons sur le fait que le compilateur C ne vrifie pas la plage des indices de tableau. Nous allouons juste la quantit d'espace ncessaire et ensuite nous accdons au tableau comme s'il avait t dclar avec la bonne longueur (c'est une astuce courante que vous pouvez trouver dans beaucoup de manuels de C).
En manipulant les types longueur variable, nous devons tre attentifs allouer la quantit correcte de mmoire et fixer correctement le champ longueur. Par exemple, si nous voulons stocker 40 octets dans une structure text, nous devrions utiliser un fragment de code comme celui-ci :
#include "postgres.h"
...
char buffer[40]; /* notre donne source */
...
text *destination = (text *) palloc(VARHDRSZ + 40);
SET_VARSIZE(destination, VARHDRSZ + 40);
memcpy(destination->data, buffer, 40);
...
VARHDRSZ est quivalent sizeof(int4) mais est considr comme une meilleure tournure de rfrence la taille de
l'overhead pour un type longueur variable. Also, the length field must be set using the SET_VARSIZE macro, not by simple assignment.
Le Tableau 35.1, quivalence des types C et des types SQL intgrs spcifie la correspondance entre les types C et les types
SQL quand on crit une fonction en langage C utilisant les types internes de PostgreSQL. La colonne Dfini dans donne le
fichier d'en-tte devant tre inclus pour accder la dfinition du type (la dfinition effective peut se trouver dans un fichier diffrent inclus dans le fichier indiqu. Il est recommand que les utilisateurs s'en tiennent l'interface dfinie). Notez que vous devriez
toujours inclure postgres.h en premier dans tout fichier source car il dclare un grand nombre d'lments dont vous aurez besoin de toute faon.
Tableau 35.1. quivalence des types C et des types SQL intgrs
Type SQL
Type C
Dfini dans
abstime
AbsoluteTime
utils/nabstime.h
boolean
bool
tendre SQL
Type SQL
Type C
Dfini dans
box
BOX*
utils/geo_decls.h
bytea
bytea*
postgres.h
"char"
char
(intgr au compilateur)
character
BpChar*
postgres.h
cid
CommandId
postgres.h
date
DateADT
utils/date.h
smallint (int2)
int2 or int16
postgres.h
int2vector
int2vector*
postgres.h
integer (int4)
int4 or int32
postgres.h
real (float4)
float4*
postgres.h
float8*
postgres.h
interval
Interval*
utils/timestamp.h
lseg
LSEG*
utils/geo_decls.h
name
Name
postgres.h
oid
Oid
postgres.h
oidvector
oidvector*
postgres.h
path
PATH*
utils/geo_decls.h
point
POINT*
utils/geo_decls.h
regproc
regproc
postgres.h
reltime
RelativeTime
utils/nabstime.h
text
text*
postgres.h
tid
ItemPointer
storage/itemptr.h
time
TimeADT
utils/date.h
TimeTzADT
utils/date.h
timestamp
Timestamp*
utils/timestamp.h
tinterval
TimeInterval
utils/nabstime.h
varchar
VarChar*
postgres.h
xid
TransactionId
postgres.h
Maintenant que nous avons pass en revue toutes les structures possibles pour les types de base, nous pouvons donner quelques
exemples de vraies fonctions.
tendre SQL
add_one(int arg)
{
return arg + 1;
}
/* par rfrence, taille fixe */
float8 *
add_one_float8(float8 *arg)
{
float8
*result = (float8 *) palloc(sizeof(float8));
*result = *arg + 1.0;
return result;
}
Point *
makepoint(Point *pointx, Point *pointy)
{
Point
*new_point = (Point *) palloc(sizeof(Point));
new_point->x = pointx->x;
new_point->y = pointy->y;
return new_point;
}
/* par rfrence, taille variable */
text *
copytext(text *t)
{
/*
* VARSIZE est la taille totale de la structure en octets.
*/
text *new_t = (text *) palloc(VARSIZE(t));
SET_VARSIZE(new_t, VARSIZE(t));
/*
* VARDATA est un pointeur sur la rgion de donnes de la structure.
*/
memcpy((void *) VARDATA(new_t), /* destination */
(void *) VARDATA(t),
/* source */
VARSIZE(t) - VARHDRSZ); /* nombre d'octets */
return new_t;
}
text *
concat_text(text *arg1, text *arg2)
{
int32 new_text_size = VARSIZE(arg1) + VARSIZE(arg2) - VARHDRSZ;
text *new_text = (text *) palloc(new_text_size);
SET_VARSIZE(new_text, new_text_size);
memcpy(VARDATA(new_text), VARDATA(arg1), VARSIZE(arg1) - VARHDRSZ);
memcpy(VARDATA(new_text) + (VARSIZE(arg1) - VARHDRSZ),
VARDATA(arg2), VARSIZE(arg2) - VARHDRSZ);
return new_text;
}
En supposant que le code ci-dessus ait t crit dans le fichier funcs.c et compil en objet partag, nous pourrions dfinir les
fonctions pour PostgreSQL avec des commandes comme ceci :
CREATE FUNCTION add_one(integer) RETURNS integer
AS 'DIRECTORY/funcs', 'add_one'
LANGUAGE C STRICT;
-- notez la surcharge du nom de la fonction SQL "add_one"
CREATE FUNCTION add_one(double precision) RETURNS double precision
663
tendre SQL
AS 'DIRECTORY/funcs', 'add_one_float8'
LANGUAGE C STRICT;
CREATE FUNCTION makepoint(point, point) RETURNS point
AS 'DIRECTORY/funcs', 'makepoint'
LANGUAGE C STRICT;
CREATE FUNCTION copytext(text) RETURNS text
AS 'DIRECTORY/funcs', 'copytext'
LANGUAGE C STRICT;
CREATE FUNCTION concat_text(text, text) RETURNS text
AS 'DIRECTORY/funcs', 'concat_text'
LANGUAGE C STRICT;
Ici, DIRECTORY reprsente le rpertoire contenant le fichier de la bibliothque partage (par exemple le rpertoire du tutoriel de
PostgreSQL, qui contient le code des exemples utiliss dans cette section). (Un meilleur style aurait t d'crire seulement
'funcs' dans la clause AS, aprs avoir ajout DIRECTORY au chemin de recherche. Dans tous les cas, nous pouvons omettre
l'extension spcifique au systme pour les bibliothques partages, communment .so ou .sl.)
Remarquez que nous avons spcifi la fonction comme STRICT , ce qui signifie que le systme devra automatiquement supposer un rsultat NULL si n'importe quelle valeur d'entre est NULL. Ainsi, nous vitons d'avoir vrifier l'existence d'entres
NULL dans le code de la fonction. Sinon, nous aurions d contrler explicitement les valeurs NULL en testant un pointeur NULL
pour chaque argument pass par rfrence (pour les arguments passs par valeur, nous n'aurions mme aucun moyen de
contrle !).
Bien que cette convention d'appel soit simple utiliser, elle n'est pas trs portable ; sur certaines architectures, il y a des problmes
pour passer de cette manire des types de donnes plus petits que int. De plus, il n'y a pas de moyen simple de renvoyer un rsultat
NULL, ni de traiter des arguments NULL autrement qu'en rendant la fonction strict. La convention version-1, prsente ci-aprs,
permet de surmonter ces objections.
"postgres.h"
<string.h>
"fmgr.h"
"utils/geo_decls.h"
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
/* par valeur */
PG_FUNCTION_INFO_V1(add_one);
Datum
add_one(PG_FUNCTION_ARGS)
{
int32
arg = PG_GETARG_INT32(0);
664
tendre SQL
PG_RETURN_INT32(arg + 1);
}
/* par rfrence, longueur fixe */
PG_FUNCTION_INFO_V1(add_one_float8);
Datum
add_one_float8(PG_FUNCTION_ARGS)
{
/* La macro pour FLOAT8 cache sa nature de passage par rfrence. */
float8
arg = PG_GETARG_FLOAT8(0);
PG_RETURN_FLOAT8(arg + 1.0);
}
PG_FUNCTION_INFO_V1(makepoint);
Datum
makepoint(PG_FUNCTION_ARGS)
{
/* Ici, la nature de passage par rfrence de Point n'est pas cache. */
Point
*pointx = PG_GETARG_POINT_P(0);
Point
*pointy = PG_GETARG_POINT_P(1);
Point
*new_point = (Point *) palloc(sizeof(Point));
new_point->x = pointx->x;
new_point->y = pointy->y;
PG_RETURN_POINT_P(new_point);
}
/* par rfrence, longueur variable */
PG_FUNCTION_INFO_V1(copytext);
Datum
copytext(PG_FUNCTION_ARGS)
{
text
*t = PG_GETARG_TEXT_P(0);
/*
* VARSIZE est la longueur totale de la structure en octets.
*/
text
*new_t = (text *) palloc(VARSIZE(t));
SET_VARSIZE(new_t, VARSIZE(t));
/*
* VARDATA est un pointeur vers la rgion de donnes de la structure.
*/
memcpy((void *) VARDATA(new_t), /* destination */
(void *) VARDATA(t),
/* source */
VARSIZE(t) - VARHDRSZ);
/* nombre d'octets */
PG_RETURN_TEXT_P(new_t);
}
PG_FUNCTION_INFO_V1(concat_text);
Datum
concat_text(PG_FUNCTION_ARGS)
{
text *arg1 = PG_GETARG_TEXT_P(0);
text *arg2 = PG_GETARG_TEXT_P(1);
int32 new_text_size = VARSIZE(arg1) + VARSIZE(arg2) - VARHDRSZ;
text *new_text = (text *) palloc(new_text_size);
SET_VARSIZE(new_text, new_text_size);
memcpy(VARDATA(new_text), VARDATA(arg1), VARSIZE(arg1) - VARHDRSZ);
memcpy(VARDATA(new_text) + (VARSIZE(arg1) - VARHDRSZ),
VARDATA(arg2), VARSIZE(arg2) - VARHDRSZ);
665
tendre SQL
PG_RETURN_TEXT_P(new_text);
}
Les commandes CREATE FUNCTION sont les mmes que pour leurs quivalents dans la version-0.
Au premier coup d'il, les conventions de codage de la version-1 peuvent sembler inutilement obscures. Pourtant, elles offrent
nombre d'amliorations car les macros peuvent cacher les dtails superflus. Un exemple est donn par la fonction
add_one_float8 o nous n'avons plus besoin de prter attention au fait que le type float8 est pass par rfrence. Un autre
exemple de simplification est donn par les macros pour les types longueur variable GETARG qui permettent un traitement plus
efficace des valeurs toasted (compresses ou hors-ligne).
Une des grandes amliorations dans les fonctions version-1 est le meilleur traitement des entres et des rsultats NULL. La macro
PG_ARGISNULL(n) permet une fonction de tester si chaque entre est NULL (videmment, ceci n'est ncessaire que pour les
fonctions dclares non STRICT ). Comme avec les macros PG_GETARG_xxx(), les arguments en entre sont compts
partir de zro. Notez qu'on doit se garder d'excuter PG_GETARG_xxx() jusqu' ce qu'on ait vrifi que l'argument n'est pas
NULL. Pour renvoyer un rsultat NULL, excutez la fonction PG_RETURN_NULL() ; ceci convient aussi bien dans les fonctions
STRICT que non STRICT.
Les autres options proposes dans l'interface de nouveau style sont deux variantes des macros PG_GETARG_xxx(). La premire
d'entre elles, PG_GETARG_xxx_COPY(), garantit le renvoi d'une copie de l'argument spcifi o nous pouvons crire en toute
scurit (les macros normales peuvent parfois renvoyer un pointeur vers une valeur physiquement mise en mmoire dans une table
qui ne doit pas tre modifie. En utilisant les macros PG_GETARG_xxx_COPY(), on garantit l'criture du rsultat). La seconde
variante se compose des macros PG_GETARG_xxx_SLICE() qui prennent trois arguments. Le premier est le nombre
d'arguments de la fonction (comme ci-dessus). Le second et le troisime sont le dcalage et la longueur du segment qui doit tre
renvoy. Les dcalages sont compts partir de zro et une longueur ngative demande le renvoi du reste de la valeur. Ces macros
procurent un accs plus efficace des parties de valeurs grande dimension dans le cas o elles ont un type de stockage en mmoire external (le type de stockage d'une colonne peut tre spcifi en utilisant ALTER TABLE nom_table ALTER COLUMN nom_colonne SET STORAGE typestockage. typestockage est un type parmi plain, external, extended ou main).
Enfin, les conventions d'appels de la version-1 rendent possible le renvoi de rsultats d'ensemble (Section 35.9.9, Renvoi
d'ensembles ), l'implmentation de fonctions dclencheurs (Chapitre 36, Dclencheurs (triggers)) et d'oprateurs d'appel de langage procdural (Chapitre 49, crire un gestionnaire de langage procdural). Le code version-1 est aussi plus portable que celui de
version-0 car il ne contrevient pas aux restrictions du protocole d'appel de fonction en C standard. Pour plus de dtails, voir src/
backend/utils/fmgr/README dans les fichiers sources de la distribution.
Utilisez pg_config --includedir-server pour dcouvrir o sont installs les fichiers d'en-tte du serveur PostgreSQL sur votre systme (ou sur le systme de vos utilisateurs).
Compilez et liez votre code de faon ce qu'il soit charg dynamiquement dans PostgreSQL, ce qui requiert des informations spciales. Voir Section 35.9.6, Compiler et lier des fonctions charges dynamiquement pour une explication dtaille
sur la faon de le faire pour votre systme d'exploitation spcifique.
Rappelez-vous de dfinir un bloc magique pour votre bibliothque partage, comme dcrit dans Section 35.9.1,
Chargement dynamique .
Quand vous allouez de la mmoire, utilisez les fonctions PostgreSQL palloc et pfree au lieu des fonctions correspondantes malloc et free de la bibliothque C. La mmoire alloue par palloc sera libre automatiquement la fin de
chaque transaction, empchant des dbordements de mmoire.
Remettez toujours zro les octets de vos structures en utilisant memset (ou allouez les avec la fonction palloc0). Mme si
vous assignez chacun des champs de votre structure, il pourrait rester des espaces de remplissage (trous dans la structure) afin
de respecter l'alignement des donnes qui contiennent des valeurs parasites. Sans cela, il sera difficile de calculer des hachages
pour les index ou les jointures, dans la mesure o vous devrez uniquement tenir compte des octets significatifs de vos structures de donnes pour calculer ces hachages. Le planificateur se base galement sur des comparaisons de constantes via des
galits de bits, aussi vous pouvez obtenir des planifications incorrectes si des valeurs logiquement quivalentes ne sont pas
666
tendre SQL
La plupart des types internes PostgreSQL sont dclars dans postgres.h alors que les interfaces de gestion des fonctions
(PG_FUNCTION_ARGS, etc.) sont dans fmgr.h. Du coup, vous aurez besoin d'inclure au moins ces deux fichiers. Pour des
raisons de portabilit, il vaut mieux inclure postgres.h en premier avant tout autre fichier d'en-tte systme ou utilisateur.
En incluant postgres.h, il incluera galement elog.h et palloc.h pour vous.
Les noms de symboles dfinis dans les objets ne doivent pas entrer en conflit entre eux ou avec les symboles dfinis dans les
excutables du serveur PostgreSQL. Vous aurez renommer vos fonctions ou variables si vous recevez un message d'erreur
cet effet.
tendre SQL
PIC est l'option par dfaut. Aucune option de compilation particulire n'est ncessaire. Le commutateur de l'diteur de liens
pour produire des bibliothques partages est -shared :
cc -c foo.c
ld -shared -o foo.so foo.o
Linux
L'option du compilateur pour crer des PIC est -fpic. Sur certaines plateformes et dans certaines situations, -fPIC doit
tre utilis si -fpic ne fonctionne pas. Le manuel de GCC donne plus d'informations. L'option de compilation pour crer des
bibliothques partages est -shared. Un exemple complet ressemble :
cc -fpic -c foo.c
cc -shared -o foo.so foo.o
Mac OS X
L'exemple suivant suppose que les outils de dveloppement sont installs.
cc -c foo.c
cc -bundle -flat_namespace -undefined suppress -o foo.so foo.o
NetBSD
L'option du compilateur pour crer des PIC est -fpic. Pour les systmes ELF, l'option de compilation pour lier les bibliothques partages est -shared. Sur les systmes plus anciens et non-ELF, on utilise ld -Bshareable.
gcc -fpic -c foo.c
gcc -shared -o foo.so foo.o
OpenBSD
L'option du compilateur pour crer des PIC est -fpic. Les bibliothques partages peuvent tre cres avec ld Bshareable.
gcc -fpic -c foo.c
ld -Bshareable -o foo.so foo.o
Solaris
L'option du compilateur pour crer des PIC est -KPIC avec le compilateur de Sun et -fpic avec GCC. Pour lier les bibliothques partages, l'option de compilation est respectivement -G ou -shared.
cc -KPIC -c foo.c
cc -G -o foo.so foo.o
ou
gcc -fpic -c foo.c
gcc -G -o foo.so foo.o
Tru64 UNIX
Par dfaut, il s'agit de PIC. Ainsi, aucune directive particulire n'est fournir pour la compilation. Pour l'dition de lien, des
options spcifiques sont fournir ld :
cc -c foo.c
ld -shared -expect_unresolved '*' -o foo.so foo.o
Une procdure identique doit tre employe dans le cas o GCC est utilis la place du compilateur du systme ; aucune option particulire n'est ncessaire.
UnixWare
L'option de compilation pour crer des PIC est -KPIC avec le compilateur SCO et -fpic avec GCC. Pour lier des bibliothques partages, les options respectives sont -G et -shared.
cc -K PIC -c foo.c
cc -G -o foo.so foo.o
ou
gcc -fpic -c foo.c
668
tendre SQL
Astuce
Si cela s'vre trop compliqu, GNU Libtool peut tre utilis. Cet outil permet de s'affranchir des diffrences
entre les nombreux systmes au travers d'une interface uniformise.
La bibliothque partage rsultante peut tre charge dans PostgreSQL. Lorsque l'on prcise le nom du fichier dans la commande CREATE FUNCTION, il faut indiquer le nom de la bibliothque partage et non celui du fichier objet intermdiaire.
L'extension standard pour les bibliothques partages (en gnral .so ou .sl) peut tre omise dans la commande CREATE
FUNCTION, et doit l'tre pour une meilleure portabilit.
La Section 35.9.1, Chargement dynamique indique l'endroit o le serveur s'attend trouver les fichiers de bibliothques partages.
/* pour GetAttributeByName() */
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
bool
c_surpaye(HeapTupleHeader *t, /* la ligne courante d'emp */
int32 limite)
{
bool isNULL;
int32 salaire;
salaire = DatumGetInt32(GetAttributeByName(t, "salaire", &isNULL));
if (isNULL)
return false;
return salaire > limite;
}
Dans le codage version-1, le code ci-dessus devient :
#include "postgres.h"
#include "executor/executor.h"
/* pour GetAttributeByName() */
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
PG_FUNCTION_INFO_V1(c_surpaye);
Datum
c_surpaye(PG_FUNCTION_ARGS)
{
HeapTupleHeader *t = (HeapTupleHeader *) PG_GETARG_HEAPTUPLEHEADER(0);
int32
limite = PG_GETARG_INT32(1);
bool isNULL;
Datum salaire;
669
tendre SQL
Astuce
get_call_result_type peut rsoudre le vrai type du rsultat d'une fonction polymorphique ; donc, il est utile
pour les fonctions qui renvoient des rsultats scalaires polymorphiques, pas seulement les fonctions qui renvoient
des types composites. Le rsultat resultTypeId est principalement utile pour les fonctions renvoyant des scalaires polymorphiques.
Note
670
tendre SQL
get_call_result_type a une fonction cousine get_expr_result_type, qui peut tre utilise pour rsoudre le tupe attendu en sortie en un appel de fonction reprsent par un arbre d'expressions. Ceci peut tre utilis
pour tenter de dterminer le type de rsultat sans entrer dans la fonction elle-mme. Il existe aussi
get_func_result_type, qui peut seulement tre utilise quand l'OID de la fonction est disponible. Nanmoins, ces fonctions ne sont pas capables de grer les fonctions dclares renvoyer des enregistrements (record).
get_func_result_type ne peut pas rsoudre les types polymorphiques, donc vous devriez utiliser de prfrence get_call_result_type.
Les fonctions anciennes, et maintenant obsoltes, qui permettent d'obtenir des TupleDesc sont :
TupleDesc RelationNameGetTupleDesc(const char *relname)
pour obtenir un TupleDesc pour le type de ligne d'une relation nomme ou :
TupleDesc TypeGetTupleDesc(Oid typeoid, List *colaliases)
pour obtenir une TupleDesc base sur l'OID d'un type. Ceci peut tre utilis pour obtenir un TupleDesc soit pour un type de base,
soit pour un type composite. Nanmoins, cela ne fonctionnera pas pour une fonction qui renvoie record et cela ne rsoudra pas les
types polymorphiques.
Une fois que vous avez un TupleDesc, appelez :
TupleDesc BlessTupleDesc(TupleDesc tupdesc)
si vous pensez travailler avec des Datums ou :
AttInMetadata *TupleDescGetAttInMetadata(TupleDesc tupdesc)
si vous pensez travailler avec des chanes C. Si vous crivez une fonction renvoyant un ensemble, vous pouvez sauvegarder les rsultats de ces fonctions dans la structure dans le FuncCallContext -- utilisez le champ tuple_desc ou attinmeta respectivement.
Lorsque vous fonctionnez avec des Datums, utilisez :
HeapTuple heap_form_tuple(TupleDesc tupdesc, Datum *values, bool *isnull)
pour construire une donne utilisateur HeapTuple indique dans le format Datum.
Lorsque vous travaillez avec des chanes C, utilisez :
HeapTuple BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values)
pour construire une donne utilisateur HeapTuple indique dans le format des chanes C. values est un tableau de chane C, une
pour chaque attribut de la ligne renvoye. Chaque chane C doit tre de la forme attendue par la fonction d'entre du type de donne de l'attribut. Afin de renvoyer une valeur NULL pour un des attributs, le pointeur correspondant dans le tableau de valeurs
(values) doit tre fix NULL. Cette fonction demandera tre appele pour chaque ligne que vous renvoyez.
Une fois que vous avez construit un tuple devant tre renvoy par votre fonction, vous devez le convertir en type Datum. Utilisez :
HeapTupleGetDatum(HeapTuple tuple)
pour convertir un type HeapTuple en un Datum valide. Ce Datum peut tre renvoy directement si vous envisagez de renvoyer
juste une simple ligne ou bien il peut tre utilis pour renvoyer la valeur courante dans une fonction renvoyant un ensemble.
Un exemple figure dans la section suivante.
tendre SQL
tendre SQL
SRF_FIRSTCALL_INIT()
pour initialiser la structure FuncCallContext. chaque appel de fonction, y compris le premier, utilisez :
SRF_PERCALL_SETUP()
pour une mise jour correcte en vue de l'utilisation de FuncCallContext et pour nettoyer toutes les donnes renvoyes prcdemment et conserves depuis le dernier passage de la fonction.
Si votre fonction a des donnes renvoyer, utilisez :
SRF_RETURN_NEXT(funcctx, result)
pour les renvoyer l'appelant. (result doit tre de type Datum, soit une valeur simple, soit un tuple prpar comme dcrit cidessus.) Enfin, quand votre fonction a fini de renvoyer des donnes, utilisez :
SRF_RETURN_DONE(funcctx)
pour nettoyer et terminer la SRF.
Lors de l'appel de la SRF, le contexte mmoire courant est un contexte transitoire qui est effac entre les appels. Cela signifie que
vous n'avez pas besoin d'appeler pfree sur tout ce que vous avez allou en utilisant palloc ; ce sera supprim de toute faon.
Toutefois, si vous voulez allouer des structures de donnes devant persister tout au long des appels, vous avez besoin de les
conserver quelque part. Le contexte mmoire rfrenc par multi_call_memory_ctx est un endroit appropri pour toute
donne devant survivre jusqu' l'achvement de la fonction SRF. Dans la plupart des cas, cela signifie que vous devrez basculer
vers multi_call_memory_ctx au moment de la prparation du premier appel.
Voici un exemple complet de pseudo-code :
Datum
my_set_returning_function(PG_FUNCTION_ARGS)
{
FuncCallContext *funcctx;
Datum
result;
further declarations as needed
if (SRF_IS_FIRSTCALL())
{
MemoryContext oldcontext;
funcctx = SRF_FIRSTCALL_INIT();
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
/* One-time setup code appears here: */
user code
if returning composite
build TupleDesc, and perhaps AttInMetadata
endif returning composite
user code
MemoryContextSwitchTo(oldcontext);
}
/* Each-time setup code appears here: */
user code
funcctx = SRF_PERCALL_SETUP();
user code
/* this is just one way we might test whether we are done: */
if (funcctx->call_cntr < funcctx->max_calls)
{
/* Here we want to return another item: */
user code
obtain result Datum
SRF_RETURN_NEXT(funcctx, result);
}
else
{
/* Here we are done returning items and just need to clean up: */
user code
SRF_RETURN_DONE(funcctx);
}
}
673
tendre SQL
/*
* Prepare a values array for building the returned tuple.
* This should be an array of C strings which will
* be processed later by the type input functions.
*/
values = (char **) palloc(3 * sizeof(char *));
values[0] = (char *) palloc(16 * sizeof(char));
values[1] = (char *) palloc(16 * sizeof(char));
values[2] = (char *) palloc(16 * sizeof(char));
snprintf(values[0], 16, "%d", 1 * PG_GETARG_INT32(1));
snprintf(values[1], 16, "%d", 2 * PG_GETARG_INT32(1));
snprintf(values[2], 16, "%d", 3 * PG_GETARG_INT32(1));
674
tendre SQL
/* build a tuple */
tuple = BuildTupleFromCStrings(attinmeta, values);
/* make the tuple into a datum */
result = HeapTupleGetDatum(tuple);
/* clean up (this is not really necessary) */
pfree(values[0]);
pfree(values[1]);
pfree(values[2]);
pfree(values);
SRF_RETURN_NEXT(funcctx, result);
}
else
{
}
}
Voici une faon de dclarer cette fonction en SQL :
CREATE TYPE __retcomposite AS (f1 integer, f2 integer, f3 integer);
CREATE OR REPLACE FUNCTION retcomposite(integer, integer)
RETURNS SETOF __retcomposite
AS 'filename', 'retcomposite'
LANGUAGE C IMMUTABLE STRICT;
Une faon diffrente de le faire est d'utiliser des paramtres OUT :
CREATE OR REPLACE FUNCTION retcomposite(IN integer, IN integer,
OUT f1 integer, OUT f2 integer, OUT f3 integer)
RETURNS SETOF record
AS 'filename', 'retcomposite'
LANGUAGE C IMMUTABLE STRICT;
Notez que dans cette mthode le type en sortie de la fonction est du type record anonyme.
Le module contrib/tablefunc situ dans les fichiers source de la distribution contient d'autres exemples de fonctions renvoyant des
ensembles.
tendre SQL
int
int
int
ndims;
dims[MAXDIM];
lbs[MAXDIM];
if (!OidIsValid(element_type))
elog(ERROR, "could not determine data type of input");
/* get the provided element, being careful in case it's NULL */
isnull = PG_ARGISNULL(0);
if (isnull)
element = (Datum) 0;
else
element = PG_GETARG_DATUM(0);
/* we have one dimension */
ndims = 1;
/* and one element */
dims[0] = 1;
/* and lower bound is 1 */
lbs[0] = 1;
/* get required info about the element type */
get_typlenbyvalalign(element_type, &typlen, &typbyval,
&typalign);
/* now build the array */
result = construct_md_array(&element, &isnull, ndims, dims, lbs,
element_type, typlen, typbyval, typalign);
PG_RETURN_ARRAYTYPE_P(result);
}
La commande suivante dclare la fonction make_array en SQL :
CREATE FUNCTION make_array(anyelement)
RETURNS anyarray
AS 'DIRECTORY/funcs', 'make_array'
LANGUAGE 'C' IMMUTABLE;
Notez l'utilisation de STRICT ; ceci est primordial car le code ne se proccupe pas de tester une entre NULL.
Il existe une variante du polymorphisme qui est seulement disponible pour les fonctions en langage C : elles peuvent tre dclares
prendre des paramtres de type "any". (Notez que ce nom de type doit tre plac entre des guillemets doubles car il s'agit d'un
mot SQL rserv.) Ceci fonctionne comme anyelement sauf qu'il ne contraint pas les diffrents arguments "any" tre du mme
type, pas plus qu'ils n'aident dterminer le type de rsultat de la fonction. Une fonction en langage C peut aussi dclarer son paramtre final ainsi : VARIADIC "any". Cela correspondra un ou plusieurs arguments rels de tout type (pas ncessairement le
mme type). Ces arguments ne seront pas placs dans un tableau comme c'est le cas pour les fonctions variadic normales ; ils seront passs sparment la fonction. La macro PG_NARGS() et les mthodes dcrites ci-dessus doivent tre utilises pour dterminer le nombre d'arguments rels et leur type lors de l'utilisation de cette fonctionnalit.
tendre SQL
if (!ptr)
{
bool
found;
LWLockAcquire(AddinShmemInitLock, LW_EXCLUSIVE);
ptr = ShmemInitStruct("my struct name", size, &found);
if (!found)
{
initialize contents of shmem area;
acquire any requested LWLocks using:
ptr->mylockid = LWLockAssign();
}
LWLockRelease(AddinShmemInitLock);
}
Toutes les fonctions accessibles par le serveur doivent prsenter une interface en C ; seules ces fonctions C pourront alors appeler du code C++. Ainsi, l'dition de liens extern C est ncessaire pour les fonctions appeles par le serveur. Ceci est galement obligatoire pour toutes les fonctions passes comme pointeur entre le serveur et du code C++.
Librez la mmoire en utilisant la mthode de dsallocation approprie. Par exemple, la majeure partie de la mmoire alloue
par le serveur l'est par appel de la fonction palloc(), aussi, il convient de librer ces zones mmoire en utilisant la fonction
pfree(). L'utilisation de la fonction C++ delete chouerait pour ces blocs de mmoire.
vitez la propagation d'exceptions dans le code C (utilisez un bloc catch-all au niveau le plus haut de toute fonction extern
C. Ceci est ncessaire, mme si le code C++ n'met explicitement aucune exception, dans la mesure o la survenue
d'vnements tels qu'un manque de mmoire peut toujours lancer une exception. Toutes les exceptions devront tre gres et
les erreurs correspondantes transmises via l'interface du code C. Si possible, compilez le code C++ avec l'option fno-exceptions afin d'liminer entirement la venue d'exceptions ; dans ce cas, vous devrez effectuer vous-mme les vrifications correspondantes dans votre code C++, par exemple, vrifier les ventuels paramtres NULL retourns par la fonction new().
Si vous appelez des fonctions du serveur depuis du code C++, assurez vous que la pile d'appels ne contienne que des structures
C (POD). Ceci est ncessaire dans la mesure o les erreurs au niveau du serveur gnrent un saut via l'instruction longjmp() qui ne peut dpiler proprement une pile d'appels C++ comportant des objets non-POD.
Pour rsumer, le code C++ doit donc tre plac derrire un rempart de fonctions extern C qui fourniront l'interface avec le serveur, et devra viter toute fuite de mcanismes propres au C++ (exceptions, allocation/libration de mmoire et objets non-POD
dans la pile).
tendre SQL
initcond = '(0,0)'
);
SELECT somme(a) FROM test_complexe;
somme
----------(34,53.9)
(Notez que nous nous reposons sur une surcharge de fonction : il existe plus d'un agrgat nomm sum mais PostgreSQL trouve
le type de somme s'appliquant une colonne de type complex.)
La dfinition prcdente de sum retournera zro (la condition d'tat initial) s'il n'y a que des valeurs d'entre NULL. Dans ce cas,
on peut souhaiter qu' elle retourne NULL -- le standard SQL prvoit que la fonction sum se comporte ainsi. Cela peut tre obtenu
par l'omission de l'instruction initcond, de sorte que la condition d'tat initial soit NULL. Dans ce cas, sfunc vrifie l'entre
d'une condition d'tat NULL mais, pour sum et quelques autres agrgats simples comme max et min, il suffit d'insrer la premire
valeur d'entre non NULL dans la variable d'tat et d'appliquer la fonction de transition d'tat partir de la seconde valeur non
NULL. PostgreSQL fait cela automatiquement si la condition initiale est NULL et si la fonction de transition est marque
strict (elle n'est pas appele pour les entres NULL).
Par dfaut galement, pour les fonctions de transition strict , la valeur d'tat prcdente reste inchange pour une entre NULL.
Les valeurs NULL sont ainsi ignores. Pour obtenir un autre comportement, il suffit de ne pas dclarer la fonction de transition
strict . la place, codez-la de faon ce qu'elle vrifie et traite les entres NULL.
avg (average = moyenne) est un exemple plus complexe d'agrgat. Il demande deux tats courants : la somme des entres et le
nombre d'entres. Le rsultat final est obtenu en divisant ces quantits. La moyenne est typiquement implante en utilisant comme
valeur d'tat un tableau. Par exemple, l'implmentation intgre de avg(float8) ressemble :
CREATE AGGREGATE avg (float8)
(
sfunc = float8_accum,
stype = float8[],
finalfunc = float8_avg,
initcond = '{0,0,0}'
);
(float8_accum ncessite un tableau trois lments, et non pas seulement deux, car il accumule la somme des carrs, ainsi que
la somme et le nombre des entres. Cela permet son utilisation pour d'autres agrgats que avg.)
Les fonctions d'agrgat peuvent utiliser des fonctions d'tat transitionnelles ou des fonctions finales polymorphes. De cette faon,
les mmes fonctions peuvent tre utilises pour de multiples agrgats. Voir la Section 35.2.5, Types et fonctions polymorphes
pour une explication des fonctions polymorphes. La fonction d'agrgat elle-mme peut tre spcifie avec un type de base et des
types d'tat polymorphes, ce qui permet ainsi une unique dfinition de fonction de servir pour de multiples types de donnes en
entre. Voici un exemple d'agrgat polymorphe :
CREATE AGGREGATE array_accum (anyelement)
(
sfunc = array_append,
stype = anyarray,
initcond = '{}'
);
Dans ce cas, le type d'tat effectif pour tout appel d'agrgat est le type tableau avec comme lments le type effectif d'entre. Le
comportement de l'agrgat est de concatner toutes les entres dans un tableau de ce type. (Note : l'agrgat array_agg fournit
une fonctionnalit similaire, avec de meilleures performances que ne pourrait avoir cette dfinition.)
Voici le rsultat pour deux types de donnes diffrents en arguments :
SELECT attrelid::regclass, array_accum(attname)
FROM pg_attribute WHERE attnum > 0
AND attrelid = 'pg_tablespace'::regclass GROUP BY attrelid;
attrelid
|
array_accum
---------------+--------------------------------------pg_tablespace | {spcname,spcowner,spclocation,spcacl}
(1 row)
SELECT attrelid::regclass, array_accum(atttypid::regtype)
FROM pg_attribute
WHERE attnum > 0 AND attrelid = 'pg_tablespace'::regclass
GROUP BY attrelid;
678
tendre SQL
attrelid
|
array_accum
---------------+--------------------------pg_tablespace | {name,oid,text,aclitem[]}
(1 row)
Une fonction crite en C peut dtecter si elle est appele en tant que fonction de transition ou en tant que fonction finale d'un agrgat en appelant AggCheckCallContext, par exemple :
if (AggCheckCallContext(fcinfo, NULL))
Une raison de surveiller ceci est que, si le retour de cette fonction vaut true pour une fonction de transition, la premire valeur doit
tre une valeur de transition temporaire et peut du coup tre modifie en toute sret sans avoir allouer une nouvelle copie. Voir
int8inc() pour un exemple. (C'est le seul cas o une fonction peut modifier en toute scurit un argument pass en rfrence.
En particulier, les fonctions finales d'agrgat ne doivent pas modifier leur arguments dans tous les cas car, dans certains cas, elles
seront r-excutes sur la mme valeur de transition finale.)
Pour de plus amples dtails, on se rfrera la commande CREATE AGGREGATE(7).
tendre SQL
result->x = x;
result->y = y;
PG_RETURN_POINTER(result);
}
La fonction de sortie peut s'crire simplement :
PG_FUNCTION_INFO_V1(complex_out);
Datum
complex_out(PG_FUNCTION_ARGS)
{
Complex
*complex = (Complex *) PG_GETARG_POINTER(0);
char
*result;
result = (char *) palloc(100);
snprintf(result, 100, "(%g,%g)", complex->x, complex->y);
PG_RETURN_CSTRING(result);
}
Il est particulirement important de veiller ce que les fonctions d'entre et de sortie soient bien inverses l'une par rapport
l'autre. Dans le cas contraire, de grosses difficults pourraient apparatre lors de la sauvegarde de la base dans un fichier en vue
d'une future relecture de ce fichier. Ceci est un problme particulirement frquent lorsque des nombres virgule flottante entrent
en jeu.
De manire optionnelle, un type utilisateur peut fournir des routines d'entre et de sortie binaires. Les entres/sorties binaires sont
normalement plus rapides mais moins portables que les entres/sorties textuelles. Comme avec les entres/sorties textuelles, c'est
l'utilisateur qui dfinit prcisment la reprsentation binaire externe. La plupart des types de donnes intgrs tentent de fournir
une reprsentation binaire indpendante de la machine. Dans le cas du type complex, des convertisseurs d'entres/sorties binaires
pour le type float8 sont utiliss :
PG_FUNCTION_INFO_V1(complex_recv);
Datum
complex_recv(PG_FUNCTION_ARGS)
{
StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
Complex
*result;
result = (Complex *) palloc(sizeof(Complex));
result->x = pq_getmsgfloat8(buf);
result->y = pq_getmsgfloat8(buf);
PG_RETURN_POINTER(result);
}
PG_FUNCTION_INFO_V1(complex_send);
Datum
complex_send(PG_FUNCTION_ARGS)
{
Complex
*complex = (Complex *) PG_GETARG_POINTER(0);
StringInfoData buf;
pq_begintypsend(&buf);
pq_sendfloat8(&buf, complex->x);
pq_sendfloat8(&buf, complex->y);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
Lorsque les fonctions d'entre/sortie sont crites et compiles en une bibliothque partage, le type complex peut tre dfini en
SQL. Tout d'abord, il est dclar comme un type shell :
CREATE TYPE complex;
Ceci sert de paramtre qui permet de mettre en rfrence le type pendant la dfinition de ses fonctions E/S. Les fonctions E/S
peuvent alors tre dfinies :
CREATE FUNCTION complex_in(cstring)
RETURNS complex
AS 'filename'
680
tendre SQL
Note
Un ancien code dclare frquemment vl_len_ comme un champ de type int32 au lieu de char[4]. C'est correct
tant que la dfinition de la structure a d'autres champs qui ont au moins un alignement int32. Mais il est dangereux
d'utiliser une telle dfinition de structure en travaillant avec un datum potentiellement mal align ; le compilateur
peut le prendre comme une indication pour supposer que le datum est en fait align, ceci amenant des core dump
sur des architectures qui sont strictes sur l'alignement.
Pour plus de dtails, voir la description de la commande CREATE TYPE(7).
tendre SQL
sucre syntaxique car il apporte des informations supplmentaires qui aident le planificateur de requte optimiser les requtes
utilises par l'oprateur. La prochaine section est consacre l'explication de ces informations additionnelles.
postgresql accepte les oprateurs unaire gauche, unaire droit et binaire. Les oprateurs peuvent tre surchargs ; c'est--dire que
le mme nom d'oprateur peut tre utilis pour diffrents oprateurs condition qu'ils aient des nombres et des types diffrents
d'oprandes. Quand une requte est excute, le systme dtermine l'oprateur appeler en fonction du nombre et des types
d'oprandes fournis.
Voici un exemple de cration d'oprateur pour l'addition de deux nombres complexes. Nous supposons avoir dj cr la dfinition du type complex (voir la Section 35.11, Types utilisateur ). premirement, nous avons besoin d'une fonction qui fasse le
travail, ensuite nous pouvons dfinir l'oprateur :
CREATE FUNCTION complex_add(complex, complex)
RETURNS complex
AS 'filename', 'complex_add'
LANGUAGE C;
CREATE OPERATOR + ( leftarg = complex, rightarg = complex, procedure =
complex_add, commutator = + );
Maintenant nous pouvons excuter la requte comme ceci :
SELECT (a + b) AS c FROM test_complex;
c
----------------(5.2,6.05)
(133.42,144.95)
Nous avons montr comment crer un oprateur binaire. Pour crer des oprateurs unaires, il suffit d'omettre un des leftarg
(pour un oprateur unaire gauche) ou rightarg (pour un oprateur unaire droit). La clause procedure et les clauses argument
sont les seuls lments requis dans la commande create operator. la clause commutator montre dans l'exemple est une indication optionnelle pour l'optimiseur de requte. Des dtails supplmentaires sur la clause commutator et d'autres complments
d'optimisation sont donns dans la prochaine section.
35.13.1. COMMUTATOR
Si elle est fournie, la clause commutator dsigne un oprateur qui est le commutateur de l'oprateur en cours de dfinition.
Nous disons qu'un oprateur A est le commutateur de l'oprateur B si (x A y) est gal (y B x) pour toute valeur possible de x, y.
Notez que B est aussi le commutateur de A. Par exemple, les oprateurs < et > pour un type particulier de donnes sont habituellement des commutateurs l'un pour l'autre, et l'oprateur + est habituellement commutatif avec lui-mme. Mais l'oprateur - n'est
habituellement commutatif avec rien.
Le type de l'oprande gauche d'un oprateur commut est le mme que l'oprande droit de son commutateur, et vice versa. Aussi
postgresql n'a besoin que du nom de l'oprateur commutateur pour consulter le commutateur, et c'est tout ce qui doit tre fourni
la clause commutator .
Vous avez juste dfinir un oprateur auto-commutateur. Mais les choses sont un peu plus compliques quand vous dfinissez
une paire de commutateurs : comment peut-on dfinir la rfrence du premier au second alors que ce dernier n'est pas encore dfini ? Il y a deux solutions ce problme :
Une faon d'oprer est d'omettre la clause commutator dans le premier oprateur que vous dfinissez et ensuite d'en insrer
une dans la dfinition du second oprateur. Puisque postgresql sait que les oprateurs commutatifs vont par paire, quand il
voit la seconde dfinition, il retourne instantanment remplir la clause commutator manquante dans la premire dfinition.
L'autre faon, plus directe, est de simplement inclure les clauses commutator dans les deux dfinitions. quand postgresql
682
tendre SQL
traite la premire dfinition et ralise que la clause commutator se rfre un oprateur inexistant, le systme va crer une
entre provisoire pour cet oprateur dans le catalogue systme. Cette entre sera pourvue seulement de donnes valides pour le
nom de l'oprateur, les types d'oprande droit et gauche et le type du rsultat, puisque c'est tout ce que postgresql peut dduire ce point. la premire entre du catalogue pour l'oprateur sera lie cette entre provisoire. Plus tard, quand vous dfinirez le second oprateur, le systme mettra jour l'entre provisoire avec les informations additionnelles fournies par la seconde dfinition. Si vous essayez d'utiliser l'oprateur provisoire avant qu'il ne soit complt, vous aurez juste un message
d'erreur.
35.13.2. NEGATOR
La clause negator dnomme un oprateur qui est l'oprateur de ngation de l'oprateur en cours de dfinition. Nous disons
qu'un oprateur A est l'oprateur de ngation de l'oprateur B si tous les deux renvoient des rsultats boolens et si (x A y) est gal
NOT (x B y) pour toutes les entres possible x, y. Notez que B est aussi l'oprateur de ngation de A. Par exemple, < et >=
forment une paire d'oprateurs de ngation pour la plupart des types de donnes. Un oprateur ne peut jamais tre valid comme
son propre oprateur de ngation .
Au contraire des commutateurs, une paire d'oprateurs unaires peut tre valide comme une paire d'oprateurs de ngation rciproques ; ce qui signifie que (A x) est gal NOT (B x) pour tout x ou l'quivalent pour les oprateurs unaires droite.
L'oprateur de ngation d'un oprateur doit avoir les mmes types d'oprandes gauche et/ou droit que l'oprateur dfinir comme
avec commutator. seul le nom de l'oprateur doit tre donn dans la clause negator.
Dfinir un oprateur de ngation est trs utile pour l'optimiseur de requtes car il permet de simplifier des expressions telles que
not (x = y) en x <> y. ceci arrive souvent parce que les oprations not peuvent tre insres la suite d'autres rarrangements.
Des paires d'oprateurs de ngation peuvent tre dfinies en utilisant la mme mthode que pour les commutateurs.
35.13.3. RESTRICT
La clause restrict, si elle est invoque, nomme une fonction d'estimation de slectivit de restriction pour cet oprateur (notez
que c'est un nom de fonction, et non pas un nom d'oprateur). Les clauses restrict n'ont de sens que pour les oprateurs binaires qui renvoient un type boolean. un estimateur de slectivit de restriction repose sur l'ide de prvoir quelle fraction des
lignes dans une table satisfera une condition de clause where de la forme :
colonne OP constante
pour l'oprateur courant et une valeur constante particulire. Ceci aide l'optimiseur en lui donnant une ide du nombre de lignes
qui sera limin par les clauses where qui ont cette forme (vous pouvez vous demander, qu'arrivera-t-il si la constante est
gauche ? h bien, c'est une des choses laquelle sert le commutator...).
L'criture de nouvelles fonctions d'estimation de restriction de slectivit est loigne des objectifs de ce chapitre mais, heureusement, vous pouvez habituellement utiliser un des estimateurs standards du systme pour beaucoup de vos propres oprateurs. Voici les estimateurs standards de restriction :
eqsel pour =
neqsel pour <>
scalarltsel pour < ou <=
scalargtsel pour > ou >=
Ces catgories peuvent sembler un peu curieuses mais cela prend un sens si vous y rflchissez. = acceptera typiquement une petite fraction des lignes d'une table ; <> rejettera typiquement seulement une petite fraction des lignes de la table. < acceptera une
fraction des lignes en fonction de la situation de la constante donne dans la gamme de valeurs de la colonne pour cette table (ce
qui est justement l'information collecte par la commande analyze et rendue disponible pour l'estimateur de slectivit). <= acceptera une fraction lgrement plus grande que < pour la mme constante de comparaison mais elles sont assez proches pour ne pas
valoir la peine d'tre distingues puisque nous ne risquons pas de toute faon de faire mieux qu'une grossire estimation. La mme
remarque s'applique > et >=.
Vous pouvez frquemment vous en sortir bon compte en utilisant soit eqsel ou neqsel pour des oprateurs qui ont une trs
grande ou une trs faible slectivit, mme s'ils ne sont pas rellement galit ou ingalit. Par exemple, les oprateurs gomtriques d'galit approche utilisent eqsel en supposant habituellement qu'ils ne correspondent qu' une petite fraction des entres dans une table.
Vous pouvez utiliser scalarltsel et scalargtsel pour des comparaisons de types de donnes qui possdent un moyen de
conversion en scalaires numriques pour les comparaisons de rang. Si possible, ajoutez le type de donnes ceux accepts par la
fonction convert_to_scalar() dans src/backend/utils/adt/selfuncs.c (finalement, cette fonction devrait tre
remplace par des fonctions pour chaque type de donnes identifi grce une colonne du catalogue systme pg_type ; mais cela n'a pas encore t fait). si vous ne faites pas ceci, les choses fonctionneront mais les estimations de l'optimiseur ne seront pas
683
tendre SQL
35.13.4. JOIN
La clause join, si elle est invoque, nomme une fonction d'estimation de slectivit de jointure pour l'oprateur (notez que c'est
un nom de fonction, et non pas un nom d'oprateur). Les clauses join n'ont de sens que pour les oprateurs binaires qui renvoient
un type boolean. un estimateur de slectivit de jointure repose sur l'ide de prvoir quelle fraction des lignes dans une paire de
tables satisfera une condition de clause where de la forme :
table1.colonne1 OP table2.colonne2
pour l'oprateur courant. Comme pour la clause restrict, ceci aide considrablement l'optimiseur en lui indiquant parmi plusieurs squences de jointure possibles laquelle prendra vraisemblablement le moins de travail.
Comme prcdemment, ce chapitre n'essaiera pas d'expliquer comment crire une fonction d'estimation de slectivit de jointure
mais suggrera simplement d'utiliser un des estimateurs standard s'il est applicable :
eqjoinsel pour =
neqjoinsel pour <>
scalarltjoinsel pour < ou <=
scalargtjoinsel pour > ou >=
areajoinsel pour des comparaisons bases sur une aire 2d
positionjoinsel pour des comparaisons bases sur une position 2d
contjoinsel pour des comparaisons bases sur un appartenance 2d
35.13.5. HASHES
La clause hashes indique au systme qu'il est permis d'utiliser la mthode de jointure-dcoupage pour une jointure base sur cet
oprateur. hashes n'a de sens que pour un oprateur binaire qui renvoie un boolean et en pratique l'oprateur galit doit reprsenter l'galit pour certains types de donnes ou paire de type de donnes.
La jointure-dcoupage repose sur l'hypothse que l'oprateur de jointure peut seulement renvoyer la valeur vrai pour des paires de
valeurs droite et gauche qui correspondent au mme code de dcoupage. Si deux valeurs sont places dans deux diffrents paquets
( buckets ), la jointure ne pourra jamais les comparer avec la supposition implicite que le rsultat de l'oprateur de jointure doit
tre faux. Ainsi, il n'y a aucun sens spcifier hashes pour des oprateurs qui ne reprsentent pas une certaine forme d'galit.
Dans la plupart des cas, il est seulement pratique de supporter le hachage pour les oprateurs qui prennent le mme type de donnes sur chaque ct. Nanmoins, quelque fois, il est possible de concevoir des fonctions de hachage compatibles pour deux type
de donnes, voire plus ; c'est--dire pour les fonctions qui gnreront les mmes codes de hachage pour des valeurs gales mme
si elles ont des reprsentations diffrentes. Par exemple, il est assez simple d'arranger cette proprit lors du hachage d'entiers de
largeurs diffrentes.
Pour tre marqu hashes, l'oprateur de jointure doit apparatre dans une famille d'oprateurs d'index de dcoupage. Ceci n'est
pas rendu obligatoire quand vous crez l'oprateur, puisque videmment la classe rfrenant l'oprateur peut ne pas encore exister. Mais les tentatives d'utilisation de l'oprateur dans les jointure-dcoupage choueront l'excution si une telle famille
d'oprateur n'existe pas. Le systme a besoin de la famille d'oprateur pour dfinir la fonction de dcoupage spcifique au type de
donnes d'entre de l'oprateur. Bien sr, vous devez galement crer des fonctions de dcoupage appropries avant de pouvoir
crer la famille d'oprateur.
On doit apporter une grande attention la prparation des fonctions de dcoupage parce qu'il y a des processus dpendants de la
machine qui peuvent ne pas faire les choses correctement. Par exemple, si votre type de donnes est une structure dans laquelle
peuvent se trouver des bits de remplissage sans intrt, vous ne pouvez pas simplement passer la structure complte la fonction
hash_any ( moins d'crire vos autres oprateurs et fonctions de faon s'assurer que les bits inutiliss sont toujours zro, ce qui
est la stratgie recommande). Un autre exemple est fourni sur les machines qui respectent le standard de virgule-flottante ieee, le
zro ngatif et le zro positif sont des valeurs diffrentes (les motifs de bit sont diffrents) mais ils sont dfinis pour tre gaux. Si
une valeur flottante peut contenir un zro ngatif, alors une tape supplmentaire est ncessaire pour s'assurer qu'elle gnre la
mme valeur de dcoupage qu'un zro positif.
Un oprateur joignable par hachage doit avoir un commutateur (lui-mme si les types de donnes des deux oprandes sont identiques, ou un oprateur d'galit relatif dans le cas contraire) qui apparat dans la mme famille d'oprateur. Si ce n'est pas le cas,
des erreurs du planificateur pourraient apparatre quand l'oprateur est utilis. De plus, une bonne ide (mais pas obligatoire) est
qu'une famille d'oprateur de hachage supporte les tupes de donnes multiples pour fournir des oprateurs d'galit pour chaque
combinaison des types de donnes ; cela permet une meilleure optimisation.
684
tendre SQL
Note
La fonction sous-jacente un oprateur de jointure-dcoupage doit tre marque immuable ou stable. Si elle est volatile, le systme n'essaiera jamais d'utiliser l'oprateur pour une jointure hachage.
Note
Si un oprateur de jointure-hachage a une fonction sous-jacente marque stricte, la fonction doit galement tre
complte : cela signifie qu'elle doit renvoyer TRUE ou FALSE, jamais NULL, pour n'importe quelle double entre
non NULL. Si cette rgle n'est pas respecte, l'optimisation de dcoupage des oprations in peut gnrer des rsultats faux (spcifiquement, in devrait renvoyer false quand la rponse correcte devrait tre NULL ; ou bien il devrait renvoyer une erreur indiquant qu'il ne s'attendait pas un rsultat NULL).
35.13.6. MERGES
La clause merges, si elle est prsente, indique au systme qu'il est permis d'utiliser la mthode de jointure-union pour une jointure base sur cet oprateur. merges n'a de sens que pour un oprateur binaire qui renvoie un boolean et, en pratique, cet oprateur doit reprsenter l'galit pour des types de donnes ou des paires de types de donnes.
La jointure-union est fonde sur le principe d'ordonner les tables gauche et droite et ensuite de les comparer en parallle. Ainsi, les
deux types de donnes doivent tre capable d'tre pleinement ordonnes, et l'oprateur de jointure doit pouvoir russir seulement
pour des paires de valeurs tombant la mme place dans l'ordre de tri. En pratique, cela signifie que l'oprateur de jointure
doit se comporter comme l'oprateur galit. Mais il est possible de faire une jointure-union sur deux types de donnes distincts
tant qu'ils sont logiquement compatibles. Par exemple, l'oprateur d'galit smallint-contre-integer est susceptible d'oprer une
jointure-union. Nous avons seulement besoin d'oprateurs de tri qui organisent les deux types de donnes en squences logiquement comparables.
Pour tre marqu MERGES, l'oprateur de jointure doit apparatre en tant que membre d'galit d'une famille oprateur d'index
btree. Ceci n'est pas forc quand vous crez l'oprateur puisque, bien sr, la famille d'oprateur rfrente n'existe pas encore.
Mais l'oprateur ne sera pas utilis pour les jointures de fusion sauf si une famille d'oprateur correspondante est trouve. L'option
MERGES agit en fait comme une aide pour le planificateur lui indiquant qu'il est intressant de chercher une famille d'oprateur
correspondant.
Un oprateur joignable par fusion doit avoir un commutateur (lui-mme si les types de donnes des deux oprateurs sont identiques, ou un oprateur d'galit en relation dans le cas contraire) qui apparatdans la mme famille d'oprateur. Si ce n'est pas le
cas, des erreurs du planificateur pourraient apparatre quand l'oprateur est utilis. De plus, une bonne ide (mais pas obligatoire)
est qu'une famille d'oprateur de hachage supporte les tupes de donnes multiples pour fournir des oprateurs d'galit pour
chaque combinaison des types de donnes ; cela permet une meilleure optimisation.
Note
La fonction sous-jacente un oprateur de jointure-union doit tre marque immuable ou stable. Si elle est volatile,
le systme n'essaiera jamais d'utiliser l'oprateur pour une jointure union.
tendre SQL
Opration
Numro de stratgie
gal
Les index de dcoupage permettent seulement des comparaisons d'galit et utilisent ainsi une seule stratgie expose dans le Tableau 35.3, Stratgies de dcoupage .
Tableau 35.3. Stratgies de dcoupage
Opration
Numro de stratgie
gal
Les index GiST sont plus flexibles : ils n'ont pas du tout un ensemble fixe de stratgies. la place, la routine de support de
cohrence de chaque classe d'oprateur GiST interprte les numros de stratgie comme elle l'entend. Comme exemple, plusieurs des classes d'oprateurs GiST indexe les objets gomtriques deux dimensions fournissant les stratgies R-tree affiches dans Tableau 35.4, Stratgies R-tree pour GiST deux dimensions . Quatre d'entre elles sont des vrais tests deux dimensions (surcharge, identique, contient, contenu par) ; quatre autres considrent seulement la direction X ; et les quatre dernires
fournissent les mmes tests dans la direction Y.
Tableau 35.4. Stratgies R-tree pour GiST deux dimensions
686
tendre SQL
Opration
Numro de stratgie
strictement gauche de
surcharge
strictement droite de
identique
contient
contenu par
strictement en dessous
10
strictement au dessus
11
12
Les index GIN sont similaires aux index GiST en flexibilit : ils n'ont pas un ensemble fixe de stratgie. la place, les routines de
support de chaque classe d'oprateur interprtent les numros de stratgie suivant la dfinition du classe d'oprateur. Comme
exemple, les numros des stratgies utiliss par les classes d'oprateur sur des tableaux sont affichs dans Tableau 35.5,
Stratgies des tableaux GIN .
Tableau 35.5. Stratgies des tableaux GIN
Opration
Numro de stratgie
surcharge
contient
identique
Notez que tous les oprateurs ci-dessus renvoient des valeurs de type boolen. Dans la pratique, tous les oprateurs dfinis comme
index method search operators doivent renvoyer un type boolean puisqu'ils doivent apparatre au plus haut niveau d'une clause
WHERE pour tre utiliss avec un index. (Some index access methods also support ordering operators, which typically don't return
Boolean values; that feature is discussed in Section 35.14.7, Ordering Operators .)
Fonction
Numro d'appui
687
tendre SQL
De faon identique, les index de dcoupage requirent une fonction d'appui expose dans le Tableau 35.7, Fonctions d'appui
pour dcoupage .
Tableau 35.7. Fonctions d'appui pour dcoupage
Fonction
Numro d'appui
Les index GiST requirent sept fonctions d'appui, with an optional eighth, exposes dans le Tableau 35.8, Fonctions d'appui
pour GiST .
Tableau 35.8. Fonctions d'appui pour GiST
Fonction
Description
Numro d'appui
consistent
union
compress
decompress
penalty
picksplit
equal
distance
Les index GIN requirent quatre fonctions d'appui, with an optional fifth, exposes dans le Tableau 35.9, Fonctions d'appui
GIN .
Tableau 35.9. Fonctions d'appui GIN
Fonction
Description
compare
Compare deux cls et renvoie un entier plus petit que zro, zro
ou plus grand que zro, indiquant si la premire cl est plus petit, gal ou plus grand que la seconde.
extractValue
extractQuery
consistent
comparePartial
Contrairement aux oprateurs de recherche, les fonctions d'appui renvoient le type de donne, quelqu'il soit, que la mthode
d'indexation particulire attend, par exemple, dans le cas de la fonction de comparaison des B-trees, un entier sign. Le nombre et
le type des arguments pour chaque fonction de support peuvent dpendre de la mthode d'indexage. Pour les B-tree et les hash, les
fonctions de support prennent les mme types de donnes en entre comme le font les oprateurs incluant dans la classe
d'oprateur, bien que ce ne soit pas le cas pour la plupart des fonctions de support GIN et GiST.
688
tendre SQL
35.14.4. Exemple
Maintenant que nous avons vu les ides, voici l'exemple promis de cration d'une nouvelle classe d'oprateur. Cette classe
d'oprateur encapsule les oprateurs qui trient les nombres complexes selon l'ordre de la valeur absolue, aussi avons-nous choisi le
nom de complex_abs_ops. En premier lieu, nous avons besoin d'un ensemble d'oprateurs. La procdure pour dfinir des oprateurs a t discute dans la Section 35.12, Oprateurs dfinis par l'utilisateur . Pour une classe d'oprateur sur les B-trees,
nous avons besoin des oprateurs :
Le plus simple moyen de dfinie un ensemble d'oprateurs de comparaison est d'crire en premier la fonction de comparaison Btree, puis d'crire les autres fonctions en tant que wrapper de la fonction de support. Ceci rduit les risques de rsultats incohrents
pour les cas spcifiques. En suivant cette approche, nous devons tout d'abord crire :
#define Mag(c)
((c)->x*(c)->x + (c)->y*(c)->y)
static int
complex_abs_cmp_internal(Complex *a, Complex *b)
{
double
amag = Mag(a),
bmag = Mag(b);
if (amag <
return
if (amag >
return
return 0;
bmag)
-1;
bmag)
1;
}
Maintenant, la fonction plus-petit-que ressemble ceci :
PG_FUNCTION_INFO_V1(complex_abs_lt);
Datum
complex_abs_lt(PG_FUNCTION_ARGS)
{
Complex
*a = (Complex *) PG_GETARG_POINTER(0);
Complex
*b = (Complex *) PG_GETARG_POINTER(1);
PG_RETURN_BOOL(complex_abs_cmp_internal(a, b) < 0);
}
Les quatre autres fonctions diffrent seulement sur la faon dont ils comparent le rsultat de la fonction interne au zro.
Maintenant, dclarons en SQL les fonctions et les oprateurs bass sur ces fonctions :
CREATE FUNCTION complex_abs_lt(complex, complex) RETURNS bool
AS 'nom_fichier', 'complex_abs_lt'
LANGUAGE C IMMUTABLE STRICT;
CREATE OPERATOR < (
leftarg = complex, rightarg = complex, procedure = complex_abs_lt,
commutator = > , negator = >= ,
restrict = scalarltsel, join = scalarltjoinsel
);
Il est important de spcifier les fonctions de slectivit de restriction et de jointure, sinon l'optimiseur sera incapable de faire un
usage effectif de l'index. Notez que les cas 'less-than', 'equal' et 'greater-than' doivent utiliser des fonctions diffrentes de slectivit.
Voici d'autres choses importantes noter :
Il ne peut y avoir qu'un seul oprateur nomm, disons, = et acceptant un type complex pour ses deux oprandes. Dans le cas
prsent, nous n'avons aucun autre oprateur = pour complex mais, si nous construisons un type de donne fonctionnel, nous
689
tendre SQL
aurions certainement dsir que = soit l'opration ordinaire d'galit pour les nombres complexes (et non pour l'galit de leurs
valeurs absolues). Dans ce cas, nous aurions eu besoin d'utiliser un autre nom d'oprateur pour notre fonction complex_abs_eq.
Bien que PostgreSQL puisse se dbrouiller avec des fonctions ayant le mme nom SQL, tant qu'elles ont en argument des
types de donnes diffrents, en C il ne peut exister qu'une fonction globale pour un nom donn. Aussi ne devons-nous pas donner un nom simple comme abs_eq. Habituellement, inclure le nom du type de donnes dans le nom de la fonction C est une
bonne habitude pour ne pas provoquer de conflit avec des fonctions pour d'autres types de donne.
Nous aurions pu faire de abs_eq le nom SQL de la fonction, en laissant PostgreSQL le soin de la distinguer de toute
autre fonction SQL de mme nom par les types de donnes en argument. Pour la simplicit de l'exemple, nous donnerons la
fonction le mme nom au niveau de C et au niveau de SQL.
La prochaine tape est l'enregistrement de la routine d'appui ncessaire pour les B-trees. Le code exemple C qui implmente ceci
est dans le mme fichier qui contient les fonctions d'oprateur. Voici comment dclarer la fonction :
CREATE FUNCTION complex_abs_cmp(complex, complex)
RETURNS integer
AS 'filename'
LANGUAGE C;
Maintenant que nous avons les oprateurs requis et la routine d'appui, nous pouvons enfin crer la classe d'oprateur.
CREATE OPERATOR CLASS complex_abs_ops
DEFAULT FOR TYPE complex USING btree AS
OPERATOR
1
< ,
OPERATOR
2
<= ,
OPERATOR
3
= ,
OPERATOR
4
>= ,
OPERATOR
5
> ,
FUNCTION
1
complex_abs_cmp(complex, complex);
Et c'est fait ! Il devrait tre possible maintenant de crer et d'utiliser les index B-tree sur les colonnes complex.
Nous aurions pu crire les entres de l'oprateur de faon plus explicite comme dans :
OPERATOR
mais il n'y a pas besoin de faire ainsi quand les oprateurs prennent le mme type de donne que celui pour lequel la classe
d'oprateur a t dfinie.
Les exemples ci-dessus supposent que vous voulez que cette nouvelle classe d'oprateur soit la classe d'oprateur B-tree par dfaut
pour le type de donne complex. Si vous ne voulez pas, supprimez simplement le mot DEFAULT.
tendre SQL
et ensuite les oprateurs en relation mais peuvent tre ajouts en tant que membres lches de la famille d'oprateur.
Comme exemple, PostgreSQL a une famille d'oprateur B-tree interne integer_ops, qui inclut les classes d'oprateurs
int8_ops, int4_ops et int2_ops pour les index sur les colonnes bigint (int8), integer (int4) et smallint (int2) respectivement. La famille contient aussi des oprateurs de comparaison inter-type permettant la comparaison de deux de ces types, pour
qu'un index parmi ces types puisse tre parcouru en utilisant une valeur de comparaison d'un autre type. La famille peut tre dupliqu par ces dfinitions :
CREATE OPERATOR FAMILY integer_ops USING btree;
CREATE OPERATOR CLASS int8_ops
DEFAULT FOR TYPE int8 USING btree FAMILY integer_ops AS
-- comparaisons int8 standard
OPERATOR 1 < ,
OPERATOR 2 <= ,
OPERATOR 3 = ,
OPERATOR 4 >= ,
OPERATOR 5 > ,
FUNCTION 1 btint8cmp(int8, int8) ;
CREATE OPERATOR CLASS int4_ops
DEFAULT FOR TYPE int4 USING btree FAMILY integer_ops AS
-- comparaisons int4 standard
OPERATOR 1 < ,
OPERATOR 2 <= ,
OPERATOR 3 = ,
OPERATOR 4 >= ,
OPERATOR 5 > ,
FUNCTION 1 btint4cmp(int4, int4) ;
CREATE OPERATOR CLASS int2_ops
DEFAULT FOR TYPE int2 USING btree FAMILY integer_ops AS
-- comparaisons int2 standard
OPERATOR 1 < ,
OPERATOR 2 <= ,
OPERATOR 3 = ,
OPERATOR 4 >= ,
OPERATOR 5 > ,
FUNCTION 1 btint2cmp(int2, int2) ;
ALTER OPERATOR FAMILY integer_ops USING btree ADD
-- comparaisons inter-types int8 vs int2
OPERATOR 1 < (int8, int2) ,
OPERATOR 2 <= (int8, int2) ,
OPERATOR 3 = (int8, int2) ,
OPERATOR 4 >= (int8, int2) ,
OPERATOR 5 > (int8, int2) ,
FUNCTION 1 btint82cmp(int8, int2) ,
-- comparaisons inter-types int8 vs int4
OPERATOR 1 < (int8, int4) ,
OPERATOR 2 <= (int8, int4) ,
OPERATOR 3 = (int8, int4) ,
OPERATOR 4 >= (int8, int4) ,
OPERATOR 5 > (int8, int4) ,
FUNCTION 1 btint84cmp(int8, int4) ,
-- comparaisons inter-types int4 vs int2
OPERATOR 1 < (int4, int2) ,
OPERATOR 2 <= (int4, int2) ,
OPERATOR 3 = (int4, int2) ,
OPERATOR 4 >= (int4, int2) ,
OPERATOR 5 > (int4, int2) ,
FUNCTION 1 btint42cmp(int4, int2) ,
-- comparaisons inter-types int4 vs int8
OPERATOR 1 < (int4, int8) ,
OPERATOR 2 <= (int4, int8) ,
OPERATOR 3 = (int4, int8) ,
691
tendre SQL
Note
Avant PostgreSQL 8.3, le concept des familles d'oprateurs n'existait pas. Donc, tous les oprateurs inter-type
dont le but tait d'tre utiliss avec un index taient lis directement la classe d'oprateur de l'index. Bien que
cette approche fonctionne toujours, elle est obsolte car elle rend trop importantes les dpendances de l'index et
parce que le planificateur peut grer des comparaisons inter-type avec plus d'efficacit que quand les typdes de
donnes ont des oprateurs dans la mme famille d'oprateur.
tendre SQL
par dfaut.
S'il n'y a pas de classe d'oprateur B-tree par dfaut pour le type de donne, le systme cherchera une classe d'oprateur de dcoupage. Mais puisque cette classe d'oprateur ne fournit que l'galit, c'est en pratique seulement suffisant pour tablir l'galit de tableau.
Quand il n'y a pas de classe d'oprateur par dfaut pour un type de donne, vous obtenez des erreurs telles que could not identify
an ordering operator si vous essayez d'utiliser ces caractristiques SQL avec le type de donne.
Note
Dans les versions de PostgreSQL antrieures la 7.4, les oprations de tri et de groupement utilisaient implicitement les oprateurs nomms =, < et >. Le nouveau comportement qui repose sur les classes d'oprateurs par dfaut
vite d'avoir faire une quelconque supposition sur le comportement des oprateurs avec des noms particuliers.
Un autre point important est qu'un oprateur apparaissant dans une famille d'oprateur de hachage est un candidat pour les jointures de hachage, les agrgations de hachage et les optimisations relatives. La famille d'oprateur de hachage est essentiel ici car
elle identifie le(s) fonction(s) de hachage utiliser.
where float_ops is the built-in operator family that includes operations on float8. This declaration states that the index is able
to return rows in order of increasing values of the <-> operator.
tendre SQL
que quelques lignes supplmentaires qui pourront tre limines par la vrification. Les mthodes d'indexage qui supportent les recherches perte (actuellement GiST et GIN) permettent aux fonctions de support des classes individuelles d'oprateurs de lever le
drapeau recheck, et donc c'est essentiellement une fonctionnalit pour les classes d'oprateur.
Considrons nouveau la situation o nous gardons seulement dans l'index le rectangle dlimitant un objet complexe comme un
polygone. Dans ce cas, il n'est pas trs intressant de conserver le polygone entier dans l'index - nous pouvons aussi bien conserver
seulement un objet simple du type box. Cette situation est exprime par l'option STORAGE dans la commande CREATE OPERATOR CLASS : nous aurons crire quelque chose comme :
CREATE OPERATOR CLASS polygon_ops
DEFAULT FOR TYPE polygon USING gist AS
...
STORAGE box;
Actuellement, seule les mthodes d'indexation GIN et GiST supportent un type STORAGE qui soit diffrent du type de donne de
la colonne. Les routines d'appui de GiST pour la compression (compress) et la dcompression (decompress) doivent
s'occuper de la conversion du type de donne quand STORAGE est utilis. Avec GIN, le type STORAGE identifie le type des valeurs key , qui est normalement diffrent du type de la colonne indexe -- par exemple, une classe d'oprateur pour des colonnes de tableaux d'entiers pourrait avoir des cls qui sont seulement des entiers. Les routines de support GIN extractValue
et extractQuery sont responsables de l'extraction des cls partir des valeurs indexes.
tendre SQL
La commande CREATE EXTENSION(7) repose sur un fichier de contrle associ chaque extension. Ce fichier doit avoir le
mme nom que l'extension suivi du suffixe .control, et doit tre plac dans le sous-rpertoire SHAREDIR/extension du rpertoire d'installation. Il doit tre accompagn d'au moins un fichier de script SQL dont le nom doit rpondre la syntaxe extension--version.sql (par exemple, foo--1.0.sql pour la version 1.0 de l'extension foo). Par dfaut, les fichiers de
script sont eux-aussi situs dans le rpertoire SHAREDIR/extension. Le fichier de contrle peut toutefois spcifier un rpertoire diffrent pour chaque fichier de script.
Le format du fichier de contrle d'une extension est le mme que pour le fichier postgresql.conf, savoir une liste
d'affectation nom_paramtre = valeur avec un maximum d'une affectation par ligne. Les lignes vides et les commentaires
introduits par # sont eux-aussi autoriss. Prenez garde placer entre guillemets les valeurs qui ne sont ni des nombres ni des mots
isols.
Un fichier de contrle peut dfinir les paramtres suivants :
directory (string)
Le rpertoire qui inclut les scripts SQL de l'extension. Si un chemin relatif est spcifi, le sous-rpertoire SHAREDIR du rpertoire d'installation sera choisi comme base. Le comportement par dfaut de ce paramtre revient le dfinir tel que directory = 'extension'.
default_version (string)
La version par dfaut de l'extension, qui sera installe si aucune version n'est spcifie avec la commande CREATE EXTENSION. Ainsi, bien que ce paramtre puisse ne pas tre prcis, il reste recommand de le dfinir pour viter que la commande CREATE EXTENSION ne provoque une erreur en l'absence de l'option VERSION.
comment (string)
Un commentaire de type chane de caractre au sujet de l'extension. Une alternative consiste utiliser la commande COMMENT(7) dans le script de l'extension.
encoding (string)
L'encodage des caractres utilis par les fichiers de script. Ce paramtre doit tre spcifi si les fichiers de script contiennent
des caractres non ASCII. Le comportement par dfaut en l'absence de ce paramtre consiste utiliser l'encodage de la base
de donne.
module_pathname (string)
La valeur de ce paramtre sera utilise pour toute rfrence MODULE_PATHNAME dans les fichiers de script. Si ce paramtre n'est pas dfini, la substitution ne sera pas effectue. La valeur $libdir/nom_de_bibliothque lui est usuellement attribue et dans ce cas, MODULE_PATHNAME est utilis dans la commande CREATE FUNCTION concernant les
fonctions en langage C, de manire ne pas mentionner en dur le nom de la bibliothque partage.
requires (string)
Une liste de noms d'extension dont dpend cette extension, comme par exemple requires = 'foo, bar'. Ces extensions doivent tre installes avant que l'extension puisse tre installe.
superuser (boolean)
Si ce paramtre est true (il s'agit de la valeur par dfaut), seuls les superutilisateurs pourront crer cet extension ou la
mettre jour. Si ce paramtre est false, seuls les droits ncessaires seront requis pour installer ou mettre jour
l'extension.
relocatable (boolean)
Une extension est dite dplaable (relocatable) s'il est possible de dplacer les objets qu'elle contient dans un schma diffrent de celui attribu initialement par l'extension. La valeur par dfaut est false, ce qui signifie que l'extension n'est pas
dplaable. Voir ci-dessous pour des informations complmentaires.
schema (string)
Ce paramtre ne peut tre spcifi que pour les extensions non dplaables. Il permet de forcer l'extension charger ses objets
dans le schma spcifi et aucun autre. Voir ci-dessous pour des informations complmentaires.
En complment au fichier de contrle extension.control, une extension peut disposer de fichiers de contrle secondaires
pour chaque version dont le nommage correspond extension--version.control. Ces fichiers doivent se trouver dans le
rpertoire des fichiers de script de l'extension. Les fichiers de contrle secondaires suivent le mme format que le fichier de
contrle principal. Tout paramtre spcifi dans un fichier de contrle secondaire surcharge la valeur spcifie dans le fichier de
contrle principal concernant les installations ou mises jour la version considre. Cependant, il n'est pas possible de spcifier
les paramtres directory et default_version dans un fichier de contrle secondaire.
Un fichier de script SQL d'une extension peut contenir toute commande SQL, l'exception des commandes de contrle de transaction (BEGIN, COMMIT, etc), et des commandes qui ne peuvent tre excutes au sein d'un bloc transactionnel (comme la commande VACUUM). Cette contrainte est lie au fait que les fichiers de script sont implicitement excuts dans une transaction.
695
tendre SQL
An extension's SQL script files can also contain lines beginning with \echo, which will be ignored (treated as comments) by the
extension mechanism. This provision is commonly used to throw an error if the script file is fed to psql rather than being loaded
via CREATE EXTENSION (see example script below). Without that, users might accidentally load the extension's contents as
loose objects rather than as an extension, a state of affairs that's a bit tedious to recover from.
Bien que les fichiers de script puissent contenir n'importe quel caractre autoris par l'encodage spcifi, les fichiers de contrle ne
peuvent contenir que des caractres ASCII non formats. En effet, PostgreSQL ne peut pas dterminer l'encodage utilis par les
fichiers de contrle. Dans la pratique, cela ne pose problme que dans le cas o vous voudriez utiliser des caractres non ASCII
dans le commentaire de l'extension. Dans ce cas de figure, il est recommand de ne pas utiliser le paramtre comment du fichier
de contrle pour dfinir ce commentaire, mais plutt la commande COMMENT ON EXTENSION dans un fichier de script.
Une extension supportant compltement le dplacement peut tre dplac dans un autre schma tout moment, y compris
aprs son chargement dans une base de donne. Initialement, tous les objets de l'extension installe appartiennent un premier
schma (except les objets qui n'appartiennent aucun schma comme les langages procduraux). L'opration de dplacement
peut alors tre ralise avec la commande ALTER EXTENSION SET SCHEMA, qui renomme automatiquement tous les
objets de l'extension pour tre intgrs dans le nouveau schma. Le dplacement ne sera toutefois fonctionnel que si
l'extension ne contient aucune rfrence de l'appartenance d'un de ses objets un schma. Dans ce cadre, il est alors possible
de spcifier qu'une extension supporte compltement le dplacement en initialisant relocatable = true dans son fichier
de contrle.
Une extension peut tre dplaable durant l'installation et ne plus l'tre par la suite. Un exemple courant est celui du fichier de
script de l'extension qui doit rfrencer un schma cible de manire explicite pour des fonctions SQL, par exemple en dfinissant la proprit search_path. Pour de telles extensions, il faut dfinir relocatable = false dans son fichier de
contrle, et utiliser @extschema@ pour rfrencer le schma cible dans le fichier de script. Toutes les occurences de cette
chane dans le fichier de script seront remplaces par le nom du schma choisi avant son excution. Le nom du schma choisi
peut tre fix par l'option SCHEMA de la commande CREATE EXTENSION>.
Si l'extension ne permet pas du tout le dplacement, il faut dfinir relocatable = false dans le fichier de contrle,
mais aussi dfinir schema comme tant le nom du schma cible. Cette prcaution permettra d'empcher l'usage de l'option
SCHEMA de la commande CREATE EXTENSION, moins que cette option ne rfrence la mme valeur que celle spcifie
dans le fichier de contrle. Ce choix est priori ncessaire si l'extension contient des rfrences des noms de schma qui ne
peuvent tre remplacs par @extschema@. noter que mme si son usage reste relativement limit dans ce cas de figure
puisque le nom du schma est alors fix dans le fichier de contrle, le mcanisme de substitution de @extschema@ reste toujours oprationnel.
Dans tous les cas, le fichier de script sera excut avec comme valeur de search_path le schma cible. Cela signifie que la commande CREATE EXTENSION ralisera l'quivalent de la commande suivante :
SET LOCAL search_path TO @extschema@;
Cela permettra aux objets du fichier de script d'tre crs dans le schma cible. Le fichier de script peut toutefois modifier la valeur de search_path si ncessaire, mais cela n'est gnralement pas le comportement souhait. La variable search_path retrouvera sa valeur initiale la fin de l'excution de la commande CREATE EXTENSION.
Le schma cible est dtermin par le paramtre schema dans le fichier de contrle s'il est prcis, sinon par l'option SCHEMA de
la commande CREATE EXTENSION si elle est spcifie, sinon par le schma de cration par dfaut actuel (le premier rencontr
en suivant le chemin de recherche search_path de l'appelant). Quand le paramtre schema du fichier de contrle est utilis,
le schma cible sera cr s'il n'existe pas encore. Dans les autres cas, il devra exister au pralable.
Si des extensions requises sont dfinies par requires dans le fichier de contrle, leur schma cible est ajout la valeur initiale
de search_path. Cela permet leurs objets d'tre visibles dans le fichier de script de l'extension installe.
Une extension peut contenir des objets rpartis dans plusieurs schmas. Il est alors conseill de regrouper dans un unique schma
l'ensemble des objets destins un usage externe l'extension, qui sera alors le schma cible de l'extension. Une telle organisation
est compatible avec la dfinition par dfaut de search_path pour la cration d'extensions qui en seront dpendantes.
tendre SQL
contenu ne sera sauvegard par pg_dump. Mais ce comportement n'est pas celui attendu pour une table de configuration. Les donnes modifies par un utilisateur ncessitent d'tre sauvegardes, ou l'extension aura un comportement diffrent aprs rechargement.
Pour rsoudre ce problme, un fichier de script d'extension peut marquer une table comme tant une table de configuration, ce qui
indiquera pg_dump d'inclure le contenu de la table (et non sa dfinition) dans la sauvegarde. Pour cela, il s'agit d'appeler la fonction pg_extension_config_dump(regclass, text) aprs avoir cr la table, par exemple
CREATE TABLE my_config (key text, value text);
SELECT pg_catalog.pg_extension_config_dump('my_config', '');
Cette fonction permet de marquer autant de tables que ncessaire.
Si le second argument de pg_extension_config_dump est une chane vide, le contenu entier de la table sera sauvegard par
l'application pg_dump. Cela n'est correct que si la table tait initialement vide aprs l'installation du script. Si un mlange de donnes initiales et de donnes ajoutes par l'utilisateur est prsent dans la table, le second argument de
pg_extension_config_dump permet de spcifier une condition WHERE qui selectionne les donnes sauvegarder. Par
exemple, vous pourriez faire
CREATE TABLE my_config (key text, value text, standard_entry boolean);
SELECT pg_catalog.pg_extension_config_dump('my_config', 'WHERE NOT standard_entry');
et vous assurer que la valeur de standard_entry soit true uniquement lorsque les lignes ont t cres par le script de
l'extension.
Des situations plus compliques, comme des donnes initiales qui peuvent tre modifies par l'utilisateur, peuvent tre prises en
charge en crant des triggers sur la table de configuration pour s'assurer que les lignes ont t marques correctement.
Vous pouvez modifier la condition du filtre associ avec une table de configuration en appelant de nouveau
pg_extension_config_dump. (Ceci serait typiquement utile dans un script de mise jour d'extension.) La seule faon de
marquer une table est de la dissocier de l'extension avec la commande ALTER EXTENSION ... DROP TABLE.
jour
ont
un
nom
qui
correspond
au
format
extension--oldversion--newversion.sql (par exemple, foo--1.0--1.1.sql contient les commandes pour modifier la version 1.0 de l'extension foo en la version 1.1).
En admettant qu'un tel script de mise jour soit disponible, la commande ALTER EXTENSION UPDATE mettra jour une extension installe vers la nouvelle version spcifie. Le script de mise jour est excut dans le mme environnement que celui que
la commande CREATE EXTENSION fournit pour l'installation de scripts : en particulier, la variable search_path est dfinie
de la mme faon et tout nouvel objet cr par le script est automatiquement ajout l'extension.
Si une extension a un fichier de contrle secondaire, les paramtres de contrle qui sont utiliss par un script de mise jour sont
ceux dfinis par le script de la version cible.
Le mcanisme de mise jour peut tre utilis pour rsoudre un cas particulier important : convertir une collection parse d'objets
en une extension. Avant que le mcanisme d'extension ne soit introduit PostgreSQL (dans la version 9.1), de nombreuses personnes crivaient des modules d'extension qui craient simplement un assortiment d'objets non empaquets. Etant donn une base
de donne existante contenant de tels objets, comment convertir ces objets en des extensions proprement empaquetes ? Les supprimer puis excuter la commande CREATE EXTENSION est une premire mthode, mais elle n'est pas envisageable lorsque
les objets ont des dpendances (par exemple, s'il y a des colonnes de table dont le type de donnes appartient une extension). Le
moyen propos pour rsoudre ce problme est de crer une extension vide, d'utiliser la commande ALTER EXTENSION ADD
pour lier chaque objet pr-existant l'extension, et finalement crer les nouveaux objets prsents dans la nouvelle extension mais
absents de celle non empaquete. La commande CREATE EXTENSION prend en charge cette fonction avec son option FROM
old_version, qui permet de ne pas charger le script d'installation par dfaut pour la version cible, mais celui nomm extension--old_version--target_version.sql. Le choix de la valeur de old_version relve de la responsabilit de
l'auteur de l'extension, mme si unpackaged est souvent rencontr. Il est aussi possible de multiplier les valeurs de
old_version pour prendre en compte une mise jour depuis diffrentes anciennes versions.
La commande ALTER EXTENSION peut excuter des mises jour en squence pour russir une mise jour. Par exemple, si
697
tendre SQL
seuls les fichiers foo--1.0--1.1.sql et foo--1.1--2.0.sql sont disponibles, la commande ALTER EXTENSION les
excutera squentiellement si une mise jour vers la version 2.0 est demande alors que la version 1.0 est installe.
PostgreSQL ne suppose rien au sujet des noms de version. Par exemple, il ne sait pas si 1.1 suit 1.0. Il effectue juste une correspondance entre les noms de version et suit un chemin qui ncessite d'appliquer le moins de fichier de script possible. Un nom
de version peut en ralit tre toute chane qui ne contiendrait pas -- ou qui ne commencerait ou ne finirait pas par -.
Il peut parfois tre utile de fournir des scripts de retour en arrire, comme par exemple foo--1.1--1.0.sql pour autoriser
d'inverser les modifications effectues par la mise jour en version 1.1. Si vous procdez ainsi, ayez conscience de la possibilit
laisse PostgreSQL d'excuter un tel script de retour en arrire s'il permet d'atteindre la version cible d'une mise jour en un
nombre rduit d'tapes. La cause du risque se trouve dans les scripts de mise jour optimiss permettant de passer plusieurs versions en un seul script. La longueur du chemin commenant par un retour en arrire suivi d'un script optimis pourrait tre infrieure la longueur du chemin qui monterait de version une par une. Si le script de retour en arrire supprime un objet irremplaable, les consquences pourraient en tre facheuses.
Pour vrifier que vous ne serez pas confront des chemins de mise jour inattendus, utilisez cette commande :
SELECT * FROM pg_extension_update_paths('extension_name');
Cette commande permet d'afficher chaque paire de noms de version connues pour l'extension spcifie, ainsi que le chemin de
mise jour qui serait suivi depuis la version de dpart jusque la version cible, ou la valeur NULL si aucun chemin valable n'est disponible. Le chemin est affich sous une forme textuelle avec des sparateurs --. Vous pouvez utiliser regexp_split_to_array(path,'--') si vous prfrez le format tableau.
OPERATOR
OPERATOR
OPERATOR
OPERATOR
~>
~>
~>
~>
(LEFTARG
(LEFTARG
(LEFTARG
(LEFTARG
=
=
=
=
698
tendre SQL
EXTENSION = pair
DATA = pair--1.0.sql
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
Ce fichier d'installation s'appuye sur PGXS, qui est dcrit dans Section 35.16, Outils de construction d'extension . La commande make install va installer les fichiers de contrle et de script dans le rpertoire adquat tel qu'indiqu par pg_config.
Une fois les fichiers installs, utilisez la commande CREATE EXTENSION(7) pour charger les objets dans une base de donne.
tendre SQL
DOCS
Fichiers divers installer dans prefix/doc/$MODULEDIR
SCRIPTS
Fichiers de scripts (non binaires) installer dans prefix/bin
SCRIPTS_built
Fichiers de script (non binaires) installer dans prefix/bin, qui ncessitent d'tre construit au pralable.
REGRESS
Liste de tests de regression (sans suffixe), voir plus bas
REGRESS_OPTS
Options supplmentaires passer pg_regress
EXTRA_CLEAN
Fichiers supplmentaire supprimer par la commande make clean
PG_CPPFLAGS
Sera ajout CPPFLAGS
PG_LIBS
Sera ajout la ligne d'dition de lien de PROGRAM
SHLIB_LINK
Sera ajout la ligne d'dition de lien de MODULE_big
PG_CONFIG
Chemin vers le programme pg_config de l'installation de PostgreSQL pour laquelle construire la bibliothque ou le binaire
(l'utilisation de pg_config seul permet d'utiliser le premier accessible par votre PATH)
Placez ce fichier de construction comme Makefile dans le rpertoire qui contient votre extension. Puis vous pouvez excuter la
commande make pour compiler, et ensuite make install pour dployer le module. Par dfaut, l'extension est compile et installe pour l'installation de PostgreSQL qui correspond au premier programme pg_config trouv dans votre PATH. Vous pouvez
utiliser une installation diffrente en dfinissant PG_CONFIG pour pointer sur le programme pg_config de votre choix, soit dans
le fichier makefile, soit partir de la ligne de commande de la commande make.
Attention
Modifier la variable PG_CONFIG ne fonctionne que lorsque l'on compile pour PostgreSQL 8.3 et au del. Avec
des versions plus anciennes, il n'est possible de spcifier que pg_config. Vous devez modifier votre PATH pour
choisir l'installation souhaite.
Les scripts lists dans la variable REGRESS sont utiliss pour des tests de regression de votre module, qui peut tre invoqu par
make installcheck aprs avoir effectu make install. Pour que cela fonctionne, vous devez lancer le serveur PosgreSQL pralablement. Les fichiers de script lists dans la variable REGRESS doivent apparatre dans le sous-rpertoire appel
sql/ du rpertoire de votre extension. Ces fichiers doivent avoir l'extension .sql, qui ne doit pas tre inclus dans la liste REGRESS du makefile. Pour chaque test, il doit aussi y avoir un fichier qui contient les rsultats attendus dans un sous-rpertoire
nomm expected, avec le mme nom mais l'extension .out. La commande make installcheck excute chaque script de
test avec psql, et compare la sortie resultante au fichier de rsultat correspondant. Toute diffrence sera crite dans le fichier regression.diffs au format diff -c. Notez que l'excution d'un test qui ne dispose pas des fichiers ncessaires sera rapporte
comme une erreur dans le test, donc assurez-vous que tous les fichiers ncessaires soient prsents.
Astuce
Le moyen le plus simple de crer les fichiers ncessaires est de crer des fichiers vides, puis d'effectuer un jeu
d'essai (qui bien sr retournera des anomalies). tudiez les rsultats trouvs dans le rpertoire results et copiezles dans le rpertoire expected/ s'ils correspondent ce que vous attendiez du test correspondant.
700
Il peut retourner un pointeur NULL pour sauter l'opration pour la ligne courante. Ceci donne comme instruction
l'excuteur de ne pas excuter l'opration niveau ligne qui a lanc le dclencheur (l'insertion, la modification ou la suppression d'une ligne particulire de la table).
Pour les dclencheurs INSERT et UPDATE de niveau ligne uniquement, la valeur de retour devient la ligne qui sera insre
ou remplacera la ligne en cours de mise jour. Ceci permet la fonction dclencheur de modifier la ligne en cours
d'insertion ou de mise jour.
701
Dclencheurs (triggers)
Un dclencheur BEFORE niveau ligne qui ne serait pas conu pour avoir l'un de ces comportements doit prendre garde retourner
la mme ligne que celle qui lui a t passe comme nouvelle ligne (c'est--dire : pour des dclencheurs INSERT et UPDATE : la
nouvelle (NEW) ligne ,et pour les dclencheurs DELETE) : l'ancienne (OLD) ligne .
Un trigger INSTEAD OF niveau ligne devrait renvoyer soit NULL pour indiquer qu'il n'a pas modifi de donnes des tables de
base sous-jacentes de la vue, soit la ligne de la vue qui lui a t pass (la ligne NEW pour les oprations INSERT et UPDATE, ou
la ligne OLD pour l'opration DELETE). Une valeur de retour diffrent de NULL est utilise comme signal indiquant que le trigger a ralis les modifications de donnes ncessaires dans la vue. Ceci causera l'incrmentation du nombre de lignes affectes par
la commande. Pour les oprations INSERT et UPDATE, le trigger peut modifier la ligne NEW avant de la renvoyer. Ceci modifiera les donnes renvoyes par INSERT RETURNING ou UPDATE RETURNING, et est utile quand la vue n'affichera pas exactement les donnes fournies.
La valeur de retour est ignore pour les dclencheurs niveau ligne lancs aprs une opration. Ils peuvent donc renvoyer la valeur
NULL.
Si plus d'un dclencheur est dfini pour le mme vnement sur la mme relation, les dclencheurs seront lancs dans l'ordre alphabtique de leur nom. Dans le cas de dclencheurs BEFORE et INSTEAD OF, la ligne renvoye par chaque dclencheur, qui a
ventuellement t modifie, devient l'argument du prochain dclencheur. Si un des dclencheurs BEFORE ou INSTEAD OF renvoie un pointeur NULL, l'opration est abandonne pour cette ligne et les dclencheurs suivants ne sont pas lancs (pour cette
ligne).
Une dfinition de trigger peut aussi spcifier une condition boolenne WHEN qui sera teste pour savoir si le trigger doit bien tre
dclench. Dans les triggers de niveau ligne, la condition WHEN peut examiner l'ancienne et la nouvelle valeur des colonnes de la
ligne. (les triggers de niveau instruction peuvent aussi avoir des conditions WHEN mais cette fonctionnalit est moins intressante
pour elles). Dans un trigger avant, la condition WHEN est value juste avant l'excution de la fonction, donc l'utilisation de WHEN
n'est pas rellement diffrente du test de la mme condition au dbut de la fonction trigger. Nanmoins, dans un tigger AFTER, la
condition WHEN est value juste avant la mise jour de la ligne et dtermine si un vnement va dclencher le trigger la fin de
l'instruction. Donc, quand la condition WHEN d'un trigger AFTER ne renvoie pas true, il n'est pas ncessaire de mettre en queue un
vnement ou de rcuprer de nouveau la ligne la fin de l'instriction. Ceci permet une amlioration consquente des performances pour les instructions qui modifient un grand nombre de lignes si le trigger a seulement besoin d'tre excut que sur
quelques lignes. Les triggers INSTEAD OF n'acceptent pas les conditions WHEN.
Les dclencheurs BEFORE en mode ligne sont typiquement utiliss pour vrifier ou modifier les donnes qui seront insres ou
mises jour. Par exemple, un dclencheur BEFORE pourrait tre utilis pour insrer l'heure actuelle dans une colonne de type timestamp ou pour vrifier que deux lments d'une ligne sont cohrents. Les dclencheurs AFTER en mode ligne sont pour la plupart utiliss pour propager des mises jour vers d'autres tables ou pour raliser des tests de cohrence avec d'autres tables. La raison de cette division du travail est qu'un dclencheur AFTER peut tre certain qu'il voit la valeur finale de la ligne alors qu'un dclencheur BEFORE ne l'est pas ; il pourrait exister d'autres dclencheurs BEFORE qui seront excuts aprs lui. Si vous n'avez aucune raison spciale pour le moment du dclenchement, le cas BEFORE est plus efficace car l'information sur l'opration n'a pas
besoin d'tre sauvegarde jusqu' la fin du traitement.
Si une fonction dclencheur excute des commandes SQL, alors ces commandes peuvent lancer leur tour des dclencheurs. On
appelle ceci un dclencheur en cascade. Il n'y a pas de limitation directe du nombre de niveaux de cascade. Il est possible que les
cascades causent un appel rcursif du mme dclencheur ; par exemple, un dclencheur INSERT pourrait excuter une commande
qui insre une ligne supplmentaire dans la mme table, entranant un nouveau lancement du dclencheur INSERT. Il est de la
responsabilit du programmeur d'viter les rcursions infinies dans de tels scnarios.
Quand un dclencheur est dfini, des arguments peuvent tre spcifis pour lui. L'objectif de l'inclusion d'arguments dans la dfinition du dclencheur est de permettre diffrents dclencheurs ayant des exigences similaires d'appeler la mme fonction. Par
exemple, il pourrait y avoir une fonction dclencheur gnralise qui prend comme arguments deux noms de colonnes et place
l'utilisateur courant dans l'une et un horodatage dans l'autre. Correctement crit, cette fonction dclencheur serait indpendante de
la table particulire sur laquelle il se dclenche. Ainsi, la mme fonction pourrait tre utilise pour des vnements INSERT sur
n'importe quelle table ayant des colonnes adquates, pour automatiquement suivre les crations d'enregistrements dans une table
de transactions par exemple. Elle pourrait aussi tre utilise pour suivre les dernires mises jours si elle est dfinie comme un dclencheur UPDATE.
Chaque langage de programmation supportant les dclencheurs a sa propre mthode pour rendre les donnes en entre disponible
la fonction du dclencheur. Cette donne en entre inclut le type d'vnement du dclencheur (c'est--dire INSERT ou UPDATE) ainsi que tous les arguments lists dans CREATE TRIGGER. Pour un dclencheur niveau ligne, la donne en entre inclut aussi la ligne NEW pour les dclencheurs INSERT et UPDATE et/ou la ligne OLD pour les dclencheurs UPDATE et DELETE. Les dclencheurs niveau instruction n'ont actuellement aucun moyen pour examiner le(s) ligne(s) individuelle(s) modifies
par l'instruction.
Dclencheurs (triggers)
crez ce dclencheur, alors vous avez besoin de connatre les rgles de visibilit des donnes car elles dterminent si les commandes SQL voient les modifications de donnes pour lesquelles est excut le dclencheur. En bref :
Les dclencheurs niveau instruction suivent des rgles de visibilit simples : aucune des modifications ralises par une instruction n'est visible aux dclencheurs niveau instruction appels avant l'instruction alors que toutes les modifications sont visibles aux dclencheurs AFTER niveau instruction.
Les modifications de donnes (insertion, mise jour ou suppression) lanant le dclencheur ne sont naturellement pas visibles
aux commandes SQL excutes dans un dclencheur BEFORE en mode ligne parce qu'elles ne sont pas encore survenues.
Nanmoins, les commandes SQL excutes par un dclencheur BEFORE en mode ligne verront les effets des modifications de
donnes pour les lignes prcdemment traites dans la mme commande externe. Ceci requiert une grande attention car l'ordre
des vnements de modification n'est en gnral pas prvisible ; une commande SQL affectant plusieurs lignes pourrait visiter
les lignes dans n'importe quel ordre.
De faon similaire, un trigger niveau ligne de type INSTEAD OF verra les effets des modifications de donnes ralises par
l'excution des autres triggers INSTEAD OF dans la mme commande.
Quand un dclencheur AFTER en mode ligne est excut, toutes les modifications de donnes ralises par la commande externe sont dj termines et sont visibles par la fonction appele par le dclencheur.
Si votre fonction trigger est crite dans un des langages de procdures standard, alors les instructions ci-desus s'appliquent seulement si la fonction est dclare VOLATILE. Les fonctions dclares STABLE ou IMMUTABLE ne verront pas les modifications
ralises par la commande appelante dans tous les cas.
Il existe plus d'informations sur les rgles de visibilit des donnes dans la Section 43.4, Visibilit des modifications de donnes . L'exemple dans la Section 36.4, Un exemple complet de trigger contient une dmonstration de ces rgles.
Dclencheurs (triggers)
tg_event
Dcrit l'vnement pour lequel la fonction est appele. Vous pouvez utiliser les macros suivantes pour examiner tg_event :
TRIGGER_FIRED_BEFORE(tg_event)
Renvoie vrai si le dclencheur est lanc avant l'opration.
TRIGGER_FIRED_AFTER(tg_event)
Renvoie vrai si le dclencheur est lanc aprs l'opration.
TRIGGER_FIRED_INSTEAD(tg_event)
Renvoie vrai si le trigger a t lanc la place de l'opration.
TRIGGER_FIRED_FOR_ROW(tg_event)
Renvoie vrai si le dclencheur est lanc pour un vnement en mode ligne.
TRIGGER_FIRED_FOR_STATEMENT(tg_event)
Renvoie vrai si le dclencheur est lanc pour un vnement en mode instruction.
TRIGGER_FIRED_BY_INSERT(tg_event)
Retourne vrai si le dclencheur est lanc par une commande INSERT.
TRIGGER_FIRED_BY_UPDATE(tg_event)
Retourne vrai si le dclencheur est lanc par une commande UPDATE.
TRIGGER_FIRED_BY_DELETE(tg_event)
Retourne vrai si le dclencheur est lanc par une commande DELETE.
TRIGGER_FIRED_BY_TRUNCATE(tg_event)
Renvoie true si le trigger a t dclench par une commande TRUNCATE.
tg_relation
Un pointeur vers une structure dcrivant la relation pour laquelle le dclencheur est lanc. Voir utils/rel.h pour les dtails de cette structure. Les choses les plus intressantes sont tg_relation->rd_att (descripteur de nuplets de la relation) et tg_relation->rd_rel->relname (nom de la relation ; le type n'est pas char* mais NameData ; utilisez
SPI_getrelname(tg_relation) pour obtenir un char* si vous avez besoin d'une copie du nom).
tg_trigtuple
Un pointeur vers la ligne pour laquelle le dclencheur a t lanc. Il s'agit de la ligne tant insre, mise jour ou efface. Si
ce dclencheur a t lanc pour une commande INSERT ou DELETE, c'est cette valeur que la fonction doit retourner si vous
ne voulez pas remplacer la ligne par une ligne diffrente (dans le cas d'un INSERT) ou sauter l'opration.
tg_newtuple
Un pointeur vers la nouvelle version de la ligne, si le dclencheur a t lanc pour un UPDATE et NULL si c'est pour un INSERT ou un DELETE. C'est ce que la fonction doit retourner si l'vnement est un UPDATE et que vous ne voulez pas remplacer cette ligne par une ligne diffrente ou bien sauter l'opration.
tg_trigger
Un pointeur vers une structure de type Trigger, dfinie dans utils/rel.h :
typedef struct Trigger
{
Oid
tgoid;
char
*tgname;
Oid
tgfoid;
int16
tgtype;
char
tgenabled;
bool
tgisinternal;
Oid
tgconstrrelid;
Oid
tgconstrindid;
Oid
tgconstraint;
bool
tgdeferrable;
bool
tginitdeferred;
int16
tgnargs;
int16
tgnattr;
int16
*tgattr;
char
**tgargs;
char
*tgqual;
} Trigger;
o tgname est le nom du dclencheur, tgnargs est le nombre d'arguments dans tgargs et tgargs est un tableau de
pointeurs vers les arguments spcifis dans l'expression contenant la commande CREATE TRIGGER. Les autres membres
704
Dclencheurs (triggers)
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
extern Datum trigf(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(trigf);
Datum
trigf(PG_FUNCTION_ARGS)
{
TriggerData *trigdata = (TriggerData *) fcinfo->context;
TupleDesc
tupdesc;
HeapTuple
rettuple;
char
*when;
bool
checkNULL = false;
bool
isNULL;
int
ret, i;
/* on s'assure que la fonction est appele en tant que dclencheur */
if (!CALLED_AS_TRIGGER(fcinfo))
elog(ERROR, "trigf: not called by trigger manager");
/* nuplet retourner l'excuteur */
if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
rettuple = trigdata->tg_newtuple;
else
rettuple = trigdata->tg_trigtuple;
/* vrification des valeurs NULL */
if (!TRIGGER_FIRED_BY_DELETE(trigdata->tg_event)
&& TRIGGER_FIRED_BEFORE(trigdata->tg_event))
checkNULL = true;
if (TRIGGER_FIRED_BEFORE(trigdata->tg_event))
when = "before";
705
Dclencheurs (triggers)
else
when = "after ";
tupdesc = trigdata->tg_relation->rd_att;
/* connexion au gestionnaire SPI */
if ((ret = SPI_connect()) < 0)
elog(ERROR, "trigf (fired %s): SPI_connect returned %d", when, ret);
/* obtient le nombre de lignes dans la table */
ret = SPI_exec("SELECT count(*) FROM ttest", 0);
if (ret < 0)
elog(ERROR, "trigf (fired %s): SPI_exec returned %d", when, ret);
/* count(*) renvoie int8, prenez garde bien convertir */
i = DatumGetInt64(SPI_getbinval(SPI_tuptable->vals[0],
SPI_tuptable->tupdesc,
1,
&isNULL));
elog (INFO, "trigf (fired %s): there are %d rows in ttest", when, i);
SPI_finish();
if (checkNULL)
{
SPI_getbinval(rettuple, tupdesc, 1, &isNULL);
if (isNULL)
rettuple = NULL;
}
return PointerGetDatum(rettuple);
}
Aprs avoir compil le code source (voir Section 35.9.6, Compiler et lier des fonctions charges dynamiquement ), dclarez la
fonction et les dclencheurs :
CREATE FUNCTION trigf() RETURNS trigger
AS 'nomfichier'
LANGUAGE C;
CREATE TRIGGER tbefore BEFORE INSERT OR UPDATE OR DELETE ON ttest
FOR EACH ROW EXECUTE PROCEDURE trigf();
CREATE TRIGGER tafter AFTER INSERT OR UPDATE OR DELETE ON ttest
FOR EACH ROW EXECUTE PROCEDURE trigf();
prsent, testez le fonctionnement du dclencheur :
=> INSERT INTO ttest VALUES (NULL);
INFO: trigf (fired before): there are 0 rows in ttest
INSERT 0 0
-- Insertion supprime et dclencheur APRES non excut
=> SELECT * FROM ttest;
x
--(0 rows)
=> INSERT INTO ttest VALUES (1);
INFO: trigf (fired before): there are 0 rows in ttest
INFO: trigf (fired after ): there are 1 rows in ttest
^^^^^^^^
souvenez-vous de ce que nous avons dit sur la visibilit.
INSERT 167793 1
vac=> SELECT * FROM ttest;
x
706
Dclencheurs (triggers)
--1
(1 row)
=> INSERT INTO ttest SELECT x * 2 FROM ttest;
INFO: trigf (fired before): there are 1 rows in ttest
INFO: trigf (fired after ): there are 2 rows in ttest
^^^^^^
souvenez-vous de ce que nous avons dit sur la visibilit.
INSERT 167794 1
=> SELECT * FROM ttest;
x
--1
2
(2 rows)
=> UPDATE ttest SET
INFO: trigf (fired
UPDATE 0
=> UPDATE ttest SET
INFO: trigf (fired
INFO: trigf (fired
UPDATE 1
vac=> SELECT * FROM
x
--1
4
(2 rows)
x = NULL WHERE x = 2;
before): there are 2 rows in ttest
x = 4 WHERE x = 2;
before): there are 2 rows in ttest
after ): there are 2 rows in ttest
ttest;
there
there
there
there
are
are
are
are
2 rows in ttest
1 rows in ttest
0 rows in ttest
0 rows in ttest
^^^^^^
souvenez-vous de ce que nous avons dit sur la visibilit.
DELETE 2
=> SELECT * FROM ttest;
x
--(0 rows)
Vous trouverez des exemples plus complexes dans src/test/regress/regress.c et dans spi.
707
Systme de rgles
systme de rgles ajoutera une entre spciale ctid pour aller jusqu' la liste de cibles vide pour permettre l'excuteur de
trouver la ligne supprimer. (CTID est ajout quand la relation rsultante est une table ordinaire. S'il s'agit d'une vue, une variable de type ligne est ajoute la place, comme dcrit dans Section 37.2.4, Mise jour d'une vue .)
Pour les commandes insert, la liste cible dcrit les nouvelles lignes devant aller dans la relation rsultat. Elle consiste en des
expressions de la clause values ou en celles de la clause select dans insert ... SELECT. la premire tape du processus de rcriture ajoute les entres de la liste cible pour les colonnes n'ont affectes par la commande originale mais ayant des
valeurs par dfaut. Toute colonne restante (avec soit une valeur donne soit une valeur par dfaut) sera remplie par le planificateur avec une expression NULL constante.
Pour les commandes update, la liste cible dcrit les nouvelles lignes remplaant les anciennes. Dans le systme des rgles,
elle contient seulement les expressions de la partie set colonne = expression de la commande. le planificateur grera les colonnes manquantes en insrant des expressions qui copient les valeurs provenant de l'ancienne ligne dans la nouvelle.
Comme pour DELETE, le systme de rgles ajoute un CTID ou une variable de type ligne pour que l'excuteur puisse identifier l'ancienne ligne mettre jour.
Chaque entre de la liste cible contient une expression qui peut tre une valeur constante, une variable pointant vers une colonne d'une des relations de la table d'chelle, un paramtre ou un arbre d'expressions ralis partir d'appels de fonctions, de
constantes, de variables, d'oprateurs, etc.
la qualification
La qualification de la requte est une expression ressemblant une de celles contenues dans les entres de la liste cible. La valeur rsultant de cette expression est un boolen indiquant si l'opration (insert, update, delete ou select) pour la ligne de rsultat final devrait tre excute ou non. Elle correspond la clause where d'une instruction SQL.
l'arbre de jointure
L'arbre de jointure de la requte affiche la structure de la clause from. pour une simple requte comme select ...
from a, b, c, l'arbre de jointure est une simple liste d'lments de from parce que nous sommes autoriss les joindre
dans tout ordre. Mais quand des expressions join, et plus particulirement les jointures externes, sont utilises, nous devons
les joindre dans l'ordre affich par les jointures. Dans ce cas, l'arbre de jointure affiche la structure des expressions join. les
restrictions associes avec ces clauses join particulires ( partir d'expressions on ou using) sont enregistres comme des
expressions de qualification attaches aux nuds de l'arbre de jointure. Il s'avre agrable d'enregistrer l'expression de haut
niveau where comme une qualification attache l'lment de l'arbre de jointure de haut niveau. Donc, rellement, l'arbre de
jointure reprsente la fois les clauses from et where d'un select.
le reste
Les autres parties de l'arbre de requte comme la clause order BY n'ont pas d'intrt ici. le systme de rgles substitue
quelques entres lors de l'application des rgles mais ceci n'a pas grand chose voir avec les fondamentaux du systme de
rgles.
Systme de rgles
leur tour. Une des deux premires vues est personnalise plus tard en ajoutant des rgles pour des oprations insert, update et delete de faon ce que le rsultat final sera une vue qui se comporte comme une vraie table avec quelques fonctionnalits magiques. Il n'existe pas un tel exemple pour commencer et ceci rend les choses plus difficiles obtenir. Mais il est mieux d'avoir un
exemple couvrant tous les points discuts tape par tape plutt que plusieurs exemples, rendant la comprhension plus difficile.
Pour cet exemple, nous avons besoin d'une petite fonction min renvoyant la valeur la plus basse entre deux entiers. Nous la crons
ainsi :
CREATE FUNCTION min(integer, integer) RETURNS integer AS $$
SELECT CASE WHEN $1 < $2 THEN $1 ELSE $2 END
$$' LANGUAGE SQL STRICT;
Les tables relles dont nous avons besoin dans les deux premires descriptions du systme de rgles sont les suivantes :
CREATE TABLE donnees_chaussure (
nom_chaussure
text,
dispo_chaussure
integer,
couleur_chaussure
text,
long_min_chaussure
real,
long_max_chaussure
real,
unite_long_chaussure text
);
-------
cl primaire
nombre de pairs disponibles
couleur de lacet prfre
longueur minimum du lacet
longueur maximum du lacet
unit de longueur
------
cl primaire
nombre de pairs disponibles
couleur du lacet
longueur du lacet
unit de longueur
-- cl primaire
-- facteur pour le transformer en cm
text,
real
Comme vous pouvez le constater, elles reprsentent les donnes d'un magasin de chaussures.
Les vues sont cres avec :
CREATE VIEW chaussure AS
SELECT sh.nom_chaussure,
sh.dispo_chaussure,
sh.couleur_chaussure,
sh.long_min_chaussure,
sh.long_min_chaussure * un.facteur_unite AS long_min_chaussure_cm,
sh.long_max_chaussure,
sh.long_max_chaussure * un.facteur_unite AS long_max_chaussure_cm,
sh.unite_long_chaussure
FROM donnees_chaussure sh, unite un
WHERE sh.unite_long_chaussure = un.nom_unite;
CREATE VIEW lacet AS
SELECT s.nom_lacet,
s.dispo_lacet,
s.couleur_lacet,
s.longueur_lacet,
s.unite_lacet,
s.longueur_lacet * u.facteur_unite AS longueur_lacet_cm
FROM donnees_lacet s, unite u
WHERE s.unite_lacet = u.nom_unite;
CREATE VIEW chaussure_prete AS
SELECT rsh.nom_chaussure,
rsh.dispo_chaussure,
rsl.nom_lacet,
rsl.dispo_lacet,
min(rsh.dispo, rsl.dispo_lacet) AS total_avail
FROM chaussure rsh, lacet rsl
WHERE rsl.couleur_lacet = rsh.couleur
AND rsl.longueur_lacet_cm >= rsh.long_min_chaussure_cm
710
Systme de rgles
Note
Les deux entres supplmentaires de la table d'chelle pour new et old que vous pouvez voir dans l'entre de
pg_rewrite ne sont d'aucun intrt pour les rgles select.
Maintenant, nous remplissons unit, donnees_chaussure et donnees_lacet, puis nous lanons une requte simple sur
une vue :
INSERT INTO unite VALUES ('cm', 1.0);
INSERT INTO unite VALUES ('m', 100.0);
INSERT INTO unite VALUES ('inch', 2.54);
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
donnees_chaussure
donnees_chaussure
donnees_chaussure
donnees_chaussure
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INSERT
INTO
INTO
INTO
INTO
INTO
INTO
INTO
INTO
donnees_lacet
donnees_lacet
donnees_lacet
donnees_lacet
donnees_lacet
donnees_lacet
donnees_lacet
donnees_lacet
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
VALUES
('sh1',
('sh2',
('sh3',
('sh4',
('sl1',
('sl2',
('sl3',
('sl4',
('sl5',
('sl6',
('sl7',
('sl8',
5,
6,
0,
8,
4,
0,
7,
1,
2,
0,
4,
3,
'black',
'black',
'brown',
'brown',
'black',
'black',
'black',
'black',
'brown',
'brown',
'brown',
'brown',
70.0,
30.0,
50.0,
40.0,
90.0,
40.0,
65.0,
50.0,
'cm');
'inch');
'cm');
'inch');
80.0, 'cm');
100.0, 'cm');
35.0 , 'inch');
40.0 , 'inch');
1.0 , 'm');
0.9 , 'm');
60 , 'cm');
40 , 'inch');
nom_lacet
| dispo_lacet | couleur_lacet | longueur_lacet | unite_lacet |
longueur_lacet_cm
-------------+-------------+---------------+----------------+-------------+----------------sl1
|
5 | black
|
80 | cm
|
80
sl2
|
6 | black
|
100 | cm
|
100
sl7
|
7 | brown
|
60 | cm
|
60
sl3
|
0 | black
|
35 | inch
|
88.9
sl4
|
8 | black
|
40 | inch
|
101.6
sl8
|
1 | brown
|
40 | inch
|
101.6
sl5
|
4 | brown
|
1 | m
|
100
sl6
|
0 | brown
|
0.9 | m
|
90
(8 rows)
C'est la requte select la plus simple que vous pouvez lancer sur nos vues, donc nous prenons cette opportunit d'expliquer les
bases des rgles de vues. select * from lacet a t interprt par l'analyseur et a produit l'arbre de requte :
SELECT lacet.nom_lacet, lacet.dispo_lacet,
lacet.couleur_lacet, lacet.longueur_lacet,
lacet.unite_lacet, lacet.longueur_lacet_cm
FROM lacet lacet;
et ceci est transmis au systme de rgles. Ce systme traverse la table d'chelle et vrifie s'il existe des rgles pour chaque relation.
Lors du traitement d'une entre de la table d'chelle pour lacet (la seule jusqu' maintenant), il trouve la rgle _return avec
711
Systme de rgles
l'arbre de requte :
SELECT s.nom_lacet, s.dispo_lacet,
s.couleur_lacet, s.longueur_lacet, s.unite_lacet,
s.longueur_lacet * u.facteur_unite AS longueur_lacet_cm
FROM lacet old, lacet new,
donnees_lacet s, unit u
WHERE s.unite_lacet = u.nom_unite;
Pour tendre la vue, la rcriture cre simplement une entre de la table d'chelle de sous-requte contenant l'arbre de requte de
l'action de la rgle et substitue cette entre avec l'original rfrenc dans la vue. L'arbre d'chelle rsultant de la rcriture est pratiquement identique celui que vous avez saisi :
SELECT lacet.nom_lacet, lacet.dispo_lacet,
lacet.couleur_lacet, lacet.longueur_lacet,
lacet.unite_lacet, lacet.longueur_lacet_cm
FROM (SELECT s.nom_lacet,
s.dispo_lacet,
s.couleur_lacet,
s.longueur_lacet,
s.unite_lacet,
s.longueur_lacet * u.facteur_unite AS longueur_lacet_cm
FROM donnees_lacet s, unit u
WHERE s.unite_lacet = u.nom_unite) lacet;
Nanmoins, il y a une diffrence : la table d'chelle de la sous-requte a deux entres supplmentaires, lacet old et lacet
new. ces entres ne participent pas directement dans la requte car elles ne sont pas rfrences par l'arbre de jointure de la sousrequte ou par la liste cible. La rcriture les utilise pour enregistrer l'information de vrification des droits d'accs qui taient prsents l'origine dans l'entre de table d'chelle rfrence par la vue. De cette faon, l'excution vrifiera toujours que l'utilisateur
a les bons droits pour accder la vue mme s'il n'y a pas d'utilisation directe de la vue dans la requte rcrite.
C'tait la premire rgle applique. Le systme de rgles continuera de vrifier les entres restantes de la table d'chelle dans la requte principale (dans cet exemple, il n'en existe pas plus), et il vrifiera rcursivement les entres de la table d'chelle dans la
sous-requte ajoute pour voir si une d'elle rfrence les vues. (Mais il n'tendra ni old ni new -- sinon nous aurions une rcursion infinie !) Dans cet exemple, il n'existe pas de rgles de rcriture pour donnees_lacet ou unit, donc la rcriture est termine et ce qui est ci-dessus est le rsultat final donn au planificateur.
Maintenant, nous voulons crire une requte qui trouve les chaussures en magasin dont nous avons les lacets correspondants
(couleur et longueur) et pour lesquels le nombre total de pairs correspondants exactement est suprieur ou gal deux.
SELECT * FROM chaussure_prete WHERE total_avail >= 2;
nom_chaussure | dispo | nom_lacet | dispo_lacet | total_avail
---------------+-------+-----------+-------------+------------sh1
|
2 | sl1
|
5 |
2
sh3
|
4 | sl7
|
7 |
4
(2 rows)
Cette fois, la sortie de l'analyseur est l'arbre de requte :
SELECT chaussure_prete.nom_chaussure, chaussure_prete.dispo,
chaussure_prete.nom_lacet, chaussure_prete.dispo_lacet,
chaussure_prete.total_avail
FROM chaussure_prete chaussure_prete
WHERE chaussure_prete.total_avail >= 2;
La premire rgle applique sera celle de la vue chaussure_prete et cela rsultera en cet arbre de requte :
SELECT chaussure_prete.nom_chaussure, chaussure_prete.dispo,
chaussure_prete.nom_lacet, chaussure_prete.dispo_lacet,
chaussure_prete.total_avail
FROM (SELECT rsh.nom_chaussure,
rsh.dispo,
rsl.nom_lacet,
rsl.dispo_lacet,
min(rsh.dispo, rsl.dispo_lacet) AS total_avail
FROM chaussure rsh, lacet rsl
WHERE rsl.couleur_lacet = rsh.couleur
AND rsl.longueur_lacet_cm >= rsh.long_min_chaussure_cm
AND rsl.longueur_lacet_cm <= rsh.long_max_chaussure_cm) chaussure_prete
WHERE chaussure_prete.total_avail >= 2;
712
Systme de rgles
De faon similaire, les rgles pour chaussure et lacet sont substitues dans la table d'chelle de la sous-requte, amenant
l'arbre de requte final trois niveaux :
SELECT chaussure_prete.nom_chaussure, chaussure_prete.dispo,
chaussure_prete.nom_lacet, chaussure_prete.dispo_lacet,
chaussure_prete.total_avail
FROM (SELECT rsh.nom_chaussure,
rsh.dispo,
rsl.nom_lacet,
rsl.dispo_lacet,
min(rsh.dispo, rsl.dispo_lacet) AS total_avail
FROM (SELECT sh.nom_chaussure,
sh.dispo,
sh.couleur,
sh.long_min_chaussure,
sh.long_min_chaussure * un.facteur_unite AS
long_min_chaussure_cm,
sh.long_max_chaussure,
sh.long_max_chaussure * un.facteur_unite AS
long_max_chaussure_cm,
sh.unite_long_chaussure
FROM donnees_chaussure sh, unit un
WHERE sh.unite_long_chaussure = un.nom_unite) rsh,
(SELECT s.nom_lacet,
s.dispo_lacet,
s.couleur_lacet,
s.longueur_lacet,
s.unite_lacet,
s.longueur_lacet * u.facteur_unite AS longueur_lacet_cm
FROM donnees_lacet s, unit u
WHERE s.unite_lacet = u.nom_unite) rsl
WHERE rsl.couleur_lacet = rsh.couleur
AND rsl.longueur_lacet_cm >= rsh.long_min_chaussure_cm
AND rsl.longueur_lacet_cm <= rsh.long_max_chaussure_cm) chaussure_prete
WHERE chaussure_prete.total_avail > 2;
Il s'avre que le planificateur rduira cet arbre en un arbre de requte deux niveaux : les commandes select du bas seront
remontes dans le select du milieu car il n'est pas ncessaire de les traiter sparment. Mais le select du milieu restera spar
du haut car il contient des fonctions d'agrgat. Si nous les avions mont, cela aurait modifi le comportement du select de haut niveau, ce qui n'est pas ce que nous voulons. Nanmoins, rduire l'arbre de requte est une optimisation qui ne concerne pas le systme de rcriture.
Les tables d'chelle contiennent des entres pour les tables t1 et t2.
Les listes cibles contiennent une variable pointant vers la colonne b de l'entre de la table d'chelle pour la table t2.
Les expressions de qualification comparent les colonnes a des deux entres de table d'chelle pour une galit.
713
Systme de rgles
La consquence est que les deux arbres de requte rsultent en des plans d'excution similaires : ce sont tous les deux des jointures
sur les deux tables. Pour l'update, les colonnes manquantes de t1 sont ajoutes la liste cible par le planificateur et l'arbre de requte final sera lu de cette faon :
UPDATE t1 SET a = t1.a, b = t2.b FROM t2 WHERE t1.a = t2.a;
et, du coup, l'excuteur lanc sur la jointure produira exactement le mme rsultat qu'un :
SELECT t1.a, t2.b FROM t1, t2 WHERE t1.a = t2.a;
Mais il existe un petit problme dans UPDATE : la partie du plan d'excution qui fait la jointure ne prte pas attention l'intrt
des rsultats de la jointure. Il produit un ensemble de lignes. Le fait qu'il y a une commande SELECT et une commande UPDATE est gr plus haut dans l'excuteur o cette partie sait qu'il s'agit d'une commande UPDATE, et elle sait que ce rsultat va
aller dans la table t1. Mais lesquels de ces lignes vont tre remplaces par la nouvelle ligne ?
Pour rsoudre ce problme, une autre entre est ajoute dans la liste cible de l'update (et aussi dans les instructions delete) :
l'identifiant actuel du tuple (ctid, acronyme de current tuple ID). cette colonne systme contient le numro de bloc du fichier et la
position dans le bloc pour cette ligne. Connaissant la table, le ctid peut tre utilis pour rcuprer la ligne originale de t1 mettre
jour. aprs avoir ajout le ctid dans la liste cible, la requte ressemble ceci :
SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a;
Maintenant, un autre dtail de PostgreSQL entre en jeu. Les anciennes lignes de la table ne sont pas surcharges et cela explique
pourquoi rollback est rapide. avec un update, la nouvelle ligne rsultat est insre dans la table (aprs avoir enlev le ctid) et,
dans le nouvel en-tte de ligne de l'ancienne ligne, vers o pointe le ctid, les entres cmax et xmax sont configures par le compteur de commande actuel et par l'identifiant de transaction actuel. Du coup, l'ancienne ligne est cache et, aprs validation de la
transaction, le nettoyeur (vacuum) peut ventuellement la supprimer.
Connaissant tout ceci, nous pouvons simplement appliquer les rgles de vues de la mme faon que toute autre commande. Il n'y a
pas de diffrence.
714
Systme de rgles
Notez que les rgles sont values en premier, rcrivant la requte originale avant qu'elle ne soit optimise et excute. Du coup,
si une vue a des triggers INSTEAD OF en plus de rgles sur INSERT, UPDATE ou DELETE, alors les rgles seront values
en premier et, suivant le rsultat, les triggers pourraient tre utiliss.
Ensuite, elles ne modifient pas l'arbre de requte en place. la place, elles crent de nouveaux arbres de requtes et peuvent abandonner l'original.
Systme de rgles
rfrencer les entres de la table d'chelle pour new et old, quelques substitutions ont d tre faites avant qu'elles ne puissent tre
utilises. Pour toute rfrence de new, une entre correspondante est recherche dans la liste cible de la requte originale. Si elle
est trouve, cette expression de l'entre remplace la rfrence. Sinon, new signifie la mme chose que old (pour un update) ou
est remplac par une valeur null (pour un insert). toute rfrence old est remplace par une rfrence l'entre de la table
d'chelle qui est la relation rsultante.
Aprs que le systme a termin d'appliquer des rgles de mise jour, il applique les rgles de vues pour le(s) arbre(s) de requte
produit(s). Les vues ne peuvent pas insrer de nouvelles actions de mise jour, donc il n'est pas ncessaire d'appliquer les rgles
de mise jour la sortie d'une rcriture de vue.
-- modification de lacet
-- nouvelle valeur disponible
-- qui l'a modifi
-- quand
Systme de rgles
Systme de rgles
Maintenant, si quelqu'un essaie de faire une de ces oprations sur la vue chaussure, le systme de rgles appliquera ces rgles.
Comme les rgles n'ont pas d'action et sont de type instead, la liste rsultante des arbres de requtes sera vide et la requte entire deviendra vide car il ne reste rien optimiser ou excuter aprs que le systme de rgles en ait termin avec elle.
Une faon plus sophistique d'utiliser le systme de rgles est de crer les rgles qui rcrivent l'arbre de requte en un arbre faisant la bonne opration sur les vraies tables. Pour raliser cela sur la vue lacet, nous crons les rgles suivantes :
CREATE RULE lacet_ins AS ON INSERT TO lacet
DO INSTEAD
INSERT INTO donnees_lacet VALUES (
NEW.nom_lacet,
NEW.dispo_lacet,
NEW.couleur_lacet,
NEW.longueur_lacet,
NEW.unite_lacet
);
CREATE RULE lacet_upd AS ON UPDATE TO lacet
DO INSTEAD
UPDATE donnees_lacet
SET nom_lacet = NEW.nom_lacet,
dispo_lacet = NEW.dispo_lacet,
couleur_lacet = NEW.couleur_lacet,
longueur_lacet = NEW.longueur_lacet,
unite_lacet = NEW.unite_lacet
WHERE nom_lacet = OLD.nom_lacet;
CREATE RULE lacet_del AS ON DELETE TO lacet
DO INSTEAD
DELETE FROM donnees_lacet
718
Systme de rgles
Systme de rgles
sl8
101.6
sl5
100
sl6
90
(8 rows)
1 | brown
40 | inch
4 | brown
1 | m
0 | brown
0.9 | m
Systme de rgles
Systme de rgles
Seq Scan on s
Seq Scan on lacet_arrive
qui produit exactement les mmes entres dans la table des traces. Du coup, le systme de rgles a caus un parcours supplmentaire dans la table donnees_lacet qui n'est absolument pas ncessaire. et le mme parcours redondant est fait une fois de plus
dans l'update. mais ce fut rellement un travail difficile de rendre tout ceci possible.
Maintenant, nous faisons une dmonstration finale du systme de rgles de PostgreSQL et de sa puissance. disons que nous
ajoutons quelques lacets avec des couleurs extraordinaires votre base de donnes :
INSERT INTO lacet VALUES ('sl9', 0, 'pink', 35.0, 'inch', 0.0);
INSERT INTO lacet VALUES ('sl10', 1000, 'magenta', 40.0, 'inch', 0.0);
Nous voulons crer une vue vrifiant les entres lacet qui ne correspondent aucune chaussure pour la couleur. Voici la vue :
CREATE VIEW lacet_mismatch AS
SELECT * FROM lacet WHERE NOT EXISTS
(SELECT nom_chaussure FROM chaussure WHERE couleur = couleur_lacet);
Sa sortie est :
SELECT * FROM lacet_mismatch;
Systme de rgles
sl7
60
sl4
101.6
sl3
88.9
sl8
101.6
sl10
101.6
sl5
100
sl6
90
(9 rows)
6 | brown
60 | cm
8 | black
40 | inch
10 | black
35 | inch
21 | brown
40 | inch
1000 | magenta
40 | inch
4 | brown
1 | m
20 | brown
0.9 | m
Un delete sur une vue, avec une qualification de sous-requte qui utilise au total quatre vues imbriques/jointes, o l'une d'entre
elles a une qualification de sous-requte contenant une vue et o les colonnes des vues calcules sont utilises, est rcrite en un
seul arbre de requte qui supprime les donnes demandes sur la vraie table.
Il existe probablement seulement quelques situations dans le vrai monde o une telle construction est ncessaire. Mais, vous vous
sentez mieux quand cela fonctionne.
Systme de rgles
S'il n'y a pas de rgle instead inconditionnelle pour la requte, alors la requte donne originellement sera excute et son
statut de commande sera renvoy comme d'habitude. (Mais notez que s'il y avait des rgles instead conditionnelles, la ngation de leur qualifications sera ajout la requte initiale. Ceci pourrait rduire le nombre de lignes qu'il traite et, si c'est le cas,
le statut rapport en sera affect.)
S'il y a des rgles instead inconditionnelles pour la requte, alors la requte originale ne sera pas excute du tout. Dans ce
cas, le serveur renverra le statut de la commande pour la dernire requte qui a t insre par une rgle instead
(conditionnelle ou non) et est du mme type de commande (insert, update ou delete) que la requte originale. si aucune requte ne rencontrant ces pr-requis n'est ajoute une rgle, alors le statut de commande renvoy affiche le type de requte
original et annule le compteur de ligne et le champ OID.
(Ce systme a t tabli pour PostgreSQL 7.3. Dans les versions prcdentes, le statut de commande pouvait afficher des rsultats diffrents lorsque les rgles existaient.)
Le programmeur peut s'assurer que toute rgle instead dsire est celle qui initialise le statut de commande dans le deuxime
cas en lui donnant un nom de rgle tant le dernier en ordre alphabtique parmi les rgles actives pour qu'elle soit applique en
dernier.
Systme de rgles
de ce chapitre peuvent aussi tre implments en utilisant les triggers INSTEAD OF sur les vues. crire ce type de triggers est
souvent plus facile qu'crire des rgles, tout particulirement si une logique complexe est requise pour raliser la mise jour.
Pour les lments qui peuvent tre implments par les deux, ce qui sera le mieux dpend de l'utilisation de la base de donnes. Un
dclencheur est excut une fois pour chaque ligne affecte. Une rgle modifie la requte ou en gnre une autre. Donc, si un
grand nombre de lignes sont affectes pour une instruction, une rgle lanant une commande supplmentaire sera certainement
plus rapide qu'un dclencheur appel pour chaque ligne et qui devra excuter ces oprations autant de fois. Nanmoins, l'approche
du dclencheur est conceptuellement plus simple que l'approche de la rgle et est plus facile utiliser pour les novices.
Ici, nous montrons un exemple o le choix d'une rgle ou d'un dclencheur joue sur une situation. Voici les deux tables :
CREATE TABLE ordinateur (
nom_hote
text,
constructeur
text
);
-- index
-- index
-- index
-- index
Les deux tables ont plusieurs milliers de lignes et les index sur nom_hote sont uniques. la rgle ou le dclencheur devrait implmenter une contrainte qui supprime les lignes de logiciel rfrenant un ordinateur supprim. Le dclencheur utiliserait cette
commande :
DELETE FROM logiciel WHERE nom_hote = $1;
Comme le dclencheur est appel pour chaque ligne individuelle supprime partir de ordinateur, il peut prparer et sauvegarder le plan pour cette commande et passer la valeur nom_hote dans le paramtre. La rgle devra tre rcrite ainsi :
CREATE RULE ordinateur_del AS ON DELETE TO ordinateur
DO DELETE FROM logiciel WHERE nom_hote = OLD.nom_hote;
Maintenant, nous apercevons diffrents types de suppressions. Dans le cas d'un :
DELETE FROM ordinateur WHERE nom_hote = 'mypc.local.net';
la table ordinateur est parcourue par l'index (rapide), et la commande lance par le dclencheur pourrait aussi utiliser un parcours d'index (aussi rapide). La commande supplmentaire provenant de la rgle serait :
DELETE FROM logiciel WHERE ordinateur.nom_hote = 'mypc.local.net'
AND logiciel.nom_hote = ordinateur.nom_hote;
Comme il y a une configuration approprie des index, le planificateur crera un plan :
Nestloop
-> Index Scan using comp_hostidx on ordinateur
-> Index Scan using soft_hostidx on logiciel
Donc, il n'y aurait pas trop de diffrence de performance entre le dclencheur et l'implmentation de la rgle.
Avec la prochaine suppression, nous voulons nous dbarrasser des 2000 ordinateurs o nom_hote commence avec old. il existe
deux commandes possibles pour ce faire. Voici l'une d'elle :
DELETE FROM ordinateur WHERE nom_hote >= 'old'
AND nom_hote < 'ole'
La commande ajoute par la rgle sera :
DELETE FROM logiciel WHERE ordinateur.nom_hote >= 'old'
AND ordinateur.nom_hote < 'ole'
AND logiciel.nom_hote = ordinateur.nom_hote;
avec le plan :
Hash Join
-> Seq Scan on logiciel
-> Hash
-> Index Scan using comp_hostidx on ordinateur
L'autre commande possible est :
DELETE FROM ordinateur WHERE nom_hote ~ '^old';
ce qui finira dans le plan d'excution suivant pour la commande ajoute par la rgle :
725
Systme de rgles
Nestloop
-> Index Scan using comp_hostidx on ordinateur
-> Index Scan using soft_hostidx on logiciel
Ceci monte que le planificateur ne ralise pas que la qualification pour nom_hote dans ordinateur pourrait aussi tre utilise
pour un parcours d'index sur logiciel quand il existe plusieurs expressions de qualifications combines avec and, ce qui correspond ce qu'il fait dans la version expression rationnelle de la commande. Le dclencheur sera appel une fois pour chacun des
2000 anciens ordinateurs qui doivent tre supprimes, et ceci rsultera en un parcours d'index sur ordinateur et 2000 parcours
d'index sur logiciel. l'implmentation de la rgle le fera en deux commandes qui utilisent les index. Et cela dpend de la taille
globale de la table logiciel, si la rgle sera toujours aussi rapide dans la situation du parcours squentiel. 2000 excutions de
commandes partir du dclencheur sur le gestionnaire SPI prend un peu de temps, mme si tous les blocs d'index seront rapidement dans le cache.
La dernire commande que nous regardons est :
DELETE FROM ordinateur WHERE constructeur = 'bim';
De nouveau, ceci pourrait rsulter en de nombreuses lignes supprimer dans ordinateur. donc, le dclencheur lancera de nouveau de nombreuses commandes via l'excuteur. La commande gnre par la rgle sera :
DELETE FROM logiciel WHERE ordinateur.constructeur = 'bim'
AND logiciel.nom_hote = ordinateur.nom_hote;
Le plan pour cette commande sera encore la boucle imbrique sur les deux parcours d'index, en utilisant seulement un index diffrent sur ordinateur :
Nestloop
-> Index Scan using comp_manufidx on ordinateur
-> Index Scan using soft_hostidx on logiciel
Dans chacun de ces cas, les commandes supplmentaires provenant du systme de rgles seront plus ou moins indpendantes du
nombre de lignes affectes en une commande.
Voici le rsum, les rgles seront seulement significativement plus lentes que les dclencheurs si leur actions rsultent en des jointures larges et mal qualifies, une situation o le planificateur choue.
726
Un langage de procdures s'installe en cinq tapes effectues obligatoirement par le superutilisateur des bases de donnes. Dans
la plupart des cas, les commandes SQL ncessaires doivent tre places dans un script d'installation d'une extension , pour
que la commande CREATE EXTENSION puisse tre utilis pour installer le langage.
1.
La bibliothque partage du gestionnaire de langage doit tre compile et installe dans le rpertoire de bibliothques appropri. Cela se droule comme la construction et l'installation de modules de classiques fonctions C utilisateur ; voir la
Section 35.9.6, Compiler et lier des fonctions charges dynamiquement . Il arrive souvent que le gestionnaire du langage dpende d'une bibliothque externe fournissant le moteur de langage ; dans ce cas, elle doit aussi tre installe.
2.
3.
En option, le gestionnaire de langages peut fournir une fonction de gestion en ligne qui permet l'excution de blocs de
code anonyme (commandes DO(7)) crits dans ce langage. Si une fonction de gestion en ligne est fourni par le langage, dclarez-le avec une commande comme
CREATE FUNCTION nom_fonction_en_ligne(internal)
RETURNS void
AS 'chemin-vers-objet-partag'
LANGUAGE C;
4.
En option, le gestionnaire de langages peut fournir une fonction de validation qui vrifie la dfinition d'une fonction
727
Langages de procdures
sans rellement l'excuter. La fonction de validation, si elle existe, est appele par CREATE FUNCTION. Si une telle fonction est fournie par le langage, elle sera dclare avec une commande de la forme
CREATE FUNCTION nom_fonction_validation(oid)
RETURNS void
AS 'chemin-vers-objet-partag'
LANGUAGE C;
5.
L'Exemple 38.1, Installation manuelle de PL/Perl prsente le fonctionnement de la procdure d'installation manuelle du langage PL/Perl.
Exemple 38.1. Installation manuelle de PL/Perl
La commande suivante indique au serveur l'emplacement de la bibliothque partage pour la fonction de gestion des appels du
langage PL/Perl.
CREATE FUNCTION plperl_call_handler() RETURNS language_handler AS
'$libdir/plperl' LANGUAGE C;
PL/Perl a une fonction de gestion en ligne et une fonction de validation, donc nous dclarons aussi celles-ci :
CREATE FUNCTION plperl_inline_handler(internal) RETURNS void AS
'$libdir/plperl' LANGUAGE C;
CREATE FUNCTION plperl_validator(oid) RETURNS void AS
'$libdir/plperl' LANGUAGE C STRICT;
La commande :
CREATE TRUSTED PROCEDURAL LANGUAGE plperl
HANDLER plperl_call_handler
INLINE plperl_inline_handler
VALIDATOR plperl_validator;
indique l'vocation des fonctions prcdentes pour les fonctions et procdures de dclencheur lorsque l'attribut de langage est plperl.
Lors de l'installation par dfaut de PostgreSQL, le gestionnaire du langage PL/pgSQL est compil et install dans le rpertoire
des bibliothques ( lib ) ; de plus, le langage PL/pgSQL est install dans toutes les bases de donnes. Si le support de Tcl est
configur, les gestionnaires pour PL/Tcl et PL/TclU sont construits et installs dans le rpertoire des bibliothques mais le langage
lui-mme n'est pas install par dfaut dans les bases de donnes. De la mme faon, les gestionnaires pour PL/Perl et PL/PerlU
sont construits et installs si le support de Perl est configur et le gestionnaire pour PL/PythonU est install si le support de Python
est configur mais ces langages ne sont pas installs par dfaut.
728
hrite de tous les types, fonctions et oprateurs dfinis par les utilisateurs,
Les fonctions PL/pgSQL acceptent un nombre variable d'arguments en utilisant le marqueur VARIADIC. Cela fonctionne exactement de la mme faon pour les fonctions SQL, comme indiqu dans Section 35.4.5, Fonctions SQL avec un nombre variables d'arguments .
Les fonctions crites en PL/pgSQL peuvent tre utilises partout o une fonction intgre peut l'tre. Par exemple, il est possible
de crer des fonctions complexes de traitement conditionnel et, par la suite, de les utiliser pour dfinir des oprateurs ou de les
utiliser dans des expressions d'index.
partir de la version 9.0 de PostgreSQL, PL/pgSQL est install par dfaut. Il reste toutefois un module chargeable et les administrateurs craignant pour la scurit de leur instance pourront le retirer.
Il n'est pas ncessaire de traiter ou transfrer entre le client et le serveur les rsultats intermdiaires dont le client n'a pas besoin
Ceci a pour rsultat une augmentation considrable des performances en comparaison une application qui n'utilise pas les procdures stockes.
Ainsi, avec PL/pgSQL vous pouvez utiliser tous les types de donnes, oprateurs et fonctions du SQL.
Les fonctions PL/pgSQL acceptent en entre et en sortie les types polymorphes anyelement, anyarray, anynonarray et anyenum.
Le type de donnes rel gr par une fonction polymorphe peut varier d'appel en appel (voir la Section 35.2.5, Types et fonctions polymorphes ). Voir l'exemple de la Section 39.3.1, Dclarer des paramtres de fonctions .
Les fonctions PL/pgSQL peuvent aussi renvoyer un ensemble de lignes (ou une table) de n'importe lequel des type de donnes
dont les fonctions peuvent renvoyer une instance unique. Ces fonctions gnrent leur sortie en excutant RETURN NEXT pour
chaque lment dsir de l'ensemble rsultat ou en utilisant RETURN QUERY pour afficher le rsultat de l'valuation d'une requte.
Enfin, une fonction PL/pgSQL peut tre dclare comme renvoyant void si elle n'a pas de valeur de retour utile.
Les fonctions PL/pgSQL peuvent aussi tre dclares avec des paramtres en sortie la place de la spcification explicite du code
de retour. Ceci n'ajoute pas de fonctionnalit fondamentale au langage mais c'est un moyen agrable principalement pour renvoyer
plusieurs valeurs. La notation RETURNS TABLE peut aussi tre utilis la place de RETURNS SETOF.
Des exemples spcifiques apparaissent dans la Section 39.3.1, Dclarer des paramtres de fonctions et la Section 39.6.1,
Retour d'une fonction .
Astuce
Une erreur habituelle est d'crire un point-virgule immdiatement aprs BEGIN. C'est incorrect et a comme rsultat
une erreur de syntaxe.
Un label est seulement ncessaire si vous voulez identifier le bloc utiliser dans une instruction EXIT ou pour qualifier les
noms de variable dclares dans le bloc. Si un label est crit aprs END, il doit correspondre au label donn au dbut du bloc.
Tous les mots cls sont insensibles la casse. Les identifiants sont convertis implicitement en minuscule sauf dans le cas de
l'utilisation de guillemets doubles. Le comportement est donc identique celui des commandes SQL habituelles.
Les commentaires fonctionnent de la mme manire tant dans du PL/pgSQL que dans le code SQL. Un double tiret (--) commence un commentaire et celui-ci continue jusqu' la fin de la ligne. Un /* commence un bloc de commentaire qui continue jusqu'au */ correspondant. Les blocs de commentaires peuvent imbriquer les uns dans les autres.
Chaque expression de la section expression d'un bloc peut tre un sous-bloc. Les sous-blocs peuvent tre utiliss pour des groupements logiques ou pour situer des variables locales dans un petit groupe d'instructions. Les variables dclares dans un sous-bloc
masquent toute variable nomme de faon similaire dans les blocs externes pendant toute la dure du sous-bloc. Cependant, vous
pouvez accder aux variables externes si vous qualifiez leur nom du label de leur bloc. Par exemple :
CREATE FUNCTION une_fonction() RETURNS integer AS $$
<< blocexterne >>
DECLARE
quantite integer := 30;
BEGIN
RAISE NOTICE 'quantit vaut ici %', quantite; -- affiche 30
quantite := 50;
--- Cre un sous-bloc
-DECLARE
quantite integer := 80;
BEGIN
RAISE NOTICE 'quantite vaut ici %', quantite; -- affiche 80
730
--
-- affiche 50
RETURN quantite;
END;
$$ LANGUAGE plpgsql;
Note
Il existe un bloc externe cach entourant le corps de toute fonction PL/pgSQL. Ce bloc fournit la dclaration des
paramtres de la fonction ainsi que quelques variables spciales comme FOUND (voir la Section 39.5.5, Obtention
du statut du rsultat ). Le bloc externe a pour label le nom de la fonction. Cela a pour consquence que les paramtres et les variables spciales peuvent tre qualifis du nom de la fonction.
Il est important de ne pas confondre l'utilisation de BEGIN/END pour grouper les instructions dans PL/pgSQL avec les commandes pour le contrle des transactions. Les BEGIN/END de PL/pgSQL ne servent qu'au groupement ; ils ne dbutent ni ne terminent une transaction. Les fonctions standards et les fonctions triggers sont toujours excutes l'intrieur d'une transaction tablie par une requte extrieure -- ils ne peuvent pas tre utiliss pour commencer ou valider une transaction car ils n'auraient pas
de contexte pour s'excuter. Nanmoins, un bloc contenant une clause EXCEPTION forme rellement une sous-transaction qui
peut tre annule sans affecter la transaction externe. Pour plus d'informations sur ce point, voir la Section 39.6.6, Rcuprer les
erreurs .
39.3. Dclarations
Toutes les variables utilises dans un bloc doivent tre dclares dans la section dclaration du bloc. Les seules exceptions sont
que la variable de boucle d'une boucle FOR effectuant une itration sur des valeurs entires est automatiquement dclare comme
variable entire (type integer), et de la mme faon une variable de boucle FOR effectuant une itration sur le rsultat d'un curseur
est automatiquement dclare comme variable de type record.
Les variables PL/pgSQL peuvent tre de n'importe quel type de donnes tels que integer, varchar et char.
Quelques exemples de dclaration de variables :
id_utilisateur integer;
quantit numeric(5);
url varchar;
ma_ligne nom_table%ROWTYPE;
mon_champ nom_table.nom_colonne%TYPE;
une_ligne RECORD;
La syntaxe gnrale d'une dclaration de variable est :
nom [ CONSTANT ] type [ COLLATE nom_collationnement ] [ NOT NULL ] [ { DEFAULT | := }
expression ];
La clause DEFAULT, si indique, spcifie la valeur initiale affecte la variable quand on entre dans le bloc. Si la clause DEFAULT n'est pas indique, la variable est initialise la valeur SQL NULL. L'option CONSTANT empche la modification de la
variable aprs initialisation, de sorte que sa valeur reste constante pour la dure du bloc. L'option COLLATE indique le collationnement utiliser pour la variable (voir Section 39.3.6, Collationnement des variables PL/pgSQL ). Si NOT NULL est spcifi,
l'affectation d'une valeur NULL aboutira une erreur d'excution. Les valeurs par dfaut de toutes les variables dclares NOT
NULL doivent tre prcises, donc non NULL.
La valeur par dfaut d'une variable est value et affecte la variable chaque entre du bloc (pas seulement une fois lors de
l'appel de la fonction). Ainsi, par exemple, l'affectation de now() une variable de type timestamp donnera la variable l'heure
de l'appel de la fonction courante, et non l'heure au moment o la fonction a t prcompile.
Exemples :
quantit integer DEFAULT 32;
url varchar := 'http://mysite.com';
id_utilisateur CONSTANT integer := 10;
Les paramtres passs aux fonctions sont nomms par les identifiants $1, $2, etc. ventuellement, des alias peuvent tre dclars
pour les noms de paramtres de type $n afin d'amliorer la lisibilit. L'alias ou l'identifiant numrique peuvent tre utiliss indiffremment pour se rfrer la valeur du paramtre.
Il existe deux faons de crer un alias. La faon prfre est de donner un nom au paramtre dans la commande CREATE FUNCTION, par exemple :
CREATE FUNCTION taxe_ventes(sous_total real) RETURNS real AS $$
BEGIN
RETURN sous_total * 0.06;
END;
$$ LANGUAGE plpgsql;
L'autre faon, la seule disponible pour les versions antrieures PostgreSQL 8.0, est de dclarer explicitement un alias en utilisant la syntaxe de dclaration :
nom ALIAS FOR $n;
Le mme exemple dans ce style ressemble ceci :
CREATE FUNCTION taxe_ventes(real) RETURNS real AS $$
DECLARE
sous_total ALIAS FOR $1;
BEGIN
RETURN sous_total * 0.06;
END;
$$ LANGUAGE plpgsql;
Note
Ces deux exemples ne sont pas compltement identiques. Dans le premier cas, sous_total peut tre rfrenc
comme taxe_ventes.sous_total, alors que ce n'est pas possible dans le second cas. (Si nous avions attach
un label au bloc interne, sous_total aurait pu utiliser ce label la place.)
Quelques exemples de plus :
CREATE FUNCTION instr(varchar, integer) RETURNS integer AS $$
DECLARE
v_string ALIAS FOR $1;
index ALIAS FOR $2;
BEGIN
-- quelques traitements utilisant ici v_string et index
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION concat_champs_selectionnes(in_t un_nom_de_table) RETURNS text AS $$
BEGIN
RETURN in_t.f1 || in_t.f3 || in_t.f5 || in_t.f7;
END;
$$ LANGUAGE plpgsql;
Quand une fonction PL/pgSQL est dclare avec des paramtres en sortie, ces derniers se voient attribus les noms $n et des alias
optionnels de la mme faon que les paramtres en entre. Un paramtre en sortie est une variable qui commence avec la valeur
NULL ; il devrait se voir attribuer une valeur lors de l'excution de la fonction. La valeur finale du paramtre est ce qui est renvoye. Par exemple, l'exemple taxe_ventes peut s'crire de cette faon :
CREATE FUNCTION taxe_ventes(sous_total real, OUT taxe real) AS $$
BEGIN
taxe := sous_total * 0.06;
END;
$$ LANGUAGE plpgsql;
Notez que nous avons omis RETURNS real. Nous aurions pu l'inclure mais cela aurait t redondant.
Les paramtres en sortie sont encore plus utiles lors du retour de plusieurs valeurs. Un exemple trivial est :
CREATE FUNCTION somme_n_produits(x int, y int, OUT somme int, OUT produit int) AS $$
BEGIN
somme := x + y;
732
produit := x * y;
END;
$$ LANGUAGE plpgsql;
D'aprs ce qui a t vu dans la Section 35.4.4, Fonctions SQL avec des paramtres en sortie , ceci cre rellement un type
d'enregistrement anonyme pour les rsultats de la fonction. Si une clause RETURNS est donne, elle doit spcifier RETURNS record.
Voici une autre faon de dclarer une fonction PL/pgSQL, cette fois avec RETURNS TABLE :
CREATE FUNCTION extended_sales(p_itemno int)
RETURNS TABLE(quantity int, total numeric) AS $$
BEGIN
RETURN QUERY SELECT quantity, quantity * price FROM sales
WHERE itemno = p_itemno;
END;
$$ LANGUAGE plpgsql;
C'est exactement quivalent dclarer un ou plusieurs paramtres OUT et spcifier RETURNS SETOF un_type.
Lorsque le type de retour d'une fonction PL/pgSQL est dclar comme type polymorphe (anyelement, anyarray, anynonarray et
anyenum), un paramtre spcial $0 est cr. Son type de donne est le type effectif de retour de la fonction, dduit d'aprs les
types en entre (voir la Section 35.2.5, Types et fonctions polymorphes ). Ceci permet la fonction d'accder son type de retour rel comme on le voit ici avec la Section 39.3.3, Copie de types . $0 est initialis NULL et peut tre modifi par la fonction, de sorte qu'il peut tre utilis pour contenir la variable de retour si besoin est, bien que cela ne soit pas requis. On peut aussi
donner un alias $0. Par exemple, cette fonction s'excute comme un oprateur + pour n'importe quel type de donnes :
CREATE FUNCTION ajoute_trois_valeurs(v1 anyelement, v2 anyelement, v3 anyelement)
RETURNS anyelement AS $$
DECLARE
resultat ALIAS FOR $0;
BEGIN
resultat := v1 + v2 + v3;
RETURN resultat;
END;
$$ LANGUAGE plpgsql;
Le mme effet peut tre obtenu en dclarant un ou plusieurs paramtres polymorphes en sortie de types. Dans ce cas, le paramtre
spcial $0 n'est pas utilis ; les paramtres en sortie servent ce mme but. Par exemple :
CREATE FUNCTION ajoute_trois_valeurs(v1 anyelement, v2 anyelement, v3 anyelement,
OUT somme anyelement)
AS $$
BEGIN
somme := v1 + v2 + v3;
END;
$$ LANGUAGE plpgsql;
39.3.2. ALIAS
nouveaunom ALIAS FOR anciennom;
La syntaxe ALIAS est plus gnrale que la section prcdente pourrait faire croire : vous pouvez dclarer un alias pour n'importe
quelle variable et pas seulement des paramtres de fonction. L'utilisation principale de cette instruction est l'attribution d'un autre
nom aux variables aux noms prdtermins, telles que NEW ou OLD au sein d'une procdure trigger.
Exemples:
DECLARE
anterieur ALIAS FOR old;
misajour ALIAS FOR new;
ALIAS crant deux manires diffrentes de nommer le mme objet, son utilisation outrance peut prter confusion. Il vaut
mieux ne l'utiliser uniquement pour se passer des noms prdtermins.
variable%TYPE
%TYPE fournit le type de donnes d'une variable ou d'une colonne de table. Vous pouvez l'utiliser pour dclarer des variables qui
contiendront des valeurs de base de donnes. Par exemple, disons que vous avez une colonne nomme id_utilisateur dans
votre table utilisateurs. Pour dclarer une variable du mme type de donnes que utilisateurs.id_utilisateur,
vous pouvez crire :
id_utilisateur utilisateurs.id_utilisateur%TYPE;
En utilisant %TYPE vous n'avez pas besoin de connatre le type de donnes de la structure laquelle vous faites rfrence et, plus
important, si le type de donnes de l'objet rfrenc change dans le futur (par exemple : vous changez le type de
id_utilisateur de integer real), vous pouvez ne pas avoir besoin de changer votre dfinition de fonction.
%TYPE est particulirement utile dans le cas de fonctions polymorphes puisque les types de donnes ncessaires aux variables internes peuvent changer d'un appel l'autre. Des variables appropries peuvent tre cres en appliquant %TYPE aux arguments de
la fonction ou la variable fictive de rsultat.
ture relle est dtermine quand la requte appelante est analyse, alors qu'une variable record peut changer sa structure de ligne
la vole.
39.4. Expressions
Toutes les expressions utilises dans les instructions PL/pgSQL sont traites par l'excuteur SQL classique du serveur. En effet,
une requte comme
SELECT expression
735
est trait par le moteur SQL principal. Bien qu'utilisant la commande SELECT, tout nom de variable PL/pgSQL est remplac par
des paramtres (ceci est expliqu en dtail dans la Section 39.10.1, Substitution de variables ). Cela permet au plan de requte
du SELECT d'tre prpar une seule fois, puis d'tre rutilis pour les valuations suivantes avec diffrentes valeurs des variables.
Du coup, ce qui arrive rellement la premire utilisation d'une expression est simplement une commande PREPARE. Par
exemple, si nous dclarons deux variables de type integer, x et y, et que nous crivons :
IF x < y THEN ...
ce qui se passe en arrire plan est quivalent :
PREPARE nom_instruction(integer, integer) AS SELECT $1 < $2;
puis cette instruction prpare est excute (via EXECUTE) pour chaque excution de l'instruction IF, avec les valeurs actuelles
des variables PL/pgSQL fournies en tant que valeurs des paramtres. Le plan de requte prpar de cette faon est sauvegard
pour toute la dure de la connexion la base, comme le dcrit la Section 39.10.2, Mise en cache du plan . Gnralement, ces
dtails ne sont pas importants pour un utilisateur de PL/pgSQL, mais ils sont utiles connatre pour diagnostiquer un problme.
39.5.1. Affectation
L'affectation d'une valeur une variable PL/pgSQL s'crit ainsi :
variable := expression;
Comme expliqu prcdemment, l'expression dans cette instruction est value au moyen de la commande SQL SELECT envoye au moteur principal de bases de donnes. L'expression ne doit manier qu'une seule valeur (ventuellement une valeur de
range, si cette variable est une variable de range ou d'enrengistrement). La variable cible peut tre une simple varible
(ventuellement qualifie avec un nom de bloc), un champ d'une range ou variable d'enrengistrement ou un lment de tableau
qui se trouve tre une simple variable ou champ.
Si le type de donnes du rsultat de l'expression ne correspond pas au type de donne de la variable, ou que la variable a une taille
ou une prcision (comme char(20)), la valeur rsultat sera implicitement convertie par l'interprteur PL/pgSQL en utilisant la
fonction d'criture (output-function) du type du rsultat, et la fonction d'entre (input-function) du type de la variable. Notez que
cela peut conduire des erreurs d'excution gnres par la fonction d'entre si la forme de la chane de la valeur rsultat n'est pas
acceptable pour cette fonction.
Exemples :
taxe := sous_total * 0.06;
mon_enregistrement.id_utilisateur := 20;
mande SELECT mais remplacez le mot cl initial SELECT avec PERFORM. Pour les requtes WITH, utilisez PERFORM
puis placez la requte entre parenthses. (De cette faon, la requte peut seulement renvoyer une ligne.) Les variables PL/pgSQL
seront substitues dans la requte comme pour les commandes qui ne renvoient pas de rsultat. Le plan est mis en cache de la
mme faon. La variable spciale FOUND est configure true si la requte a produit au moins une ligne, false dans le cas
contraire (voir la Section 39.5.5, Obtention du statut du rsultat ).
Note
Vous pourriez vous attendre ce que l'utilisation directe de SELECT aboutisse au mme rsultat mais, actuellement, la seule faon accepte de le faire est d'utiliser PERFORM. Une commande SQL qui peut renvoyer des
lignes comme SELECT sera rejete comme une erreur si elle n'a pas de clause INTO, ce qui est discut dans la
section suivante.
Un exemple :
PERFORM creer_vuemat('cs_session_page_requests_mv', ma_requete);
o cible peut tre une variable de type record, row ou une liste de variables ou de champs record/row spares par des virgules.
Les variables PL/pgSQL seront substitues dans le reste de la requte, et le plan est mis en cache comme dcrit ci-dessus pour les
commandes qui ne renvoient pas de lignes. Ceci fonctionne pour SELECT, INSERT/UPDATE/DELETE avec RETURNING, et
les commandes utilitaires qui renvoient des rsultats de type rowset (comme EXPLAIN). Sauf pour la clause INTO, la commande
SQL est identique celle qui aurait t crite en dehors de PL/pgSQL.
Astuce
Notez que cette interprtation de SELECT avec INTO est assez diffrente de la commande habituelle SELECT
INTO o la cible INTO est une table nouvellement cre. Si vous voulez crer une table partir du rsultat d'un
SELECT l'intrieur d'une fonction PL/pgSQL, utilisez la syntaxe CREATE TABLE ... AS SELECT.
Si une ligne ou une liste de variables est utilise comme cible, les colonnes du rsultat de la requte doivent correspondre exactement la structure de la cible (nombre de champs et types de donnes). Dans le cas contraire, une erreur sera rapporte
l'excution. Quand une variable record est la cible, elle se configure automatiquement avec le type row des colonnes du rsultat de
la requte.
La clause INTO peut apparatre pratiquement partout dans la commande SQL. Elle est crite soit juste avant soit juste aprs la
liste d'expressions_select dans une commande SELECT, ou la fin de la commande pour d'autres types de commande. Il
est recommand de suivre cette convention au cas o l'analyseur PL/pgSQL devient plus strict dans les versions futures.
Si STRICT n'est pas spcifi dans la clause INTO, alors cible sera configur avec la premire ligne renvoye par la requte ou
NULL si la requte n'a renvoy aucune ligne. (Notez que la premire ligne n'est bien dfinie que si vous avez utilis ORDER
BY.) Toute ligne rsultat aprs la premire ligne est annule. Vous pouvez vrifier la valeur de la variable spciale FOUND (voir la
Section 39.5.5, Obtention du statut du rsultat ) pour dterminer si une ligne a t renvoye :
SELECT * INTO monrec FROM emp WHERE nom = mon_nom;
IF NOT FOUND THEN
RAISE EXCEPTION 'employ % introuvable', mon_nom;
END IF;
Si l'option STRICT est indique, la requte doit renvoyer exactement une ligne. Dans le cas contraire, une erreur sera rapporte
l'excution, soit NO_DATA_FOUND (aucune ligne) soit TOO_MANY_ROWS (plus d'une ligne). Vous pouvez utiliser un bloc
d'exception si vous souhaitez rcuprer l'erreur, par exemple :
BEGIN
SELECT * INTO STRICT monrec FROM emp WHERE nom = mon_nom;
EXCEPTION
WHEN NO_DATA_FOUND THEN
737
Note
L'option STRICT correspond au comportement du SELECT INTO d'Oracle PL/SQL et des instructions relatives.
Pour grer les cas o vous avez besoin de traiter plusieurs lignes de rsultat partir d'une requte SQL, voir la Section 39.6.4,
Boucler dans les rsultats de requtes .
Une autre restriction sur les symboles de paramtres est qu'ils ne marchent que dans les commandes SELECT, INSERT, UPDATE et DELETE. Dans les autres types d'instructions (appells de manire gnrique commandes utilitaires), vous devez insrer les valeurs sous forme de texte mme si ce ne sont que des donnes.
Un EXECUTE avec une chane de commande constante et des paramtres USING, comme dans le premier exemple ci-dessus, est
quivalent fonctionnellement l'criture simple d'une commande directement dans PL/pgSQL et permet le remplacement automatique des variables PL/pgSQL. La diffrence importante est que EXECUTE va planifier de nouveau la commande pour chaque
excution, gnrant un plan qui est spcifique aux valeurs actuelles des paramtres ; alors que PL/pgSQL cre habituellement un
plan gnrique et le stocke pour le rutiliser. Dans des situations o le meilleur plan dpend fortement des valeurs des paramtres,
EXECUTE peut tre beaucoup plus rapide : alors que lorsque le plan n'est pas sensible aux valeurs des paramtres, la replanification sera une perte.
SELECT INTO n'est actuellement pas support l'intrieur de EXECUTE ; la place, excutez une commande SELECT et
spcifiez INTO comme faisant parti lui-mme d'EXECUTE.
Note
L'instruction EXECUTE de PL/pgSQL n'a pas de relation avec l'instruction SQL EXECUTE(7) supporte par le
serveur PostgreSQL. L'instruction EXECUTE du serveur ne peut pas tre utilise directement dans les fonctions
PL/pgSQL. En fait, elle n'est pas ncessaire.
Exemple 39.1. Mettre entre guillemets des valeurs dans des requtes dynamiques
En travaillant avec des commandes dynamiques, vous aurez souvent grer des chappements de guillemets simples. La mthode
recommande pour mettre entre guillemets un texte fixe dans le corps de votre fonction est d'utiliser les guillemets dollar (si votre
code n'utilise pas les guillemets dollar, rfrez-vous l'aperu dans la Section 39.11.1, Utilisation des guillemets simples
(quotes) , ce qui peut vous faire gagner des efforts lors du passage de ce code un schma plus raisonnable).
Les valeurs dynamiques qui sont insrer dans la requte construite requirent une gestion spciale car elles pourraient ellesmme contenir des guillemets. Un exemple (ceci suppose que vous utilisez les guillemets dollar pour la fonction dans sa globalit,
du coup les guillemets n'ont pas besoin d'tre doubls) :
EXECUTE 'UPDATE tbl SET '
|| quote_ident(nom_colonne)
|| ' = '
|| quote_literal(nouvelle_valeur)
|| ' WHERE cle = '
|| quote_literal(valeur_cle);
Cet exemple dmontre l'utilisation des fonctions quote_ident et quote_literal (voir Section 9.4, Fonctions et oprateurs de chanes ). Pour plus de sret, les expressions contenant les identifiants des colonnes et des tables doivent tre passes
la fonction quote_ident avant l'insertion dans une requte dynamique. Les expressions contenant des valeurs de type chane de
caractres doivent tre passes quote_literal. Ce sont les tapes appropries pour renvoyer le texte en entre entour par
des guillemets doubles ou simples respectivement, en chappant tout caractre spcial.
Comme quote_literal est labelis STRICT, elle renverra toujours NULL lorsqu'elle est appele avec un argument NULL.
Dans l'exemple ci-dessus, si nouvelle_valeur ou valeur_cl taient NULL, la requte dynamique entire deviendrait
NULL, amenant une erreur partir du EXECUTE. Vous pouvez viter ce problme en utilisant la fonction quote_nullable
qui fonctionne de faon identique quote_literal sauf si elle est appele avec un argument NULL, elle renvoie la chane
NULL. Par exemple,
EXECUTE 'UPDATE tbl SET '
|| quote_ident(nom_colonne)
|| ' = '
|| quote_nullable(nouvelle_valeur)
|| ' WHERE key = '
|| quote_nullable(valeur_cl);
Si vous travaillez avez des valeurs qui peuvent tre NULL, vous devez utiliser quote_nullable la place de
quote_literal.
Comme toujours, il faut s'assurer que les valeurs NULL d'une requte ne ramnent pas des valeurs inattendues. Par exemple, la
clause WHERE
739
Une instruction SELECT INTO positionne FOUND true si une ligne est affecte, false si aucune ligne n'est renvoye.
Une instruction PERFORM positionne FOUND true si elle renvoie une ou plusieurs lignes, false si aucune ligne n'est produite.
Les instructions UPDATE, INSERT, et DELETE positionnent FOUND true si au moins une ligne est affecte, false si aucune ligne n'est affecte.
740
Une instruction FETCH positionne FOUND true si elle renvoie une ligne, false si aucune ligne n'est renvoye.
Une instruction MOVE initialise FOUND true si elle repositionne le curseur avec succs. Dans le cas contraire, elle le positionne false.
Une instruction FOR ou FOREACH initialise FOUND la valeur true s'il itre une ou plusieurs fois, et false dans les autres
cas. FOUND est initialis de cette faon quand la boucle se termine : pendant l'excution de la boucle, FOUND n'est pas modifi
par la boucle, bien qu'il pourrait tre modifi par l'excution d'autres requtes dans le corps de la boucle.
Les instructions RETURN QUERY et RETURN QUERY EXECUTE mettent jour la variable FOUND true si la requte
renvoie au moins une ligne, et false si aucune ligne n'est renvoye.
Les autres instructions PL/pgSQL ne changent pas l'tat de FOUND. Notez que la commande EXECUTE modifie la sortie de
GET DIAGNOSTICS mais ne change pas FOUND.
FOUND est une variable locale l'intrieur de chaque fonction PL/pgSQL ; chaque changement qui y est fait n'affecte que la fonction en cours.
-- ignore l'erreur
Note
Dans le PL/SQL d'Oracle, les listes d'instructions vides ne sont pas autorises et, du coup, les instructions NULL
sont requises dans les situations telles que celles-ci. PL/pgSQL vous permet d'crire simplement rien.
39.6.1.1. RETURN
RETURN expression;
RETURN accompagn d'une expression termine la fonction et renvoie le valeur de l'expression l'appelant. Cette forme doit
tre utilise avec des fonctions PL/pgSQL qui ne renvoient pas d'ensemble de valeurs.
Lorsqu'elle renvoie un type scalaire, n'importe quelle expression peut tre utilise. Le rsultat de l'expression sera automatiquement converti vers le type de retour de la fonction, comme dcrit pour les affectations. Pour renvoyer une valeur composite
(ligne), vous devez crire une variable record ou ligne comme expression.
Si vous dclarez la fonction avec des paramtres en sortie, crivez seulement RETURN sans expression. Les valeurs courantes
741
Note
L'implmentation actuelle de RETURN NEXT et de RETURN QUERY pour PL/pgSQL rcupre la totalit de
742
l'ensemble des rsultats avant d'effectuer le retour de la fonction, comme vu plus haut. Cela signifie que si une
fonction PL/pgSQL produit une structure rsultat trs grande, les performances peuvent tre faibles : les donnes
seront crites sur le disque pour viter un puisement de la mmoire mais la fonction en elle-mme ne renverra rien
jusqu' ce que l'ensemble complet des rsultats soit gnr. Une version future de PL/pgSQL permettra aux utilisateurs de dfinir des fonctions renvoyant des ensembles qui n'auront pas cette limitation. Actuellement, le point auquel les donnes commencent tre crites sur le disque est contrl par la variable de configuration work_mem.
Les administrateurs ayant une mmoire suffisante pour enregistrer des ensembles de rsultats plus importants en
mmoire doivent envisager l'augmentation de ce paramtre.
IF ... THEN
CASE ... WHEN ... THEN ... ELSE ... END CASE
39.6.2.1. IF-THEN
IF expression-booleenne THEN
instructions
END IF;
Les instructions IF-THEN sont la forme la plus simple de IF. Les instructions entre THEN et END IF seront excutes si la
condition est vraie. Autrement, elles seront ignores.
Exemple :
IF v_id_utilisateur <> 0 THEN
UPDATE utilisateurs SET email = v_email WHERE id_utilisateur = v_id_utilisateur;
END IF;
39.6.2.2. IF-THEN-ELSE
IF expression-booleenne THEN
instructions
ELSE
instructions
END IF;
Les instructions IF-THEN-ELSE s'ajoutent au IF-THEN en vous permettant de spcifier un autre ensemble d'instructions excuter si la condition n'est pas vraie (notez que ceci inclut le cas o la condition s'value NULL.).
Exemples :
IF id_parent IS NULL OR id_parent = ''
THEN
RETURN nom_complet;
ELSE
RETURN hp_true_filename(id_parent) || '/' || nom_complet;
END IF;
IF v_nombre > 0 THEN
INSERT INTO nombre_utilisateurs (nombre) VALUES (v_nombre);
RETURN 't';
ELSE
RETURN 'f';
END IF;
743
39.6.2.3. IF-THEN-ELSIF
IF expression-booleenne THEN
instructions
[ ELSIF expression-booleenne THEN
instructions
[ ELSIF expression-booleenne THEN
instructions
...
]
]
[ ELSE
instructions ]
END IF;
Quelques fois, il existe plus de deux alternatives. IF-THEN-ELSIF fournit une mthode agrable pour vrifier diffrentes alternatives. Les conditions IF sont testes successivement jusqu' trouver la bonne. Alors les instructions associes sont excutes,
puis le contrle est pass la prochaine instruction aprs END IF. (Toute autre condition IF n'est pas teste.) Si aucune des
conditions IF n'est vraie, alors le bloc ELSE (s'il y en a un) est excut.
Voici un exemple :
IF nombre = 0 THEN
resultat := 'zero';
ELSIF nombre > 0 THEN
resultat := 'positif';
ELSIF nombre < 0 THEN
resultat := 'negatif';
ELSE
-- hmm, la seule possibilit est que le nombre soit NULL
resultat := 'NULL';
END IF;
Le mot cl ELSIF peut aussi s'crire ELSEIF.
Une faon alternative d'accomplir la mme tche est d'intgrer les instructions IF-THEN-ELSE, comme dans l'exemple suivant :
IF demo_row.sex = 'm' THEN
pretty_sex := 'man';
ELSE
IF demo_row.sex = 'f' THEN
pretty_sex := 'woman';
END IF;
END IF;
Nanmoins, cette mthode requiert d'crire un END IF pour chaque IF, donc c'est un peu plus compliqu que d'utiliser ELSIF
quand il y a beaucoup d'autres alternatives.
39.6.3.1. LOOP
[<<label>>]
LOOP
instructions
END LOOP [ label ];
LOOP dfinit une boucle inconditionnelle rpte indfiniment jusqu' ce qu'elle soit termine par une instruction EXIT ou RETURN. Le label optionnel peut tre utilis par les instructions EXIT et CONTINUE dans le cas de boucles imbriques pour dfinir la boucle implique.
39.6.3.2. EXIT
EXIT [ label ] [ WHEN expression-boolenne ];
Si aucun label n'est donn, la boucle la plus imbrique se termine et l'instruction suivant END LOOP est excute. Si un label
est donn, ce doit tre le label de la boucle, du bloc courant ou d'un niveau moins imbriqu. La boucle ou le bloc nomm se termine alors et le contrle continue avec l'instruction situe aprs le END de la boucle ou du bloc correspondant.
Si WHEN est spcifi, la sortie de boucle ne s'effectue que si expression-boolenne est vraie. Sinon, le contrle passe
745
39.6.3.3. CONTINUE
CONTINUE [ label ] [ WHEN expression-boolenne ];
Si aucun label n'est donn, la prochaine itration de la boucle interne est commence. C'est--dire que toutes les instructions
restantes dans le corps de la boucle sont ignores et le contrle revient l'expression de contrle de la boucle pour dterminer si
une autre itration de boucle est ncessaire. Si le label est prsent, il spcifie le label de la boucle dont l'excution va tre continue.
Si WHEN est spcifi, la prochaine itration de la boucle est commence seulement si l'expression-boolenne est vraie. Sinon, le contrle est pass l'instruction aprs CONTINUE.
CONTINUE peut tre utilis avec tous les types de boucles ; il n'est pas limit l'utilisation des boucles inconditionnelles.
Exemples :
LOOP
-- quelques traitements
EXIT WHEN nombre > 100;
CONTINUE WHEN nombre < 50;
-- quelques traitements pour nombre IN [50 .. 100]
END LOOP;
39.6.3.4. WHILE
[<<label>>]
WHILE expression-boolenne LOOP
instructions
END LOOP [ label ];
L'instruction WHILE rpte une squence d'instructions aussi longtemps que expression-boolenne est value vrai.
L'expression est vrifie juste avant chaque entre dans le corps de la boucle.
Par exemple :
WHILE montant_possede > 0 AND balance_cadeau > 0 LOOP
-- quelques traitements ici
END LOOP;
746
END LOOP;
RAISE NOTICE 'Fin du rafraichissement des vues matrialises.';
RETURN 1;
END;
$$ LANGUAGE plpgsql;
Si la boucle est termine par une instruction EXIT, la dernire valeur ligne affecte est toujours accessible aprs la boucle.
La requte utilise dans ce type d'instruction FOR peut tre toute commande SQL qui renvoie des lignes l'appelant : SELECT
est le cas le plus commun mais vous pouvez aussi utiliser INSERT, UPDATE ou DELETE avec une clause RETURNING. Certaines commandes comme EXPLAIN fonctionnent aussi.
Les variables PL/pgSQL sont substitues dans le texte de la requte et le plan de requte est mis en cache pour une rutilisation
possible. C'est couvert en dtail dans la Section 39.10.1, Substitution de variables et dans la Section 39.10.2, Mise en cache
du plan .
L'instruction FOR-IN-EXECUTE est un moyen d'itrer sur des lignes :
[<<label>>]
FOR target IN EXECUTE text_expression [ USING expression [, ...] ] LOOP
instructions
END LOOP [ label ];
Ceci est identique la forme prcdente, ceci prs que l'expression de la requte source est spcifie comme une expression
chane, value et replanifie chaque entre dans la boucle FOR. Ceci permet au dveloppeur de choisir entre la vitesse d'une requte prplanifie et la flexibilit d'une requte dynamique, uniquement avec l'instruction EXECUTE. Comme avec EXECUTE,
les valeurs de paramtres peuvent tre insres dans la commande dynamique via USING.
Une autre faon de spcifier la requte dont les rsultats devront tre itrs est de la dclarer comme un curseur. Ceci est dcrit
dans Section 39.7.4, Boucler dans les rsultats d'un curseur .
et elle reoit les morceaux successifs de la valeur du tableau, o chaque morceau est le nombre de dimensions indiques par
SLICE. Voici un exemple d'itration sur des morceaux une dimension :
CREATE FUNCTION parcourt_lignes(int[]) RETURNS void AS $$
DECLARE
x int[];
BEGIN
FOREACH x SLICE 1 IN ARRAY $1
LOOP
RAISE NOTICE 'ligne = %', x;
END LOOP;
END;
$$ LANGUAGE plpgsql;
SELECT parcourt_lignes(ARRAY[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]);
NOTICE:
NOTICE:
NOTICE:
NOTICE:
ligne
ligne
ligne
ligne
=
=
=
=
{1,2,3}
{4,5,6}
{7,8,9}
{10,11,12}
x := x + 1;
y := x / 0;
EXCEPTION
WHEN division_by_zero THEN
RAISE NOTICE 'rcupration de l''erreur division_by_zero';
RETURN x;
END;
Quand le contrle parvient l'affectation de y, il chouera avec une erreur division_by_zero. Elle sera rcupre par la
clause EXCEPTION. La valeur renvoye par l'instruction RETURN sera la valeur incrmente de x mais les effets de la commande UPDATE auront t annuls. La commande INSERT prcdant le bloc ne sera pas annule, du coup le rsultat final est
que la base de donnes contient Tom Jones et non pas Joe Jones.
Astuce
Un bloc contenant une clause EXCEPTION est significativement plus coteuse en entre et en sortie qu'un bloc
sans. Du coup, n'utilisez pas EXCEPTION sans besoin.
l'intrieur d'un gestionnaire d'exceptions, la variable SQLSTATE contient le code d'erreur correspondant l'exception qui a t
leve (rfrez-vous au Tableau A.1, Codes d'erreur de PostgreSQL pour une liste des codes d'erreurs possibles). La variable
SQLERRM contient le message d'erreur associ avec l'exception. Ces variables sont indfinies l'extrieur des gestionnaires
d'exceptions.
Exemple 39.2. Exceptions avec UPDATE/INSERT
Cet exemple utilise un gestionnaire d'exceptions pour raliser soit un UPDATE soit un INSERT, comme appropri :
CREATE TABLE base (a INT PRIMARY KEY, b TEXT);
CREATE FUNCTION fusionne_base(cle INT, donnee TEXT) RETURNS VOID AS
$$
BEGIN
LOOP
-- commenons par tenter la mise jour de la cl
UPDATE base SET b = donnee WHERE a = cle;
IF found THEN
RETURN;
END IF;
-- si elle n'est pas dispo, tentons l'insertion de la cl
-- si quelqu'un essaie d'insrer la mme cl en mme temps,
-- il y aura une erreur pour violation de cl unique
BEGIN
INSERT INTO base(a,b) VALUES (cle, donnee);
RETURN;
EXCEPTION WHEN unique_violation THEN
-- ne rien faire, et tente de nouveau la mise jour
END;
END LOOP;
END;
$$
LANGUAGE plpgsql;
SELECT fusionne_base(1, 'david');
SELECT fusionne_base(1, 'dennis');
Cet exemple suppose que l'erreur unique_violation est caus par la requte INSERT, et non pas par une fonction trigger sur
l'opration INSERT pour cette table.
39.7. Curseurs
Plutt que d'excuter la totalit d'une requte la fois, il est possible de crer un curseur qui encapsule la requte, puis en lit le rsultat quelques lignes la fois. Une des raisons pour faire de la sorte est d'viter les surcharges de mmoire quand le rsultat
contient un grand nombre de lignes (cependant, les utilisateurs PL/pgSQL n'ont gnralement pas besoin de se proccuper de cela
puisque les boucles FOR utilisent automatiquement un curseur en interne pour viter les problmes de mmoire). Un usage plus
intressant est de renvoyer une rfrence un curseur qu'une fonction a cr, permettant l'appelant de lire les lignes. C'est un
750
Note
Les variables des curseurs lis peuvent aussi tre utiliss sans les ouvrir explicitement, via l'instruction FOR dcrite
dans Section 39.7.4, Boucler dans les rsultats d'un curseur .
39.7.3.1. FETCH
FETCH [ direction { FROM | IN } ] curseur INTO cible;
FETCH rcupre la prochaine ligne partir d'un curseur et la place dans une cible, qui peut tre une variable ligne, une variable
record ou une liste de variables simples spares par des virgules, comme dans un SELECT INTO. S'il n'y a pas de ligne suivante, la cible est mise NULL. Comme avec SELECT INTO, la variable spciale FOUND peut tre lue pour voir si une ligne a
t rcupre.
La clause direction peut tre une des variantes suivantes autorises pour la commande SQL FETCH(7) sauf celles qui peuvent
rcuprer plus d'une ligne ; nommment, cela peut tre NEXT, PRIOR, FIRST, LAST, ABSOLUTE nombre, RELATIVE
nombre, FORWARD ou BACKWARD. Omettre direction est identique spcifier NEXT. Les valeurs direction qui ncessitent d'aller en sens inverse risquent d'chouer sauf si le curseur a t dclar ou ouvert avec l'option SCROLL.
curseur doit tre le nom d'une variable refcursor qui rfrence un portail de curseur ouvert.
Exemples :
FETCH
FETCH
FETCH
FETCH
39.7.3.2. MOVE
752
curs1;
LAST FROM curs3;
RELATIVE -2 FROM curs4;
FORWARD 2 FROM curs4;
39.7.3.4. CLOSE
CLOSE curseur;
CLOSE ferme le portail sous-tendant un curseur ouvert. Ceci peut tre utilis pour librer des ressources avant la fin de la transaction ou pour librer la variable curseur pour pouvoir la rouvrir.
Exemple :
CLOSE curs1;
Note
Une variable curseur avec limites est initialise avec la valeur de la chane reprsentant son nom, de faon ce que
le nom du portail soit identique au nom de la variable curseur, sauf si le dveloppeur le surcharge par affectation
avant d'ouvrir le curseur. Mais, une variable curseur sans limite aura par dfaut la valeur NULL, dont il reoit un
nom unique gnr automatiquement sauf s'il est surcharg.
753
L'exemple suivant montre une faon de fournir un nom de curseur par l'appelant :
CREATE TABLE test (col text);
INSERT INTO test VALUES ('123');
CREATE FUNCTION fonction_reference(refcursor) RETURNS refcursor AS $$
BEGIN
OPEN $1 FOR SELECT col FROM test;
RETURN $1;
END;
$$ LANGUAGE plpgsql;
BEGIN;
SELECT fonction_reference('curseur_fonction');
FETCH ALL IN curseur_fonction;
COMMIT;
L'exemple suivant utilise la gnration automatique du nom du curseur :
CREATE FUNCTION fonction_reference2() RETURNS refcursor AS $$
DECLARE
ref refcursor;
BEGIN
OPEN ref FOR SELECT col FROM test;
RETURN ref;
END;
$$ LANGUAGE plpgsql;
-- Il faut tre dans une transaction pour utiliser les curseurs.
BEGIN;
SELECT fonction_reference2();
fonction_reference2
-------------------------<unnamed cursor 1>
(1 row)
FETCH ALL IN "<unnamed cursor 1>";
COMMIT;
L'exemple suivant montre une faon de renvoyer plusieurs curseurs une seule fonction :
CREATE FUNCTION ma_fonction(refcursor, refcursor) RETURNS SETOF refcursor AS $$
BEGIN
OPEN $1 FOR SELECT * FROM table_1;
RETURN NEXT $1;
OPEN $2 FOR SELECT * FROM table_2;
RETURN NEXT $2;
END;
$$ LANGUAGE plpgsql;
-- doit tre dans une transaction pour utiliser les curseurs.
BEGIN;
SELECT * FROM ma_fonction('a', 'b');
FETCH ALL FROM a;
FETCH ALL FROM b;
COMMIT;
La variable curseur doit avoir t lie une requte lors de sa dclaration et il ne peut pas tre dj ouvert. L'instruction FOR
ouvre automatiquement le curseur, et il ferme le curseur en sortie de la boucle. Une liste des expressions de valeurs des arguments
doit apparatre si et seulement si le curseur a t dclar prendre des arguments. Ces valeurs seront substitutes dans la requte, de
la mme faon que lors d'un OPEN. La variable variable var_record est dfinie automatiquement avec le type record et existe
seulement dans la boucle (toute dfinition existante d'un nom de variable est ignore dans la boucle). Chaque ligne renvoye par le
curseur est successivement affecte la variable d'enregistrement et le corps de la boucle est excut.
L'option niveau indique la svrit de l'erreur. Les niveaux autoriss sont DEBUG, LOG, INFO, NOTICE, WARNING et EXCEPTION, ce dernier tant la valeur par dfaut. EXCEPTION lve une erreur (ce qui annule habituellement la transaction en cours).
Les autres niveaux ne font que gnrer des messages aux diffrents niveaux de priorit. Les variables de configuration
log_min_messages et client_min_messages contrlent l'envoi de messages dans les traces, au client ou aux deux. Voir le Chapitre 18, Configuration du serveur pour plus d'informations.
Aprs niveau, vous pouvez crire un format (qui doit tre une chane litrale, pas une expression). La chane format indique le
texte du message d'erreur rapporter. Elle peut tre suivie par des expressions optionnelles insrer dans le message. Dans la
chane, % est remplac par la reprsentation de la valeur du prochain argument. crivez %% pour saisir un % litral.
Dans cet exemple, la valeur de v_job_id remplace le % dans la chane.
RAISE NOTICE 'Appel de cs_creer_job(%)', v_job_id;
Vous pouvez attacher des informations supplmentaires au rapport d'erreur en crivant USING suivi par des lments option =
expression. Les mots cls autorises pour option sont MESSAGE, DETAIL, HINT et ERRCODE, alors que chaque expression peut tre une expression de type chane. MESSAGE configure le texte de l'erreur (cette option ne peut pas tre utilise
sous la forme de RAISE qui inclut une chane de format avant USING). DETAIL fournit un message dtaill de l'erreur, HINT
propose une astuce. ERRCODE indique le code d'erreur (SQLSTATE) rapporter, soit par le nom de la condition comme indique
dans Annexe A, Codes d'erreurs de PostgreSQL, soit directement sous la forme d'un code SQLSTATE cinq caractres.
Cet exemple annulera la transaction avec le message d'erreur et l'astuce donns :
RAISE EXCEPTION 'Nonexistent ID --> %', user_id
USING HINT = 'Please check your user id';
Ces deux exemples affichent des faons quivalents pour initialiser SQLSTATE :
RAISE 'Duplicate user ID: %', user_id USING ERRCODE = 'unique_violation';
RAISE 'Duplicate user ID: %', user_id USING ERRCODE = '23505';
Il existe une deuxime syntaxe RAISE pour laquelle l'argument principale est le nom de la condition ou le SQLSTATE rapporter, par exemple :
RAISE division_by_zero;
RAISE SQLSTATE '22012';
Dans cette syntaxe, USING peut tre utilis pour fournir un message d'erreur, un dtail ou une astuce personnalis. Voici une autre
faon de faire l'exemple prcdent :
RAISE unique_violation USING MESSAGE = 'Duplicate user ID: ' || user_id;
Une autre variante est d'crire RAISE USING ou RAISE niveau USING et de placer tout le reste dans la liste USING.
La dernire variante de RAISE n'a aucun paramtre. Cette forme peut seulement tre utilise dans un bloc BEGIN d'une clause
EXCEPTION ; cela fait que l'erreur est renvoye.
755
Note
Avant PostgreSQL 9.1, RAISE sans paramtres tait interprt comme un renvoi de l'erreur partir du bloc
contenant le gestionnaire actif d'exceptions. Du coup, une clause EXCEPTION imbrique dans ce gestionnaire ne la
rcuprerait pas, mme si le RAISE tait intgre dans le bloc de la clause EXCEPTION. C'tait trs surprenant et
incompatible avec PL/SQL d'Oracle.
Si aucun nom de condition ou SQLSTATE n'est indiqu dans une commande RAISE EXCEPTION, la valeur par dfaut est
d'utiliser RAISE_EXCEPTION (P0001). Si aucun message texte n'est indiqu, la valeur par dfaut est d'utiliser le nom de la
condition ou le SQLSTATE comme texte de message.
Note
Lors de la spcification du code d'erreur par un code SQLSTATE, vous n'tes pas limit aux codes d'erreur prdfinis, mais pouvez slectionner tout code d'erreur consistant en cinq chiffres et/ou des lettres ASCII majuscules, autre
que 00000. Il est recommand d'viter d'envoyer des codes d'erreur qui se terminent avec trois zros car il y a des
codes de catgorie, et peuvent seulement tre rcuprs en filtrant la catgorie complte.
TG_ARGV[]
Type de donne text ; les arguments de l'instruction CREATE TRIGGER. L'index dbute 0. Les indices invalides
(infrieurs 0 ou suprieurs ou gaux tg_nargs) auront une valeur NULL.
Une fonction trigger doit renvoyer soit NULL soit une valeur record ayant exactement la structure de la table pour laquelle le trigger a t lanc.
Les triggers de niveau ligne lancs BEFORE peuvent renvoyer NULL pour indiquer au gestionnaire de trigger de sauter le reste de
l'opration pour cette ligne (les triggers suivants ne sont pas lancs, et les INSERT/UPDATE/DELETE ne se font pas pour cette
ligne). Si une valeur non NULL est renvoye alors l'opration se droule avec cette valeur ligne. Renvoyer une valeur ligne diffrente de la valeur originale de NEW modifie la ligne qui sera insre ou mise jour. De ce fait, si la fonction de trigger veut que
l'action russise sans modifier la valeur de range, NEW (ou une valeur gale) doit tre renvoye. Pour modifier la range tre
stocke, il est possible de remplacer les valeurs directement dans NEW et renvoyer le NEW modifi ou de gnrer un nouvel enregistrement renvoyer. Dans le cas d'un before-trigger sur une commande DELETE, la valeur renvoye n'a aucun effet direct mais
doit tre non-nulle pour permettre l'action trigger de continuer. Notez que NEW est nul dans le cadre des triggers DELETE et
que renvoyer ceci n'est pas recommand dans les cas courants. Une pratique utile dans des triggers DELETE serait de renvoyer
OLD.
Les triggers INSTEAD OF (qui sont toujours des triggers au niveau ligne et peuvent seulement tre utiliss sur des vues) peuvent
renvoyer NULL pour signaler qu'ils n'ont fait aucune modification et que le reste de l'opration pour cette ligne doit tre ignor
(autrement dit, les triggers suivants ne sont pas dclenchs et la ligne n'est pas compte dans le statut des lignes affectes pour la
requte INSERT/UPDATE/DELETE). Une valeur diffrente de NULL doit tre renvoye pour indiquer que le trigger a trait
l'opration demande. Pour les oprations INSERT et UPDATE, la valeur de retour doit tre NEW, que la fonction trigger peut
modifier pour supporter une clause RETURNING d'une requte INSERT ou UPDATE (cela affectera aussi la valeur de la ligne
passe aux autres triggers). Pour les requtes DELETE, la valeur de retour doit tre OLD.
La valeur de retour d'un trigger de niveau range dclench AFTER ou un trigger de niveau instruction dclench BEFORE ou
AFTER est toujours ignor ; il pourrait aussi bien tre NULL. Nanmoins, tous les types de triggers peuvent toujours annuler
l'opration complte en envoyant une erreur.
L'Exemple 39.3, Une procdure trigger PL/pgSQL montre un exemple d'une procdure trigger dans PL/pgSQL.
Exemple 39.3. Une procdure trigger PL/pgSQL
Cet exemple de trigger assure qu' chaque moment o une ligne est insre ou mise jour dans la table, le nom de l'utilisateur courant et l'heure sont estampills dans la ligne. Et cela vous assure qu'un nom d'employ est donn et que le salaire est une valeur positive.
CREATE TABLE emp (
nom_employe text,
salaire integer,
date_dermodif timestamp,
utilisateur_dermodif text
);
CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
BEGIN
-- Verifie que nom_employe et salary sont donns
IF NEW.nom_employe IS NULL THEN
RAISE EXCEPTION 'nom_employe ne peut pas tre NULL';
END IF;
IF NEW.salaire IS NULL THEN
RAISE EXCEPTION '% ne peut pas avoir un salaire', NEW.nom_employe;
END IF;
-- Qui travaille pour nous si la personne doit payer pour cela ?
IF NEW.salaire < 0 THEN
RAISE EXCEPTION '% ne peut pas avoir un salaire ngatif', NEW.nom_employe;
END IF;
-- Rappelons-nous qui a chang le salaire et quand
NEW.date_dermodif := current_timestamp;
NEW.utilisateur_dermodif := current_user;
RETURN NEW;
END;
$emp_stamp$ LANGUAGE plpgsql;
757
Cet exemple de trigger nous assure que toute insertion, modification ou suppression d'une ligne dans la table emp est enregistre
dans la table emp_audit. L'heure et le nom de l'utilisateur sont conserves dans la ligne avec le type d'opration ralis.
CREATE TABLE emp (
nom_employe
salaire
);
NOT
NOT
NOT
NOT
NULL,
NULL,
NULL,
NULL,
END;
$emp_audit$ language plpgsql;
CREATE TRIGGER emp_audit
AFTER INSERT OR UPDATE OR DELETE ON emp
FOR EACH ROW EXECUTE PROCEDURE audit_employe();
Une variation de l'exemple prcdent utilise une vue joignant la table principale et la table d'audit pour montrer les derniers enregistrements modifis. Cette approche enregistre toujours toutes les modifications sur la table mais prsente aussi une vue simple
de l'audit, n'affichant que le date et heure de la dernire modification pour chaque enregistrement. Exemple 39.5, Une fonction
trigger en PL/pgSQL surune vue pour un audit montre un exemple d'un trigger d'audit sur une vue avec PL/pgSQL.
Exemple 39.5. Une fonction trigger en PL/pgSQL surune vue pour un audit
Cet exemple utilise un trigger sur une vue pour la rendre modifiable, et s'assure que toute insertion, mise jour ou suppression
d'une ligne dans la vue est enregistre (pour l'audit) dans la table emp_audit. La date et l'heure courante ainsi que le nom de
l'utilisateur sont enregistrs, avec le type d'opration ralis pour que la vue affiche la date et l'heure de la dernire modification de
chaque ligne.
CREATE TABLE emp (
758
nom_employe
salaire
);
CREATE TABLE emp_audit(
operation
char(1)
id_utilisateur
text
nom_employe
text
salaire
integer,
dmodif
timestamp
);
NOT NULL,
NOT NULL,
NOT NULL,
NOT NULL
Le schma dtaill ici est partiellement bas sur l'exemple du Grocery Store provenant de The Data Warehouse Toolkit par Ralph
Kimball.
-759
interdit les mises jour qui modifient time_key (probablement pas trop cher, car DELETE + INSERT est la faon la plus
probable de raliser les modifications).
( OLD.time_key != NEW.time_key) THEN
RAISE EXCEPTION 'Update of time_key : % -> % not allowed',
OLD.time_key, NEW.time_key;
END IF;
delta_time_key = OLD.time_key;
delta_amount_sold = NEW.amount_sold - OLD.amount_sold;
delta_units_sold = NEW.units_sold - OLD.units_sold;
delta_amount_cost = NEW.amount_cost - OLD.amount_cost;
760
tion. En coulisses, PL/pgSQL remplace les paramtres de requtes par des rfrences. Les paramtres ne seront remplacs qu'aux
endroits o un paramtre ou une rfrence de colonne sont autoriss par la syntaxe. Pour un cas extrme, considerez cet exemple
de mauvaise programmation :
INSERT INTO foo (foo) VALUES (foo);
La premire occurrence de foo doit tre un nom de table, d'aprs la syntaxe et ne sera donc pas remplace, mme si la fonction a
une variable nomme foo. La deuxime occurrence doit tre le nom d'une colonne de la table et ne sera donc pas remplace non
plus. Seule la troisime occurrence peuvent tre une rfrence la variable de la fonction.
Note
Les versions de PostgreSQL avant la 9.0 remplaaient la variable dans les trois cas, donnant lieu des erreurs de
syntaxe.
Les noms de variables n'tant pas diffrents des noms de colonnes, d'aprs la syntaxe, il peut y avoir ambuiguit dans les instructions qui font rfrence aux deux : un nom donn fait-il rfrence un nom de colonne ou une variable ? Modifions l'exemple
prcdent.
INSERT INTO dest (col) SELECT foo + bar FROM src;
Ici, dest et src doivent tre des noms de table et col doit tre une colonne de dest mais foo et bar peuvent tre aussi bien
des variables de la fonction que des colonnes de src.
Par dfait, PL/pgSQL signalera une erreur si un nom dans une requte SQL peut faire rfrence la fois une variable et une colonne. Vous pouvez corriger ce problme en renommant la variable ou colonne, en qualifiant la rfrence ambige ou en prcisant
PL/pgSQL quelle est l'interpretation privilgier.
Le choix le plus simple est de renommer la variable ou colonne. Une rgle de codage rcurrente est d'utiliser une convention de
nommage diffrente pour les variables de PL/pgSQL que pour les noms de colonne. Par exemple, si vous utilisez toujours des variables de fonctions en v_quelquechose tout en vous assurant qu'aucun nom de colonne ne commence par v_, aucun conflit
ne sera possible.
Autrement, vous pouvez qualifier les rfrences ambiges pour les rendre plus claires. Dans l'exemple ci-dessus, src.foo serait
une rfrence sans amigit une colonne de table. Pour crer une rfrence sans amigit une variable, dclarez-la dans un
bloc nomm et utilisez le nom du bloc (voir Section 39.2, Structure de PL/pgSQL ). Par exemple,
<<bloc>>
DECLARE
foo int;
BEGIN
foo := ...;
INSERT INTO dest (col) SELECT bloc.foo + bar FROM src;
Ici, bloc.foo dsigne la variable mme s'il existe une colonne foo dans la base src. Les paramtres de fonction, ainsi que les
variables spciales tel que FOUND, peuvent tre qualifis par le nom de la fonction, parce qu'ils sont implicitement dclars dans
un bloc exterieur portant le nom de la fonction.
Quelque fois, il n'est pas envisageable de lever toutes les ambigits dans une grande quantit de code PL/pgSQL. Dans ces cas-ci,
vous pouvez spcifier PL/pgSQL qu'il doit traiter les rfrences ambiges comme tant une variable (ce qui est compatible avec
le comportement de PL/pgSQL avant PostgreSQL 9.0) ou comme tant la colonne d'une table (ce qui est compatible avec
d'autres systmes tels que Oracle).
Pour modifier ce comportement dans toute l'instance, mettez le paramtre de configuration plpgsql.variable_conflict
l'un de error, use_variable ou use_column (o error est la valeur par dfaut). Ce paramtre agit sur les compilations
posterieures d'instructions dans les fonctions PL/pgSQL mais pas les instructions dj compiles dans la session en cours. Pour
fixer ce paramtre avant le chargement de PL/pgSQL, vous devez ajouter plpgsql la liste custom_variable_classes dans
postgresql.conf. Cette modification pouvant affecter de manire inattendue le comportement des fonctions PL/pgSQL, elle
ne peut tre fate que par un administrateur.
Vous pouvez modifier ce comportement fonction par fonction, en insrant l'une de ces commandes spciales au dbut de la fonction :
#variable_conflict error
#variable_conflict use_variable
762
#variable_conflict use_column
Ces commandes n'agissent que sur les fonctions qui les contient et surchargent la valeur de plpgsql.variable_conflict.
Un exemple est
CREATE FUNCTION stamp_user(id int, comment text) RETURNS void AS $$
#variable_conflict use_variable
DECLARE
curtime timestamp := now();
BEGIN
UPDATE users SET last_modified = curtime, comment = comment
WHERE users.id = id;
END;
$$ LANGUAGE plpgsql;
Dans la commande UPDATE, curtime, comment, et id font rfrence aux variables et paramtres de la fonction, que la table
users ait ou non des colonnes portant ces noms. Notez qu'il a fallu qualifier la rfrence users.id dans la clause WHERE
pour qu'elle fasse rfrence la colonne. Mais nous ne qualifions pas la rfrence comment comme cible dans la liste UPDATE
car, d'aprs la syntaxe, elle doit tre une colonne de users. Nous pourrions crire la mme fonction sans dpendre de la valeur de
variable_conflict de cette manire :
CREATE FUNCTION stamp_user(id int, comment text) RETURNS void AS $$
<<fn>>
DECLARE
curtime timestamp := now();
BEGIN
UPDATE users SET last_modified = fn.curtime, comment = stamp_user.comment
WHERE users.id = stamp_user.id;
END;
$$ LANGUAGE plpgsql;
La substitution de variable n'arrive pas dans la chane de commande donne EXECUTE ou une de ces variantes. Si vous avez
besoin d'insrer une valeur dans une telle commande, faites-le lors de la construction d'une valeur de chane, illustre dans la Section 39.5.4, Excuter des commandes dynamiques , ou utilisez USING.
La substitution de variable fonctionne seulement dans les commandes SELECT, INSERT, UPDATE et DELETE parce que le
moteur SQL principal autorise les paramtres de la requte seulement dans ces commandes. Pour utiliser un nom variable ou une
valeur dans les autres types d'instructions (gnralement appeles des instructions utilitaires), vous devez construire l'instruction
en question comme une chane et l'excuter via EXECUTE.
pouvez pas utiliser un paramtre comme le nom d'une table ou d'une colonne dans une commande SQL. Pour contourner cette restriction, vous pouvez construire des commandes dynamiques en utilisant l'instruction EXECUTE de PL/pgSQL -- au prix de la
construction d'un nouveau plan d'excution chaque excution.
Un autre point important est que les plans prpars utilisent des paramtres pour permettre le changement des valeurs des variables PL/pgSQL entre chaque excution, comme indiqu en dtail ci-dessus. Quelque fois, cela signifie qu'un plan est moins efficace que s'il avait t gnr avec une valeur spcifique. Comme exemple, regardez :
SELECT * INTO mon_enregistrement FROM dictionnaire WHERE mot LIKE terme_recherche;
o terme_recherche est une variable PL/pgSQL. Le plan cach pour cette requte n'utilisera jamais un index sur une variable. Le plan cach pour cette requte n'utilisera jamais un index sur un mot car le planificateur ne peut pas savoir si le modle
LIKE comprendra une ancre gauche l'excution. Pour utiliser un index, la requte doit tre planifie avec un modle spcifique
pour LIKE. C'est un autre cas o EXECUTE peut tre utilis pour forcer la gnration d'un nouveau plan chaque excution.
La nature muable des variables de type record prsente un autre problme dans cette connexion. Quand les champs d'une variable
record sont utiliss dans les expressions ou instructions, les types de donnes des champs ne doivent pas modifier d'un appel de la
fonction un autre car chaque expression sera planifie en utilisant le type de donnes qui est prsent quand l'expression est atteinte en premier. EXECUTE peut tre utilis pour contourner ce problme si ncessaire.
Si la mme fonction est utilise comme trigger pour plus d'une table, PL/pgSQL prpare et met en cache les plans indpendament
pour chacune de ses tables -- c'est--dire qu'il y a un cache pour chaque combinaison fonction trigger/table, pas uniquement pour
chaque fonction. Ceci diminue certains des problmes avec les types de donnes variables ; par exemple, une fonction trigger
pourra fonctionner correctement avec une colonne nomme cle mme si cette colonne a diffrents types dans diffrentes tables.
De la mme faon, les fonctions ayant des types polymorphiques pour les arguments ont un cache spar des plans pour chaque
combinaison des types d'argument rl avec lesquels elles ont t appeles, donc les diffrences de type de donnes ne causent pas
d'checs inattendus.
La mise en cache du plan peut parfois avoir des effets surprenants sur l'interprtation des valeurs sensibles l'heure. Par exemple,
il y a une diffrence entre ce que font ces deux fonctions :
CREATE FUNCTION logfunc1(logtxt text) RETURNS void AS $$
BEGIN
INSERT INTO logtable VALUES (logtxt, 'now');
END;
$$ LANGUAGE plpgsql;
et :
CREATE FUNCTION logfunc2(logtxt text) RETURNS void AS $$
DECLARE
curtime timestamp;
BEGIN
curtime := 'now';
INSERT INTO logtable VALUES (logtxt, curtime);
END;
$$ LANGUAGE plpgsql;
Dans le cas de logfunc1, l'analyseur principal de PostgreSQL sait que, au moment de la prparation du plan pour INSERT,
la chane 'now' devra tre interprte comme une valeur de type timestamp car la colonne cible de logtable est de ce type.
Du coup, 'now' sera converti en une constante quand INSERT est planifi, puis utilis dans tous les appels logfunc1 lors de
la dure de vie de la session. Il n'est pas ncessaire de prciser que ce n'est pas le souhait du dveloppeur.
Dans le cas de logfunc2, l'analyseur principal de PostgreSQL ne connat pas le type que deviendra 'now' et, du coup, il renvoie une valeur de type text contenant la chane now. Lors de l'affectation la variable curtime locale, l'interprteur PL/pgSQL
convertie cette chane dans le type timestamp en appelant les fonctions text_out et timestamp_in pour la conversion. Du
coup, l'heure calcule est mise jour chaque excution comme le suppose le dveloppeur.
764
6 guillemets simples
Quand un simple guillemet dans une chane l'intrieur du corps d'une fonction est adjacent la fin de cette chane constante,
par exemple :
une_sortie := une_sortie || '' AND nom LIKE ''''foobar''''''
La valeur effectivement concatne une_sortie est alors : AND nom LIKE 'foobar'.
Dans l'approche guillemet dollar, ceci devient :
une_sortie := une_sortie || $$ AND nom LIKE 'foobar'$$
10 guillemets simples
Lorsque vous voulez deux guillemets simples dans une chane constante (qui compte pour huit guillemets simples) et qu'elle
est adjacente la fin de cette chane constante (deux de plus). Vous n'aurez probablement besoin de ceci que si vous crivez
une fonction qui gnre d'autres fonctions comme dans l'Exemple 39.8, Portage d'une fonction qui cre une autre fonction
de PL/SQL vers PL/pgSQL . Par exemple :
une_sortie := une_sortie || '' if v_'' ||
referrer_keys.kind || '' like ''''''''''
|| referrer_keys.key_string || ''''''''''
then return '''''' || referrer_keys.referrer_type
|| ''''''; end if;'';
La valeur de une_sortie sera alors :
if v_... like ''...'' then return ''...''; end if;
Dans l'approche du guillemet dollar, ceci devient :
une_sortie := une_sortie || $$ if v_$$ || referrer_keys.kind || $$ like '$$
|| referrer_keys.key_string || $$'
then return '$$ || referrer_keys.referrer_type
|| $$'; end if;$$;
o nous supposons que nous avons seulement besoin de placer des marques de guillemets simples dans une_sortie parce
que les guillemets seront recalculs avant utilisation.
Si un nom utilis dans une commande SQL peut tre soit un nom de colonne d'une table soit une rfrence une variable de la
fonction, PL/SQL le traite comme un nom de commande. Cela correspond au comportement de PL/pgSQL lorsque plpgsql.variable_conflict = use_column, ce qui n'est pas la valeur par dfaut, comme expliqu dans Section 39.10.1,
Substitution de variables . Il est prfreable d'viter de tels ambigits des le dbut mais si vous devez migrer une grande
quantit de code qui dpend de ce comportement, paramtrer variable_conflict peut s'avrer tre la meilleure solution.
Dans PostgreSQL, le corps de la fonction doit tre crit comme une chane litrale. Du coup, vous avez besoin d'utiliser les
guillemets dollar ou l'chappement des simples guillemets dans le corps de la fonction. Voir la Section 39.11.1, Utilisation
des guillemets simples (quotes) .
la place des paquetages, utilisez des schmas pour organiser vos fonctions en groupes.
Comme il n'y a pas de paquetages, il n'y a pas non plus de variables au niveau paquetage. Ceci est un peu ennuyant. Vous
pourriez tre capable de conserver un tat par session dans les tables temporaires la place.
Les boucles FOR d'entiers en ordre inverse (REVERSE) fonctionnent diffremment ; PL/SQL compte du second numro jusqu'au premier alors que PL/pgSQL compte du premier jusqu'au second, ceci rclamant que les limites de la boucle soient
changes lors du portage. Cette incompatibilit est malheureuse mais a peu de chance d'tre change. (Voir Section 39.6.3.5,
FOR (variante avec entier) .)
Les boucles FOR sur des requtes (autres que des curseurs) fonctionnent aussi diffremment : la variable cible doit avoir t
dclare alors que PL/SQL les dclare toujours implicitement. Un avantage de ceci est que les valeurs des variables sont tou766
Le mot cl RETURN dans le prototype de la fonction (pas dans le corps de la fonction) devient RETURNS dans PostgreSQL.
De plus, IS devient AS et vous avez besoin d'ajouter une clause LANGUAGE parce que PL/pgSQL n'est pas le seul langage de
procdures disponible.
Dans PostgreSQL, le corps de la fonction est considr comme une chane littrale, donc vous avez besoin d'utiliser les
guillemets simples ou les guillemets dollar tout autour. Ceci se substitue au / de fin dans l'approche d'Oracle.
La commande show errors n'existe pas dans PostgreSQL et n'est pas ncessaire car les erreurs sont rapportes automatiquement.
La procdure suivante rcupre des lignes d'une instruction SELECT et construit une grande fonction dont les rsultats sont dans
une instruction IF pour favoriser l'efficacit.
Voici la version Oracle :
CREATE OR REPLACE PROCEDURE cs_update_referrer_type_proc IS
referrer_keys CURSOR IS
SELECT * FROM cs_referrer_keys
ORDER BY try_order;
func_cmd VARCHAR(4000);
BEGIN
func_cmd := 'CREATE OR REPLACE FUNCTION cs_find_referrer_type(v_host IN VARCHAR,
767
La procdure Oracle suivante est utilise pour analyser une URL et renvoyer plusieurs lments (hte, chemin et requte). Les
768
IF a_pos1 = 0 THEN
v_path := substr(v_url, a_pos2);
RETURN;
END IF;
v_path := substr(v_url, a_pos2, a_pos1 - a_pos2);
v_query := substr(v_url, a_pos1 + 1);
END;
$$ LANGUAGE plpgsql;
Cette fonction pourrait tre utilise ainsi :
SELECT * FROM cs_parse_url('http://foobar.com/query.cgi?baz');
L'Exemple 39.10, Portage d'une procdure de PL/SQL vers PL/pgSQL montre comment porter une procdure qui utilise de
nombreuses fonctionnalits spcifiques Oracle.
Exemple 39.10. Portage d'une procdure de PL/SQL vers PL/pgSQL
La version Oracle :
CREATE OR REPLACE PROCEDURE cs_create_job(v_job_id IN INTEGER) IS
a_running_job_count INTEGER;
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
LOCK TABLE cs_jobs IN EXCLUSIVE MODE;
SELECT count(*) INTO a_running_job_count FROM cs_jobs WHERE end_stamp IS NULL;
IF a_running_job_count > 0 THEN
COMMIT; -- free lock
raise_application_error(-20000, 'Unable to create a new job: a job is currently
running.');
END IF;
DELETE FROM cs_active_job;
INSERT INTO cs_active_job(job_id) VALUES (v_job_id);
BEGIN
INSERT INTO cs_jobs (job_id, start_stamp) VALUES (v_job_id, sysdate);
EXCEPTION
WHEN dup_val_on_index THEN NULL; -- ne vous inquietez pas si cela existe dj
END;
COMMIT;
END;
/
show errors
Les procdures comme celles-ci peuvent tre aisment converties en fonctions PostgreSQL renvoyant un void. Cette procdure
en particulier est intressante parce qu'elle peut nous apprendre diverses choses :
Il n'y a pas d'instruction PRAGMA dans PostgreSQL.
Si vous faites un LOCK TABLE dans PL/pgSQL, le verrou ne sera pas libr jusqu' ce que la transaction appelante soit
termine.
Vous ne pouvez pas lancer un COMMIT dans une fonction PL/pgSQL. La fonction est lance l'intrieur d'une transaction
externe et, du coup, un COMMIT impliquerait simplement la fin de l'excution de la fonction. Nanmoins, dans ce cas particulier, ce n'est de toute faon pas ncessaire parce que le verrou obtenu par LOCK TABLE sera libr lors de la leve de
l'erreur.
Voici comment nous pourrions porter cette procdure vers PL/pgSQL :
CREATE OR REPLACE FUNCTION cs_create_job(v_job_id integer) RETURNS void AS $$
DECLARE
a_running_job_count integer;
BEGIN
LOCK TABLE cs_jobs IN EXCLUSIVE MODE;
770
39.12.2.2. EXECUTE
La version PL/pgSQL d'EXECUTE fonctionne de faon similaire la version PL/SQL mais vous devez vous rappeler d'utiliser
quote_literal et quote_ident comme dcrit dans la Section 39.5.4, Excuter des commandes dynamiques . Les
constructions de type EXECUTE 'SELECT * FROM $1'; ne fonctionneront pas de faon fiable moins d'utiliser ces fonctions.
renvoie toujours le mme rsultat quand on lui donne les mmes arguments) et la rigueur (une fonction renvoie NULL si tous
ses arguments sont NULL). Consultez la page de rfrence de CREATE FUNCTION(7) pour les dtails.
Pour faire usage de ces attributs d'optimisation, votre instruction CREATE FUNCTION devrait ressembler ceci :
CREATE FUNCTION foo(...) RETURNS integer AS $$
...
$$ LANGUAGE plpgsql STRICT IMMUTABLE;
39.12.3. Annexe
Cette section contient le code d'un ensemble de fonctions instr compatible Oracle que vous pouvez utiliser pour simplifier vos
efforts de portage.
---------
773
40.1. Aperu
PL/Tcl offre un grand nombre de fonctionnalits qu'un codeur de fonctions dispose avec le langage C, avec quelques restrictions
et coupl de puissantes bibliothques de traitement de chanes de caractres disponibles pour Tcl.
Une bonne restriction est que tout est excut dans le contexte de l'interprteur Tcl. En plus de l'ensemble sr de commandes limites de Tcl, seules quelques commandes sont disponibles pour accder la base via SPI et pour envoyer des messages via
elog(). PL/Tcl ne fournit aucun moyen pour accder aux internes du serveur de bases ou pour gagner un accs au niveau systme d'exploitation avec les droits du processus serveur PostgreSQL comme le fait une fonction C. Du coup, les utilisateurs
de la base, sans droits, peuvent utiliser ce langage en toute confiance ; il ne leur donne pas une autorit illimite.
L'autre restriction d'implmentation est que les fonctions Tcl ne peuvent pas tre utilises pour crer des fonctions
d'entres/sorties pour les nouveaux types de donnes.
Quelques fois, il est prfrable d'crire des fonctions Tcl non restreintes par le Tcl sr. Par exemple, vous pourriez vouloir une
fonction Tcl pour envoyer un courrier lectronique. Pour grer ces cas, il existe une variante de PL/Tcl appele PL/TclU (Tcl
non accrdit). C'est exactement le mme langage sauf qu'un interprteur Tcl complet est utilis. Si PL/TclU est utilis, il doit
tre install comme langage de procdures non accrdit de faon ce que seuls les superutilisateurs de la base de donnes
puissent crer des fonctions avec lui. Le codeur d'une fonction PL/TclU doit faire attention au fait que la fonction ne pourra pas
tre utilis pour faire autre chose que son but initial, car il sera possible de faire tout ce qu'un administrateur de la base de donnes peut faire.
Le code de l'objet partag pour les gestionnaires d'appel PL/Tcl et PL/TclU est automatiquement construit et install dans le rpertoire des bibliothques de PostgreSQL si le support de Tcl est spcifi dans l'tape de configuration de la procdure
d'installation. Pour installer PL/Tcl et/ou PL/TclU dans une base de donnes particulire, utilisez la commande CREATE EXTENSION ou le programme createlang, par exemple createlang pltcl nom_base ou createlang pltclu
nom_base.
local est GD. Il est recommand d'utiliser GD pour les donnes prives persistantes d'une fonction. Utilisez les variables globales
Tcl uniquement pour les valeurs que vous avez l'intention de partager avec les autres fonctions. (Notez que les tableaux GD sont
seulement globaux l'intrieur d'un interprteur particulier, pour qu'ils ne franchissent pas les restrictions de scurit mentionnes
ci-dessus.)
Un exemple de l'utilisation de GD apparat dans l'exemple spi_execp ci-dessous.
778
779
Astuce
Si un langage est install dans template1, toutes les bases de donnes cres ultrieurement disposeront automatiquement de ce langage.
Note
Les utilisateurs des paquetages sources doivent explicitement autoriser la construction de PL/Perl pendant le processus d'installation (se rfrer la Chapitre 15, Procdure d'installation de PostgreSQL du code source pour
plus d'informations). Les utilisateurs des paquetages binaires peuvent trouver PL/Perl dans un sous-paquetage spar.
Note
L'utilisation de sous-routines nommes est dangereux en Perl, spcialement si elles font rfrences des variables lexicales dans la partie englobante. Comme une fonction PL/Perl est englobe dans une sous-routine,
toute sous-routine nomme que vous y crez sera englobe. En gnral, il est bien plus sr de crer des sousroutines anonymes que vous appellerez via un coderef. Pour de plus amples dtails, voir les entres Variable
"%s" will not stay shared et Variable "%s" is not available dans le manuel perldiag, ou
recherchez perl nested named subroutine sur internet.
La syntaxe de la commande CREATE FUNCTION requiert que le corps de la fonction soit crit comme une constante de type
chane. Il est habituellement plus agrable d'utiliser les guillemets dollar (voir la Section 4.1.2.4, Constantes de chanes avec
guillemet dollar ) pour cette constante. Si vous choisissez d'utiliser la syntaxe d'chappement des chanes E'', vous devez
doubler les marques de guillemets simples (') et les antislashs (\) utiliss dans le corps de la fonction (voir la Section 4.1.2.1,
Constantes de chanes ).
Les arguments et les rsultats sont manipuls comme dans n'importe quel routine Perl : les arguments sont passs au tableau @_
et une valeur de retour est indique par return ou par la dernire expression value dans la fonction.
780
Par exemple, une fonction retournant le plus grand de deux entiers peut tre dfinie comme suit :
CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$
if ($_[0] > $_[1]) { return $_[0]; }
return $_[1];
$$ LANGUAGE plperl;
Note
Les arguments seront convertis de l'encodage de la base de donnes en UTF-8 pour tre utilis par PL/perl, puis
converti de l'UTF-8 vers l'encodage de la base.
Si une valeur NULL en SQL est passe une fonction, cet argument apparatra comme undefined en Perl. La fonction dfinie
ci-dessus ne se comportera pas correctement avec des arguments NULL (en fait, tout se passera comme s'ils avaient t des zros).
Nous aurions pu ajouter STRICT la dfinition de la fonction pour forcer PostgreSQL faire quelque chose de plus raisonnable : si une valeur NULL est passe en argument, la fonction ne sera pas du tout appele mais retournera automatiquement un
rsultat NULL. D'une autre faon, nous aurions pu vrifier dans le corps de la fonction la prsence d'arguments NULL. Par
exemple, supposons que nous voulions que perl_max avec un argument NULL et un autre non NULL retourne une valeur non
NULL plutt qu'une valeur NULL, on aurait crit :
CREATE FUNCTION perl_max (integer, integer) RETURNS integer AS $$
my ($x, $y) = @_;
if (not defined $x) {
return undef if not defined $y;
return $y;
}
return $x if not defined $y;
return $x if $x > $y;
return $y;
$$ LANGUAGE plperl;
Comme le montre l'exemple ci-dessus, passer une valeur NULL en SQL une fonction en PL/Perl retourne une valeur non dfinie. Et ceci, que la fonction soit dclare stricte ou non.
Dans un argument de fonction, tout ce qui n'est pas une rfrence est une chane qui est dans la reprsentation texte externe standard de PostgreSQL pour ce type de donnes. Dans le cas de types numriques ou texte, Perl fera ce qu'il faut et le programmeur n'aura pas s'en soucier. Nanmoins, dans d'autres cas, l'argument aura besoin d'tre converti dans une forme qui est plus
utilisable que Perl. Par exemple, la fonction decode_bytea peut-tre utilise pour convertir un argument de type bytea en donnes binaires non chappes.
De faon similaire, les valeurs renvoyes PostgreSQL doivent tre dans le format textuel. Par exemple, la fonction encode_bytea peut tre utilise pour chapper des donnes binaires en retournant une valeur de type bytea.
Perl peut renvoyer des tableaux PostgreSQL comme rfrence des tableaux Perl. Voici un exemple :
CREATE OR REPLACE function renvoit_tableau()
RETURNS text[][] AS $$
return [['a"b','c,d'],['e\\f','g']];
$$ LANGUAGE plperl;
select renvoit_tableau();
Perl utilise les tableaux PostgreSQL comme des objets PostgreSQL::InServer::ARRAY. Cet objet sera trait comme une rfrence de tableau ou comme une chane, permettant une compatibilit ascendante avec le code Perl crit pour les versions de PostgreSQL antrieures la 9.1. Par exemple :
CREATE OR REPLACE FUNCTION concat_array_elements(text[]) RETURNS TEXT AS $$
my $arg = shift;
my $result = "";
return undef if (!defined $arg);
# en tant que rfrence de tableau
for (@$arg) {
$result .= $_;
}
# en tant que chane
781
$result .= $arg;
return $result;
$$ LANGUAGE plperl;
SELECT concat_array_elements(ARRAY['PL','/','Perl']);
Note
Les tableaux multi-dimensionnels sont reprsents comme des rfrences des tableaux de refrence et de moindre
dimension, d'une faon connue de chaque dveloppeur Perl.
Les arguments de type composite sont passs la fonction en tant que rfrences d'un tableau de dcoupage, les cls du tableau de
dcoupage tant les noms des attributs du type compos. Voici un exemple :
CREATE TABLE employe (
nom text,
basesalaire integer,
bonus integer
);
CREATE FUNCTION empcomp(employe) RETURNS integer AS $$
my ($emp) = @_;
return $emp->{basesalaire} + $emp->{bonus};
$$ LANGUAGE plperl;
SELECT nom, empcomp(employe.*) FROM employe;
Une fonction PL/Perl peut renvoyer un rsultat de type composite en utilisant la mme approche : renvoyer une rfrence un hachage qui a les attributs requis. Par exemple
CREATE TYPE testligneperl AS (f1 integer, f2 text, f3 text);
CREATE OR REPLACE FUNCTION perl_ligne() RETURNS test_ligne_perl AS $$
return {f2 => 'hello', f1 => 1, f3 => 'world'};
$$ LANGUAGE plperl;
SELECT * FROM perl_row();
Toute colonne dans le type de donnes dclar du rsultat qui n'est pas prsente dans le hachage sera renvoye NULL.
Les fonctions PL/Perl peuvent aussi renvoyer des ensembles de types scalaires ou composites. Habituellement, vous voulez renvoyer une ligne la fois, la fois pour amliorer le temps de dmarrage et pour viter d'allonger la queue de l'ensemble des rsultats en mmoire. Vous pouvez faire ceci avec return_next comme indiqu ci-dessous. Notez qu'aprs le dernier return_next, vous devez placer soit return soit (encore mieux) return undef.
CREATE OR REPLACE FUNCTION perl_set_int(int)
RETURNS SETOF INTEGER AS $$
foreach (0..$_[0]) {
return_next($_);
}
return undef;
$$ LANGUAGE plperl;
SELECT * FROM perl_set_int(5);
CREATE OR REPLACE FUNCTION perl_set()
RETURNS SETOF test_ligne_perl AS $$
return_next({ f1 => 1, f2 => 'Hello', f3 => 'World' });
return_next({ f1 => 2, f2 => 'Hello', f3 => 'PostgreSQL' });
return_next({ f1 => 3, f2 => 'Hello', f3 => 'PL/Perl' });
return undef;
$$ LANGUAGE plperl;
Pour les petits ensembles de rsultats, vous pouvez renvoyer une rfrence un tableau contenant soit des scalaires, soit des rfrences des tableaux soit des rfrences des hachages de types simples, de types tableaux ou de types composites. Voici
quelques exemples simples pour renvoyer l'ensemble complet du rsultant en tant que rfrence de tableau :
782
783
INTO
INTO
INTO
INTO
test
test
test
test
(i,
(i,
(i,
(i,
v)
v)
v)
v)
VALUES
VALUES
VALUES
VALUES
(1,
(2,
(3,
(4,
'premire ligne');
'deuxime ligne');
'troisime ligne');
'immortel');
($1, $2, etc) et une liste de chanes indiquant le type des arguments :
$plan = spi_prepare('SELECT * FROM test WHERE id > $1 AND name = $2', 'INTEGER',
'TEXT');
Une fois qu'un plan est prpar suite un appel spi_prepare, le plan peut tre utilis la place de la requte, soit dans
spi_exec_prepared, o le rsultat est identique celui renvoy par spi_exec_query, soit dans
spi_query_prepared qui renvoi un curseur exactement comme le fait spi_query, qui peut ensuite tre pass
spi_fetchrow. Le deuxime paramtre, optionnel, de spi_exec_prepared est une rfrence hache des attributs ; le
seul attribut actuellement support est limit, qui configure le nombre maximum de lignes renvoyes par une requte.
L'avantage des requtes prpares est que cela rend possible l'utilisation d'un plan prpar par plusieurs excutions de la requte. Une fois que le plan n'est plus utile, il peut tre libr avec spi_freeplan :
CREATE OR REPLACE FUNCTION init() RETURNS VOID AS $$
$_SHARED{my_plan} = spi_prepare( 'SELECT (now() + $1)::date AS now',
'INTERVAL');
$$ LANGUAGE plperl;
CREATE OR REPLACE FUNCTION add_time( INTERVAL ) RETURNS TEXT AS $$
return spi_exec_prepared(
$_SHARED{my_plan},
$_[0]
)->{rows}->[0]->{now};
$$ LANGUAGE plperl;
CREATE OR REPLACE FUNCTION done() RETURNS VOID AS $$
spi_freeplan( $_SHARED{my_plan});
undef $_SHARED{my_plan};
$$ LANGUAGE plperl;
SELECT init();
SELECT add_time('1 day'), add_time('2 days'), add_time('3 days');
SELECT done();
add_time | add_time | add_time
------------+------------+-----------2005-12-10 | 2005-12-11 | 2005-12-12
Notez que l'indice du paramtre dans spi_prepare est dfini via $1, $2, $3, etc, donc vitez de dclarer des chanes de requtes qui pourraient aisment amener des bogues difficiles trouver et corriger.
Cet autre exemple illustre l'utilisation d'un paramtre optionnel avec spi_exec_prepared :
CREATE TABLE hosts AS SELECT id, ('192.168.1.'||id)::inet AS address FROM
generate_series(1,3) AS id;
CREATE OR REPLACE FUNCTION init_hosts_query() RETURNS VOID AS $$
$_SHARED{plan} = spi_prepare('SELECT * FROM hosts WHERE address << $1',
'inet');
$$ LANGUAGE plperl;
CREATE OR REPLACE FUNCTION query_hosts(inet) RETURNS SETOF hosts AS $$
return spi_exec_prepared(
$_SHARED{plan},
{limit => 2},
$_[0]
)->{rows};
$$ LANGUAGE plperl;
CREATE OR REPLACE FUNCTION release_hosts_query() RETURNS VOID AS $$
spi_freeplan($_SHARED{plan});
undef $_SHARED{plan};
$$ LANGUAGE plperl;
SELECT init_hosts_query();
785
SELECT query_hosts('192.168.1.0/30');
SELECT release_hosts_query();
query_hosts
----------------(1,192.168.1.1)
(2,192.168.1.2)
(2 rows)
Note
While PL/Perl functions run in a separate Perl interpreter for each SQL role, all PL/PerlU functions executed in a
given session run in a single Perl interpreter (which is not any of the ones used for PL/Perl functions). This allows
PL/PerlU functions to share data freely, but no communication can occur between PL/Perl and PL/PerlU functions.
Note
Perl cannot support multiple interpreters within one process unless it was built with the appropriate flags, namely
either usemultiplicity or useithreads. (usemultiplicity is preferred unless you actually need to
use threads. For more details, see the perlembed man page.) If PL/Perl is used with a copy of Perl that was not built
this way, then it is only possible to have one Perl interpreter per session, and so any one session can only execute
either PL/PerlU functions, or PL/Perl functions that are all called by the same SQL role.
789
Tous les modules chargs par plperl.on_init, directement ou indirectement, seront disponibles depuis plperl. Cela
entrane un problme de scurit potentiel. Pour consulter la liste des modules chargs, vous pouvez utiliser :
DO 'elog(WARNING, join ", ", sort keys %INC)' language plperl;
L'initialisation aura lieu au sein du postmaster si la librairie plperl est incluse dans le paramtre shared_preload_libraries), auquel cas une plus grande attention doit tre porte au risque de dstabiliser ce dernier. The principal reason for making use of
this feature is that Perl modules loaded by plperl.on_init need be loaded only at postmaster start, and will be instantly
available without loading overhead in individual database sessions. However, keep in mind that the overhead is avoided only
for the first Perl interpreter used by a database session -- either PL/PerlU, or PL/Perl for the first SQL role that calls a PL/Perl
function. Any additional Perl interpreters created in a database session will have to execute plperl.on_init afresh. Also,
on Windows there will be no savings whatsoever from preloading, since the Perl interpreter created in the postmaster process
does not propagate to child processes.
Ce paramtre ne peut tre positionn que dans le fichier postgresql.conf ou depuis la ligne de commande de dmarrage
du serveur.
plperl.on_plperl_init (string), plperl.on_plperlu_init (string)
These parameters specify Perl code to be executed when a Perl interpreter is specialized for plperl or plperlu respectively. This will happen when a PL/Perl or PL/PerlU function is first executed in a database session, or when an additional interpreter has to be created because the other language is called or a PL/Perl function is called by a new SQL role. This follows
any initialization done by plperl.on_init. The SPI functions are not available when this code is executed. The Perl code
in plperl.on_plperl_init is executed after locking down the interpreter, and thus it can only perform trusted operations.
Si le code lve une erreur, il interrompra l'initialisation et la propagera la requte originale, provoquant ainsi l'annulation de
la transaction ou sous-transaction courante. Any actions already done within Perl won't be undone; however, that interpreter
won't be used again. If the language is used again the initialization will be attempted again within a fresh Perl interpreter.
Only superusers can change these settings. Although these settings can be changed within a session, such changes will not affect Perl interpreters that have already been used to execute functions.
plperl.use_strict (boolean)
Lorsqu'il est positionn true , les compilations des fonction PL/Perl suivantes auront le pragma strict activ. Ce paramtre n'affecte pas les fonctions dj compiles au sein de la session courante.
Si vous rcuprez des ensembles de donnes trs importants en utilisant spi_exec_query, vous devez tre conscient qu'ils
iront tous en mmoire. Vous pouvez l'viter en utilisant spi_query/spi_fetchrow comme montr prcdemment.
Un problme similaire survient si une fonction renvoyant un ensemble passe un gros ensemble de lignes PostgreSQL via
return. Vous pouvez l'viter aussi en utilisant la place return_next pour chaque ligne renvoye, comme indiqu prcdemment.
Lorsque'une session se termine normalement, et pas cause d'une erreur fatale, tous les blocs END qui ont t dfinis sont excuts. Actuellement, aucune autre action ne sont ralises. Spcifiquement, les descripteurs de fichiers ne sont pas vids automatiquement et les objets ne sont pas dtruits automatiquement.
790
Astuce
Si un langage est install dans template1, toutes les bases nouvellement cres se verront installes ce langage
automatiquement.
Depuis PostgreSQL 7.4, PL/Python est seulement disponible en tant que langage sans confiance (ceci signifiant qu'il
n'offre aucun moyen de restreindre ce que les utilisateurs en font). Il a donc t renomm en plpythonu. La variante de
confiance plpython pourrait tre de nouveau disponible dans le futur, si un nouveau mcanisme scuris d'excution est dvelopp dans Python. Le codeur d'une fonction dans PL/Python sans confiance doit faire attention ce que cette fonction ne puisse
pas tre utilise pour raliser quelque chose qui n'est pas prvue car il sera possible de faire tout ce que peut faire un utilisateur
connect en tant qu'administrateur de la base de donnes. Seuls les superutilisateurs peuvent crer des fonctions dans des langages sans confiance comme plpythonu.
Note
Les utilisateurs des paquets sources doivent activer spcifiquement la construction de PL/Python lors des tapes
d'installation (rfrez-vous aux instructions d'installation pour plus d'informations). Les utilisateurs de paquets binaires pourront trouver PL/Python dans un paquet spar.
Le langage PostgreSQL nomm plpython2u implmente PL/Python sur la variante Python 2 du langage.
Le langage PostgreSQL nomm plpython3u implmente PL/Python sur la variante Python 3 du langage.
Le langage nomm plpythonu implmente PL/Python suivant la variante par dfaut du langage Python, qui est actuellement Python 2. (Cette valeur par dfaut est indpendante de ce que toute installations locales de Python pourrait considrer
comme la valeur par dfaut , par exemplece que pourrait tre /usr/bin/python.) La valeur par dfaut sera probablement change avec Python 3 dans une prochaine version de PostgreSQL, suivant les progrs de la migration Python 3 dans
la communaut Python.
Cela dpend de la configuration lors de la compilation ou des paquets installs si PL/Python pour Python 2 ou Python 3 ou les
deux sont disponibles.
Astuce
La variante construite dpend de la version de Python trouve pendant l'installation ou de la version slectionne
explicitement en configurant la variable d'environnement PYTHON ; voir Section 15.4, Procdure
d'installation . Pour que les deux variantes de PL/Python soient disponibles sur une installation, le rpertoire des
sources doit tre configur et construit deux fois.
Ceci a pour rsultat la stratgie suivante d'utilisation et de migration :
Les utilisateurs existants et ceux qui ne sont pas actuellement intresss par Python 3 utilisent le nom plpythonu et n'ont
rien changer pour l'instant. Il est recommand de s'assurer graduellement de migrer le code vers Python 2.6/2.7 pour
simplifier une migration ventuelle vers Python 3.
791
En pratique, beaucoup de fonctions PL/Python seront migres Python 3 avec peu, voire par du tout, de modifications.
Les utilisateurs sachant d'avance qu'ils ont du code reposant massivement sur Python 2 et ne planifient pas de changer peuvent
utiliser le nom plpython2u. Cela continuera de fonctionner, y compris dans un futur lointain, jusqu' ce que le support de
Python 2 soit compltement supprime de PostgreSQL.
Les utilisateurs qui veulent utiliser Python 3 peuvent utiliser le nom plpython3u, qui continuera fonctionner en permanence avec les standards actuels. Dans le futur, quand Python 3 deviendra la version par dfaut du langage, ils pourront supprimer le chiffre 3 , principalement pour des raisons esthtiques.
Les intrpides qui veulent construire un systme d'exploitation utilisant seulement Python-3, peuvent modifier le contenu de
pg_pltemplate pour rendre plpythonu quivalent plpython3u, en gardant en tte que cela rend leur installation incompatible avec la majorit de ce qui existe dans ce monde.
Voir aussi le document What's New In Python 3.0 pour plus d'informations sur le portage vers Python 3.
Il n'est pas permis d'utiliser PL/Python bas sur Python 2 et PL/Python bas sur Python 3 dans la mme session car les symbles
dans les modules dynamiques entreraient en conflit, ce qui pourrait rsulter en des arrts brutaux du processus serveur PostgreSQL. Une vrification est ajoute pour empcher ce mlange de versions majeures Python dans une mme sessio. Cette vrification
aura pour effet d'annuler la session si une diffrence est dtecte. Nanmoins, il est possible d'utiliser les deux variantes de PL/
Python dans une mme base de donnes condition que ce soit dans des sessions spares.
$$ LANGUAGE plpythonu;
car affecter la variable x la transforme en variable locale pour ce bloc et que, par consquent, la variable x de l'expression de
droite fait rfrence une variable locale x non encore dfinie, et non pas au paramtre de la fonction PL/Python. L'utilisation du
mot-cl global permet de rsoudre le problme :
CREATE FUNCTION pystrip(x text)
RETURNS text
AS $$
global x
x = x.strip() # ok now
return x
$$ LANGUAGE plpythonu;
Cependant, il vaut mieux ne pas trop s'appuyer sur ce dtail d'implmentation de PL/Python. Il est prfrable de traiter les paramtres de fonction comme tant en lecture seule.
Les smallint et int de PostgreSQL sont convertis en int Python. Le bigint PostgreSQL est converti en long pour Python 2 et en
int pour Python 3.
Les real, double et numeric de PostgreSQL sont convertis en float Python. Notez que pour numeric, cela entraine une perte
d'information et peut aboutir des rsulats incorrects. Cela devrait tre corrig dans une future version.
Le bytea PostgreSQL est converti en str pour Python 2 et en bytes pour Python 3. Avec Python 2, la chane devrait tre traite
comme une squence d'octets sans encodage.
Tous les autres types de donnes, y compris les chanes de caractres PostgreSQL, sont convertis en str Python. En Python 2,
ces chanes auront le mme encodage de caractres que le serveur. En Python 3, ce seront des chanes Unicode comme les
autres.
Les valeurs renvoyes par les fonctions sont converties en types de retour PostgreSQL comme suit:
Quand le type de la valeur PostgreSQL renvoye est boolean, la valeur de retrour sera value en fonction des rgles Python.
Ainsi, les 0 et les chaines vides sont fausses, mais la valeur 'f' est vraie.
Quand le type de la valeur PostgreSQL renvoye est bytea, la valeur de retour sera convertie en chaine de caractres (Python
2) ou en octets (Python 3) en utilisant les mcanismes Python correspondants, le rsultat tant ensuite converti en bytea.
Pour tous les autres types de retrour PostgreSQL, la valeur renvoye par Python est convertie en chaine de caractres en utilisant la mthode Python str, et et le rsultat est transmis la fonction d'entre du type de donnes PostgreSQL.
Les chaines de caractres en Python 2 doivent tre transmises dans le mme encodage que celui du serveur PostgreSQL. Les
chaines invalides dans l'encodage du serveur entraineront la leve d'une erreur, mais toutes les erreurs d'encodage ne sont pas
detectes, ce qui peut aboutir une corruption des donnes lorsque ces rgles ne sont pas respcte. Les chaines Unicode sont
automatiquement converties dans le bon encodage, il est donc plus prudent de les utiliser. Dans Python 3, toutes les chaines
sont en Unicode.
Notez que les erreurs logiques entre le type de retour dclar dans PostgreSQL et le type de l'objet Python renvoy ne sont pas dtectes. La valeur sera convertie dans tous les cas.
exemple, la dfinition de la fonction pymax indique dans Section 42.2, Fonctions PL/Python renverra la mauvaise rponse
pour des entres NULL. Nous pouvons jouer STRICT la dfinition de la fonction pour faire en sorte que PostgreSQL fasse
quelque-chose de plus raisonnable : si une valeur NULL est passe, la fonction ne sera pas appele du tout mais renverra juste un
rsultat NULL automatiquement. Sinon, vous pouver vrifier les entres NULL dans le corps de la fonction :
CREATE FUNCTION pymax (a integer, b integer)
RETURNS integer
AS $$
if (a is None) or (b is None):
return None
if a > b:
return a
return b
$$ LANGUAGE plpythonu;
Comme montr ci-dessus, pour renvoyer une valeur SQL NULL partir d'une fonction PL/Python, renvoyez la valeur None. Ceci
peut se faire que la fonction soit stricte ou non.
return True
return False
$$ LANGUAGE plpythonu;
Il existe plusieurs faon de renvoyer une ligne ou des types composites partir d'une fonction Python. Les exemples suivants supposent que nous avons :
CREATE TABLE valeur_nommee (
nom
text,
valeur integer
);
ou
CREATE TYPE valeur_nommee AS (
nom
text,
valeur integer
);
Une valeur composite peut tre renvoy comme :
Un type squence (ligne ou liste), mais pas un ensemble parce que ce n'est pas indexable
Les objets squences renvoys doivent avoir le mme nombre d'lments que le type composite a de champs. L'lment
d'index 0 est affect au premier champ du type composite, 1 au second et ainsi de suite. Par exemple :
CREATE FUNCTION cree_paire (nom text, valeur integer)
RETURNS valeur_nommee
AS $$
return [ nom, valeur ]
# ou autrement, en tant que ligne : return ( nom, valeur )
$$ LANGUAGE plpythonu;
Pour renvoyer NULL dans une colonne, insrez None la position correspondante.
Correspondance (dictionnaire)
La valeur de chaque colonne du type rsultat est rcupre partir de la correspondance avec le nom de colonne comme cl.
Exemple :
CREATE FUNCTION cree_paire (nom text, valeur integer)
RETURNS valeur_nommee
AS $$
return { "nom": nom, "valeur": valeur }
$$ LANGUAGE plpythonu;
Des paires cls/valeurs supplmentaires du dictionnaire sont ignores. Les cls manquantes sont traites comme des erreurs.
Pour renvoyer NULL comme une colonne, insrez None avec le nom de la colonne correspondante comme cl.
Objet (tout objet fournissant la mthode __getattr__)
Ceci fonctionne de la mme faon qu'une correspondance. Exemple :
CREATE FUNCTION cree_paire (nom text, valeur integer)
RETURNS valeur_nommee
AS $$
class valeur_nommee:
def __init__ (self, n, v):
self.nom = n
self.valeur = v
return valeur_nommee(nom, valeur)
# ou simplement
class nv: pass
nv.nom = nom
nv.valeur = valeur
return nv
$$ LANGUAGE plpythonu;
Les fonctions ayant des paramtres OUT sont aussi supportes. Par exemple :
CREATE FUNCTION multiout_simple(OUT i integer, OUT j integer) AS $$
return (1, 2)
795
$$ LANGUAGE plpythonu;
SELECT * FROM multiout_simple();
Avertissement
cause du bogue #1483133 de Python, certaines versions de dbogage de Python 2.4 (configur et compil
avec l'option --with-pydebug) sont connues pour arrter brutalement le serveur PostgreSQL lors de
l'utilisation d'un itrateur pour renvoyer un rsultat ensemble. Les versions non corriges de Fedora 4
contiennent ce bogue. Cela n'arrive pas dans les versions de production de Python et sur les versions corriges
de Fedora 4.
796
Les fonctions renvoyant des ensembles et ayant des paramtres OUT (en utilisant RETURNS SETOF record) sont aussi supportes. Par exemple :
CREATE FUNCTION multiout_simple_setof(n integer, OUT integer, OUT integer) RETURNS
SETOF record AS $$
return [(1, 2)] * n
$$ LANGUAGE plpythonu;
SELECT * FROM multiout_simple_setof(3);
vaut INSERT ou UPDATE, vous pouvez renvoyer "MODIFY" pour indiquer que vous avez modifi la ligne. Sinon la valeur de
retour est ignore.
Si la deuxime instruction UPDATE se termine avec la leve d'une exception, cette fonction renverra l'erreur mais le rsultat du
premier UPDATE sera valid malgr tout. Autrement dit, les fonds auront t dbits du compte de Joe mais ils n'auront pas t
799
void AS $$
%s" % e.args
Note
Bien que les gestionnaires de contexte sont implments dans Python 2.5, pour utiliser la syntaxe with dans cette
version vous aurez besoin d'utiliser une requte future. D aux dtails d'implmentation, vous ne pouvez pas utiliser les requtes futures dans des fonctions PL/Python.
PYTHONHOME
PYTHONPATH
PYTHONY2K
PYTHONOPTIMIZE
PYTHONDEBUG
PYTHONVERBOSE
PYTHONCASEOK
PYTHONDONTWRITEBYTECODE
PYTHONIOENCODING
PYTHONUSERBASE
(Cela semble tre un dtail d'implmentation de Python, en dehors du contrle de PL/Python, qui fait que certaines variables
d'environnement listes dans la page man de python sont seulement utilisables avec l'interprteur en ligne de commande et non
avec un interprteur Python embarqu.)
801
Note
Les langages procduraux disponibles donnent plusieurs moyens de lancer des commandes SQL partir de procdures. La plupart est base partir de SPI. Cette documentation prsente donc galement un intrt pour les
utilisateurs de ces langages.
Pour assurer la comprhension, nous utiliserons le terme de fonction quand nous parlerons de fonctions d'interface SPI et
procdure pour une fonction C dfinie par l'utilisateur et utilisant SPI.
Notez que si une commande appele via SPI choue, alors le contrle ne sera pas redonn votre procdure. Au contraire, la
transaction ou sous-transaction dans laquelle est excute votre procdure sera annule. (Ceci pourrait tre surprenant tant donn que les fonctions SPI ont pour la plupart des conventions documentes de renvoi d'erreur. Ces conventions s'appliquent seulement pour les erreurs dtectes l'intrieur des fonctions SPI.) Il est possible de rcuprer le contrle aprs une erreur en tablissant votre propre sous-transaction englobant les appels SPI qui pourraient chouer. Ceci n'est actuellement pas document
parce que les mcanismes requis sont toujours en flux.
Les fonctions SPI renvoient un rsultat positif en cas de succs (soit par une valeur de retour entire, soit dans la variable globale SPI_result comme dcrit ci-dessous). En cas d'erreur, un rsultat ngatif ou NULL sera retourn.
Les fichiers de code source qui utilisent SPI doivent inclure le fichier d'en-tte executor/spi.h.
802
Nom
SPI_connect connecter une procdure au gestionnaire SPI
Synopsis
int SPI_connect(void)
Description
SPI_connect ouvre une connexion au gestionnaire SPI lors de l'appel d'une procdure. Vous devez appeler cette fonction si
vous voulez lancer des commandes au travers du SPI. Certaines fonctions SPI utilitaires peuvent tre appeles partir de procdures non connectes.
Si votre procdure est dj connecte, SPI_connect retournera le code d'erreur SPI_ERROR_CONNECT. Cela peut arriver si
une procdure qui a appel SPI_connect appelle directement une autre procdure qui appelle SPI_connect. Bien que des
appels rcursifs au gestionnaire SPI soient permis lorsqu'une commande SQL appele au travers du SPI invoque une autre fonction qui utilise SPI, les appels directement intgrs SPI_connect et SPI_finish sont interdits (mais voir SPI_push et
SPI_pop).
Valeur de retour
SPI_OK_CONNECT
en cas de succs
SPI_ERROR_CONNECT
en cas d'chec
803
Nom
SPI_finish dconnecter une procdure du gestionnaire SPI
Synopsis
int SPI_finish(void)
Description
SPI_finish ferme une connexion existante au gestionnaire SPI. Vous devez appeler cette fonction aprs avoir termin les oprations SPI souhaites pendant l'invocation courante de votre procdure. Vous n'avez pas vous proccuper de ceci, sauf si vous
terminez la transaction via elog(ERROR). Dans ce cas, SPI terminera automatiquement.
Si SPI_finish est appele sans avoir une connexion valable, elle retournera SPI_ERROR_UNCONNECTED. Il n'y a pas de
problme fondamental avec cela ; le gestionnaire SPI n'a simplement rien faire.
Valeur de retour
SPI_OK_FINISH
si dconnecte correctement
SPI_ERROR_UNCONNECTED
si appel partir d'une procdure non connecte
804
Nom
SPI_push pousse la pile SPI pour autoriser une utilisation rcursive de SPI
Synopsis
void SPI_push(void)
Description
SPI_push devrait tre appel avant d'excuter une autre procdure qui pourrait elle-mme souhaiter utiliser SPI. Aprs
SPI_push, SPI n'est plus dans un tat connect et les appels de fonction SPI seront rejets sauf si un nouveau
SPI_connect est excut. Ceci nous assure une sparation propre entre l'tat SPI de votre procdure et celui d'une autre procdure que vous appelez. Aprs le retour de cette dernire, appelez SPI_pop pour restaurer l'accs votre propre tat SPI.
Notez que SPI_execute et les fonctions relatives font automatiquement l'quivalent de SPI_push avant de repasser le
contrle au moteur d'excution SQL, donc il n'est pas ncessaire de vous inquiter de cela lors de l'utilisation de ces fonctions.
Vous aurez besoin d'appeler SPI_push et SPI_pop seulement quand vous appelez directement un code arbitraire qui pourrait
contenir des appels SPI_connect.
805
Nom
SPI_pop rcupre la pile SPI pour revenir de l'utilisation rcursive de SPI
Synopsis
void SPI_pop(void)
Description
SPI_pop enlve l'environnement prcdent de la pile d'appel SPI. Voir SPI_push.
806
Nom
SPI_execute excute une commande
Synopsis
int SPI_execute(const char * command, bool read_only, long count)
Description
SPI_exec lance la commande SQL spcifie pour count lignes. Si read_only est true, la commande doit tre en lecture
seule et la surcharge de l'excution est quelque peu rduite.
Cette fonction ne devrait tre appele qu' partir d'une procdure connecte.
Si count vaut zro, alors la commande est excute pour toutes les lignes auxquelles elle s'applique. Si count est suprieur 0,
alors pas plus de count lignes seront rcupres. L'excution s'arrtera quand le compte est atteint, un peu comme l'ajout d'une
clause LIMIT une requte. Par exemple :
SPI_execute("SELECT * FROM foo", true, 5);
rcuprera 5 lignes tout au plus partir de la table. Notez qu'une telle limite n'est efficace qu' partir du moment o la requte renvoie des lignes. Par exemple :
SPI_execute("INSERT INTO foo SELECT * FROM bar", false, 5);
insrera toutes les lignes de bar, en ignorant le paramtre count. Cependant, avec
SPI_execute("INSERT INTO foo SELECT * FROM bar RETURNING *", false, 5);
au plus cinq lignes seront insres car l'excution s'arrtera aprs la cinquime ligne renvoye par RETURNING.
Vous pourriez passer plusieurs commandes dans une chane, mais ces commandes ne peuvent pas dpendre d'objets crs plus tt
dans la chane car toute la chane est analyse et planifie avant le dbut de l'excution. SPI_execute renvoie le rsultat pour la
dernire commande excute. La limite count s'applique chaque commande sparment (mme si seul le dernier rsultat sera
renvoy). La limite n'est pas applique toute commande cache gnre par les rgles.
Quand read_only vaut false, SPI_execute incrmente le compteur de la commande et calcule une nouvelle image avant
d'excuter chaque commande dans la chane. L'image n'est pas rellement modifie si le niveau d'isolation de la transaction en
cours est SERIALIZABLE ou REPEATABLE READ mais, en mode READ COMMITTED, la mise jour de l'image permet
chaque commande de voir les rsultats des transactions nouvellement valides partir des autres sessions. Ceci est essentiel pour
un comportement cohrent quand les commandes modifient la base de donnes.
Quand read_only vaut true, SPI_execute ne met jour ni l'image ni le compteur de commandes, et il autorise seulement
les commandes SELECT dans la chane des commandes. Elles sont excutes en utilisant l'image prcdemment tablie par la requte englobante. Ce mode d'excution est un peu plus rapide que le mode lecture/criture cause de l'limination de la surcharge
par commande. Il autorise aussi directement la construction des fonctions stable comme les excutions successives utiliseront
toutes la mme image, il n'y aura aucune modification dans les rsultats.
Il n'est gnralement pas conseill de mixer les commandes en lecture seule et les commandes en lecture/criture l'intrieur d'une
seule fonction utilisant SPI ; ceci pourrait causer un comportement portant confusion car les requtes en mode lecture seule devraient ne pas voir les rsultats de toute mise jour de la base de donnes effectues par les requtes en lecture/criture.
Le nombre rel de lignes pour lesquelles la (dernire) commande a t lance est retourn dans la variable globale
SPI_processed. Si la valeur de retour de la fonction est SPI_OK_SELECT, SPI_OK_INSERT_RETURNING,
SPI_OK_DELETE_RETURNING ou SPI_OK_UPDATE_RETURNING, alors vous pouvez utiliser le pointeur global SPITupleTable *SPI_tuptable pour accder aux lignes de rsultat. Quelques commandes (comme EXPLAIN) renvoient aussi
des ensembles de lignes et SPI_tuptable contiendra aussi le rsultat dans ces cas.
La structure SPITupleTable est dfinie comme suit :
typedef struct
{
MemoryContext tuptabcxt;
uint32
alloced;
uint32
free;
TupleDesc
tupdesc;
HeapTuple *vals;
} SPITupleTable;
/*
/*
/*
/*
/*
vals est un tableau de pointeurs vers des lignes (le nombre d'entres valables est donn par SPI_processed). tupdesc est
un descripteur de ligne que vous pouvez passer aux fonctions SPI qui traitent des lignes. tuptabcxt, alloced et free sont
des champs internes non conus pour tre utiliss par des routines SPI appelantes.
SPI_finish libre tous les SPITupleTables alloues pendant la procdure courante. Vous pouvez librer une table de rsultats
donne plus tt, si vous en avez termin avec elle, en appelant SPI_freetuptable.
Arguments
const char * command
chane contenant la commande excuter
bool read_only
true en cas d'excution en lecture seule
long count
nombre maximum de lignes traiter ou 0 pour aucune limite
Valeur de retour
Si l'excution de la commande a russi, alors l'une des valeurs (positives) suivantes sera renvoye :
SPI_OK_SELECT
si un SELECT (mais pas SELECT INTO) a t lanc
SPI_OK_SELINTO
si un SELECT INTO a t lanc
SPI_OK_INSERT
si un INSERT a t lanc
SPI_OK_DELETE
si un DELETE a t lanc
SPI_OK_UPDATE
si un UPDATE a t lanc
SPI_OK_INSERT_RETURNING
si un INSERT RETURNING a t lanc
SPI_OK_DELETE_RETURNING
si un DELETE RETURNING a t lanc
SPI_OK_UPDATE_RETURNING
si un UPDATE RETURNING a t lanc
SPI_OK_UTILITY
si une commande utilitaire (c'est--dire CREATE TABLE) a t lance
SPI_OK_REWRITTEN
si la commande a t rcrite dans un autre style de commande (c'est--dire que UPDATE devient un INSERT) par une
rgle.
Sur une erreur, l'une des valeurs ngatives suivante est renvoye :
SPI_ERROR_ARGUMENT
si command est NULL ou count est infrieur 0
SPI_ERROR_COPY
si COPY TO stdout ou COPY FROM stdin ont t tents
SPI_ERROR_TRANSACTION
Si une commande de manipulation de transaction a t tente (BEGIN, COMMIT, ROLLBACK, SAVEPOINT, PREPARE TRANSACTION, COMMIT PREPARED, ROLLBACK PREPARED ou toute variante de ces dernires)
SPI_ERROR_OPUNKNOWN
si le type de commande est inconnu (ce qui ne devrait pas arriver)
808
SPI_ERROR_UNCONNECTED
si appel partir d'une procdure non connecte
Notes
Toutes les fonctions d'excution de requtes SPI changent la fois SPI_processed et SPI_tuptable (juste le pointeur, pas
le contenu de la structure). Sauvegardez ces deux variables globales dans des variables locales de procdures si vous voulez accder la table des rsultats de SPI_execute ou d'une fonction d'excution de requtes sur plusieurs appels.
809
Nom
SPI_exec excute une commande en lecture/criture
Synopsis
int SPI_exec(const char * command, long count)
Description
SPI_exec est identique SPI_execute, mais le paramtre read_only de ce dernier est bloqu sur la valeur false.
Arguments
const char * command
chane contenant la commande excuter
long count
nombre maximum de lignes renvoyer ou 0 pour aucune limite
Valeur de retour
Voir SPI_execute.
810
Nom
SPI_execute_with_args excute une commande avec des paramtres hors ligne
Synopsis
int SPI_execute_with_args(const char *command,
int nargs, Oid *argtypes,
Datum *values, const char *nulls,
bool read_only, long count)
Description
SPI_execute_with_args excute une commande qui pourrait inclure des rfrences des paramtres fournis en externe. Le
texte de commande fait rfrence un paramtre avec $n et l'appel spcifie les types et valeurs des donnes pour chaque symbole
de ce type. read_only et count ont la mme interprtation que dans SPI_execute.
Le principal avantage de cette routine compar SPI_execute est que les valeurs de donnes peuvent tre insres dans la
commande sans mise entre guillemets et chappements, et donc avec beaucoup moins de risques d'attaques du type injection SQL.
Des rsultats similaires peuvent tre raliss avec SPI_prepare suivi par SPI_execute_plan ; nanmoins, lors de
l'utilisation de cette fonction, le plan de requte est personnalis avec les valeurs de paramtres spcifiques fournies. Pour une excution simple, cette fonction doit tre prfre. Si la mme commande doit tre excute avec plusieurs paramtres diffrents,
chaque mthode peut tre la plus rapide, le cot de la planification pouvant contre-balancer les bnfices des plans personnaliss.
Arguments
const char * command
chane de commande
int nargs
nombre de paramtres en entre ($1, $2, etc.)
Oid * argtypes
un tableau contenant les OID des types de donnes des paramtres
Datum * values
un tableau des valeurs relles des paramtres
const char * nulls
un tableau dcrivant les paramtres NULL
Si nulls vaut NULL, alors SPI_execute_with_args suppose qu'aucun paramtre n'est NULL.
bool read_only
true pour les excutions en lecture seule
long count
nombre maximum de lignes renvoyer ou 0 pour aucune limite
Valeur de retour
La valeur de retour est identique celle de SPI_execute.
SPI_processed et SPI_tuptable sont configurs comme dans SPI_execute en cas de succs.
811
Nom
SPI_prepare prpare un plan pour une commande sans l'excuter tout de suite
Synopsis
SPIPlanStr SPI_prepare(const char * command, int nargs, Oid * argtypes)
Description
SPI_prepare cre et retourne un plan d'excution pour la commande spcifie mais ne lance pas la commande. Cette fonction
ne peut tre appele que depuis une procdure connecte.
Lorsque la mme commande ou une commande semblable doit tre lance plusieurs reprises, il peut tre intressant de ne faire
la planification que d'une seule fois. SPI_prepare convertit une chane de commande en un plan d'excution qui peut tre lanc
plusieurs fois en utilisant SPI_executeplan.
Une commande prpare peut tre gnralise en utilisant les paramtres ($1, $2, etc.) en lieu et place de ce qui serait des
constantes dans une commande normale. Les valeurs actuelles des paramtres sont alors spcifies lorsque SPI_executeplan
est appele. Ceci permet la commande prpare d'tre utilise sur une plage plus grande de situations que cela ne serait possible
sans paramtres.
Le plan renvoy par SPI_prepare ne peut tre utilis que dans l'invocation courante de la procdure puisque SPI_finish libre la mmoire alloue pour le plan. Mais un plan peut tre sauvegard plus longtemps par l'utilisation de la fonction
SPI_saveplan.
Arguments
const char * command
chane contenant la commande planifier
int nargs
nombre de paramtres d'entre ($1, $2, etc.)
Oid * argtypes
pointeur vers un tableau contenant les OID des types de donnes des paramtres
Valeurs de retour
SPI_prepare retourne un pointeur non nul vers un plan d'excution. En cas d'erreur, NULL sera retourn et SPI_result sera positionne un des mmes codes d'erreur utiliss par SPI_execute sauf qu'il est positionn SPI_ERROR_ARGUMENT
si command est NULL ou si nargs est infrieur 0 ou si nargs est suprieur 0 et typesargs est NULL.
Notes
SPIPlanPtr est dclar comme un pointeur vers un type de structure opaque dans spi.h. Il est dconseill d'essayer d'accder
son contenu directement car cela rend votre code plus fragile aux futures versions de PostgreSQL.
Il y a un inconvnient utiliser les paramtres : puisque le planificateur ne connat pas les valeurs qui seront utilises pour les paramtres, il effectuera des choix pires que ceux qu'il prendrait pour une commande normale avec toutes les constantes visibles.
812
Nom
SPI_prepare_cursor prpare un plan pour une commande, sans l'excuter pour l'instant
Synopsis
SPIPlanPtr SPI_prepare_cursor(const char * command, int nargs, Oid * argtypes, int
cursorOptions)
Description
SPI_prepare_cursor est identique SPI_prepare, sauf qu'il permet aussi la spcification du paramtre des options du
curseur du planificateur. Il s'agit d'un champ de bits dont les valeurs sont indiques dans nodes/parsenodes.h pour le
champ options de DeclareCursorStmt. SPI_prepare utilise zro pour les options du curseur.
Arguments
const char * command
chane commande
int nargs
nombre de paramtres en entre ($1, $2, etc.)
Oid * argtypes
pointeur vers un tableau contenant l'OID des types de donnes des paramtres
int cursorOptions
champ de bits prcisant les options du curseur ; zro est le comportement par dfaut
Valeur de retour
SPI_prepare_cursor a les mmes conventions pour la valeur de retour que SPI_prepare.
Notes
Les bits utiles pour cursorOptions incluent CURSOR_OPT_SCROLL, CURSOR_OPT_NO_SCROLL et CURSOR_OPT_FAST_PLAN. Notez en particulier que CURSOR_OPT_HOLD est ignor.
813
Nom
SPI_prepare_params prpare un plan pour une commande, mais sans l'excuter
Synopsis
SPIPlanPtr SPI_prepare_params(const char * command,
ParserSetupHook parserSetup,
void * parserSetupArg,
int cursorOptions)
Description
SPI_prepare_params cre et renvoie un plan d'excution pour la commande indique mais n'excute pas la commande. Cette
fonction est quivalente SPI_prepare_cursor avec en plus le fait que l'appelant peut indiquer des fonctions pour contrler
l'analyse de rfrences de paramtres externes.
Arguments
const char * command
chane correspondant la commande
ParserSetupHook parserSetup
fonction de configuration de l'analyseur
void * parserSetupArg
argument pass parserSetup
int cursorOptions
masque de bits des options du curseur, sous la forme d'un entier ; zro indique le comportement par dfaut
Code de retour
SPI_prepare_params a les mmes conventions de retour que SPI_prepare.
814
Nom
SPI_getargcount renvoie le nombre d'arguments ncessaires au plan prpar par SPI_prepare
Synopsis
int SPI_getargcount(SPIPlanPtr plan)
Description
SPI_getargcount renvoie le nombre d'arguments ncessaires pour excuter un plan prpar par SPI_prepare.
Arguments
SPIPlanPtr plan
plan d'excution (renvoy par SPI_prepare)
Code de retour
Le nombre d'arguments attendus par le plan. Si plan est NULL ou invalide, SPI_result est initialis
SPI_ERROR_ARGUMENT et -1 est renvoy.
815
Nom
SPI_getargtypeid renvoie l'OID du type de donnes pour un argument du plan prpar par SPI_prepare
Synopsis
Oid SPI_getargtypeid(SPIPlanPtr plan, int argIndex)
Description
SPI_getargtypeid renvoie l'OID reprsentant le type pour le argIndex-ime argument d'un plan prpar par
SPI_prepare. Le premier argument se trouve l'index zro.
Arguments
SPIPlanPtr plan
plan d'excution (renvoy par SPI_prepare)
int argIndex
index de l'argument ( partir de zro)
Code de retour
L'OID du type de l'argument l'index donn. Si le plan est NULL ou invalide, ou argIndex infrieur 0 ou pas moins que le
nombre d'arguments dclar pour le plan, SPI_result est initialis SPI_ERROR_ARGUMENT et InvalidOid est renvoy.
816
Nom
SPI_is_cursor_plan renvoie true si le plan prpar par SPI_prepare peut tre utilis avec SPI_cursor_open
Synopsis
bool SPI_is_cursor_plan(SPIPlanPtr plan)
Description
SPI_is_cursor_plan renvoie true si un plan prpar par SPI_prepare peut tre pass comme un argument
SPI_cursor_open ou false si ce n'est pas le cas. Les critres sont que le plan reprsente une seule commande et que cette
commande renvoit des lignes l'appelant ; par l'exemple, SELECT est autoris sauf s'il contient une clause INTO et UPDATE
est autoris seulement s'il contient un RETURNING
Arguments
SPIPlanPtr plan
plan d'excution (renvoy par SPI_prepare)
Return Value
true ou false pour indiquer si plan peut produire un curseur ou non, avec SPI_result initialis zro. S'il nest pas possible de
dterminer la rponse (par exemple, si le plan vaut NULL ou est invalide, ou s'il est appel en tant dconnect de SPI), alors
SPI_result est configur avec un code d'erreur convenable et false est renvoy.
817
Nom
SPI_execute_plan excute un plan prpar par SPI_prepare
Synopsis
int SPI_execute_plan(SPIPlanPtr plan, Datum * values, const char * nulls, bool
read_only, long count)
Description
SPI_execute_plan excute un plan prpar par SPI_prepare. read_only et count ont la mme interprtation que
dans SPI_execute.
Arguments
SPIPlanPtr plan
plan d'excution (retourn par SPI_prepare)
Datum *values
Un tableau des vraies valeurs des paramtres. Doit avoir la mme longueur que le nombre d'arguments du plan.
const char * nulls
Un tableau dcrivant les paramtres nuls. Doit avoir la mme longueur que le nombre d'arguments du plan. n indique une valeur NULL (l'entre correspondante dans values sera ignore) ; un espace indique une valeur non NULL (l'entre correspondante dans values est valide).
Si nulls est NULL, alors SPI_executeplan part du principe qu'aucun paramtre n'est nul.
bool read_only
true pour une excution en lecture seule
long count
nombre maximum de lignes renvoyer ou 0 pour aucune ligne renvoyer
Valeur de retour
La valeur de retour est la mme que pour SPI_execute avec les rsultats d'erreurs (ngatif) possibles :
SPI_ERROR_ARGUMENT
si plan est NULL ou invalide ou count est infrieur 0
SPI_ERROR_PARAM
si values est NULL et plan est prpar avec des paramtres
SPI_processed et SPI_tuptable sont positionns comme dans SPI_execute en cas de russite.
818
Nom
SPI_execute_plan_with_paramlist excute un plan prpar par SPI_prepare
Synopsis
int SPI_execute_plan_with_paramlist(SPIPlanPtr plan,
ParamListInfo params,
bool read_only,
long count)
Description
SPI_execute_plan_with_paramlist excute un plan prpar par SPI_prepare. Cette fonction est l'quivalent de
SPI_execute_plan, sauf que les informations sur les valeurs des paramtres passer la requte sont prsentes diffremment. La reprsentation ParamListInfo peut tre utilse pour passer des valeurs qui sont dj disponibles dans ce format. Elle
supporte aussi l'utilisation d'ensemble de paramtres dynamiques indiqus via des fonctions dans ParamListInfo.
Arguments
SPIPlanPtr plan
plan d'excution (renvoy par SPI_prepare)
ParamListInfo params
structure de donnes contenant les types et valeurs de paramtres ; NULL si aucune structure
bool read_only
true pour une excution en lecture seule
long count
nombre maximum de lignes renvoyer ou 0 pour aucune ligne renvoyer
Code de retour
La valeur de retour est identique celle de SPI_execute_plan.
SPI_processed et SPI_tuptable sont initialiss de la mme faon que pour SPI_execute_plan en cas de russite.
819
Nom
SPI_execp excute un plan en mode lecture/criture
Synopsis
int SPI_execp(SPIPlanPtr plan, Datum * values, const char * nulls, long count)
Description
SPI_execp est identique SPI_execute_plan mais le paramtre read_only de ce dernier vaut toujours false.
Arguments
SPIPlanPtr plan
plan d'excution (renvoy par SPI_prepare)
Datum * values
Un tableau des vraies valeurs de paramtre. Doit avoir la mme longueur que le nombre d'arguments du plan.
const char * nulls
Un tableau dcrivant les paramtres NULL. Doit avoir la mme longueur que le nombre d'arguments du plan. n indique une
valeur NULL (l'entre dans values sera ignore) ; un espace indique une valeur non NULL (l'entre dans values est valide).
Si nulls est NULL, alors SPI_execp suppose qu'aucun paramtre n'est NULL.
long count
nombre maximum de lignes renvoyer ou 0 pour aucune ligne renvoyer
Valeur de retour
Voir SPI_execute_plan.
SPI_processed et SPI_tuptable sont initialises comme dans SPI_execute en cas de succs.
820
Nom
SPI_cursor_open met en place un curseur en utilisant un plan cr avec SPI_prepare
Synopsis
Portal SPI_cursor_open(const char * name, SPIPlanPtr plan,
Datum * values, const char * nulls,
bool read_only)
Description
SPI_cursor_open met en place un curseur (en interne, un portail) qui lancera un plan prpar par SPI_prepare. Les paramtres ont la mme signification que les paramtres correspondant SPI_execute_plan.
Utiliser un curseur au lieu de lancer le plan directement a deux avantages. Premirement, les lignes de rsultats peuvent tre rcupres un certain nombre la fois, vitant la saturation de mmoire pour les requtes qui retournent trop de lignes. Deuximement,
un portail peut survivre la procdure courante (elle peut, en fait, vivre jusqu' la fin de la transaction courante). Renvoyer le nom
du portail l'appelant de la procdure donne un moyen de retourner une srie de ligne en tant que rsultat.
Les donnes passes seront copies dans le portail du curseur, donc il peut tre libr alors que le curseur existe toujours.
Arguments
const char * name
nom pour le portail ou NULL pour laisser le systme choisir un nom
SPIPlanPtr plan
plan d'excution (retourn par SPI_prepare)
Datum * values
Un tableau des valeurs de paramtres actuelles. Doit avoir la mme longueur que le nombre d'arguments du plan.
const char *nulls
Un tableau dcrivant quels paramtres sont NULL. Doit avoir la mme longueur que le nombre d'arguments du plan. n indique une valeur NULL (l'entre correspondante dans values sera ignore) ; un espace indique une valeur non NULL
(l'entre correspondante dans values est valide).
Si nulls est NULL, alors SPI_cursor_open part du principe qu'aucun paramtre n'est nul.
bool read_only
true pour les excutions en lecture seule
Valeur de retour
Pointeur vers le portail contenant le curseur. Notez qu'il n'y a pas de convention pour le renvoi d'une erreur ; toute erreur sera rapporte via elog.
821
Nom
SPI_cursor_open_with_args ouvre un curseur en utilisant une requte et des paramtres
Synopsis
Portal SPI_cursor_open_with_args(const char *name,
const char *command,
int nargs, Oid *argtypes,
Datum *values, const char *nulls,
bool read_only, int cursorOptions)
Description
SPI_cursor_open_with_args initialise un curseur (en interne, un portail) qui excutera la requte spcifi. La plupart des
paramtres ont la mme signification que les paramtres correspondant de SPI_prepare_cursor et SPI_cursor_open.
Pour une excution seule, cette fonction sera prfre SPI_prepare_cursor suivie de SPI_cursor_open. Si la mme
commande doit tre excute avec plusieurs paramtres diffrents, il n'y a pas de diffrences sur les deux mthode, la replanification a un cot mais bnficie de plans personnaliss.
Les donnes passes seront copies dans le portail du curseur, donc elles seront libres alors que le curseur existe toujours.
Arguments
const char * name
nom du portail, ou NULL pour que le systme slectionne un nom de lui-mme
const char * command
chane de commande
int nargs
nombre de paramtres en entre ($1, $2, etc.)
Oid * argtypes
un tableau contenant les OID des types de donnes des paramtres
Datum * values
un tableau des valeurs actuelles des paramtres
const char * nulls
un tableau dcrivant les paramtres NULL
Si nulls vaut NULL, alors SPI_cursor_open_with_args suppose qu'aucun paramtre n'est NULL.
bool read_only
true pour une excution en lecture seule
int cursorOptions
masque de bits des options du curseur : zro cause le comportement par dfaut
Valeur de retour
Pointeur du portail contenant le curseur. Notez qu'il n'y a pas de convention pour le renvoi des erreurs ; toute erreur sera rapporte
par elog.
822
Nom
SPI_cursor_open_with_paramlist ouvre un curseur en utilisant les paramtres
Synopsis
Portal SPI_cursor_open_with_paramlist(const char *name,
SPIPlanPtr plan,
ParamListInfo params,
bool read_only)
Description
SPI_cursor_open_with_paramlist prpare un curseur (en interne un portail), qui excutera un plan prpar par
SPI_prepare. Cette fonction est quivalente SPI_cursor_open sauf que les informations sur les valeurs des paramtres
passes la requte sont prsentes diffremment. La reprsentation de ParamListInfo peut tre utile pour fournir des valeurs
dj disponibles dans ce format. Elle supporte aussi l'utilisation d'ensemble de paramtres dynamiques via des fonctions spcifies
dans ParamListInfo.
Les donnes passes en paramtre seront copies dans le portail du curseur et peuvent donc tre libres alors que le curseur existe
toujours.
Arguments
const char * name
nom d'un portail ou NULL pour que le systme en choisisse un lui-mme
SPIPlanPtr plan
plan d'excution (renvoy par SPI_prepare)
ParamListInfo params
structure de donnes contenant les types et valeurs de paramtres ; NULL sinon
bool read_only
true pour une excution en lecture seule
Valeur de retour
Pointeur vers le portail contenant le curseur. Notez qu'il n'existe pas de convention pour le retour d'erreur ; toute erreur sera renvoye via elog.
823
Nom
SPI_cursor_find recherche un curseur existant par nom
Synopsis
Portal SPI_cursor_find(const char * name)
Description
SPI_cursor_find recherche un portail par nom. Ceci est principalement utile pour rsoudre un nom de curseur renvoy en
tant que texte par une autre fonction.
Arguments
const char * name
nom du portail
Valeur de retour
Pointeur vers le portail portant le nom spcifi ou NULL si aucun n'a t trouv
824
Nom
SPI_cursor_fetch extrait des lignes partir d'un curseur
Synopsis
void SPI_cursor_fetch(Portal portal, bool forward, long count)
Description
SPI_cursor_fetch extrait des lignes partir d'un curseur. Ceci est quivalent un sous-ensemble de la commande SQL
FETCH (voir SPI_scroll_cursor_fetch pour plus de dtails).
Arguments
Portal portal
portail contenant le curseur
bool forward
vrai pour une extraction en avant, faux pour une extraction en arrire
long count
nombre maximum de lignes rcuprer
Valeur de retour
SPI_processed et SPI_tuptable sont positionns comme dans SPI_execute en cas de russite.
Notes
Rcuprer en sens inverse pourrait chouer si le plan du curseur n'tait pas cr avec l'option CURSOR_OPT_SCROLL.
825
Nom
SPI_cursor_move dplace un curseur
Synopsis
void SPI_cursor_move(Portal portal, bool forward, long count)
Description
SPI_cursor_move saute un certain nombre de lignes dans un curseur. Ceci est quivalent un sous-ensemble de la commande
SQL MOVE (voir SPI_scroll_cursor_move pour plus de dtails).
Arguments
Portal portal
portail contenant le curseur
bool forward
vrai pour un saut en avant, faux pour un saut en arrire
long count
nombre maximum de lignes dplacer
Notes
Se dplacer en sens inverse pourrait chouer si le plan du curseur n'a pas t cr avec l'option CURSOR_OPT_SCROLL option.
826
Nom
SPI_scroll_cursor_fetch rcupre quelques lignes partir d'un curseur
Synopsis
void SPI_scroll_cursor_fetch(Portal portal, FetchDirection direction, long count)
Description
SPI_scroll_cursor_fetch rcupre quelques lignes partir d'un curseur. C'est quivalent la commande SQL FETCH.
Arguments
Portal portal
portail contenant le curseur
FetchDirection direction
un parmi FETCH_FORWARD, FETCH_BACKWARD, FETCH_ABSOLUTE ou FETCH_RELATIVE
long count
nombre de lignes rcuprer pour FETCH_FORWARD ou FETCH_BACKWARD ; nombre de lignes absolu rcuprer
pour FETCH_ABSOLUTE ; ou nombre de lignes relatif rcuprer pour FETCH_RELATIVE
Valeur de retour
SPI_processed et SPI_tuptable sont configurs comme SPI_execute en cas de succs.
Notes
Voir la commande SQL FETCH(7) pour des dtails sur l'interprtation des paramtres direction et count.
Les valeurs de direction autres que FETCH_FORWARD peuvent chouer si le plan du curseur n'a pas t cr avec l'option CURSOR_OPT_SCROLL.
827
Nom
SPI_scroll_cursor_move dplacer un curseur
Synopsis
void SPI_scroll_cursor_move(Portal portal, FetchDirection direction, long count)
Description
SPI_scroll_cursor_move ignore un certain nombre de lignes dans un curseur. C'est l'quivalent de la commande SQL
MOVE.
Arguments
Portal portal
portail contenant le curseur
FetchDirection direction
un parmi FETCH_FORWARD, FETCH_BACKWARD, FETCH_ABSOLUTE et FETCH_RELATIVE
long count
nombre de lignes dplacer pour FETCH_FORWARD ou FETCH_BACKWARD ; nombre de lignes absolu dplacer pour
FETCH_ABSOLUTE ; ou nombre de lignes relatif dplacer pour FETCH_RELATIVE
Valeur de retour
SPI_processed est configur comme SPI_execute en cas de succs. SPI_tuptable est configur NULL car aucune
ligne n'est renvoye par cette fonction.
Notes
Voir la commande SQL FETCH(7) pour des dtails sur l'interprtation des paramtres direction et count.
Les valeurs de direction autres que FETCH_FORWARD peuvent chouer si le plan du curseur n'a pas t cr avec l'option CURSOR_OPT_SCROLL.
828
Nom
SPI_cursor_close ferme un curseur
Synopsis
void SPI_cursor_close(Portal portal)
Description
SPI_cursor_close ferme un curseur cr prcdemment et libre la mmoire du portail.
Tous les curseurs ouverts sont ferms automatiquement la fin de la transaction. SPI_cursor_close n'a besoin d'tre invoqu
que s'il est dsirable de librer les ressources plus tt.
Arguments
Portal portal
portail contenant le curseur
829
Nom
SPI_saveplan sauvegarde un plan
Synopsis
SPIPlanPtr SPI_saveplan(SPIPlanPtr plan)
Description
SPI_saveplan sauvegarde un plan valid (prpar par SPI_prepare) dans une zone de mmoire qui ne sera pas libre par
SPI_finish et par le gestionnaire de transactions et retourne le pointeur vers le plan sauvegard. Ceci vous donne la possibilit
de rutiliser les plans prpars lors des invocations suivantes de votre procdure dans la session courante.
Arguments
SPIPlanPtr plan
le plan sauvegarder
Valeur de retour
Pointeur vers le plan sauvegard ; NULL en cas d'chec. En cas d'erreur, SPI_result est positionne comme suit :
SPI_ERROR_ARGUMENT
si plan est NULL ou invalide
SPI_ERROR_UNCONNECTED
si appel d'une procdure non connecte
Notes
Le plan pass n'est pas libr, donc vous pouvez souhaiter excuter SPI_freeplan sur ce dernier pour viter des pertes mmoire jusqu' SPI_finish.
Si l'un des objets (une table, une fonction, etc.) rfrencs par le plan prpar est supprim ou redfini, alors les excutions futures
de SPI_execute_plan pourrait chouer ou renvoyer des rsultats diffrents de ce que le plan indique initialement.
830
Nom
SPI_fname dtermine le nom de colonne pour le numro de colonne spcifi
Synopsis
char * SPI_fname(TupleDesc rowdesc, int colnumber)
Description
SPI_fname retourne une copie du nom de colonne d'une colonne spcifie (vous pouvez utiliser pfree pour librer la copie du
nom lorsque vous n'en avez plus besoin).
Arguments
TupleDesc rowdesc
description de range d'entre
int colnumber
nombre de colonne (le compte commence 1)
Valeur de retour
Le nom de colonne ; NULL si colnumber est hors de porte. SPI_result est positionne SPI_ERROR_NOATTRIBUTE
en cas d'chec.
831
Nom
SPI_fnumber dtermine le numro de colonne pour le nom de colonne spcifie
Synopsis
int SPI_fnumber(TupleDesc rowdesc, const char * colname)
Description
SPI_fnumber renvoie le numro de colonne pour la colonne portant le nom spcifi.
Si colname rfre une colonne systme (c'est--dire oid), alors le numro de colonne ngatif appropri sera renvoy.
L'appelant devra faire attention tester la valeur de retour pour galit exacte SPI_ERROR_NOATTRIBUTE pour dtecter une
erreur ; tester le rsultat pour une valeur infrieure ou gale 0 n'est pas correcte sauf si les colonnes systmes doivent tre rejetes.
Arguments
TupleDesc rowdesc
description de la range d'entre
const char * colname
nom de colonne
Valeur de retour
Numro de colonne (le compte commence 1) ou SPI_ERROR_NOATTRIBUTE si la colonne nomme n'est trouve.
832
Nom
SPI_getvalue renvoie la valeur de chane de la colonne spcifie
Synopsis
char * SPI_getvalue(HeapTuple row, TupleDesc rowdesc, int colnumber)
Description
SPI_getvalue retourne la reprsentation chane de la valeur de la colonne spcifie.
Le rsultat est retourn en mmoire alloue en utilisant palloc (vous pouvez utiliser pfree pour librer la mmoire lorsque
vous n'en avez plus besoin).
Arguments
HeapTuple row
ligne d'entre examiner
TupleDesc rowdesc
description de la ligne en entre
int colnumber
numro de colonne (le compte commence 1)
Valeur de retour
Valeur de colonne ou NULL si la colonne est NULL, si colnumber est hors de porte (SPI_result est positionne
SPI_ERROR_NOATTRIBUTE) ou si aucune fonction de sortie n'est disponible (SPI_result est positionne
SPI_ERROR_NOOUTFUNC).
833
Nom
SPI_getbinval retourne la valeur binaire de la colonne spcifie
Synopsis
Datum SPI_getbinval(HeapTuple row, TupleDesc rowdesc, int colnumber, bool * isNULL)
Description
SPI_getbinval retourne la valeur de la colonne spcifie dans le format interne (en tant que type Datum).
Cette fonction n'alloue pas de nouvel espace pour le datum. Dans le cas d'un type de donnes pass par rfrence, la valeur de retour sera un pointeur dans la ligne passe.
Arguments
HeapTuple row
ligne d'entre examiner
TupleDesc rowdesc
description de la ligne d'entre
int colnumber
numro de colonne (le compte commence 1)
bool * isNULL
indique une valeur NULL dans la colonne
Valeur de retour
La valeur binaire de la colonne est retourne. La variable vers laquelle pointe isNULL est positionne vrai si la colonne est
NULL et sinon faux.
SPI_result est positionne SPI_ERROR_NOATTRIBUTE en cas d'erreur.
834
Nom
SPI_gettype retourne le nom du type de donne de la colonne spcifie
Synopsis
char * SPI_gettype(TupleDesc rowdesc, int colnumber)
Description
SPI_gettype retourne une copie du nom du type de donne de la colonne spcifie (vous pouvez utiliser pfree pour librer la
copie du nom lorsque vous n'en avez plus besoin).
Arguments
TupleDesc rowdesc
description de ligne d'entre
int colnumber
numro de colonne (le compte commence 1)
Valeur de retour
Le nom de type de donne de la colonne spcifie ou NULL en cas d'erreur. SPI_result est positionne
SPI_ERROR_NOATTRIBUTE en cas d'erreur.
835
Nom
SPI_gettypeid retourne l'OID de type de donne de la colonne spcifie
Synopsis
Oid SPI_gettypeid(TupleDesc rowdesc, int colnumber)
Description
SPI_gettypeid retourne l'OID du type de donne de la colonne spcifie.
Arguments
TupleDesc rowdesc
description de ligne d'entre
int colnumber
numro de colonne (le compte commence 1)
Valeur de retour
L'OID du type de donne de la colonne spcifie ou InvalidOid en cas d'erreur. En cas d'erreur, SPI_result est positionne
SPI_ERROR_NOATTRIBUTE.
836
Nom
SPI_getrelname retourne le nom de la relation spcifie
Synopsis
char * SPI_getrelname(Relation rel)
Description
SPI_getrelname retourne une copie du nom de la relation spcifie (vous pouvez utiliser pfree pour librer la copie du nom
lorsque vous n'en avez plus besoin).
Arguments
Relation rel
relation d'entre
Valeur de retour
Le nom de la relation spcifie.
837
Nom
SPI_getnspname renvoie l'espace de noms de la relation spcifie
Synopsis
char * SPI_getnspname(Relation rel)
Description
SPI_getnspname renvoie une copie du nom de l'espace de nom auquel appartient la Relation spcifie. Ceci est quivalent au
schma de la relation. Vous devriez librer (pfree) la valeur de retour de cette fonction lorsque vous en avez fini avec elle.
Arguments
Relation rel
relation en entre
Valeur de retour
Le nom de l'espace de noms de la relation spcifie.
838
Nom
SPI_palloc alloue de la mmoire dans le contexte de mmoire courant
Synopsis
void * SPI_palloc(Size size)
Description
SPI_palloc alloue de la mmoire dans le contexte de mmoire courant.
Arguments
Size size
taille en octets du stockage allouer
Valeur de retour
Pointeur vers le nouvel espace de stockage de la taille spcifie
839
Nom
SPI_repalloc r-alloue de la mmoire dans le contexte de mmoire courant
Synopsis
void * SPI_repalloc(void * pointer, Size size)
Description
SPI_repalloc change la taille d'un segment de mmoire allou auparavant en utilisant SPI_palloc.
Cette fonction n'est plus diffrente du repalloc standard. Elle n'est garde que pour la compatibilit du code existant.
Arguments
void * pointer
pointeur vers l'espace de stockage modifier
Size size
taille en octets du stockage allouer
Valeur de retour
Pointeur vers le nouvel espace de stockage de taille spcifie avec le contenu copi de l'espace existant
840
Nom
SPI_pfree libre de la mmoire dans le contexte de mmoire courant
Synopsis
void SPI_pfree(void * pointer)
Description
SPI_pfree libre de la mmoire alloue auparavant par SPI_palloc ou SPI_repalloc.
Cette fonction n'est plus diffrente du pfree standard. Elle n'est conserve que pour la compatibilit du code existant.
Arguments
void * pointer
pointeur vers l'espace de stockage librer
841
Nom
SPI_copytuple effectue une copie d'une ligne dans le contexte de mmoire courant
Synopsis
HeapTuple SPI_copytuple(HeapTuple row)
Description
SPI_copytuple cre une copie d'une ligne dans le contexte de mmoire courant. Ceci est normalement utilis pour renvoyer
une ligne modifie partir d'un dclencheur. Dans une fonction dclare pour renvoyer un type composite, utilisez
SPI_returntuple la place.
Arguments
HeapTuple row
ligne copier
Valeur de retour
la ligne copie ; NULL seulement si row est NULL
842
Nom
SPI_returntuple prpare le renvoi d'une ligne en tant que Datum
Synopsis
HeapTupleHeader SPI_returntuple(HeapTuple row, TupleDesc rowdesc)
Description
SPI_returntuple cre une copie d'une ligne dans le contexte de l'excuteur suprieur, la renvoyant sous la forme d'une ligne
de type Datum. Le pointeur renvoy a seulement besoin d'tre converti en Datum via PointerGetDatum avant d'tre renvoy.
Notez que ceci devrait tre utilis pour les fonctions qui dclarent renvoyer des types composites. Ce n'est pas utilis pour les dclencheurs ; utilisez pour renvoyer une ligne modifie dans un dclencheur.
Arguments
HeapTuple row
ligne copier
TupleDesc rowdesc
descripteur pour la ligne (passez le mme descripteur chaque fois pour un cache plus efficace)
Valeur de retour
HeapTupleHeader pointant vers la ligne copie ; NULL seulement si row ou rowdesc est NULL
843
Nom
SPI_modifytuple cre une ligne en remplaant les champs slectionns d'une ligne donne
Synopsis
HeapTuple SPI_modifytuple(Relation rel, HeapTuple row, ncols, colnumber, Datum *
values, const char * nulls)
Description
SPI_modifytuple cre une nouvelle ligne en retirant les nouvelles valeurs pour les colonnes slectionnes et en copiant les
colonnes de la ligne d'origine d'autres positions. La ligne d'entre n'est pas modifie.
Arguments
Relation rel
Utilis seulement en tant que source du descripteur de ligne pour la ligne (passez une relation plutt qu'un descripteur de ligne
est une erreur).
HeapTuple row
range modifier
int ncols
nombre de numros de colonnes dans le tableau colnumber
int * colnumber
tableau des numros de colonnes modifier (le numro des colonnes commence 1)
Datum * values
nouvelles valeurs pour les colonnes spcifies
const char * nulls
quelles nouvelles valeurs sont NULL, si elles existent (voir SPI_executeplan pour le format)
Valeur de retour
nouvelle ligne avec modifications, alloue dans le contexte de mmoire courant ; NULL seulement si row est NULL
En cas d'erreur, SPI_result est positionne comme suit :
SPI_ERROR_ARGUMENT
si rel est NULL ou si row est NULL ou si ncols est infrieur ou gal 0 ou si nocolonne est NULL ou si values est
NULL.
SPI_ERROR_NOATTRIBUTE
si nocolonne contient un numro de colonne invalide (infrieur ou gal 0 ou suprieur au numro de colonne dans row)
844
Nom
SPI_freetuple libre une ligne alloue dans le contexte de mmoire courant
Synopsis
void SPI_freetuple(HeapTuple row)
Description
SPI_freetuple libre une range alloue auparavant dans le contexte de mmoire courant.
Cette fonction n'est plus diffrente du standard heap_freetuple. Elle est garde juste pour la compatibilit du code existant.
Arguments
HeapTuple row
range librer
845
Nom
SPI_freetuptable libre une srie de lignes cre par SPI_execute ou une fonction semblable
Synopsis
void SPI_freetuptable(SPITupleTable * tuptable)
Description
SPI_freetuptable libre une srie de lignes cre auparavant par une fonction d'excution de commandes SPI, tel que
SPI_execute. Par consquent, cette fonction est souvent appele avec la variable globale SPI_tupletable comme argument.
Cette fonction est utile si une procdure SPI a besoin d'excuter de multiples commandes et ne veut pas garder les rsultats de
commandes prcdentes en mmoire jusqu' sa fin. Notez que toute srie de lignes non libres est libre quand mme lors de
SPI_finish.
Arguments
SPITupleTable * tuptable
pointeur vers la srie de lignes librer
846
Nom
SPI_freeplan libre un plan sauvegard auparavant
Synopsis
int SPI_freeplan(SPIPlanPtr plan)
Description
SPI_freeplan libre un plan de commandes d'excution retourn auparavant par SPI_prepare ou sauvegard par
SPI_saveplan.
Arguments
SPIPlanPtr plan
pointeur vers le plan librer
Valeur de retour
SPI_ERROR_ARGUMENT si plan est NULL ou invalide.
Pendant l'excution de la commande SQL, toute modification de donnes faite par la commande est invisible la commande.
Par exemple, dans la commande :
INSERT INTO a SELECT * FROM a;
les lignes insres sont invisibles la partie SELECT.
Les modifications effectues par une commande C sont visibles par toutes les commandes qui sont lances aprs C, peu importe qu'elles soient lances l'intrieur de C (pendant l'excution de C) ou aprs que C soit termine.
Les commandes excutes via SPI l'intrieur d'une fonction appele par une commande SQL (soit une fonction ordinaire soit
un dclencheur) suivent une des rgles ci-dessus suivant le commutateur lecture/criture pass SPI. Les commandes excutes en mode lecture seule suivent la premire rgle : elles ne peuvent pas voir les modifications de la commande appelante.
Les commandes excutes en mode lecture/criture suivent la deuxime rgle : elles peuvent voir toutes les modifications ralises jusqu' maintenant.
Tous les langages standards de procdures initialisent le mode lecture/criture suivant l'attribut de volatilit de la fonction. Les
commandes des fonctions STABLE et IMMUTABLE sont ralises en mode lecture seule alors que les fonctions VOLATILE
sont ralises en mode lecture/criture. Alors que les auteurs de fonctions C sont capables de violer cette convention, il est peu
probable que cela soit une bonne ide de le faire.
43.5. Exemples
Cette section contient un exemple trs simple d'utilisation de SPI. La procdure execq prend une commande SQL comme premier argument et un compteur de lignes comme second, excute la commande en utilisant SPI_exec et renvoie le nombre de
lignes qui ont t traites par la commande. Vous trouverez des exemples plus complexes pour SPI dans l'arborescence source
dans src/test/regress/regress.c et dans le module spi.
#include "postgres.h"
#include "executor/spi.h"
#include "utils/builtins.h"
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
847
#endif
int execq(text *sql, int cnt);
int
execq(text *sql, int cnt)
{
char *command;
int ret;
int proc;
/* Convertir l'objet texte donn en chane C */
command = text_to_cstring(sql);
SPI_connect();
ret = SPI_exec(command, cnt);
proc = SPI_processed;
/*
* Si des lignes ont t rcupres,
* alors les afficher via elog(INFO).
*/
if (ret > 0 && SPI_tuptable != NULL)
{
TupleDesc tupdesc = SPI_tuptable->tupdesc;
SPITupleTable *tuptable = SPI_tuptable;
char buf[8192];
int i, j;
for (j = 0; j < proc; j++)
{
HeapTuple tuple = tuptable->vals[j];
for (i = 1, buf[0] = 0; i <= tupdesc->natts; i++)
snprintf(buf + strlen (buf), sizeof(buf) - strlen(buf), " %s%s",
SPI_getvalue(tuple, tupdesc, i),
(i == tupdesc->natts) ? " " : " |");
elog(INFO, "EXECQ: %s", buf);
}
}
SPI_finish();
pfree(command);
return (proc);
}
(Cette fonction utilisera la convention d'appel version 0 pour rendre l'exemple plus simple comprendre. Dans des applications
relles, vous devriez utiliser la nouvelle interface version 1.)
Voici comment dclarer la fonction aprs l'avoir compile en une bibliothque partage (les dtails sont dans Section 35.9.6,
Compiler et lier des fonctions charges dynamiquement ) :
CREATE FUNCTION execq(text, integer) RETURNS integer
AS 'filename'
LANGUAGE C;
Voici une session d'exemple :
=> SELECT execq('CREATE TABLE a (x integer)', 0);
execq
------0
(1 row)
=> INSERT INTO a VALUES (execq('INSERT INTO a VALUES (0)', 0));
INSERT 0 1
=> SELECT execq('SELECT * FROM a', 0);
INFO: EXECQ: 0
-- insr par execq
848
INFO:
EXECQ:
execq
------2
(1 row)
=> SELECT execq('INSERT INTO a SELECT x + 2 FROM a', 1);
execq
------1
(1 row)
=> SELECT execq('SELECT * FROM a', 10);
INFO: EXECQ: 0
INFO: EXECQ: 1
INFO: EXECQ: 2
-- 0 + 2, une seule ligne insre - comme spcifi
execq
------3
(1 row)
849
Commandes SQL
Cette partie regroupe les informations de rfrence concernant les commandes SQL reconnues par PostgreSQL. Gnralement, on dsigne par SQL le langage ; toute information sur la structure et la compatibilit standard de chaque commande
peut tre trouve sur les pages rfrences.
851
Nom
ABORT Interrompre la transaction en cours
Synopsis
ABORT [ WORK | TRANSACTION ]
Description
ABORT annule la transaction en cours et toutes les mises jour effectues pendant cette transaction. Cette commande a un
comportement identique la commande SQL ROLLBACK(7). Elle n'est prsente que pour des raisons historiques.
Paramtres
WORK, TRANSACTION
Mots-cl optionnels. Ils n'ont aucun effet.
Notes
COMMIT(7) est utilis pour terminer avec succs une transaction.
Lancer ABORT l'extrieur de toute transaction ne cause aucun dgt, mais provoque un message d'avertissement.
Exemples
Annuler toutes les modifications :
ABORT;
Compatibilit
Cette commande est une extension PostgreSQL prsente pour des raisons historiques. ROLLBACK est la commande quivalente du standard SQL.
Voir aussi
BEGIN(7), COMMIT(7), ROLLBACK(7)
852
Nom
ALTER AGGREGATE Modifier la dfinition d'une fonction d'agrgat
Synopsis
ALTER AGGREGATE nom ( type [ , ... ] ) RENAME TO nouveau_nom
ALTER AGGREGATE nom ( type [ , ... ] ) OWNER TO nouveau_proprietaire
ALTER AGGREGATE nom ( type [ , ... ] ) SET SCHEMA nouveau_schema
Description
ALTER AGGREGATE change la dfinition d'une fonction d'agrgat.
Seul le propritaire de la fonction d'agrgat peut utiliser ALTER AGGREGATE. Pour modifier le schma d'une fonction
d'agrgat, il est ncessaire de possder le droit CREATE sur le nouveau schma. Pour modifier le propritaire de la fonction, il
faut tre un membre direct ou indirect du nouveau rle propritaire, rle qui doit en outre possder le droit CREATE sur le schma de la fonction d'agrgat. Ces restrictions assurent que la modification du propritaire ne permet pas d'aller au-del de ce que
permet la suppression et la recration d'une fonction d'agrgat. Toutefois, un superutilisateur peut modifier la possession de
n'importe quelle fonction d'agrgat.
Paramtres
nom
Le nom (ventuellement qualifi du nom du schma) de la fonction d'agrgat.
type
Un type de donnes en entre sur lequel la fonction d'agrgat opre. Pour rfrencer une fonction d'agrgat sans argument,
crivez * la place de la liste des types de donnes en entre.
nouveau_nom
Le nouveau nom de la fonction d'agrgat.
nouveau_propritaire
Le nouveau propritaire de la fonction d'agrgat.
nouveau_schema
Le nouveau schma de la fonction d'agrgat.
Exemples
Renommer la fonction d'agrgat mamoyenne de type integer en ma_moyenne :
ALTER AGGREGATE mamoyenne(integer) RENAME TO ma_moyenne;
Changer le propritaire de la fonction d'agrgat mamoyenne de type integer en joe :
ALTER AGGREGATE mamoyenne(integer) OWNER TO joe;
Dplacer la fonction d'agrgat mamoyenne du type integer dans le schma monschema :
ALTER AGGREGATE mamoyenne(integer) SET SCHEMA monschema;
Compatibilit
Il n'y a pas de commande ALTER AGGREGATE dans le standard SQL.
Voir aussi
CREATE AGGREGATE(7), DROP AGGREGATE(7)
853
Nom
ALTER COLLATION modifie la dfinition d'une collation
Synopsis
ALTER COLLATION nom RENAME TO nouveau_nom
ALTER COLLATION nom OWNER TO nouveau_propritaire
ALTER COLLATION nom SET SCHEMA nouveau_schma
Description
ALTER COLLATION modifie la dfinition d'une collation.
Pour pouvoir utiliser la commande ALTER COLLATION, vous devez tre propritaire de la collation. Pour en modifier le
propritaire, vous devez galement tre un membre direct ou indirect du nouveau rle propritaire, et ce rle doit dtenir le privilge CREATE sur le schma de la collation. (Ces restrictions ont pour effet que vous ne pouvez effectuer aucune modification
de propritaire qui serait impossible en supprimant et en recrant la collation. Cependant, un super-utilisateur peut modifier le
propritaire de n'importe quelle collation, quoi qu'il arrive.)
Paramtres
nom
Le nom (ventuellement prcd par le schma) d'une collation existante.
nouveau_nom
Le nouveau nom de la collation.
nouveau_propritaire
Le nouveau propritaire de la collation.
nouveau_schma
Le nouveau schma de la collation.
Exemples
Pour renommer la collation de_DE en german:
ALTER COLLATION "de_DE" RENAME TO german;
Pour donner la proprit de la collation en_US en joe:
ALTER COLLATION "en_US" OWNER TO joe;
Compatibilit
Il n'y a pas de commande ALTER COLLATION dans le standard SQL.
Voir galement
CREATE COLLATION(7), DROP COLLATION(7)
854
Nom
ALTER CONVERSION Modifier la dfinition d'une conversion
Synopsis
ALTER CONVERSION nom RENAME TO nouveau_nom
ALTER CONVERSION nom OWNER TO nouveau_propritaire
ALTER CONVERSION nom SET SCHEMA nouveau_schma
Description
ALTER CONVERSION modifie la dfinition d'une conversion.
Seul le propritaire de la conversion peut utiliser ALTER CONVERSION. Pour changer le propritaire, il faut aussi tre un
membre direct ou indirect du nouveau rle propritaire et ce rle doit avoir le droit CREATE sur le schma de la conversion. Ces
restrictions assurent que le changement de propritaire ne va pas au-del de ce qui peut tre obtenu en supprimant et en re-crant
la conversion. Toutefois, un superutilisateur peut changer le propritaire de n'importe quelle conversion.
Paramtres
nom
Le nom de la conversion.
nouveau_nom
Le nouveau nom de la conversion.
nouveau_propritaire
Le nouveau propritaire de la conversion.
nouveau_schma
Le nouveau schma de la conversion.
Exemples
Renommer la conversion iso_8859_1_to_utf8 en latin1_to_unicode :
ALTER CONVERSION iso_8859_1_to_utf8 RENAME TO latin1_to_unicode;
Changer le propritaire de la conversion iso_8859_1_to_utf8 en joe :
ALTER CONVERSION iso_8859_1_to_utf8 OWNER TO joe;
Compatibilit
Il n'y a pas d'instruction ALTER CONVERSION dans le standard SQL.
Voir aussi
CREATE CONVERSION(7), DROP CONVERSION(7)
855
Nom
ALTER DATABASE Modifier une base de donnes
Synopsis
ALTER DATABASE nom [ [ WITH ] option [ ... ] ]
o option peut tre :
CONNECTION LIMIT limite_connexion
ALTER DATABASE nom RENAME TO nouveau_nom
ALTER DATABASE nom OWNER TO nouveau_propritaire
ALTER DATABASE nom SET TABLESPACE nouveau_tablespace
ALTER
ALTER
ALTER
ALTER
DATABASE
DATABASE
DATABASE
DATABASE
nom
nom
nom
nom
Description
ALTER DATABASE modifie les attributs d'une base de donnes.
La premire forme modifie certains paramtres d'une base de donnes (voir ci-dessous pour les dtails). Seul le propritaire de
la base de donnes ou un superutilisateur peut modifier ces paramtres.
La deuxime forme permet de renommer la base. Seul le propritaire ou un superutilisateur peut renommer une base. Un propritaire qui n'est pas superutilisateur doit en outre possder le droit CREATEDB. La base en cours d'utilisation ne peut pas tre
renomme (on se connectera une base diffrente pour raliser cette opration).
La troisime forme change le propritaire de la base de donnes. Pour changer le propritaire, il faut tre propritaire de la base
de donnes et membre direct ou indirect du nouveau rle propritaire. Le droit CREATEDB est galement requis (les superutilisateurs ont automatiquement tous ces droits).
La quatrime forme change le tablespace par dfaut de la base de donnes. Seuls le propritaire de la base de donnes et un superutilisateur peuvent le faire ; vous devez aussi avoir le droit CREATE pour le nouveau tablespace. Cette commande dplace
physiquement toutes tables et index actuellement dans l'ancien tablespace par dfaut de la base de donnes vers le nouveau tablespace. Notez que les tables et index placs dans d'autres tablespaces ne sont pas affects.
Les formes restantes modifient la valeur par dfaut d'un paramtre de configuration pour une base PostgreSQL. Par la suite,
chaque fois qu'une nouvelle session est lance, la valeur spcifique devient la valeur par dfaut de la session. Les valeurs par dfaut de la base deviennent les valeurs par dfaut de la session. En fait, elles surchargent tout paramtre prsent dans postgresql.conf ou indiqu sur la ligne de commande de postgres. Seul le propritaire de la base de donnes ou un superutilisateur peut modifier les valeurs par dfaut de la session pour une base. Certaines variables ne peuvent pas tre configures de cette
faon pour une base de donnes ou peuvent seulement tre configures par un superutilisateur.
Paramtres
nom
Le nom de la base dont les attributs sont modifier.
limite_connexion
Le nombre de connexions concurrentes sur la base de donnes. -1 signifie aucune limite.
nouveau_nom
Le nouveau nom de la base.
nouveau_propritaire
Le nouveau propritaire de la base.
nouveau_tablespace
Le nouveau tablespace par dfaut de la base de donnes.
paramtre, valeur
856
ALTER DATABASE
Configure cette valeur comme valeur par dfaut de la base pour le paramtre de configuration prcise. Si valeur indique
DEFAULT ou, de faon quivalente, si RESET est utilis, le paramtrage en cours pour cette base est supprime, donc la valeur systme est utilise pour les nouvelles sessions. Utiliser RESET ALL permet de supprimer tous les paramtres spcifiques de cette base. SET FROM CURRENT sauvegarde la valeur actuelle du paramtre en tant que valeur spcifique de la
base.
Voir SET(7) et Chapitre 18, Configuration du serveur pour plus d'informations sur les noms de paramtres et valeurs autorises.
Notes
Il est possible de lier une valeur de session par dfaut un rle plutt qu' une base. Voir ALTER ROLE(7) ce propos. En cas de
conflit, les configurations spcifiques au rle l'emportent sur celles spcifiques la base.
Exemples
Dsactiver les parcours d'index par dfaut de la base test :
ALTER DATABASE test SET enable_indexscan TO off;
Compatibilit
La commande ALTER DATABASE est une extension PostgreSQL.
Voir aussi
CREATE DATABASE(7), DROP DATABASE(7), SET(7), CREATE TABLESPACE(7)
857
Nom
ALTER DEFAULT PRIVILEGES dfinit les droits d'accs par dfaut
Synopsis
ALTER DEFAULT PRIVILEGES
[ FOR { ROLE | USER } cible_rle [, ...] ]
[ IN SCHEMA nom_schma [, ...] ]
grant_ou_revoke_rduit
where grant_ou_revoke_rduit is one of:
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[, ...] | ALL [ PRIVILEGES ] }
ON TABLES
TO { [ GROUP ] nom_rle | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { { USAGE | SELECT | UPDATE }
[, ...] | ALL [ PRIVILEGES ] }
ON SEQUENCES
TO { [ GROUP ] nom_rle | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { EXECUTE | ALL [ PRIVILEGES ] }
ON FUNCTIONS
TO { [ GROUP ] nom_rle | PUBLIC } [, ...] [ WITH GRANT OPTION ]
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[, ...] | ALL [ PRIVILEGES ] }
ON TABLES
FROM { [ GROUP ] nom_rle | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { USAGE | SELECT | UPDATE }
[, ...] | ALL [ PRIVILEGES ] }
ON SEQUENCES
FROM { [ GROUP ] nom_rle | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ EXECUTE | ALL [ PRIVILEGES ] }
ON FUNCTIONS
FROM { [ GROUP ] nom_rle | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
Description
ALTER DEFAULT PRIVILEGES vous permet de configurer les droits qui seront appliqus aux objets qui seront crs dans
le futur. (Cela ne modifie pas les droits affects des objets dj existants.) Actuellement, seuls les droits pour les tables (ceci
incluant les vues et les tables distantes), les squences et les fonctions peuvent tre modifis.
Vous pouvez modifier les droits par dfaut seulement pour les objets qui seront crs par vous ou par des rles dont vous tes
membres. Les droits peuvent tre configurs de manire globale (c'est--dire pour tous les objets de la base de donnes) ou pour
les objets des schmas indiqus. Les droits par dfaut spcifiques par schma sont ajouts aux droits par dfaut globaux pour le
type d'objet particulier.
Comme indiqu dans GRANT(7), les droits par dfaut de tout type d'objet donnent tous les droits au propritaire de l'objet et
peut aussi donner certains droits PUBLIC. Nanmoins, ce comportement peut tre chang par une modification des droits par
dfaut globaux avec ALTER DEFAULT PRIVILEGES.
Paramtres
cible_rle
858
Le nom d'un rle existant dont le rle actuel est membre. Si FOR ROLE est omis, le rle courant est utilis.
nom_schma
Le nom d'un schma existant. S'il est indiqu, les droits par dfaut sont modifis pour les objets crs aprs coup dans ce
schma. Si IN SCHEMA est omis, les droits globaux par dfaut sont modifis.
nom_rle
Le nom d'un rle existant pour donner ou reprendre les droits. Ce paramtre, et tous les autres paramtres dans
grant_ou_revoke_rduit, agissent de la faon dcrite dans GRANT(7) ou REVOKE(7), sauf qu'un permet de configurer les droits pour une classe complte d'objets plutt que pour des objets nomms spcifiques.
Notes
Utilisez la commande \ddp de psql(1) pour otbenir des informations sur les droits par dfaut. La signification des valeurs de droit
est identique celles utilises par \dp et est expliqu dans GRANT(7).
Si vous souhaitez supprimer un rle dont les droits par dfaut ont t modifis, il est ncessaire d'inverser les modifications dans
ses droits par dfaut ou d'utiliser DROP OWNED BY pour supprimer l'entre des droits par dfaut pour le rle.
Examples
Donner le droit SELECT tout le monde pour toutes les tables (et vues) que vous pourriez crer plus tard dans le schma
mon_schema, et permettre au rle webuser d'utiliser en plus INSERT :
ALTER DEFAULT PRIVILEGES IN SCHEMA mon_schema GRANT SELECT ON TABLES TO PUBLIC;
ALTER DEFAULT PRIVILEGES IN SCHEMA mon_schema GRANT INSERT ON TABLES TO webuser;
Annuler ce qui a t fait ci-dessus, pour que les tables cres par la suite n'aient pas plus de droits qu'en standard :
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema REVOKE SELECT ON TABLES FROM PUBLIC;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema REVOKE INSERT ON TABLES FROM webuser;
Supprimer le droit publique EXECUTE qui est normalement donn aux fonctions, pour toutes les fonctions cres aprs coup par
le rle admin :
ALTER DEFAULT PRIVILEGES FOR ROLE admin REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;
Compatibilit
Il n'existe pas d'instruction ALTER DEFAULT PRIVILEGES dans le standard SQL.
Voir aussi
GRANT(7), REVOKE(7)
859
Nom
ALTER DOMAIN Modifier la dfinition d'un domaine
Synopsis
ALTER DOMAIN nom
{ SET DEFAULT expression | DROP DEFAULT }
ALTER DOMAIN nom
{ SET | DROP } NOT NULL
ALTER DOMAIN nom
ADD contrainte_de_domaine
ALTER DOMAIN nom
DROP CONSTRAINT nom_de_contrainte [ RESTRICT | CASCADE ]
ALTER DOMAIN nom
OWNER TO nouveau_propritaire
ALTER DOMAIN nom
SET SCHEMA nouveau_schema
Description
ALTER DOMAIN modifie la dfinition d'un domaine. Il existe plusieurs sous-formes :
SET/DROP DEFAULT
Ces formes positionnent ou suppriment la valeur par dfaut d'un domaine. Les valeurs par dfaut ne s'appliquent qu'aux
commandes INSERT ultrieures ; les colonnes d'une table qui utilise dj le domaine ne sont pas affectes.
SET/DROP NOT NULL
Ces formes agissent sur l'acceptation ou le rejet des valeurs NULL par un domaine. SET NOT NULL ne peut tre utilis
que si les colonnes qui utilisent le domaine contiennent des valeurs non nulles.
ADD contrainte de domaine
Cette forme ajoute une nouvelle contrainte un domaine avec la mme syntaxe que CREATE DOMAIN(7). Ceci ne fonctionne que lorsque toutes les colonnes qui utilisent le domaine satisfont la nouvelle contrainte.
DROP CONSTRAINT
Cette forme supprime les contraintes sur un domaine.
OWNER
Cette forme change le propritaire du domaine.
SET SCHEMA
Cette forme change le schma du domaine. Toute contrainte associe au domaine est dplace dans le nouveau schma.
Seul le propritaire de la fonction d'agrgat peut utiliser ALTER AGGREGATE.
Seul le propritaire du domaine peut utiliser ALTER DOMAIN. Pour modifier le schma d'un domaine, le droit CREATE sur le
nouveau schma est galement requis. Pour modifier le propritaire, il faut tre un membre direct ou indirect du nouveau rle
propritaire et ce rle doit avoir le droit CREATE sur le schma du domaine. Ces restrictions assurent que la modification du
propritaire n'agissent pas au-del de ce qui est ralisable en supprimant et en re-crant le domaine. Toutefois, un superutilisateur peut modifier le propritaire de n'importe quel domaine.
Paramtres
nom
Le nom du domaine modifier.
contrainte_de_domaine
Nouvelle contrainte de domaine pour le domaine.
nom_de_contrainte
Le nom d'une contrainte supprimer.
CASCADE
Les objets qui dpendent de la contrainte sont automatiquement supprims.
860
ALTER DOMAIN
RESTRICT
La contrainte n'est pas supprime si des objets en dpendent. C'est le comportement par dfaut.
nouveau_propritaire
Le nom de l'utilisateur nouveau propritaire du domaine.
nouveau_schema
Le nouveau schma du domaine.
Notes
Actuellement, ALTER DOMAIN ADD CONSTRAINT et ALTER DOMAIN SET NOT NULL choueront si le domaine
nomm ou tout domaine driv est utilis pour une colonne de type composite dans toute table de la base de donnes. Il se pourrait
que cela soit amlior pour vrifier la nouvelle contrainte sur ce type de colonnes intgres.
Exemples
Ajouter une contrainte NOT NULL un domaine :
ALTER DOMAIN codezip SET NOT NULL;
Supprimer une contrainte NOT NULL d'un domaine :
ALTER DOMAIN codezip DROP NOT NULL;
Ajouter une contrainte de contrle un domaine :
ALTER DOMAIN codezip ADD CONSTRAINT verif_zip CHECK (char_length(VALUE) = 5);
Supprimer une contrainte de contrle d'un domaine :
ALTER DOMAIN codezip DROP CONSTRAINT verif_zip;
Dplacer le domaine dans un schma diffrent :
ALTER DOMAIN zipcode SET SCHEMA customers;
Compatibilit
ALTER DOMAIN se conforme au standard SQL, l'exception des variantes OWNER et SET SCHEMA, qui sont des extensions
PostgreSQL.
Voir aussi
CREATE DOMAIN(7), DROP DOMAIN(7)
861
Nom
ALTER EXTENSION modifie la dfinition d'une extension
Synopsis
ALTER
ALTER
ALTER
ALTER
EXTENSION
EXTENSION
EXTENSION
EXTENSION
nom_extension
nom_extension
nom_extension
nom_extension
UPDATE [ TO nouvelle_version ]
SET SCHEMA nouveau_schma
ADD objet_membre
DROP objet_membre
Description
ALTER EXTENSION modifie la dfinition d'une extension. Il existe plusieurs variantes :
UPDATE
Met jour l'extension avec une nouvelle version. L'extension doit fournir le script de mise jour adquat (voire un ensemble de scripts) qui peut modifier la version en cours vers la version demande.
SET SCHEMA
Dplace les objets de l'extension vers un autre schma. L'extension doit permettre que ses objets soient dplacs pour que
cette commande fonctionne.
ADD objet_membre
Ajoute un objet existant l'extension. Cette commande est utilise principalement dans les scripts de mise jour
d'extensions. L'objet concern sera alors considr comme appartenant l'extension. Cela signifie principalement que
l'objet ne pourra tre supprim qu'en supprimant l'extension.
DROP objet_membre
Supprime un objet de l'extension. Cette commande est utilise principalement dans les scripts de mise jour d'extensions.
L'objet n'est pas supprim : il n'appartient simplement plus l'extension.
Voir aussi Section 35.15, Empaqueter des objets dans une extension pour des informations complmentaires sur les extensions.
Seul le propritaire de l'extension peut utiliser la commande ALTER EXTENSION pour supprimer l'extension. Les options
ADD ou DROP ncessitent en complment d'tre le propritaire de l'objet concern par l'ajout ou la suppression.
Paramtres
862
ALTER EXTENSION
nom_extension
Le nom de l'extension concerne.
nouvelle_version
La nouvelle version de l'extension installer. Il peut autant s'agir d'un identifiant que d'une chane de caractre. Si cette version n'est pas spcifie, la commande ALTER EXTENSION UPDATE va utiliser tous les lments de la version par dfaut
mentionns dans le fichier de contrle de l'extension.
nouveau_schma
Le nouveau schma vers lequel dplacer l'extension.
nom_objet, nom_agg, nom_fonction, nom_oprateur
Le nom d'un objet qui sera ajout ou retir de l'extension. Les noms de tables, aggrgats, domaines, tables distantes, fonctions,
oprateurs, classes d'oprateurs, familles d'oprateurs, squences, objets de recherche de texte, types et vues peuvent tre qualifis du nom du schma.
type_agg
Un type de donne paramtres de la fonction d'aggrgat concern. La syntaxe * peut tre utilise pour les fonctions d'aggrgat
sans paramtres.
type_source
Le nom d'un type de donnes source d'un transtypage.
type_cible
Le nom du type de donne cible d'un transtypage.
mode_arg
Le mode du paramtre d'une mthode : IN, OUT, INOUT ou VARIADIC. La valeur par dfaut est IN. Notez que la commande ALTER EXTENSION ne tient en ralit pas compte des paramtres dont le mode est OUT, car les paramtres en entre sont suffisants pour dterminer la signature de la fonction. Il est ainsi possible de ne spcifier que les paramtres de mode
IN, INOUT et VARIADIC.
nom_arg
Le nom du paramtre de la mthode concerne. Notez que la commande ALTER EXTENSION ne tient pas compte en ralit des noms de paramtre, car les types de donnes sont suffisants pour dterminer la signature de la mthode.
type_arg
Le(s) type(s) de donne des paramtres de la mthode concerne (ventuellement qualifi du nom du schma).
type_gauche, type_droit
Le type de donnes des arguments (ventuellement qualifi du nom du schma). crire NONE pour l'argument manquant d'un
oprateur prfix ou postfix.
PROCEDURAL
Le mot cl PROCEDURAL n'est pas ncessaire. Il peut tre omis.
Exemples
Pour mettre jour l'extension hstore la version 2.0 :
ALTER EXTENSION hstore UPDATE TO '2.0';
Pour modifier le schma de l'extension hstore vers utils :
ALTER EXTENSION hstore SET SCHEMA utils;
Pour ajouter une procdure stocke existante l'extension hstore :
ALTER EXTENSION hstore ADD FUNCTION populate_record(anyelement, hstore);
Compatibilit
ALTER EXTENSION est une extension de PostgreSQL.
863
ALTER EXTENSION
Voir aussi
CREATE EXTENSION(7), DROP EXTENSION(7)
864
Nom
ALTER FOREIGN DATA WRAPPER modifier la dfinition d'un wrapper de donnes distantes
Synopsis
ALTER
[
[
[
ALTER
Description
ALTER FOREIGN DATA WRAPPER modifie la dfinition d'un wrapper de donnes distantes. La premire forme de la
commande modifie les fonctions de support ou les options gnriques du wrapper de donnes distantes (au moins une clause est
ncessaire). La seconde forme modifie le propritaire du wrapper de donnes distantes.
Seuls les superutilisateurs peuvent modifier les wrappers de donnes distantes. De plus, seuls les superutilisateurs peuvent tre
propritaire de wrappers de donnes distantes.
Paramtres
nom
Le nom d'un wrapper de donnes distantes existant.
HANDLER fonction_handler
Spcifie une nouvelle fonction de gestion pour le wrapper de donnes distantes.
NO HANDLER
Cette clause est utilise pour spcifier que le wrapper de donnes distantes ne doit plus avoir de fonction de gestion.
Notez que les tables distantes qui utilisent un wrapper de donnes distantes, sans fonction de gestion, ne peuvent pas tre
utilises.
VALIDATOR fonction_validation
Indique une fonction de validation pour le wrapper de donnes distantes.
Notez qu'il est possible que les options des wrappers de donnes distantes, des serveurs et des correspondances utilisateur
deviennent invalides une fois le validateur chang. C'est l'utilisateur de s'assurer que ces options sont correctes avant
d'utiliser le wrapper de donnes distantes.
NO VALIDATOR
Cette option est utilise pour spcifier que le wrapper de donnes distantes n'aura plus de fonction de validation.
OPTIONS ( [ ADD | SET | DROP ] option ['valeur'] [, ... ] )
Modifie les options du wrapper de donnes distantes. ADD, SET et DROP spcifient l'action raliser. ADD est pris par dfaut si aucune opration n'est explicitement spcifie. Les noms des options doivent tre uniques ; les noms et valeurs sont
valids en utilisant la fonction de validation du wrapper de donnes distantes.
Exemples
Modifier wrapper de donnes distantes dbi, ajouter l'option foo, supprimer bar :
ALTER FOREIGN DATA WRAPPER dbi OPTIONS (ADD foo '1', DROP 'bar');
Modifier la fonction de validation du wrapper de donnes distantes dbi en bob.myvalidator :
ALTER FOREIGN DATA WRAPPER dbi VALIDATOR bob.myvalidator;
Compatibilit
ALTER FOREIGN DATA WRAPPER se conforme ISO/IEC 9075-9 (SQL/MED). Nanmoins, les clauses HANDLER, VA865
Voir aussi
CREATE FOREIGN DATA WRAPPER(7), DROP FOREIGN DATA WRAPPER(7)
866
Nom
ALTER FOREIGN TABLE modifie la dfinition de la table distante
Synopsis
ALTER FOREIGN TABLE nom
action [, ... ]
ALTER FOREIGN TABLE nom
RENAME [ COLUMN ] colonne TO nouvelle_colonne
ALTER FOREIGN TABLE nom
RENAME TO nouveau_nom
ALTER FOREIGN TABLE nom
SET SCHEMA nouveau_schma
o action peut tre :
ADD [ COLUMN ] colonne type
ADD [ COLUMN ] colonne type [ NULL | NOT NULL ]
DROP [ COLUMN ] [ IF EXISTS ] colonne [ RESTRICT | CASCADE ]
ALTER [ COLUMN ] colonne [ SET DATA ] TYPE type
ALTER [ COLUMN ] colonne { SET | DROP } NOT NULL
OWNER TO nouveau_propritaire
OPTIONS ( [ ADD | SET | DROP ] option ['valeur'] [, ... ])
Description
ALTER FOREIGN TABLE modifie la dfinition d'une table distante existante. Il existe plusieurs variantes :
ADD COLUMN
Ajoute une nouvelle colonne la table distante en utilisant une syntaxe identique celle de CREATE FOREIGN
TABLE(7).
DROP COLUMN [ IF EXISTS ]
Supprime une colonne de la table. L'option CASCADE doit tre utilise lorsque des objets en dehors de la table dpendant
de cette colonne, comme par exemple des rfrences de cls trangres ou des vues. Si IF EXISTS est indiqu et que la
colonne n'existe pas, aucune erreur n'est renvoye. Dans ce cas, un message d'avertissement est envoy la place.
SET DATA TYPE
Change le type d'une colonne de la table.
SET/DROP NOT NULL
Autorise / refuse l'ajout de valeurs NULL dans la colonne. SET NOT NULL ne peut tre utilis que si la colonne ne
contient pas de valeurs NULL.
OWNER
Change le propritaire d'une table distante. Le nouveau propritaire est celui pass en paramtre.
RENAME
Change le nom d'une table distante ou le nom d'une colonne individuelle de la table distante. Cela n'a aucun effet sur la donne stocke.
SET SCHEMA
Dplace la table distante dans un autre schma.
OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ] )
Modifie les options de la table distante. L'action effectuer est spcifie par ADD (ajout), SET (dfinition) ou DROP
(suppression). Si aucune action n'est mentionne, ADD est utilise. Les noms des options autorises et leurs valeurs sont
spcifiques chaque wrapper de donnes distantes et sont valides en utilisant la fonction de validation du wrapper de donnes distantes. Le nom de chaque option doit tre unique.
l'exception de RENAME et SET SCHEMA, toutes les actions peuvent tre combines en une liste de modifications appliques
paralllement. Par exemple, il est possible d'ajouter plusieurs colonnes et/ou de modifier plusieurs colonnes en une seule commande.
Il faut tre propritaire de la table pour utiliser ALTER FOREIGN TABLE. Pour modifier le schma d'une table, le droit
867
CREATE sur le nouveau schma est requis. Pour modifier le propritaire de la table, il est ncessaire d'tre un membre direct ou
indirect du nouveau rle et ce dernier doit avoir le droit CREATE sur le schma de la table (ces restrictions assurent que la modification du propritaire ne diffre en rien de ce qu'il est possible de faire par la suppression et la re-cration de la table. Nanmoins,
dans tous les cas, un superutilisateur peut modifier le propritaire de n'importe quelle table).
Paramtres
nom
Le nom (ventuellement qualifi du nom du schma) de la table modifier.
colonne
Le nom d'une colonne, existante ou nouvelle.
nouvelle_colonne
Le nouveau nom d'une colonne existante.
nouveau_nom
Le nouveau nom de la table.
type
Le type de donnes de la nouvelle colonne, ou le nouveau type de donnes d'une colonne existante.
CASCADE
Les objets qui dpendent de la colonne ou de la contrainte supprime sont automatiquement supprims (par exemple, les vues
rfrenant la colonne).
RESTRICT
La colonne ou la contrainte n'est pas supprime si des objets en dpendent. C'est le comportement par dfaut.
nouveau_propritaire
Le nom d'utilisateur du nouveau propritaire de la table distante.
nouveau_schma
Le nom du schma vers lequel la table distante sera dplace.
Notes
Le mot cl COLUMN n'est pas ncessaire. Il peut tre omis.
La cohrence avec le serveur distant n'est pas vrifie lorsqu'une colonne est ajoute ou supprime avec la commande ADD COLUMN ou DROP COLUMN, lorsqu'une contrainte CHECK ou NOT NULL est ajoute, ou encore lorsqu'un type de colonne est modifi avec l'action SET DATA TYPE. Il est ainsi de la responsabilit de l'utilisateur de s'assurer que la dfinition de la table distante
est compatible avec celle du serveur distant.
Voir la commande CREATE FOREIGN TABLE(7) pour une description plus complte des paramtres valides.
Exemples
Pour interdire les valeurs NULL sur une colonne :
ALTER FOREIGN TABLE distributeurs ALTER COLUMN rue SET NOT NULL;
Pour modifier les options d'une table distante :
ALTER FOREIGN TABLE mon_schema.distributeurs OPTIONS (ADD opt1 'valeur', SET opt2,
'valeur2', DROP opt3 'valeur3');
Compatibilit
Les actions ADD, DROP, et SET DATA TYPE sont conformes au standard SQL. Les autres actions sont des extensions PostgreSQL du standard SQL. De plus, la possibilit de combiner de multiples modifications en une seule commande ALTER FOREIGN TABLE est une extension PostgreSQL.
La commande ALTER FOREIGN TABLE DROP COLUMN peut tre utilise pour supprimer jusqu' la dernire colonne
d'une table distante, permettant ainsi d'obtenir une table sans colonne. Il s'agit d'une extension du standard SQL, qui ne permet pas
de grer des tables sans colonnes.
868
Nom
ALTER FUNCTION Modifier la dfinition d'une fonction
Synopsis
ALTER FUNCTION nom ( [ [ modearg
action [ ... ] [ RESTRICT ]
ALTER FUNCTION nom ( [ [ modearg
RENAME TO nouveau_nom
ALTER FUNCTION nom ( [ [ modearg
OWNER TO new_owner
ALTER FUNCTION nom ( [ [ modearg
SET SCHEMA nouveau_schema
Description
ALTER FUNCTION modifie la dfinition d'une fonction.
Seul le propritaire de la fonction peut utiliser ALTER FUNCTION. Le privilge CREATE sur le nouveau schma est requis
pour pouvoir changer le schma de la fonction. Pour modifier le propritaire, il est ncessaire d'tre membre direct ou indirect
du nouveau rle propritaire. Ce dernier doit possder le droit CREATE sur le schma de la fonction. Ces restrictions assurent
que la modification du propritaire n'a pas d'effets autres que ceux obtenus par la suppression et la re-cration de la fonction ;
toutefois, un superutilisateur peut modifier le propritaire de n'importe quelle fonction.
Paramtres
nom
Le nom de la fonction.
modearg
Le mode d'un argument : IN, OUT, INOUT ou VARIADIC. En cas d'omission, la valeur par dfaut est IN. ALTER FUNCTION ne tient pas compte des arguments OUT, car seuls les arguments en entre sont ncessaire pour dterminer l'identit
de la fonction. Les arguments IN, INOUT et VARIADIC sont donc suffisants.
nomarg
Le nom d'un argument. ALTER FUNCTION ne tient pas compte des noms des arguments, car seuls les types de donnes
des arguments sont ncessaires pour dterminer l'identit d'une fonction.
typearg
Le(s) type(s) de donnes des arguments de la fonction (ventuellement qualifi(s) du nom du schma).
nouveau_nom
Le nouveau nom de la fonction.
nouveau_proprietaire
Le nouveau propritaire de la fonction. Si cette fonction est marque SECURITY DEFINER, elle s'excute par la suite
sous cette identit.
nouveau_schema
Le nouveau schma de la fonction.
CALLED ON NULL INPUT, RETURNS NULL ON NULL INPUT, STRICT
CALLED ON NULL INPUT modifie la fonction pour qu'elle puisse tre appele avec des arguments NULL. RETURNS
NULL ON NULL INPUT et STRICT modifie la fonction pour qu'elle ne soit pas appele si un des arguments est NULL ;
869
ALTER FUNCTION
un rsultat NULL est alors automatiquement dtermin. Voir CREATE FUNCTION(7) pour plus d'informations.
IMMUTABLE, STABLE, VOLATILE
Modifie la volatilit de la fonction. Voir CREATE FUNCTION(7) pour plus d'informations.
[ EXTERNAL ] SECURITY INVOKER, [ EXTERNAL ] SECURITY DEFINER
Prcise si la fonction doit tre appele avec les droits de l'utilisateur qui l'a cre. Le mot cl EXTERNAL, ignor, existe pour
des raisons de compatibilit SQL. Voir CREATE FUNCTION(7) pour plus d'informations.
COST cout_execution
Modifie l'estimation du cot d'excution de la fonction. Voir CREATE FUNCTION(7) pour plus d'informations.
ROWS nb_lignes_resultat
Modifie l'estimation du nombre de lignes renvoyes par une fonction SRF. Voir CREATE FUNCTION(7) pour plus
d'informations.
parametre, valeur
Ajoute ou modifie l'initialisation d'un paramtre de configuration lorsque la fonction est appele. Si valeur est DEFAULT
ou, de faon quivalente, si RESET est utilis, le paramtre local de la fonction est supprime pour que la fonction s'excute
avec la valeur par dfaut du paramtre. Utiliser RESET ALL supprime tous les valeurs spcifiques des paramtres pour cette
fonction. SET FROM CURRENT sauvegarde la valeur courante comme valeur du paramtre appliquer lors de l'excution de
la fonction.
Voir SET(7) et Chapitre 18, Configuration du serveur pour plus d'informations sur les noms des paramtres et les valeurs autoriss.
RESTRICT
Ignor, prsent pour des raisons de conformit avec le standard SQL.
Exemples
Renommer la fonction sqrt pour le type integer en square_root :
ALTER FUNCTION sqrt(integer) RENAME TO square_root;
Changer le propritaire de la fonction sqrt pour le type integer en joe :
ALTER FUNCTION sqrt(integer) OWNER TO joe;
Modifier le schma de la fonction sqrt du type integer par maths :
ALTER FUNCTION sqrt(integer) SET SCHEMA maths;
Pour ajuster automatiquement le chemin de recherche des schmas pour une fonction :
ALTER FUNCTION verifie_motdepasse(text) SET search_path = admin, pg_temp;
Pour dsactiver le paramtre search_path d'une fonction :
ALTER FUNCTION verifie_motdepasse(text) RESET search_path;
La fonction s'excutera maintenant avec la valeur de la session pour cette variable.
Compatibilit
La compatibilit de cette instruction avec l'instruction ALTER FUNCTION du standard SQL est partielle. Le standard autorise la
modification d'un plus grand nombre de proprits d'une fonction mais ne laisse pas la possibilit de renommer une fonction, de
placer le commutateur SECURITY DEFINER sur la fonction, d'y attacher des valeurs de paramtres ou d'en modifier le propritaire, le schma ou la volatilit. Le standard requiert le mot cl RESTRICT ; il est optionnel avec PostgreSQL.
Voir aussi
CREATE FUNCTION(7), DROP FUNCTION(7)
870
Nom
ALTER GROUP Modifier le nom d'un rle ou la liste de ses membres
Synopsis
ALTER GROUP nom_groupe ADD USER nom utilisateur [, ... ]
ALTER GROUP nom_groupe DROP USER nom_utilisateur [, ... ]
ALTER GROUP nom_groupe RENAME TO nouveau_nom
Description
ALTER GROUP modifie les attributs d'un groupe d'utilisateurs Cette commande est obsolte, mais toujours accepte pour des
raisons de compatibilit ascendante. Les groupes (et les utilisateurs) ont t remplacs par le concept plus gnral de rles.
Les deux premires formes ajoutent des utilisateurs un groupe ou en suppriment. Tout rle peut tre ici utilisateur ou
groupe . Ces variantes sont rellement quivalentes la promotion ou la rvocation de l'appartenance au rle nomm
groupe ; il est donc prfrable d'utiliser GRANT(7) et REVOKE(7) pour le faire.
La troisime forme change le nom du groupe. Elle est strictement quivalente au renommage du rle par ALTER ROLE(7).
Paramtres
nom_groupe
Le nom du groupe (rle) modifier.
nom_utilisateur
Les utilisateurs (rles) ajouter au groupe ou en enlever. Les utilisateurs doivent pralablement exister ; ALTER
GROUP ne cre pas et ne dtruit pas d'utilisateur.
nouveau_nom
Le nouveau nom du groupe.
Exemples
Ajouter des utilisateurs un groupe :
ALTER GROUP staff ADD USER karl, john;
Supprimer des utilisateurs d'un groupe :
ALTER GROUP workers DROP USER beth;
Compatibilit
Il n'existe pas de relation ALTER GROUP en SQL standard.
Voir aussi
GRANT(7), REVOKE(7), ALTER ROLE(7)
871
Nom
ALTER INDEX Modifier la dfinition d'un index
Synopsis
ALTER
ALTER
ALTER
ALTER
INDEX
INDEX
INDEX
INDEX
nom
nom
nom
nom
RENAME TO nouveau_nom
SET TABLESPACE nom_espacelogique
SET ( parametre_stockage = valeur [, ... ] )
RESET ( parametre_stockage [, ... ] )
Description
ALTER INDEX modifie la dfinition d'un index. Il existe plusieurs formes de l'instruction :
RENAME
La forme RENAME modifie le nom de l'index. Cela n'a aucun effet sur les donnes stockes.
SET TABLESPACE
Cette forme remplace le tablespace de l'index par le tablespace spcifi et dplace le(s) fichier(s) de donnes associ(s)
l'index dans le nouveau tablespace. Voir aussi CREATE TABLESPACE(7).
SET ( paramtre_stockage = valeur [, ... ] )
Cette forme modifie un ou plusieurs paramtres spcifiques la mthode d'indexage de cet index. Voir CREATE INDEX(7) pour les dtails sur les paramtres disponibles. Notez que le contenu de l'index ne sera pas immdiatement modifi
par cette commande ; suivant le paramtre, vous pouvez avoir besoin de reconstruire l'index avec REINDEX(7) pour obtenir l'effet dsir.
RESET ( paramtre_stockage [, ... ] )
Cette forme rinitialise un ou plusieurs paramtres de stockage spcifiques la mthode d'indexage leurs valeurs par dfaut. Comme avec SET, un REINDEX peut tre ncessaire pour mettre jour l'index compltement.
Paramtres
nom
Le nom de l'index modifier (ventuellement qualifi du nom du schma).
nouveau_nom
Le nouveau nom de l'index.
nom_espacelogique
Le nom du tablespace dans lequel dplacer l'index.
paramtre_stockage
Le nom du paramtre de stockage spcifique la mthode d'indexage.
valeur
La nouvelle valeur du paramtre de stockage spcifique la mthode d'indexage. Cette valeur peut tre un nombre ou une
chane suivant le paramtre.
Notes
Ces oprations sont aussi possibles en utilisant ALTER TABLE(7). ALTER INDEX n'est en fait qu'un alias pour les formes
d'ALTER TABLE qui s'appliquent aux index.
Auparavant, il existait une variante ALTER INDEX OWNER mais elle est maintenant ignore (avec un message
d'avertissement). Un index ne peut pas avoir un propritaire diffrent de celui de la table. Modifier le propritaire de la table modifie automatiquement celui de l'index.
Il est interdit de modifier toute partie d'un index du catalogue systme.
Exemples
Renommer un index existant :
872
ALTER INDEX
Compatibilit
ALTER INDEX est une extension PostgreSQL.
Voir aussi
CREATE INDEX(7), REINDEX(7)
873
Nom
ALTER LANGUAGE Modifier la dfinition d'un langage procdural
Synopsis
ALTER LANGUAGE nom RENAME TO nouveau_nom
ALTER LANGUAGE nom OWNER TO nouveau_proprietaire
Description
ALTER LANGUAGE modifie la dfinition d'un langage. Les seules fonctionnalits disponibles sont le renommage du langage
et son changement de propritaire. Vous devez tre soit un super-utilisateur soit le propritaire du langage pour utiliser ALTER
LANGUAGE.
Paramtres
nom
Le nom du langage.
nouveau_nom
Le nouveau nom du langage.
new_owner
Le nouveau propritaire du langage
Compatibilit
Il n'existe pas de relation ALTER LANGUAGE dans le standard SQL.
Voir aussi
CREATE LANGUAGE(7), DROP LANGUAGE(7)
874
Nom
ALTER LARGE OBJECT Modifier la dfinition d'un Large Object
Synopsis
ALTER LARGE OBJECT oid_large_object OWNER TO nouveau_propritaire
Description
ALTER LARGE OBJECT modifie la dfinition d'un Large Object . La seule fonctionnalit disponible est l'affectation d'un
nouveau propritaire. Vous devez tre un superutilisateur ou le propritaire du Large Object pour utiliser ALTER LARGE
OBJECT.
Paramtres
oid_large_object
OID d'un Large Object modifier
nouveau_propritaire
Le nouveau propritaire du Large Object
Compatibilit
Il n'existe pas d'instruction ALTER LARGE OBJECT dans le standard SQL.
Voir aussi
Chapitre 32, Objets larges
875
Nom
ALTER OPERATOR Modifier la dfinition d'un oprateur
Synopsis
ALTER OPERATOR nom ( { type_gauche | NONE } , { type_droit | NONE } ) OWNER TO
nouveau_propritaire
ALTER OPERATOR nom ( { type_gauche | NONE } , { type_droit | NONE } ) SET SCHEMA
nouveau_schma
Description
ALTER OPERATOR modifie la dfinition d'un oprateur. La seule fonctionnalit disponible est le changement de propritaire
d'un oprateur.
Seul le propritaire de l'oprateur peut utiliser ALTER OPERATOR. Pour modifier le propritaire, il est ncessaire d'tre un
membre direct ou indirect du nouveau rle propritaire, et ce rle doit avoir le droit CREATE sur le schma de l'oprateur. Ces
restrictions assurent que la modification du propritaire produise le mme rsultat que la suppression et la re-cration de
l'oprateur ; nanmoins, un superutilisateur peut modifier le propritaire de n'importe quel oprateur.
Paramtres
nom
Le nom de l'oprateur (ventuellement qualifi du nom du schma).
type_gauche
Le type de donnes de l'oprande gauche de l'oprateur ; NONE si l'oprateur n'a pas d'oprande gauche.
type_droit
Le type de donnes de l'oprande droit de l'oprateur ; NONE si l'oprateur n'a pas d'oprande droit.
nouveau_propritaire
Le nouveau propritaire de l'oprateur.
nouveau_schma
Le nouveau schma de l'oprateur.
Exemples
Modifier le propritaire d'un oprateur personnalis a @@ b pour le type text :
ALTER OPERATOR @@ (text, text) OWNER TO joe;
Compatibilit
Il n'existe pas d'instructions ALTER OPERATOR dans le standard SQL.
Voir aussi
CREATE OPERATOR(7), DROP OPERATOR(7)
876
Nom
ALTER OPERATOR CLASS Modifier la dfinition d'une classe d'oprateur
Synopsis
ALTER OPERATOR CLASS nom USING mthode_indexage RENAME TO nouveau_nom
ALTER OPERATOR CLASS nom USING mthode_indexage OWNER TO nouveau_propritaire
ALTER OPERATOR CLASS nom USING mthode_indexage SET SCHEMA nouveau_schma
Description
ALTER OPERATOR CLASS modifie la dfinition d'une classe d'oprateur.
Seul le propritaire de la classe d'oprateur peut utiliser ALTER OPERATOR CLASS. Pour modifier le propritaire, il est
obligatoire d'tre un membre direct ou indirect du nouveau rle propritaire. Ce rle doit possder le privilge CREATE sur le
schma de la classe d'oprateur. Ces restrictions assurent que la modification du propritaire produise le mme effet que celui
obtenu par la suppression et la re-cration de la classe d'oprateur ; nanmoins, un superutilisateur peut modifier le propritaire
de n'importe quelle classe d'oprateur.
Paramtres
nom
Le nom d'une classe d'oprateur.
mthode_indexage
Le nom de la mthode d'indexage laquelle associer la classe d'oprateur.
nouveau_nom
Le nouveau nom de la classe d'oprateur.
nouveau_propritaire
Le nouveau propritaire de la classe d'oprateur.
nouveau_schma
Le nouveau schma de la classe d'oprateur.
Compatibilit
Il n'existe pas d'instruction ALTER OPERATOR CLASS dans le standard SQL.
Voir aussi
CREATE OPERATOR CLASS(7), DROP OPERATOR CLASS(7), ALTER OPERATOR FAMILY(7)
877
Nom
ALTER OPERATOR FAMILY Modifier la dfinition d'une famille d'oprateur
Synopsis
ALTER OPERATOR FAMILY nom USING methode_indexage ADD
{ OPERATOR numero_strategie nom_operateur ( type_op, type_op ) [ FOR SEARCH | FOR
ORDER BY nom_famille_tri ]
| FUNCTION numero_support [ ( type_op [ , type_op ] ) ] nom_fonction (
type_argument [, ...] )
} [, ... ]
ALTER OPERATOR FAMILY nom USING methode_indexage DROP
{ OPERATOR numero_strategie ( type_op [ , type_op ] )
| FUNCTION numero_support ( type_op [ , type_op ] )
} [, ... ]
ALTER OPERATOR FAMILY nom USING mthode_indexage RENAME TO nouveau_nom
ALTER OPERATOR FAMILY nom USING mthode_indexage OWNER TO nouveau_proprietaire
ALTER OPERATOR FAMILY name USING mthode_indexage SET SCHEMA nouveau_schma
Description
ALTER OPERATOR FAMILY modifie la dfinition d'une famille d'oprateur. Vous pouvez ajouter des oprateurs et des
fonctions du support la famille, les supprimer ou modifier le nom et le propritaire de la famille.
Quand les oprateurs et fonctions de support sont ajouts une famille avec la commande ALTER OPERATOR FAMILY, ils
ne font partie d'aucune classe d'oprateur spcifique l'intrieur de la famille. Ils sont lches dans la famille. Ceci indique
que ces oprateurs et fonctions sont compatibles avec la smantique de la famille but qu'ils ne sont pas requis pour un fonctionnement correct d'un index spcifique. (Les oprateurs et fonctions qui sont ainsi ncessaires doivent tre dclars comme faisant
partie d'une classe d'oprateur ; voir CREATE OPERATOR CLASS(7).) PostgreSQL la suppression des membres lches
d'une famille tout moment, mais les membres d'une classe d'oprateur ne peuvent pas tre supprims sans supprimer toute la
classe et les index qui en dpendent. Typiquement, les oprateurs et fonctions sur un seul type de donnes font partie des classes
d'oprateurs car ils ont besoin de supporter un index sur ce type de donnes spcifique alors que les oprateurs et familles intertypes sont fait de membres lches de la famille.
Vous devez tre superutilisateur pour utiliser ALTER OPERATOR FAMILY. (Cette restriction est faite parce qu'une dfinition errone d'une famille d'oprateur pourrait gner voire mme arrter brutalement le serveur.)
ALTER OPERATOR FAMILY ne vrifie pas encore si la dfinition de l'oprateur de famille inclut tous les oprateurs et
fonctions requis par la mthode d'indexage, ni si les oprateurs et les fonctions forment un ensemble cohrent et suffisant. C'est
de la responsabilit de l'utilisateur de dfinir une famille d'oprateur valide.
Voir Section 35.14, Interfacer des extensions d'index pour plus d'informations.
Paramtres
nom
Le nom d'une famille d'oprateur (pouvant tre qualifi du schma).
methode_indexage
Le nom de la mthode d'indexage.
numero_strategie
Le numro de stratgie de la mthode d'indexage pour un oprateur associ avec la famille.
nom_operateur
Le nom d'un oprateur (pouvant tre qualifi du schma) associ avec la famille d'oprateur.
type_op
Dans une clause OPERATOR, les types de donnes en oprande de l'oprateur, ou NONE pour signifier un oprateur unaire.
Contrairement la syntaxe comparable de CREATE OPERATOR CLASS, les types de donnes en oprande doivent toujours tre prciss.
Dans une clause ADD FUNCTION, les types de donnes des oprandes que la fonction est sense supporter, si diffrent des
types de donnes en entre de la fonction. Pour les index B-tree et hash, il n'est pas strictement ncessaire de spcifier
878
op_type car les types de donnes en entre de la fonction sont toujours les bons utiliser. Pour les index GIN et GiST, il est
ncessaire de spcifier le type de donnes en entre qui sera utilis par la fonction.
Dans une clause DROP FUNCTION, les types de donnes en oprande que la fonction est sense supporte doivent tre prciss.
nom_famille_tri
Le nom d'une famille d'oprateur btree (pouvant tre qualifi du schma) dcrivant l'ordre de tri associ l'oprateur de tri.
Si ni FOR SEARCH ni FOR ORDER BY ne sont indiqus, FOR SEARCH est la valeur par dfaut.
numero_support
Le numro de la procdure de support de la mthode d'indexage associ avec la famille d'oprateur.
nom_fonction
Le nom (pouvant tre qualifi du schma) d'une fonction qui est une procdure de support de la mthode d'indexage pour la
famille d'oprateur.
argument_types
Les types de donnes pour les arguments de la fonction.
nouveau_nom
Le nouveau nom de la famille d'oprateur
nouveau_proprietaire
Le nouveau propritaire de la famille d'oprateur
nouveau_schma
Le nouveau schma de la famille d'oprateur.
Les clauses OPERATOR et FUNCTION peuvent apparatre dans n'importe quel ordre.
Notes
Notez que la syntaxe DROP spcifie uniquement le slot dans la famille d'oprateur, par stratgie ou numro de support et types
de donnes en entre. Le nom de l'oprateur ou de la fonction occupant le slot n'est pas mentionn. De plus, pour DROP FUNCTION, les types spcifier sont les types de donnes en entre que la fonction doit supporter ; pour les index GIN et GiST, ceci
pourrait ne rien avoir faire avec les types d'argument en entre de la fonction.
Comme le processus des index ne vrifie pas les droits sur les fonctions avant de les utiliser, inclure une fonction ou un oprateur
dans une famille d'oprateur est quivalent donner le droit d'excution public. Ceci n'est gnralement pas un problme pour
les tris de fonction qui sont utiles une famille d'oprateur.
Les oprateurs ne doivent pas tre dfinis par des fonctions SQL. Une fonction SQL risque d'tre remplace dans la requte appelante, ce qui empchera l'optimiseur de savoir si la requte peut utiliser un index.
Avant PostgreSQL 8.4, la clause OPERATOR pouvait inclure une option RECHECK. Ce n'est plus support parce que le fait
qu'un oprateur d'index soit perte est maintenant dtermin l'excution. Cela permet une gestion plus efficace des cas o un
oprateur pourrait ou non tre perte.
Exemples
La commande exemple suivant ajoute des oprateurs inter-type de donnes et ajoute les fonctions de support pour une famille
d'oprateur qui contient dj les classes d'oprateur B_tree pour les types de donnes int4 et int2.
ALTER OPERATOR FAMILY integer_ops USING btree ADD
-- int4 vs
OPERATOR 1
OPERATOR 2
OPERATOR 3
OPERATOR 4
OPERATOR 5
FUNCTION 1
int2
< (int4, int2) ,
<= (int4, int2) ,
= (int4, int2) ,
>= (int4, int2) ,
> (int4, int2) ,
btint42cmp(int4, int2) ,
-- int2 vs
OPERATOR 1
OPERATOR 2
OPERATOR 3
int4
< (int2, int4) ,
<= (int2, int4) ,
= (int2, int4) ,
879
int2
(int4,
(int4,
(int4,
(int4,
(int4,
(int4,
int2)
int2)
int2)
int2)
int2)
int2)
,
,
,
,
,
,
-- int2 vs
OPERATOR 1
OPERATOR 2
OPERATOR 3
OPERATOR 4
OPERATOR 5
FUNCTION 1
int4
(int2,
(int2,
(int2,
(int2,
(int2,
(int2,
int4)
int4)
int4)
int4)
int4)
int4)
,
,
,
,
,
;
Compatibilit
Il n'existe pas d'instruction ALTER OPERATOR FAMILY dans le standard SQL.
Voir aussi
CREATE OPERATOR FAMILY(7), DROP OPERATOR FAMILY(7), CREATE OPERATOR CLASS(7), ALTER OPERATOR
CLASS(7), DROP OPERATOR CLASS(7)
880
Nom
ALTER ROLE Modifier un rle de base de donnes
Synopsis
ALTER ROLE nom [ [ WITH ] option [ ... ] ]
o option peut tre :
|
|
|
|
|
|
|
|
|
SUPERUSER | NOSUPERUSER
CREATEDB | NOCREATEDB
CREATEROLE | NOCREATEROLE
CREATEUSER | NOCREATEUSER
INHERIT | NOINHERIT
LOGIN | NOLOGIN
REPLICATION | NOREPLICATION
CONNECTION LIMIT limiteconnexion
[ ENCRYPTED | UNENCRYPTED ] PASSWORD 'motdepasse'
VALID UNTIL 'dateheure'
IN
}
IN
IN
IN
Description
ALTER ROLE modifie les attributs d'un rle PostgreSQL.
La premire variante liste dans le synopsis, permet de modifier la plupart des attributs de rle spcifiables dans la commande
CREATE ROLE(7) ( lire pour plus de dtails). (Tous les attributs possibles sont couverts, l'exception de la gestion des appartenances ; GRANT(7) et REVOKE(7) sont utiliss pour cela.) Les attributs qui ne sont pas mentionns dans la commande
conservent leur paramtrage prcdent. Tous ces attributs peuvent tre modifis pour tout rle par les superutilisateurs de base
de donnes. Les rles qui possdent le privilge CREATEROLE peuvent modifier ces paramtres, mais uniquement pour les
rles qui ne sont pas superutilisateur. Les rles ordinaires ne peuvent modifier que leur mot de passe.
La deuxime variante permet de modifier le nom du rle. Les superutilisateurs peuvent renommer n'importe quel rle. Les rles
disposant du droit CREATEROLE peuvent renommer tout rle qui n'est pas superutilisateur. L'utilisateur de la session en cours
ne peut pas tre renomm. (On se connectera sous un autre utilisateur pour cela.) Comme les mots de passe chiffrs par MD5 utilisent le nom du rle comme grain de chiffrement, renommer un rle efface son mot de passe si ce dernier est chiffr avec MD5.
Les autres variantes modifient la valeur par dfaut d'une variable de configuration de session pour un rle, soit pour toutes les
bases soit, quand la clause IN DATABASE est spcifie, uniquement pour les sessions dans la base nomme. Quand le rle
lance une nouvelle session aprs cela, la valeur spcifie devient la valeur par dfaut de la session, surchargeant tout paramtrage prsent dans postgresql.conf ou provenant de la ligne de commande de postgres. Ceci arrive seulement lors de la
connexion ; excuter SET ROLE(7) ou SET SESSION AUTHORIZATION(7) ne cause pas la configuration de nouvelles valeurs pour les paramtres. L'ensemble des paramtres pour toutes les bases est surcharg par les paramtres spcifique cette
base attachs un rle Les superutilisateurs peuvent modifier les valeurs de session de n'importe quel utilisateur. Les rles disposant du droit CREATEROLE peuvent modifier les valeurs par dfaut pour les rles ordinaires (non superutilisateurs et non rplication). Les rles standards peuvent seulement configurer des valeurs par dfaut pour eux-mmes. Certaines variables ne
peuvent tre configures de cette faon ou seulement par un superutilisateur.
Paramtres
nom
Le nom du rle dont les attributs sont modifis.
SUPERUSER, NOSUPERUSER, CREATEDB, NOCREATEDB, CREATEROLE, NOCREATEROLE, CREATEUSER, NOCREATEUSER, INHERIT, NOINHERIT, LOGIN, NOLOGIN, REPLICATION, NOREPLICATION, CONNECTION LIMIT limite_connexion, PASSWORD motdepasse, ENCRYPTED, UNENCRYPTED, VALID UNTIL 'dateheure'
Ces clauses modifient les attributs originairement configurs par CREATE ROLE(7). Pour plus d'informations, voir la page
881
ALTER ROLE
Notes
CREATE ROLE(7) est utilis pour ajouter de nouveaux rles et DROP ROLE(7) pour les supprimer.
ALTER ROLE ne peut pas modifier les appartenances un rle. GRANT(7) et REVOKE(7) sont conus pour cela.
Faites attention lorsque vous prcisez un mot de passe non chiffr avec cette commande. Le mot de passe sera transmis en clair au
serveur. Il pourrait se trouver tracer dans l'historique des commandes du client et dans les traces du serveur. psql(1) contient une
commande \password qui peut tre utilis pour changer le mot de passe d'un rle sans exposer le mot de passe en clair.
Il est galement possible de lier une valeur de session par dfaut une base de donnes plutt qu' un rle ; voir ALTER DATABASE(7). S'il y a un conflit, les paramtres spcifiques la paire base de donnes/rle surchargent ceux spcifiques au rle, qui
eux-mme surchargent ceux spcifiques la base de donnes.
Exemples
Modifier le mot de passe d'un rle :
ALTER ROLE davide WITH PASSWORD 'hu8jmn3';
Supprimer le mot de passe d'un rle :
ALTER ROLE davide WITH PASSWORD NULL;
Modifier la date d'expiration d'un mot de passe, en spcifiant que le mot de passe doit expirer midi le 4 mai 2015 fuseau horaire
UTC plus 1 heure :
ALTER ROLE chris VALID UNTIL 'May 4 12:00:00 2015 +1';
Crer un mot de passe toujours valide :
ALTER ROLE fred VALID UNTIL 'infinity';
Donner un rle la capacit de crer d'autres rles et de nouvelles bases de donnes :
ALTER ROLE miriam CREATEROLE CREATEDB;
Donner un rle une valeur diffrente de celle par dfaut pour le paramtre maintenance_work_mem :
ALTER ROLE worker_bee SET maintenance_work_mem = 100000;
Donner un rle une configuration duffrente, spcifique une base de donnes, du paramtre client_min_messages :
ALTER ROLE fred IN DATABASE devel SET client_min_messages = DEBUG;
Compatibilit
882
ALTER ROLE
Voir aussi
CREATE ROLE(7), DROP ROLE(7), SET(7)
883
Nom
ALTER SCHEMA Modifier la dfinition d'un schma
Synopsis
ALTER SCHEMA nom RENAME TO nouveau_nom
ALTER SCHEMA nom OWNER TO nouveau_propritaire
Description
ALTER SCHEMA modifie la dfinition d'un schma.
Seul le propritaire du schma peut utiliser ALTER SCHEMA. Pour renommer le schma, le droit CREATE sur la base est
obligatoire. Pour modifier le propritaire, il faut tre membre, direct ou indirect, du nouveau rle propritaire, et possder le
droit CREATE sur la base (les superutilisateurs ont automatiquement ces droits).
Paramtres
nom
Le nom du schma.
nouveau_nom
Le nouveau nom du schma. Il ne peut pas commencer par pg_, noms rservs aux schmas systme.
nouveau_propritaire
Le nouveau propritaire du schma.
Compatibilit
Il n'existe pas de relation ALTER SCHEMA dans le standard SQL.
Voir aussi
CREATE SCHEMA(7), DROP SCHEMA(7)
884
Nom
ALTER SEQUENCE Modifier la dfinition d'un gnrateur de squence
Synopsis
ALTER
[
[
[
[
[
ALTER
ALTER
ALTER
Description
ALTER SEQUENCE modifie les paramtres d'un gnrateur de squence. Tout paramtre non prcis dans la commande ALTER SEQUENCE conserve sa valeur prcdente. Pour modifier le propritaire, vous devez aussi tre un membre direct ou indirect du nouveau rle propritaire, et ce rle doit avoir le droit CREATE sur le schma de la squence (ces restrictions permettent de s'assurer que modifier le propritaire ne fait rien de plus que ce que vous pourriez faire en supprimant puis recrant la
squence ; nanmoins un superutilisateur peut dj modifier le propritaire de toute squence).
Seul le propritaire de la squence peut utiliser ALTER SEQUENCE. Pour modifier le schma de la squence, il faut possder
le droit CREATE sur le nouveau schma.
Paramtres
nom
Le nom de la squence modifier (ventuellement qualifi du nom du schma).
increment
La clause INCREMENT BY increment est optionnelle. Une valeur positive cre une squence croissante, une valeur ngative une squence dcroissante. Lorsque cette clause n'est pas spcifie, la valeur de l'ancien incrment est conserve.
valeurmin, NO MINVALUE
La clause optionnelle MINVALUE valeurmin, dtermine la valeur minimale de la squence. Si NO MINVALUE est utilis, les valeurs par dfaut, 1 et -263-1 sont utilises respectivement pour les squences croissantes et decroissantes. Si aucune
option n'est prcise, la valeur minimale courante est conserve.
valeurmax, NO MAXVALUE
La clause optionnelle MAXVALUE valeurmax dtermine la valeur maximale de la squence. Si NO MAXVALUE est utilis, les valeurs par dfaut 263-1 et -1 sont utilises respectivement pour les squences croissantes et dcroissantes. Si aucune
option n'est prcise, la valeur maximale courante est conserve.
dbut
La clause optionnelle START WITH dbut modifie la valeur de dpart enregistr pour la squence. Cela n'a pas d'effet
sur la valeur actuelle de celle-ci ; cela configure la valeur que les prochaines commandes ALTER SEQUENCE RESTART utiliseront.
restart
La clause optionnelle RESTART [ WITH restart ] modifie la valeur actuelle de la squence. C'est quivalent
l'appel de la fonction setval avec is_called = false : la valeur spcifie sera renvoye par le prochain appel
nextval. crire RESTART sans valeur pour restart est quivalent fournir la valeur de dbut enregistre par
CREATE SEQUENCE ou par ALTER SEQUENCE START WITH.
cache
La clause CACHE cache active la prallocation des numros de squences et leur stockage en mmoire pour en acclerer
l'accs. 1 est la valeur minimale (une seule valeur est engendre la fois, soit pas de cache). Lorsque la clause n'est pas spcifie, l'ancienne valeur est conserve.
CYCLE
Le mot cl optionnel CYCLE est utilis pour autoriser la squence boucler lorsque valeurmax ou valeurmin est at885
ALTER SEQUENCE
teint par, respectivement, une squence croissante ou dcroissante. Lorsque la limite est atteinte, le prochain numro engendr
est, respectivement, valeurmin ou valeurmax.
NO CYCLE
Si le mot cl optionnel NO CYCLE est spcifi, tout appel nextval alors que la squence a atteint sa valeur maximale,
dans le cas d'une squence croissante, ou sa valeur minimale dans le cas contraire, retourne une erreur. Lorsque ni CYCLE ni
NO CYCLE ne sont spcifis, l'ancien comportement est prserv.
OWNED BY table.colonne, OWNED BY NONE
L'option OWNED BY permet d'associer la squence une colonne spcifique d'une table pour que cette squence soit supprime automatiquement si la colonne (ou la table complte) est supprime. Si cette option est spcifie, cette association remplacera toute ancienne association de cette squence. La table indique doit avoir le mme propritaire et tre dans le mme
schma que la squence. Indiquer OWNED BY NONE supprime toute association existante, rendant la squence son
autonomie .
nouveau_propritaire
Le nom utilisateur du nouveau propritaire de la squence.
nouveau_nom
Le nouveau nom de la squence.
nouveau_schema
Le nouveau schma de la squence.
Notes
Pour viter de bloquer des transactions concurrentes lors de la demande de numros issus de la mme squence, les effets d'ALTER SEQUENCE sur les paramtres de gnration de la squence ne sont jamais annulables. Ces changements prennent effet
immdiatement et ne sont pas rversibles. Nanmoins, les clauses OWNED BY, OWNER TO, RENAME TO et SET SCHEMA sont
des modifications ordinaires du catalogue et, de ce fait, peuvent tre annules.
ALTER SEQUENCE n'affecte pas immdiatement les rsultats de nextval pour les sessions, l'exception de la session courante, qui ont prallou (cach) des valeurs de la squence. Elles puisent les valeurs en cache avant de prendre en compte les modifications sur les paramtres de gnration de la squence. La session l'origine de la commande est, quant elle, immdiatement
affecte.
ALTER SEQUENCE ne modifie pas le statut currval d'une squence (avant PostgreSQL 8.3, c'tait le cas quelque fois).
Pour des raisons historiques, ALTER TABLE peut aussi tre utilis avec les squences, mais seules les variantes d'ALTER
TABLE autorises pour les squences sont quivalentes aux formes affiches ci-dessus.
Exemples
Redmarrez la squence serial 105 :
ALTER SEQUENCE serial RESTART WITH 105;
Compatibilit
ALTER SEQUENCE est conforme au standard SQL, l'exception des variantes START WITH, OWNED BY, OWNER TO, RENAME TO et SET SCHEMA qui sont une extension PostgreSQL.
Voir aussi
CREATE SEQUENCE(7), DROP SEQUENCE(7)
886
Nom
ALTER SERVER modifier la dfinition d'un serveur distant
Synopsis
ALTER SERVER nom_serveur [ VERSION 'nouvelle_version' ]
[ OPTIONS ( [ ADD | SET | DROP ] option ['valeur'] [, ... ] ) ]
ALTER SERVER nom_serveur OWNER TO nouveau_propritaire
Description
ALTER SERVER modifie la dfinition d'un serveur distant. La premire forme modifie la chane de version du serveur ou les
options gnriques du serveur (au moins une clause est ncessaire). La seconde forme modifie le propritaire du serveur.
Pour modifier le serveur, vous devez tre le propritaire du serveur. De plus, pour modifier le propritaire, vous devez possder
le serveur ainsi qu'tre un membre direct ou indirect du nouveau rle, et vous devez avoir le droit USAGE sur le wrapper de donnes distantes du serveur. (Notez que les superutilisateurs satisfont tout ces critres automatiquement.)
Paramtres
nom_serveur
Le nom d'un serveur existant.
nouvelle_version
Nouvelle version du serveur.
OPTIONS ( [ ADD | SET | DROP ] option ['valeur'] [, ... ] )
Modifie des options pour le serveur. ADD, SET et DROP spcifient les actions excuter. Si aucune opration n'est spcifie
explicitement, l'action est ADD. Les noms d'options doivent tre uniques ; les noms et valeurs sont aussi valids en utilisant
la bibliothque de wrapper de donnes distantes.
Exemples
Modifier le serveur foo et lui ajouter des options de connexion :
ALTER SERVER foo OPTIONS (host 'foo', dbname 'dbfoo');
Modifier le serveur foo, modifier sa version, modifier son option host :
ALTER SERVER foo VERSION '8.4' OPTIONS (SET host 'baz');
Compatibilit
ALTER SERVER est conforme ISO/IEC 9075-9 (SQL/MED).
Voir aussi
CREATE SERVER(7), DROP SERVER(7)
887
Nom
ALTER TABLE Modifier la dfinition d'une table
Synopsis
ALTER TABLE [ ONLY ] nom [ * ]
action [, ... ]
ALTER TABLE [ ONLY ] nom [ * ]
RENAME [ COLUMN ] colonne TO nouvelle_colonne
ALTER TABLE nom
RENAME TO nouveau_nom
ALTER TABLE nom
SET SCHEMA nouveau_schema
o action peut tre :
ADD [ COLUMN ] colonne type [ COLLATE collation ] [ contrainte_colonne [ ... ] ]
DROP [ COLUMN ] [ IF EXISTS ] colonne [ RESTRICT | CASCADE ]
ALTER [ COLUMN ] colonne [ SET DATA ] TYPE type [ COLLATE collation ] [ USING
expression ]
ALTER [ COLUMN ] colonne SET DEFAULT expression
ALTER [ COLUMN ] colonne DROP DEFAULT
ALTER [ COLUMN ] colonne { SET | DROP } NOT NULL
ALTER [ COLUMN ] colonne SET STATISTICS entier
ALTER [ COLUMN ] column SET ( option_attribut = valeur [, ... ] )
ALTER [ COLUMN ] column RESET ( option_attribut [, ... ] )
ALTER [ COLUMN ] colonne SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
ADD contrainte_table [ NOT VALID ]
ADD contrainte_table_utilisant_index
VALIDATE CONSTRAINT constraint_name
DROP CONSTRAINT [ IF EXISTS ] nom_contrainte [ RESTRICT | CASCADE ]
DISABLE TRIGGER [ nom_declencheur | ALL | USER ]
ENABLE TRIGGER [ nom_declencheur | ALL | USER ]
ENABLE REPLICA TRIGGER nom_trigger
ENABLE ALWAYS TRIGGER nom_trigger
DISABLE RULE nom_regle_reecriture
ENABLE RULE nom_regle_reecriture
ENABLE REPLICA RULE nom_regle_reecriture
ENABLE ALWAYS RULE nom_regle_reecriture
CLUSTER ON nom_index
SET WITHOUT CLUSTER
SET WITH OIDS
SET WITHOUT OIDS
SET ( paramtre_stockage = valeur [, ... ] )
RESET ( paramtre_stockage [, ... ] )
INHERIT table_parent
NO INHERIT table_parent
OF nom_type
NOT OF
OWNER TO nouveau_proprietaire
SET TABLESPACE nouvel_espacelogique
et table_constraint_using_index est:
[ CONSTRAINT constraint_name ]
{ UNIQUE | PRIMARY KEY } USING INDEX index_name
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
Description
ALTER TABLE modifie la dfinition d'une table existante. Il existe plusieurs variantes :
ADD COLUMN
Ajoute une nouvelle colonne la table en utilisant une syntaxe identique celle de CREATE TABLE(7).
DROP COLUMN [ IF EXISTS ]
888
ALTER TABLE
Supprime une colonne de la table. Les index et les contraintes de table rfrenant cette colonne sont automatiquement supprims. L'option CASCADE doit tre utilise lorsque des objets en dehors de la table dpendent de cette colonne, comme par
exemple des rfrences de cls trangres ou des vues. Si IF EXISTS est indiqu et que la colonne n'existe pas, aucune erreur n'est renvoye. Dans ce cas, un message d'avertissement est envoy la place.
SET DATA TYPE
Change le type d'une colonne de la table. Les index et les contraintes simples de table qui impliquent la colonne sont automatiquement convertis pour utiliser le nouveau type de la colonne en r-analysant l'expression d'origine. La clause optionnelle
COLLATE spcifie une collation pour la nouvelle colonne. Si elle est omise, la collation utilise est la collation par dfaut
pour le nouveau type de la colonne. La clause optionnelle USING prcise comment calculer la nouvelle valeur de la colonne
partir de l'ancienne ; en cas d'omission, la conversion par dfaut est identique une affectation de transtypage de l'ancien type
vers le nouveau. Une clause USING doit tre fournie s'il n'existe pas de conversion implicite ou d'assignement entre les deux
types.
SET/DROP DEFAULT
Ajoute ou supprime les valeurs par dfaut d'une colonne. Les valeurs par dfaut ne s'appliquent qu'aux commandes INSERT
ultrieures. Elles ne modifient pas les lignes dj prsentes dans la table. Des valeurs par dfaut peuvent aussi tre cres pour
les vues. Dans ce cas, elles sont ajoutes aux commandes INSERT de la vue avant que la rgle ON INSERT de la vue ne soit
applique.
SET/DROP NOT NULL
Modifie l'autorisation de valeurs NULL. SET NOT NULL ne peut tre utilis que si la colonne ne contient pas de valeurs
NULL.
SET STATISTICS
Permet de modifier l'objectif de collecte de statistiques par colonne pour les oprations d'analyse (ANALYZE(7)) ultrieures.
L'objectif prend une valeur entre 0 et 10000. il est positionn -1 pour utiliser l'objectif de statistiques par dfaut du systme
(default_statistics_target). Pour plus d'informations sur l'utilisation des statistiques par le planificateur de requtes de PostgreSQL, voir Section 14.2, Statistiques utilises par le planificateur .
SET ( attribute_option = value [, ... ] ), RESET ( attribute_option [, ... ] )
Cette syntaxe permet de configurer ou de rinitialiser des proprits. Actuellement, les seules proprits acceptes sont
n_distinct et n_distinct_alled, qui surchargent l'estimation du nombre de valeurs distinctes calcule par ANALYZE(7) n_distinct affecte les statistiques de la table elle-mme alors que n_distinct_alled affecte les statistiques rcupres pour la table et les tables en hritant. Si configur une valeur positive, ANALYZE supposera que la colonne contient exactement le nombre spcifi de valeurs distinctes non NULL. Si configur une valeur ngative qui doit tre
suprieur ou gale -1, ANALYZE supposera que le nombre de valeurs distinctes non NULL dans la colonne est linaire par
rapport la taille de la table ; le nombre total est calculer en multipliant la taille estime de la table par la valeur absolue de
ce nombre. Par exemple, une valeur de -1 implique que toutes les valeurs dans la colonne sont distinctes alors qu'une valeur
de -0,5 implique que chaque valeur apparat deux fois en moyenne. Ceci peut tre utile quand la taille de la table change dans
le temps, car la multiplication par le nombre de lignes dans la table n'est pas ralise avant la planification. Spcifiez une valeur de 0 pour retourner aux estimations standards du nombre de valeurs distinctes. Pour plus d'informations sur l'utilisation
des statistiques par le planificateur de requtes PostgreSQL, rfrez vous Section 14.2, Statistiques utilises par le planificateur .
SET STORAGE
Modifie le mode de stockage pour une colonne. Cela permet de contrler si cette colonne est conserve en ligne ou dans une
deuxime table, appele table TOAST, et si les donnes sont ou non compresses. PLAIN, en ligne, non compress, est utilis
pour les valeurs de longueur fixe, comme les integer. MAIN convient pour les donnes en ligne, compressibles. EXTERNAL
est fait pour les donnes externes non compresses, EXTENDED pour les donnes externes compresses. EXTENDED est la
valeur par dfaut pour la plupart des types qui supportent les stockages diffrents de PLAIN. L'utilisation d'EXTERNAL permet d'acclrer les oprations d'extraction de sous-chanes sur les trs grosses valeurs de types text et bytea mais utilise plus
d'espace de stockage. SET STORAGE ne modifie rien dans la table, il configure la stratgie poursuivre lors des mises jour
de tables suivantes. Voir Section 55.2, TOAST pour plus d'informations.
ADD contrainte_table [ NOT VALID ]
Ajoute une nouvelle contrainte une table en utilisant une syntaxe identique CREATE TABLE(7), plus l'option NOT VALID, qui est actuellement seulement autorise pour les contraintes de type cl trangre. Si la contrainte est marque NOT
VALID, la vrification initiale, potentiellement lente, permettant de s'assurer que toutes les lignes de la table satisfont la
contrainte, est ignore. La contrainte sera toujours assure pour les insertions et mises jour suivantes (autrement dit, elles
choueront sauf s'il existe une ligne correspondante dans la table rfrence). Par contre, la base de donnes ne supposera pas
que la contrainte est valable pour toutes les lignes dans la table, tant que la contrainte n'a pas t valide en utilisant l'option
VALIDATE CONSTRAINT.
ADD table_constraint_using_index
Cette forme ajoute une nouvelle contrainte PRIMARY KEY ou UNIQUE sur une table, base sur un index unique existant au889
ALTER TABLE
Note
Ajouter une contrainte en utilisant un index existant peut tre utile dans les situations o il faut ajouter une
nouvelle contrainte, sans bloquer les mises jour de table trop longtemps. Pour faire cela, crez l'index avec
CREATE INDEX CONCURRENTLY, puis installez-la en tant que contrainte officielle en utilisant cette
syntaxe. Voir l'exemple ci-dessous.
VALIDATE CONSTRAINT
Cette forme valide une contrainte de type cl trangre qui a t prcdemment cre avec la clause NOT VALID. Elle le fait
en parcourant la table pour s'assurer qu'aucune ligne n'ait une rfrence invalide. Si la contrainte est dj marque valide, cette
clause ne fait rien.
La validation peut tre un processus long sur des tables volumineuses et ncessite actuellement un verrou ACCESS EXCLUSIVE. Sparer la validation de la cration initiale a comme intrt de pouvoir diffrer la validation un moment moins charg ou peut tre utilis pour donner un dlai supplmentaire pour corriger les erreurs pr-existantes tout en empchant l'ajout
de nouvelles erreurs.
DROP CONSTRAINT [ IF EXISTS ]
Supprime la contrainte de table prcise. Si IF EXISTS est prcis et que la contrainte n'existe pas, aucune erreur n'est renvoye. Par contre, un message d'avertissement est lanc.
DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER
Configure l'excution des dclencheurs dfinis sur la table. Un dclencheur dsactiv est toujours connu par le systme mais
n'est plus excut lorsque l'vnement dclencheur survient. Pour un dclencheur retard, le statut d'activit est vrifi au moment o survient l'vnement, et non quand la fonction du dclencheur est rellement excute. Il est possible de dsactiver
ou d'activer un dclencheur spcifique (prcis par son nom), tous les dclencheurs d'une table ou seulement les dclencheurs
utilisateur de cette table (cette option exclut les dclencheurs gnrs en interne pour grer les contraintes comme ceux utiliss pour implanter les contraintes de cls trangres ou les contraintes dferrs uniques ou d'exclusion). Dsactiver ou activer
les dclencheurs implicites de contraintes requiert des droits de superutilisateur ; cela doit se faire avec prcaution car
l'intgrit de la contrainte ne peut pas tre garantie si les dclencheurs ne sont pas excuts. Le mcanisme de dclenchement
des triggers est aussi affect par la variable de configuration session_replication_role. Les triggers activs (ENABLE) se dclencheront quand le rle de rplication est origin (la valeur par dfaut) ou local . Les triggers configurs ENABLE
REPLICA se dclencheront seulement si la session est en mode replica et les triggers ENABLE ALWAYS se dclencheront chaque fois, quelque soit le mode de rplication.
DISABLE/ENABLE [ REPLICA | ALWAYS ] RULE
Ces formes configurent le dclenchement des rgles de rcriture appartenant la table. Une rgle dsactive est toujours
connue par le systme mais non applique lors de la rcriture de la requte. La smantique est identique celles des triggers
activs/dsactivs. Cette configuration est ignore pour les rgles ON SELECT qui sont toujours appliqus pour conserver le
bon fonctionnement des vues mme si la session actuelle n'est pas dans le rle de rplication par dfaut.
CLUSTER
Slectionne l'index par dfaut pour les prochaines oprations CLUSTER(7). La table n'est pas rorganise.
SET WITHOUT CLUSTER
Supprime de la table la spcification d'index CLUSTER(7) la plus rcemment utilise. Cela agit sur les oprations de rorganisation suivantes qui ne spcifient pas d'index.
SET WITH OIDS
Cette forme ajoute une colonne systme oid la table (voir Section 5.4, Colonnes systme ). Elle ne fait rien si la table a
890
ALTER TABLE
dj des OID.
Ce n'est pas quivalent ADD COLUMN oid oid. Cette dernire ajouterait une colonne normale nomme oid, qui n'est
pas une colonne systme.
SET WITHOUT OIDS
Supprime la colonne systme oid de la table. Cela est strictement quivalent DROP COLUMN oid RESTRICT, ceci
prs qu'aucun avertissement n'est mis si la colonne oid n'existe plus.
SET ( paramtre_stockage = valeur [, ... ] )
Cette forme modifie un ou plusieurs paramtres de stockage pour la table. Voir la section intitule Paramtres de stockage
pour les dtails sur les paramtres disponibles. Le contenu de la table ne sera pas modifi immdiatement par cette commande ; en fonction du paramtre, il pourra s'avrer ncessaire de rcrire la table pour obtenir les effets dsirs. Ceci peut se
faire avec VACUUM FULL, CLUSTER(7) ou une des formes d'ALTER TABLE qui force une rcriture de la table.
Note
Bien que CREATE TABLE autorise la spcification de OIDS avec la syntaxe WITH (paramtre_stockage), ALTER TABLE ne traite pas les OIDS comme un paramtre de stockage. la place,
utiliser les formes SET WITH OIDS et SET WITHOUT OIDS pour changer le statut des OID sur la table.
RESET ( paramtre_stockage [, ... ] )
Cette forme rinitialise un ou plusieurs paramtres de stockage leur valeurs par dfaut. Comme avec SET, une rcriture de
table pourrait tre ncessaire pour mettre jour entirement la table.
INHERIT table_parent
Cette forme ajoute la table cible comme nouvel enfant la table parent indique. En consquence, les requtes concernant le
parent ajouteront les enregistrements de la table cible. Pour tre ajoute en tant qu'enfant, la table cible doit dj contenir
toutes les colonnes de la table parent (elle peut avoir des colonnes supplmentaires). Les colonnes doivent avoir des types qui
correspondent, et s'il y a des contraintes NOT NULL dfini pour le parent, alors elles doivent aussi avoir les contraintes NOT
NULL pour l'enfant.
Il doit y avoir aussi une correspondance des contraintes de tables enfants pour toutes les contraintes CHECK. Actuellement, les
contraintes UNIQUE, PRIMARY KEY et FOREIGN KEY ne sont pas prises en compte mais ceci pourrait changer dans le futur.
NO INHERIT table_parent
Cette forme supprime une table cible de la liste des enfants de la table parent indique. Les requtes envers la table parent
n'incluront plus les enregistrements de la table cible.
OF nom_type
Cette forme lie la table un type composite comme si la commande CREATE TABLE OF l'avait cre. la liste des noms de
colonnes et leurs types doit correspondre prcisment ceux du type composite ; il est permis de diffrer la prsence d'une colonne systme oid. . La table ne doit pas hriter d'une autre table. Ces restrictions garantissent que la commande CREATE
TABLE OF pourrait permettre la dfinition d'une table quivalente.
NOT OF
Cette forme dissocie une table type de son type.
OWNER
Change le propritaire d'une table, d'une squence ou d'une vue. Le nouveau propritaire est celui pass en paramtre.
SET TABLESPACE
Remplace le tablespace de la table par le tablespace spcifi et dplace le(s) fichier(s) de donnes associ(s) la table vers le
nouveau tablespace. Les index de la table, s'il y en a, ne sont pas dplacs ; mais ils peuvent l'tre sparment l'aide de commandes SET TABLESPACE supplmentaires. Voir aussi CREATE TABLESPACE(7).
RENAME
Change le nom d'une table (d'un index, d'une squence ou d'une vue) ou le nom d'une colonne individuelle de la table. Cela
n'a aucun effet sur la donne stocke.
SET SCHEMA
Dplace la table dans un autre schma. Les index, les contraintes et les squences utilises dans les colonnes de table sont
galement dplacs.
Toutes les actions l'exception de RENAME et SET SCHEMA peuvent tre combines dans une liste d'altrations appliquer en
parallle. Par exemple, il est possible d'ajouter plusieurs colonnes et/ou de modifier le type de plusieurs colonnes en une seule
commande. Ceci est particulirement utile avec les grosses tables car une seule passe sur la table est alors ncessaire.
891
ALTER TABLE
Il faut tre propritaire de la table pour utiliser ALTER TABLE. Pour modifier le schma d'une table, le droit CREATE sur le
nouveau schma est requis. Pour ajouter la table en tant que nouvel enfant d'une table parent, vous devez aussi tre propritaire de
la table parent. Pour modifier le propritaire, il est ncessaire d'tre un membre direct ou indirect du nouveau rle et ce dernier
doit avoir le droit CREATE sur le schma de la table. (Ces restrictions assurent que la modification du propritaire ne diffre en
rien de ce qu'il est possible de faire par la suppression et le recration de la table. Nanmoins, un superutilisateur peut modifier le
propritaire de n'importe quelle table.)
Paramtres
nom
Le nom (ventuellement qualifi du nom du schma) de la table modifier. Si ONLY est indiqu avant le nom de la table,
seule cette table est modifie. Dans le cas contraire, la table et toutes ses tables filles (s'il y en a) sont modifies. En option, *
peut tre ajout aprs le nom de la table pour indiquer explicitement que les tables filles doivent tre inclues.
colonne
Le nom d'une colonne, existante ou nouvelle.
nouvelle_colonne
Le nouveau nom d'une colonne existante.
nouveau_nom
Le nouveau nom de la table.
type
Le type de donnes de la nouvelle colonne, ou le nouveau type de donnes d'une colonne existante.
contraintedetable
Une nouvelle contrainte de table pour la table.
nomdecontrainte
Le nom d'une contrainte existante supprimer.
CASCADE
Les objets qui dpendent de la colonne ou de la contrainte supprime sont automatiquement supprims (par exemple, les vues
rfrenant la colonne).
RESTRICT
La colonne ou la contrainte n'est pas supprime si des objets en dpendent. C'est le comportement par dfaut.
nom_declencheur
Le nom d'un dclencheur isol dsactiver ou activer.
ALL
Dsactiver ou activer tous les dclencheurs appartenant la table. (Les droits de superutilisateur sont ncessaires si l'un des
dclencheurs est un dclencheur interne pour la gestion d'une contrainte comme ceux utiliss pour implanter les contraintes de
type cls trangres ou les contraintes dferrables comme les contraintes uniques et d'exclusion.)
USER
Dsactiver ou activer tous les dclencheurs appartenant la table sauf les dclencheurs systmes permettant de grer en interne certaines contraintes, comme celles utilises pour implanter les contraintes de type cls trangres ou les contraintes dferrables comme les contraintes uniques et d'exclusion.)
nomindex
Le nom de l'index sur lequel la table doit tre rorganise.
paramtre_stockage
Le nom d'un paramtre de stockage de la table.
valeur
La nouvelle valeur d'un paramtre de stockage de la table. Cela peut tre un nombre ou un mot suivant le paramtre.
table_parent
Une table parent associer ou dissocier de cette table.
nouveau_propritaire
Le nom du nouveau propritaire de la table.
nouvel_espacelogique
Le nom du tablespace o dplacer la table.
892
ALTER TABLE
nouveau_schema
Le nom du schma o dplacer la table.
Notes
Le mot cl COLUMN n'est pas ncessaire. Il peut tre omis.
Quand une colonne est ajoute avec ADD COLUMN, toutes les lignes existantes de cette table sont initialises avec la valeur par
dfaut de la colonne (NULL si aucune clause DEFAULT n'a t dfinie).
Ajouter une colonne avec une valeur par dfaut diffrente de NULL ou modifier le type d'une colonne existante requiert que la
table entire et les index soient rcrits. Il existe une exception : si la clause USING ne change pas le contenu de la colonne et que
l'ancien type est soit transformable de faon binaire dans le nouveau type, ou bien un domaine sans contrainte reposant sur le nouveau type, alors il n'est pas ncessaire de rcrire la table, mais tous les index sur les colonnes affectes doivent quand mme tre
reconstruits. Le fait d'ajouter ou de supprimer une colonne systme oid ncessite galement une rcriture complte de la table.
Les reconstructions de table et/ou d'index peuvent prendre un temps significatif pour une grosse table, et peuvent ncessiter temporairement de doubler l'espace disque utilis.
Ajouter une contrainte CHECK ou NOT NULL requiert de parcourir la table pour vrifier que les lignes existantes respectent cette
contrainte.
La raison principale de la possibilit de spcifier des changements multiples l'aide d'une seule commande ALTER TABLE est
la combinaison en une seule passe sur la table de plusieurs parcours et rcritures.
La forme DROP COLUMN ne supprime pas physiquement la colonne, mais la rend simplement invisible aux oprations SQL. Par
la suite, les ordres d'insertion et de mise jour sur cette table stockent une valeur NULL pour la colonne. Ainsi, supprimer une colonne ne rduit pas immdiatement la taille de la table sur disque car l'espace occup par la colonne n'est pas rcupr. Cet espace
est rcupr au fur et mesure des mises jour des lignes de la table. (Ceci n'est pas vrai quand on supprime la colonne systme
oid ; ceci est fait avec une rcriture immdiate de la table.)
Pour forcer une rcriture immdiate de la table, vous pouvez utiliser VACUUM FULL, CLUSTER(7) ou bien une des formes de
la commande ALTER TABLE qui force une rcriture. Ceci ne cause pas de modifications visibles dans la table, mais limine des
donnes qui ne sont plus utiles.
L'option USING de SET DATA TYPE peut en fait utiliser une expression qui implique d'anciennes valeurs de la ligne ;
c'est--dire qu'il peut tre fait rfrence aussi bien aux autres colonnes qu' celle en cours de conversion. Cela permet d'effectuer
des conversions trs gnrales l'aide de la syntaxe SET DATA TYPE. cause de cette flexibilit, l'expression USING n'est pas
applique la valeur par dfaut de la colonne (s'il y en a une) : le rsultat pourrait ne pas tre une expression constante requise
pour une valeur par dfaut. Lorsqu'il n'existe pas de transtypage, implicite ou d'affectation, entre les deux types, SET DATA
TYPE peut chouer convertir la valeur par dfaut alors mme que la clause USING est spcifie. Dans de ce cas, il convient de
supprimer valeur par dfaut avec DROP DEFAULT, d'excuter ALTER TYPE et enfin d'utiliser SET DEFAULT pour ajouter une
valeur par dfaut approprie. Des considrations similaires s'appliquent aux index et contraintes qui impliquent la colonne.
Si une table est hrite, il n'est pas possible d'ajouter, de renommer ou de modifier le type d'une colonne dans la table parent sans
le faire aussi pour ses descendantes. De ce fait, la commande ALTER TABLE ONLY est rejete. Cela assure que les colonnes
des tables descendantes correspondent toujours celles de la table parent.
Un appel rcursif DROP COLUMN supprime la colonne d'une table descendante si et seulement si cette table n'hrite pas cette
colonne d'une autre table et que la colonne n'y a pas t dfinie indpendamment de tout hritage. Une suppression non rcursive
de colonne (ALTER TABLE ONLY ... DROP COLUMN) ne supprime jamais les colonnes descendantes ; elles sont marques
comme dfinies de manire indpendante, plutt qu'hrites.
Les actions TRIGGER, CLUSTER, OWNER, et TABLESPACE ne sont jamais propages aux tables descendantes ; c'est--dire
qu'elles agissent comme si ONLY est spcifi. Seuls les ajouts de contraintes CHECK sont propags, et c'est d'ailleurs obligatoire
pour ces contraintes.
Tout changement sur une table du catalogue systme est interdit.
Voir la commande CREATE TABLE(7) pour avoir une description plus complte des paramtres valides. Chapitre 5, Dfinition
des donnes fournit de plus amples informations sur l'hritage.
Exemples
Ajouter une colonne de type varchar une table :
ALTER TABLE distributeurs ADD COLUMN adresse varchar(30);
Supprimer une colonne de table :
893
ALTER TABLE
894
ALTER TABLE
Compatibilit
Les formes ADD (without USING INDEX), DROP, SET DEFAULT et SET DATA TYPE (sans USING) se conforment au standard SQL. Les autres formes sont des extensions PostgreSQL, tout comme la possibilit de spcifier plusieurs manipulations en
une seule commande ALTER TABLE.
ALTER TABLE DROP COLUMN peut tre utilis pour supprimer la seule colonne d'une table, laissant une table dpourvue de
colonne. C'est une extension au SQL, qui n'autorise pas les tables sans colonne.
See Also
CREATE TABLE(7)
895
Nom
ALTER TABLESPACE Modifier la dfinition d'un tablespace
Synopsis
ALTER
ALTER
ALTER
ALTER
TABLESPACE
TABLESPACE
TABLESPACE
TABLESPACE
Description
ALTER TABLESPACE modifie la dfinition d'un tablespace.
Seul le propritaire du tablespace peut utiliser ALTER TABLESPACE. Pour modifier le propritaire, il est ncessaire d'tre un
membre direct ou indirect du nouveau rle propritaire (les superutilisateurs ont automatiquement tous ces droits).
Paramtres
nom
Le nom du tablespace.
nouveau_nom
Le nouveau nom du tablespace. Le nouveau nom ne peut pas dbuter par pg_ car ces noms sont rservs aux espaces logiques systme.
nouveau_propritaire
Le nouveau propritaire du tablespace.
paramtre_tablespace
Un paramtre du tablespace configurer ou rinitialiser. Actuellement, les seuls paramtres disponibles sont
seq_page_cost et random_page_cost. Configurer une valeur pour un tablespace particulier surchargera
l'estimation habituelle du planificateur pour le cot de lecture de pages pour les tables du tablespace, comme indiqu par les
paramtres de configuration du mme nom (voir seq_page_cost, random_page_cost). Ceci peut tre utile si un tablespace se
trouve sur un disque qui est plus rapide ou plus lent du reste du systme d'entres/sorties.
Exemples
Renommer le tablespace espace_index en raid_rapide :
ALTER TABLESPACE espace_index RENAME TO raid_rapide;
Modifier le propritaire du tablespace espace_index :
ALTER TABLESPACE espace_index OWNER TO mary;
Compatibilit
Il n'existe pas d'instruction ALTER TABLESPACE dans le standard SQL.
Voir aussi
CREATE TABLESPACE(7), DROP TABLESPACE(7)
896
Nom
ALTER TEXT SEARCH CONFIGURATION modifier la dfinition d'une configuration de recherche plein texte
Synopsis
ALTER TEXT SEARCH CONFIGURATION nom
ADD MAPPING FOR type_jeton [, ... ] WITH nom_dictionnaire [, ... ]
ALTER TEXT SEARCH CONFIGURATION nom
ALTER MAPPING FOR type_jeton [, ... ] WITH nom_dictionnaire [, ... ]
ALTER TEXT SEARCH CONFIGURATION nom
ALTER MAPPING REPLACE vieux_dictionnaire WITH nouveau_dictionnaire
ALTER TEXT SEARCH CONFIGURATION nom
ALTER MAPPING FOR type_jeton [, ... ] REPLACE vieux_dictionnaire WITH
nouveau_dictionnaire
ALTER TEXT SEARCH CONFIGURATION nom
DROP MAPPING [ IF EXISTS ] FOR type_jeton [, ... ]
ALTER TEXT SEARCH CONFIGURATION nom RENAME TO nouveau_nom
ALTER TEXT SEARCH CONFIGURATION nom OWNER TO nouveau_proprietaire
ALTER TEXT SEARCH CONFIGURATION nom SET SCHEMA nouveau_schma
Description
ALTER TEXT SEARCH CONFIGURATION modifie la dfinition d'une configuration de recherche plein texte. Vous pouvez modifier les correspondances partir des types de jeton vers des dictionnaires, ou modifier le nom ou le propritaire de la
configuration.
Vous devez tre le propritaire de la configuration pour utiliser ALTER TEXT SEARCH CONFIGURATION.
Paramtres
nom
Le nom de la configuration de recherche plein texte (pouvant tre qualifi du schma).
type_jeton
Le nom d'un type de jeton qui est mis par l'analyseur de configuration.
nom_dictionnaire
Le nom d'un dictionnaire de recherche plein texte consulter pour le type de jeton spcifi. Si plusieurs dictionnaires sont
lists, ils sont consults dans l'ordre d'apparence.
ancien_dictionnaire
Le nom d'un dictionnaire de recherche plein texte remplacer dans la correspondance.
nouveau_dictionnaire
Le nom d'un dictionnaire de recherche plein texte substituer ancien_dictionnaire.
nouveau_nom
Le nouveau nom de la configuration de recherche plein texte.
newowner
Le nouveau propritaire de la configuration de recherche plein texte.
nouveau_schma
Le nouveau schma de la configuration de recherche plein texte.
La forme ADD MAPPING FOR installe une liste de dictionnaires consulter pour les types de jeton indiqus ; il y a une erreur
s'il y a dj une correspondance pour un des types de jeton. La forme ALTER MAPPING FOR fait de mme mais en commenant par supprimer toute correspondance existante avec ces types de jeton. Les formes ALTER MAPPING REPLACE substituent nouveau_dictionnaire par ancien_dictionnaire partout o ce dernier apparat. Ceci se fait pour les seuls
types de jeton indiqus quand FOR apparat ou pour toutes les correspondances de la configuration dans le cas contraire. La
forme DROP MAPPING supprime tous les dictionnaire pour les types de jeton spcifis, faisant en sorte que les jetons de ces
types soient ignors par la configuration de recherche plein texte. Il y a une erreur s'il n'y a pas de correspondance pour les types
de jeton sauf si IF EXISTS a t ajout.
897
Exemples
L'exemple suivant remplace le dictionnaire english avec le dictionnaire swedish partout o english est utilis dans
ma_config.
ALTER TEXT SEARCH CONFIGURATION ma_config
ALTER MAPPING REPLACE english WITH swedish;
Compatibilit
Il n'existe pas d'instructions ALTER TEXT SEARCH CONFIGURATION dans le standard SQL.
Voir aussi
CREATE TEXT SEARCH CONFIGURATION(7), DROP TEXT SEARCH CONFIGURATION(7)
898
Nom
ALTER TEXT SEARCH DICTIONARY modifier la dfinition d'un dictionnaire de recherche plein texte
Synopsis
ALTER TEXT
option
)
ALTER TEXT
ALTER TEXT
ALTER TEXT
Description
ALTER TEXT SEARCH DICTIONARY modifie la dfinition d'un dictionnaire de recherche plein texte. Vous pouvez modifier les options spcifiques au modle d'un dictionnaire. Vous pouvez aussi modifier le nom du dictionnaire et son propritaire.
Vous devez tre superutilisateur pour utiliser ALTER TEXT SEARCH DICTIONARY.
Paramtres
nom
Le nom du dictionnaire de recherche plein texte (pouvant tre qualifi du schma).
option
Le nom d'une option, spcifique au modle, configurer pour ce dictionnaire.
valeur
La nouvelle valeur utiliser pour une option spcifique au modle. Si le signe gale et la valeur sont omises, alors toute valeur prcdente de cette option est supprime du dictionnaire, permettant ainsi l'utilisation de la valeur par dfaut.
nouveau_nom
Le nouveau nom du dictionnaire de recherche plein texte.
nouveau_proprietaire
Le nouveau propritaire du dictionnaire de recherche plein texte.
nouveau_schma
Le nouveau schma du dictionnaire de recherche plein texte.
Les options spcifiques au modle peuvent apparatre dans n'importe quel ordre.
Exemples
La commande exemple suivant modifie la liste des mots d'arrt par un dictionnaire bas sur Snowball. Les autres paramtres
restent inchangs.
ALTER TEXT SEARCH DICTIONARY mon_dico ( StopWords = nouveaurusse );
La commande exemple suivante modifie la langue par le hollandais et supprime compltement l'option des mots d'arrt.
ALTER TEXT SEARCH DICTIONARY mon_dico ( language = dutch, StopWords );
La commande exemple suivante met jour la dfinition du dictionnaire sans rien modifier.
ALTER TEXT SEARCH DICTIONARY mon_dico ( dummy );
(Ceci fonctionne parce que le code de suppression de l'option ne se plaint pas s'il n'y a pas d'options.) Cette astuce est utile lors
de la modification des fichiers de configuration pour le dictionnaire : la commande ALTER forcera les sessions existantes relire les fichiers de configuration, ce qu'elles ne feraient jamais si elles les avaient dj lus.
899
Compatibilit
Il n'existe pas d'instruction ALTER TEXT SEARCH DICTIONARY dans le standard SQL.
Voir aussi
CREATE TEXT SEARCH DICTIONARY(7), DROP TEXT SEARCH DICTIONARY(7)
900
Nom
ALTER TEXT SEARCH PARSER modifier la dfinition d'un analyseur de recherche plein texte
Synopsis
ALTER TEXT SEARCH PARSER nom RENAME TO nouveau_nom
ALTER TEXT SEARCH PARSER nom SET SCHEMA nouveau_schma
Description
ALTER TEXT SEARCH PARSER modifie la dfinition d'un analyseur de recherche plein texte. Actuellement, la seule fonctionnalit supporte est la modification du nom de l'analyseur.
Vous devez tre superutilisateur pour utiliser ALTER TEXT SEARCH PARSER.
Paramtres
nom
Le nom de l'analyseur de recherche plein texte (pouvant tre qualifi du schma).
nouveau_nom
Le nouveau nom de l'analyseur de recherche plein texte.
nouveau_schma
Le nouveau schma de l'analyseur de recherche plein texte.
Compatibilit
Il n'existe pas d'instruction ALTER TEXT SEARCH PARSER dans le standard SQL.
Voir aussi
CREATE TEXT SEARCH PARSER(7), DROP TEXT SEARCH PARSER(7)
901
Nom
ALTER TEXT SEARCH TEMPLATE modifier la dfinition d'un modle de recherche plein texte
Synopsis
ALTER TEXT SEARCH TEMPLATE nom RENAME TO nouveau_nom
ALTER TEXT SEARCH TEMPLATE nom SET SCHEMA nouveau_schma
Description
ALTER TEXT SEARCH TEMPLATE modifie la dfinition d'un modle de recherche plein texte. Actuellement, la seule
fonctionnalit supporte est la modification du nom du modle.
Vous devez tre superutilisateur pour utiliser ALTER TEXT SEARCH TEMPLATE.
Paramtres
nom
Le nom du modle de recherche plein texte (pouvant tre qualifi du schma).
nouveau_nom
Le nouveau nom du modle de recherche plein texte.
nouveau_schma
Le nouveau schma du modle de recherche plein texte.
Compatibilit
Il n'existe pas d'instruction ALTER TEXT SEARCH TEMPLATE dans le standard SQL.
Voir aussi
CREATE TEXT SEARCH TEMPLATE(7), DROP TEXT SEARCH TEMPLATE(7)
902
Nom
ALTER TRIGGER Modifier la dfinition d'un dclencheur
Synopsis
ALTER TRIGGER nom ON table RENAME TO nouveau_nom
Description
ALTER TRIGGER modifie les proprits d'un dclencheur. La clause RENAME renomme le dclencheur sans en changer la
dfinition.
Seul le propritaire de la table sur laquelle le dclencheur agit peut modifier ses proprits.
Paramtres
nom
Le nom du dclencheur modifier.
table
La table sur laquelle le dclencheur agit.
nouveau_nom
Le nouveau nom du dclencheur.
Notes
La possibilit d'activer ou de dsactiver temporairement un dclencheur est offerte par ALTER TABLE(7), et non par ALTER
TRIGGER qui ne permet pas d'agir sur tous les dclencheurs d'une table en une seule opration.
Exemples
Renommer un dclencheur :
ALTER TRIGGER emp_stamp ON emp RENAME TO emp_track_chgs;
Compatibilit
ALTER TRIGGER est une extension PostgreSQL au standard SQL.
Voir aussi
ALTER TABLE(7)
903
Nom
ALTER TYPE Modifier la dfinition d'un type
Synopsis
ALTER TYPE
ALTER TYPE
ALTER TYPE
RESTRICT ]
ALTER TYPE
ALTER TYPE
Description
ALTER TYPE modifie la dfinition d'un type existant. Les variantes suivantes existent :
ADD ATTRIBUTE
Cette forme ajoute un nouvel attribut un type composite, avec la mme syntaxe que CREATE TYPE(7).
DROP ATTRIBUTE [ IF EXISTS ]
Cette forme supprime un attribut d'un type composite. Si IF EXISTS est spcifi et que l'attribut cible n'existe pas, aucun
message d'erreur ne sera mis, mais remplac par une alerte de niveau NOTICE.
SET DATA TYPE
Cette forme modifie le type d'un attribut d'un type composite.
OWNER
Cette forme modifie le propritaire d'un type.
RENAME
Cette forme permet de modifier le nom du type ou celui d'un attribut d'un type composite.
SET SCHEMA
Cette forme dplace le type dans un autre schma.
ADD VALUE [ BEFORE | AFTER ]
Cette forme ajoute une valeur une numration. Si la position de la nouvelle valeur n'est pas spcifie en utilisant BEFORE ou AFTER, le nouvel lment est plac en fin de liste.
CASCADE
Autorise la propagation automatique de la modification vers les tables types concernes par le type modifi, ainsi que leurs
ventuels descendants.
RESTRICT
Interdit l'opration si le type est dj rfrenc par des tables types. Il s'agit du comportement par dfaut.
Les actions ADD ATTRIBUTE, DROP ATTRIBUTE, et ALTER ATTRIBUTE peuvent tre combines dans une liste de modifications multiples appliquer en parallle. Il est ainsi possible d'ajouter et/ou modifier plusieurs attributs par une seule et mme
commande.
Seul le propritaire du type peut utiliser ALTER TYPE. Pour modifier le schma d'un type, le droit CREATE sur le nouveau
schma est requis. Pour modifier le propritaire, il faut tre un membre direct ou indirect du nouveau rle propritaire et ce rle
doit avoir le droit CREATE sur le schma du type (ces restrictions assurent que la modification du propritaire ne va pas au-del
de ce qui est possible par la suppression et la recration du type ; toutefois, un superutilisateur peut modifier le propritaire de
n'importe quel type).
Paramtres
nom
904
ALTER TYPE
Notes
ALTER TYPE ... ADD VALUE (cette forme qui ajoute une nouvelle valeur une numration) ne peut tre excute
l'intrieur d'une transaction.
Les comparaisons faisant intervenir une valeur ajoute postriori peuvent quelquefois s'avrer plus lentes que celles portant uniquement sur les valeurs originales d'un type numr. Ce ralentissement ne devrait toutefois intervenir que si la position de la nouvelle valeur a t spcifie en utilisant les options BEFORE ou AFTER, au lieu d'insrer la nouvelle valeur en fin de liste. Ce ralentissement peut galement se produire, bien que la nouvelle valeur ait t insre en fin d'numration, en cas de bouclage du
compteur des OID depuis la cration du type numr. Le ralentissement est gnralement peu significatif ; mais s'il s'avre important, il est toujours possible de retrouver les performances optimales par une suppression / recration du type numr, ou encore par sauvegarde et rechargement de la base.
Exemples
Pour renommer un type de donnes :
ALTER TYPE courrier_electronique RENAME TO courriel;
Donner la proprit du type courriel joe :
ALTER TYPE courriel OWNER TO joe;
Changer le schma du type courriel en clients :
ALTER TYPE courriel SET SCHEMA clients;
Ajouter un nouvel attribut un type composite :
ALTER TYPE compfoo ADD ATTRIBUTE f3 int;
Ajouter une nouvelle valeur une numration, en spcifiant sa position de tri :
ALTER TYPE colors ADD VALUE 'orange' AFTER 'red';
Compatibilit
905
ALTER TYPE
Les variantes permettant d'ajouter et supprimer un attribut font partie du standard SQL ; les autres variantes sont des extensions
spcifiques PostgreSQL.
Voir aussi
CREATE TYPE(7), DROP TYPE(7)
906
Nom
ALTER USER Modifier un rle de la base de donnes
Synopsis
ALTER USER nom [ [ WITH ] option [ ... ] ]
o option peut tre :
|
|
|
|
|
|
|
|
|
SUPERUSER | NOSUPERUSER
CREATEDB | NOCREATEDB
CREATEROLE | NOCREATEROLE
CREATEUSER | NOCREATEUSER
INHERIT | NOINHERIT
LOGIN | NOLOGIN
REPLICATION | NOREPLICATION
CONNECTION LIMIT limite_connexion
[ ENCRYPTED | UNENCRYPTED ] PASSWORD 'motdepasse'
VALID UNTIL 'dateheure'
USER
USER
USER
USER
nom
nom
nom
nom
Description
ALTER USER est dsormais un alias de ALTER ROLE(7).
Compatibilit
La commande ALTER USER est une extension PostgreSQL. En effet, le standard SQL laisse le choix de la dfinition des
utilisateurs au SGBD.
Voir aussi
ALTER ROLE(7)
907
Nom
ALTER USER MAPPING change la dfinition d'une correspondance d'utilisateurs (user mapping)
Synopsis
ALTER USER MAPPING FOR { nom_utilisateur | USER | CURRENT_USER | PUBLIC }
SERVER nom_serveur
OPTIONS ( [ ADD | SET | DROP ] option ['valeur'] [, ... ] )
Description
ALTER USER MAPPING change la dfinition d'une correspondance d'utilisateur (user mapping).
Le propritaire d'un serveur distant peut aussi altrer les correspondances d'utilisateurs pour ce serveur pour tout utilisateur. Par
ailleurs, un utilisateur peut modifier une correspondance d'utilisateur pour son propre nom d'utilisateur s'il a reu le droit USAGE
sur le serveur distant.
Paramtres
nom_utilisateur
Nom d'utilisateur de la correspondance. CURRENT_USER et USER correspondent au nom de l'utilisateur courant. PUBLIC
est utilis pour correspondre tous les noms d'utilisateurs prsents et futurs du systme.
nom_serveur
Nom du serveur de la correspondance d'utilisateur.
OPTIONS ( [ ADD | SET | DROP ] option ['valeur'] [, ... ] )
Modifie l'option pour la correspondance d'utilisateur. La nouvelle option crase toute option prcdemment spcifie. ADD,
SET et DROP spcifient l'action excuter. Si aucune action n'est spcifie, l'action est ADD. Les noms d'options doivent
tre uniques ; les options sont aussi valides par le wrapper de donnes distantes du serveur.
Exemples
Modifier le mot de passe pour la correspondance d'utilisateur bob, et le serveur foo :
ALTER USER MAPPING FOR bob SERVER foo OPTIONS (user 'bob', password 'public');
Compatibilit
ALTER USER MAPPING est conforme la norme ISO/IEC 9075-9 (SQL/MED). Il y a un problme de syntaxe subtil : le
standard omet le mot cl FOR. Puisque CREATE USER MAPPING et DROP USER MAPPING utilisent tous les deux FOR
un endroit analogue et que DB2 d'IBM (l'autre implmentation majeure de SQL/MED) l'impose aussi pour ALTER USER
MAPPING, PostgreSQL diverge du standard pour des raisons de cohrence et de compatibilit.
Voir aussi
CREATE USER MAPPING(7), DROP USER MAPPING(7)
908
Nom
ALTER VIEW modifier la dfinition d'une vue
Synopsis
ALTER
ALTER
ALTER
ALTER
ALTER
VIEW
VIEW
VIEW
VIEW
VIEW
nom
nom
nom
nom
nom
Description
ALTER VIEW modifie diffrentes proprits d'une vue. Si vous voulez modifier la requte dfinissant la vue, utilisez
CREATE OR REPLACE VIEW.)
Vous devez tre le propritaire de la vue pour utiliser ALTER VIEW. Pour modifier le schma d'une vue, vous devez aussi
avoir le droit CREATE sur le nouveau schma. Pour modifier le propritaire, vous devez aussi tre un membre direct ou indirect
de nouveau rle propritaire, et ce rle doit avoir le droit CREATE sur le schma de la vue. Ces restrictions permettent de
s'assurer que le changement de propritaire ne fera pas plus que ce que vous pourriez faire en supprimant et en recrant la vue.
Nanmoins, un superutilisateur peut changer le propritaire de n'importe quelle vue.
Paramtres
nom
Le nom de la vue (pouvant tre qualifi du schma).
SET/DROP DEFAULT
Ces formes ajoutent ou suppriment la valeur par dfaut pour une colonne. Une valeur par dfaut associe la colonne d'une
vue est insre avec des instructions INSERT sur la vue avant que la rgle ON INSERT ne soit applique, si INSERT
n'indique pas de valeur pour la colonne.
nouveau_propritaire
Nom utilisateur du nouveau propritaire de la vue.
nouveau_nom
Nouveau nom de la vue.
nouveau_schma
Nouveau schma de la vue.
Notes
Pour des raisons historiques, ALTER TABLE peut aussi tre utilis avec des vues ; mais seules les variantes de ALTER
TABLE qui sont acceptes avec les vues sont quivalentes celles affiches ci-dessus.
Exemples
Pour renommer la vue foo en bar :
ALTER VIEW foo RENAME TO bar;
Compatibilit
ALTER VIEW est une extensions PostgreSQL du standard SQL.
Voir aussi
CREATE VIEW(7), DROP VIEW(7)
909
Nom
ANALYZE Collecter les statistiques d'une base de donnes
Synopsis
ANALYZE [ VERBOSE ] [ table [ (colonne [, ...] ) ] ]
Description
ANALYZE collecte des statistiques sur le contenu des tables de la base de donnes et stocke les rsultats dans le catalogue systme pg_statistic. L'optimiseur de requtes les utilise pour dterminer les plans d'excution les plus efficaces.
Sans paramtre, ANALYZE examine chaque table de la base de donnes courante. Avec un paramtre, ANALYZE examine
seulement la table concerne. Il est possible de donner une liste de noms de colonnes, auquel cas seules les statistiques concernant ces colonnes sont collectes.
Paramtres
VERBOSE
L'affichage de messages de progression est activ.
table
Le nom (ventuellement qualifi du nom du schma) de la table analyser. Par dfaut, toutes les tables de la base de donnes courante sont analyses.
column
Le nom d'une colonne analyser. Par dfaut, toutes les colonnes le sont.
Sorties
Quand VERBOSE est spcifi, ANALYZE affiche des messages de progression pour indiquer la table en cours de traitement.
Diverses statistiques sur les tables sont aussi affiches.
Notes
Dans la configuration par dfaut de PostgreSQL, le dmon autovacumm (voir Section 23.1.5, Le dmon auto-vacuum )
l'analyse automatique des tables quand elle est remplie de donnes sont la premire fois, puis chaque fois qu'elles sont modifies via les oprations habituelles. Quand l'autovacuum est dsactiv, il est intressant de lancer ANALYZE priodiquement
ou juste aprs avoir effectu de grosses modifications sur le contenu d'une table. Des statistiques jour aident l'optimiseur
choisir le plan de requte le plus appropri et amliorent ainsi la vitesse du traitement des requtes. Une stratgie habituelle
consiste lancer VACUUM(7) et ANALYZE une fois par jour, au moment o le serveur est le moins sollicit.
ANALYZE ne requiert qu'un verrou en lecture sur la table cible. Il peut donc tre lanc en parallle d'autres activits sur la
table.
Les statistiques rcupres par ANALYZE incluent habituellement une liste des quelques valeurs les plus communes dans
chaque colonne et un histogramme affichant une distribution approximative des donnes dans chaque colonne. L'un ou les deux
peuvent tre omis si ANALYZE les juge inintressants (par exemple, dans une colonne cl unique, il n'y a pas de valeurs
communes) ou si le type de donnes de la colonne ne supporte pas les oprateurs appropris. Il y a plus d'informations sur les
statistiques dans le Chapitre 23, Planifier les tches de maintenance.
Pour les grosses tables, ANALYZE prend alatoirement plusieurs lignes de la table, au hasard, plutt que d'examiner chaque
ligne. Ceci permet des tables trs larges d'tre examines rapidement. Nanmoins, les statistiques ne sont qu'approximatives et
changent lgrement chaque fois qu'ANALYZE est lanc, mme si le contenu rel de la table n'a pas chang. Cela peut rsulter en de petites modifications dans les cots estims par l'optimiseur affichs par EXPLAIN(7). Dans de rares situations, ce
non-dterminisme entrane le choix par l'optimiseur d'un plan de requte diffrent entre deux lancements d'ANALYZE. Afin
d'viter cela, le nombre de statistiques rcupres par ANALYZE peut tre augment, comme cela est dcrit ci-dessous.
L'tendue de l'analyse est contrle par l'ajustement de la variable de configuration default_statistics_target ou colonne par colonne en initialisant la cible des statistiques par colonne avec ALTER TABLE ... ALTER COLUMN ... SET STATISTICS
(voir ALTER TABLE(7)). Cette valeur cible initialise le nombre maximum d'entres dans la liste des valeurs les plus communes
et le nombre maximum de points dans l'histogramme. La valeur cible par dfaut est fixe 100 mais elle peut tre ajuste vers le
haut ou vers le bas afin d'obtenir un bon compromis entre la prcision des estimations de l'optimiseur, le temps pris par ANA910
ANALYZE
LYZE et l'espace total occup dans pg_statistic. En particulier, initialiser la cible des statistiques zro dsactive la collecte
de statistiques pour cette colonne. Cela peut s'avrer utile pour les colonnes qui ne sont jamais utilises dans les clauses WHERE,
GROUP BY ou ORDER BY des requtes puisque l'optimiseur ne fait aucune utilisation des statistiques de ces colonnes.
La plus grande cible de statistiques parmi les colonnes en cours d'analyse dtermine le nombre de lignes testes pour prparer les
statistiques de la table. Augmenter cette cible implique une augmentation proportionnelle du temps et de l'espace ncessaires
l'excution d'ANALYZE.
Une des valeurs estimes par ANALYZE est le nombre de valeurs distinctes qui apparaissent dans chaque colonne. Comme seul
un sous-ensemble des lignes est examin, cette estimation peut parfoir tre assez inexacte, mme avec la cible statistique la plus
large possible. Si cette inexactitude amne de mauvais plans de requtes, une valeur plus prcise peut tre dtermine manuellement, puis configure avec ALTER TABLE ... ALTER COLUMN ... SET (n_distinct = ...) (voir ALTER TABLE(7) pour plus
de dtails).
Si la table en cours d'analyse a un ou plusieurs enfants, ANALYZE rcuprera deux fois les statistiques : une fois sur les lignes de
la table parent seulement et une deuxime fois sur les lignes de la table parent et de tous ses enfants. Nanmoins, le dmon autovacuum ne considrera que les insertions et mises jour sur la table parent pour dcider du lancement automatique d'un ANALYZE.
Si des lignes sont rarement insres ou mises jour dans cette table, les statistiques d'hritage ne seront jour que si vous lancez
manuellement un ANALYZE.
Compatibilit
Il n'existe pas d'instruction ANALYZE dans le standard SQL.
Voir aussi
VACUUM(7), vacuumdb(1), Section 18.4.3, Report du VACUUM en fonction de son cot , Section 23.1.5, Le dmon autovacuum
911
Nom
BEGIN Dbuter un bloc de transaction
Synopsis
BEGIN [ WORK | TRANSACTION ] [ mode_transaction [, ...] ]
o mode_transaction peut tre :
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ
UNCOMMITTED }
READ WRITE | READ ONLY
[ NOT ] DEFERRABLE
Description
BEGIN initie un bloc de transaction, c'est--dire que toutes les instructions apparaissant aprs la commande BEGIN sont excutes dans une seule transaction jusqu' ce qu'un COMMIT(7) ou ROLLBACK(7) explicite soit excut. Par dfaut (sans BEGIN), PostgreSQL excute les transactions en mode autocommit , c'est--dire que chaque instruction est excute dans sa
propre transaction et une validation (commit) est traite implicitement la fin de l'instruction (si l'excution a russi, sinon une
annulation est excute).
Les instructions sont excutes plus rapidement dans un bloc de transaction parce que la squence dbut/validation de transaction demande une activit significative du CPU et du disque. L'excution de plusieurs instructions dans une transaction est aussi
utile pour s'assurer d'une cohrence lors de la ralisation de certains modifications lies : les autres sessions ne voient pas les
tats intermdiaires tant que toutes les mises jour ne sont pas ralises.
Si le niveau d'isolation, le mode lecture/criture ou le mode diffrable sont spcifis, la nouvelle transaction possde ces caractristiques, comme si SET TRANSACTION(7) tait excute.
Paramtres
WORK, TRANSACTION
Mots cls optionnels. Ils n'ont pas d'effet.
SET TRANSACTION(7) prsente la signification des autres paramtres de cette instruction.
Notes
START TRANSACTION(7) a la mme fonctionnalit que BEGIN.
COMMIT(7) ou ROLLBACK(7) sont utiliss pour terminer un bloc de transaction.
Lancer BEGIN en tant dj dans un bloc de transaction provoque l'apparition d'un message d'avertissement, mais l'tat de la
transaction n'en est pas affect. Pour intgrer des transactions l'intrieur d'un bloc de transaction, les points de sauvegarde sont
utiliss (voir SAVEPOINT(7)).
Pour des raisons de compatibilit descendante, les virgules entre chaque mode_transaction peuvent tre omises.
Exemples
Commencer un bloc de transaction :
BEGIN;
Compatibilit
BEGIN, qui est une extension PostgreSQL, est quivalent la commande START TRANSACTION(7) du standard SQL. La
page de rfrence de cette commande contient des informations de compatibilit supplmentaires.
L'option DEFERRABLE de transaction_mode est une extension de PostgreSQL.
Le mot cl BEGIN est utilis dans un but diffrent en SQL embarqu. La smantique de la transaction doit tre tudie avec prcaution lors du portage d'applications.
912
BEGIN
Voir aussi
COMMIT(7), ROLLBACK(7), START TRANSACTION(7), SAVEPOINT(7)
913
Nom
CHECKPOINT Forcer un point de vrification dans le journal des transactions
Synopsis
CHECKPOINT
Description
Les WAL (Write-Ahead Log, journaux de transactions) placent un point de vrification dans le journal des transactions intervalle rgulier. (Pour ajuster cet intervalle, voir les options de configuration l'excution checkpoint_segments et checkpoint_timeout.) La commande CHECKPOINT force un point de vrification immdiat, sans attendre le point de vrification
planifi.
Un point de vrification est un point dans la squence du journal des transactions pour lequel tous les fichiers de donnes ont t
mis jour pour reflter l'information des journaux. Tous les fichiers de donnes sont crits sur le disque. Il convient de se rfrer
Chapitre 29, Fiabilit et journaux de transaction pour plus d'informations sur le systme WAL.
S'il est excut durant une restauration, la commande CHECKPOINT forcera un point de redmarrage plutt que l'criture d'un
nouveau point de vrification.
Seuls les superutilisateurs peuvent appeler CHECKPOINT. Cette commande ne doit pas tre utilise en fonctionnement normal.
Compatibilit
La commande CHECKPOINT est une extension PostgreSQL.
914
Nom
CLOSE Fermer un curseur
Synopsis
CLOSE { nom | ALL }
Description
CLOSE libre les ressources associes un curseur ouvert. Une fois le curseur ferm, aucune opration n'est autorise sur celuici. Un curseur doit tre ferm lorsqu'il n'est plus ncessaire.
Tout curseur volatil ouvert (NDT : On parle en anglais de non-holdable cursor, soit un curseur qui ne perdure pas audel de la transaction qui l'a cr) est ferm implicitement lorsqu'une transaction est termine avec COMMIT ou ROLLBACK.
Un curseur persistant (NDT : holdable cursor en anglais, ou curseur qui perdure au-del de la transaction initiale) est implicitement ferm si la transaction qui l'a cr est annule via ROLLBACK. Si cette transaction est valide (avec succs), ce
curseur reste ouvert jusqu' ce qu'une commande CLOSE explicite soit lance ou jusqu' la dconnexion du client.
Paramtres
name
Le nom du curseur ouvert fermer.
ALL
Ferme tous les curseurs ouverts.
Notes
PostgreSQL ne possde pas d'instruction explicite d'ouverture (OPEN) de curseur ; un curseur est considr ouvert sa dclaration. Un curseur est dclar l'aide de l'instruction DECLARE(7).
Vous pouvez voir tous les curseurs disponibles en excutant une requte sur la vue systme pg_cursors.
Si un curseur est ferm aprs un point de sauvegarde qui est annul par la suite, la commande CLOSE n'est pas annule ; autrement dit, le curseur reste ferm.
Exemples
Fermer le curseur liahona :
CLOSE liahona;
Compatibilit
CLOSE est totalement conforme au standard SQL. CLOSE ALL est une extension PostgreSQL.
Voir aussi
DECLARE(7), FETCH(7), MOVE(7)
915
Nom
CLUSTER Rorganiser une table en fonction d'un index
Synopsis
CLUSTER [VERBOSE] nom_table [ USING nom_index ]
CLUSTER [VERBOSE]
Description
CLUSTER rorganise (groupe) la table nom_table en fonction de l'index nom_index. L'index doit avoir t pralablement
dfini sur nom_table.
Une table reorganise est physiquement rordonne en fonction des informations de l'index. Ce regroupement est une opration
ponctuelle : les actualisations ultrieures ne sont pas rorganises. C'est--dire qu'aucune tentative n'est ralise pour stocker les
lignes nouvelles ou actualises d'aprs l'ordre de l'index. (Une rorganisation priodique peut tre obtenue en relanant la commande aussi souvent que souhait. De plus, configurer le paramtre FILLFACTOR moins de 100% peut aider prserver
l'ordre du cluster lors des mises jour car les lignes mises jour sont conserves dans la mme page si suffisamment d'espace
est disponible ici.)
Quand une table est rorganise, PostgreSQL enregistre l'index utilis cet effet. La forme CLUSTER nom_table rorganise la table en utilisant le mme index qu'auparavant. Vous pouvez aussi utiliser les formes CLUSTER ou SET WITHOUT
CLUSTER de ALTER TABLE(7) pour initialiser l'index de faon ce qu'il soit intgr aux prochaines oprations cluster our
pour supprimer tout prcdent paramtre.
CLUSTER, sans paramtre, rorganise toutes les tables de la base de donnes courante qui ont dj t rorganises et dont
l'utilisateur est propritaire, ou toutes les tables s'il s'agit d'un superutilisateur. Cette forme de CLUSTER ne peut pas tre excute l'intrieur d'une transaction.
Quand une table est en cours de rorganisation, un verrou ACCESS EXCLUSIVE est acquis. Cela empche toute opration sur
la table ( la fois en lecture et en criture) pendant l'excution de CLUSTER.
Paramtres
nom_table
Le nom d'une table (ventuellement qualifi du nom du schma).
nom_index
Le nom d'un index.
VERBOSE
Affiche la progression pour chaque table traite.
Notes
Lorsque les lignes d'une table sont accdes alatoirement et unitairement, l'ordre rel des donnes dans la table n'a que peu
d'importance. Toutefois, si certaines donnes sont plus accdes que d'autres, et qu'un index les regroupe, l'utilisation de CLUSTER peut s'avrer bnfique. Si une requte porte sur un ensemble de valeurs indexes ou sur une seule valeur pour laquelle
plusieurs lignes de la table correspondent, CLUSTER est utile. En effet, lorsque l'index identifie la page de la table pour la premire ligne correspondante, toutes les autres lignes correspondantes sont dj probablement sur la mme page de table, ce qui
diminue les accs disque et acclre la requte.
CLUSTER peut trier de nouveau en utilisant soit un parcours de l'index spcifi soit (si l'index est un Btree) un parcours squentiel suivi d'un tri. Il choisira la mthode qui lui semble la plus rapide, en se basant sur les paramtres de cot du planificateur et sur les statistiques disponibles.
Quand un parcours d'index est utilis, une copie temporaire de la table est cre. Elle contient les donnes de la table dans
l'ordre de l'index. Des copies temporaires de chaque index sur la table sont aussi cres. Du coup, vous devez disposer d'un espace libre sur le disque d'une taille au moins gale la somme de la taille de la table et des index.
Quand un parcours squentiel suivi d'un tri est utilis, un fichier de tri temporaire est aussi cr. Donc l'espace temporaire requis
correspond au maximum le double de la taille de la table et des index. Cette mthode est gnralement plus rapide que le parcours d'index mais si le besoin en espace disque est trop important, vous pouvez dsactiver ce choix en dsactivant temporairement enable_sort (off).
916
CLUSTER
Il est conseill de configurer maintenance_work_mem une valeur suffisamment large (mais pas plus importante que la quantit
de mmoire que vous pouvez ddier l'opration CLUSTER) avant de lancer la commande.
Puisque le planificateur enregistre les statistiques d'ordonnancement des tables, il est conseill de lancer ANALYZE(7) sur la table
nouvellement rorganise. Dans le cas contraire, les plans de requtes peuvent tre mal choisis par le planificateur.
Comme CLUSTER se rappelle les index utiliss pour cette opration, un utilisateur peut excuter manuellement des commandes
CLUSTER une premire fois, puis configurer un script de maintenance priodique qui n'excutera qu'un CLUSTER sans paramtres, pour que les tables soient frquemment tries physiquement.
Exemples
Rorganiser la table employes sur la base de son index employes_ind :
CLUSTER employes ON employes_ind;
Rorganiser la relation employes en utilisant le mme index que prcdemment :
CLUSTER employes;
Rorganiser toutes les tables de la base de donnes qui ont dj t pralablement rorganises :
CLUSTER;
Compatibilit
Il n'existe pas d'instruction CLUSTER dans le standard SQL.
La syntaxe
CLUSTER nom_index ON nom_table
est aussi supporte pour la compatibilit avec les versions de PostgreSQL antrieures la 8.3.
Voir aussi
clusterdb(1)
917
Nom
COMMENT Dfinir ou modifier le commentaire associ un objet
Synopsis
COMMENT ON
{
AGGREGATE nom_agrgat (type_agrgat [, ...] ) |
CAST (type_source AS type_cible) |
COLLATION nom_objet |
COLUMN nom_relation.nom_colonne |
CONSTRAINT nom_contrainte ON nom_table |
CONVERSION nom_objet |
DATABASE nom_objet |
DOMAIN nom_objet |
EXTENSION nom_objet |
FOREIGN DATA WRAPPER nom_objet |
FOREIGN TABLE nom_objet |
FUNCTION nom_fonction ( [ [ modearg ] [ nomarg ] typearg [, ...] ] ) |
INDEX nom_objet |
LARGE OBJECT oid_large_objet |
OPERATOR op (type_operande1, type_operande2) |
OPERATOR CLASS nom_objet USING mthode_indexage |
OPERATOR FAMILY nom_objet USING methode_index |
ROLE nom_objet |
RULE nom_rgle ON nom_table |
SCHEMA nom_objet |
SEQUENCE nom_objet |
SERVER nom_objet |
TABLE nom_objet |
TABLESPACE nom_objet |
TEXT SEARCH CONFIGURATION nom_objet |
TEXT SEARCH DICTIONARY nom_objet |
TEXT SEARCH PARSER nom_objet |
TEXT SEARCH TEMPLATE nom_objet |
TRIGGER nom_dclencheur ON nom_table |
TYPE nom_objet |
VIEW nom_objet
} IS 'texte'
Description
COMMENT stocke un commentaire sur un objet de la base de donnes.
Seule une chane de commentaire est stocke pour chaque objet, donc pour modifier un commentaire, lancer une nouvelle commande COMMENT pour le mme objet. Pour supprimer un commentaire, crire un NULL la place dans la chane de texte.
Les commentaires sont automatiquement supprimes quand leur objet est supprim.
Pour la plupart des types d'objet, seul le propritaire de l'objet peut configurer le commentaire. Les rles n'ont pas de propritaires, donc la rgle pour COMMENT ON ROLE est que vous devez tre superutilisateur pour commenter un rle superutilisateur
ou avoir l'attribut CREATEROLE pour commenter des rles standards. Bien sr, un superutilisateur peut ajouter un commentaire
sur n'importe quel objet.
Les commentaires sont visibles avec la famille de commandes \d, de psql. D'autres interfaces utilisateur de rcupration des
commentaires peuvent tre construites au-dessus des fonctions intgres qu'utilise psql, savoir obj_description,
col_description et shobj_description. (Voir Tableau 9.51, Fonctions d'informations sur les commentaires .)
Paramtres
nom_objet, nom_relation.nom_colonne, nom_agrgat, nom_contrainte, nom_fonction, op,
nom_oprateur, nom_rgle, nom_dclencheur
Le nom de l'objet commenter. Les noms des tables, agrgats, collationnements, conversions, domaines, tables distantes,
fonctions, index, oprateurs, classes d'oprateur, familles d'oprateur, squences, objets de la recherche plein texte, types et
vues peuvent tre qualifis du nom du schma. Lorsque le commentaire est plac sur une colonne, nom_relation doit
faire rfrence une table, une vue, un type composite ou une table distante.
918
COMMENT
type_agrgat
Un type de donnes en entre sur lequel l'agrgat opre. Pour rfrencer une fonction d'agrgat sans argument, utilisez * la
place de la liste des types de donnes en entre.
type_source
Le nom du type de donne source du transtypage.
type_cible
Le nom du type de donnes cible du transtypage.
modearg
Le mode d'un argument de la fonction : IN, OUT, INOUT ou VARIADIC. En cas d'omission, la valeur par dfaut est IN.
COMMENT ON FUNCTION ne tient pas compte, l'heure actuelle, des arguments OUT car seuls ceux en entre sont ncessaires pour dterminer l'identit de la fonction. Lister les arguments IN, INOUT et VARIADIC est ainsi suffisant.
nomarg
Le nom d'un argument de la fonction. COMMENT ON FUNCTION ne tient pas compte, l'heure actuelle, des noms des arguments, seuls les types de donnes des arguments tant ncessaires pour dterminer l'identit de la fonction.
typearg
Les types de donnes des arguments de la fonction (ventuellement qualifis du nom du schma).
oid_objet_large
L'OID de l'objet large.
type_gauche, type_droit
Les types de donnes des arguments de l'oprateur (avec en option le nom du schma). crire NONE pour l'argument manquant d'un oprateur prfixe ou postfixe.
PROCEDURAL
Inutilis.
texte
Le nouveau commentaire, rdig sous la forme d'une chane littrale ; ou NULL pour supprimer le commentaire.
Notes
Il n'existe pas de mcanisme de scurit pour visualiser les commentaires : tout utilisateur connect une base de donnes peut
voir les commentaires de tous les objets de la base. Pour les objets partags comme les bases, les rles et les tablespaces, les commentaires sont stockes globalement et tout utilisateur connect une base peut voir tous les commentaires pour les objets partags. Du coup, ne placez pas d'informations critiques pour la scurit dans vos commentaires.
Exemples
Attacher un commentaire la table matable :
COMMENT ON TABLE matable IS 'Ceci est ma table.';
Suppression du commentaire prcdent :
COMMENT ON TABLE matable IS NULL;
Quelques exemples supplmentaires :
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
COMMENT
base';
COMMENT
COMMENT
COMMENT
COMMENT
ON
ON
ON
ON
ON
ON
ON
ON
ON
ON
ON
ON
ON
ON
ON
919
COMMENT
Compatibilit
Il n'existe pas de commande COMMENT dans le standard SQL.
920
Nom
COMMIT Valider la transaction en cours
Synopsis
COMMIT [ WORK | TRANSACTION ]
Description
COMMIT valide la transaction en cours. Tout le monde peut dsormais voir les modifications ralises au cours de la transaction. De plus, leur persistance est garantie en cas d'arrt brutal du serveur.
Paramtres
WORK, TRANSACTION
Mots cls optionnels et sans effet.
Notes
ROLLBACK(7) est utilis pour annuler une transaction.
Lancer COMMIT l'extrieur d'une transaction n'a aucune consquence mais provoque l'affichage d'un message
d'avertissement.
Exemples
Valider la transaction courante et rendre toutes les modifications persistantes :
COMMIT;
Compatibilit
Le standard SQL ne spcifie que les deux formes COMMIT et COMMIT WORK. Pour le reste, cette commande est totalement
conforme.
Voir aussi
BEGIN(7), ROLLBACK(7)
921
Nom
COMMIT PREPARED Valider une transaction pralablement prpare en vue d'une validation en deux phases
Synopsis
COMMIT PREPARED id_transaction
Description
COMMIT PREPARED valide une transaction prpare.
Paramtres
id_transaction
L'identifiant de la transaction valider.
Notes
Seul l'utilisateur l'origine de la transaction ou un superutilisateur peut valider une transaction prpare. Il n'est cependant pas
ncessaire d'tre dans la session qui a initi la transaction.
Cette commande ne peut pas tre excute l'intrieur d'un bloc de transaction. La transaction prpare est valide immdiatement.
Toutes les transactions prpares disponibles sont listes dans la vue systme pg_prepared_xacts.
Exemples
Valider la transaction identifie par foobar :
COMMIT PREPARED 'foobar';
Voir aussi
PREPARE TRANSACTION(7), ROLLBACK PREPARED(7)
922
Nom
COPY Copier des donnes depuis/vers un fichier vers/depuis une table
Synopsis
COPY nom_table [ ( colonne [, ...] ) ]
FROM { 'nom_fichier' | STDIN }
[ [ WITH ] ( option [, ...] ) ]
COPY { nom_table [ ( colonne [, ...] ) ] | ( requte ) }
TO { 'nom_fichier' | STDOUT }
[ [ WITH ] ( option [, ...] ) ]
o option fait partie
de :
FORMAT nom_format
OIDS [ oids ]
DELIMITER 'caractre_dlimiteur'
NULL 'chane_null'
HEADER [ boolean ]
QUOTE 'caractre_guillemet'
ESCAPE 'caractre_chappement'
FORCE_QUOTE { ( colonne [, ...] ) | * }
FORCE_NOT_NULL ( colonne [, ...] )
ENCODING 'nom_encodage'
Description
COPY transfre des donnes entre les tables de PostgreSQL et les fichiers du systme de fichiers standard. COPY TO copie
le contenu d'une table vers un fichier tandis que COPY FROM copie des donnes depuis un fichier vers une table (ajoutant les
donnes celles dj dans la table). COPY TO peut aussi copier le rsultat d'une requte SELECT.
Si une liste de colonnes est prcise, COPY ne copie que les donnes des colonnes spcifies vers ou depuis le fichier. COPY
FROM insre les valeurs par dfaut des colonnes qui ne sont pas prcises dans la liste.
Si un nom de fichier est prcis, COPY lit ou crit directement dans le fichier. Ce fichier doit tre accessible par le serveur et
son nom doit tre spcifi du point de vue du serveur. Si STDIN ou STDOUT est indiqu, les donnes sont transmises au travers
de la connexion entre le client et le serveur.
Paramtres
nom_table
Le nom de la table (ventuellement qualifi du nom du schma).
colonne
Une liste optionnelle de colonnes copier. Sans prcision, toutes les colonnes de la table seront copies.
requte
Une commande SELECT(7) ou VALUES(7) dont les rsultats doivent tre copis. Notez que les parenthses sont requises
autour de la requte.
nom_fichier
Le chemin absolu du fichier en entre ou en sortie. Les utilisateurs sous Windows peuvent avoir besoin d'utiliser une chane
E'' et de doubler tous les antislashs utiliss comme sparateurs de chemin.
STDIN
Les donnes en entre proviennent de l'application cliente.
STDOUT
Les donnes en sortie vont sur l'application cliente.
boolean
Spcifie si l'option slectionne doit tre active ou non. Vous pouvez crire TRUE, ON ou 1 pour activer l'option, et
FALSE, OFF ou 0 pour la dsactiver. La valeur boolean peut aussi tre omise, auquel cas la valeur TRUE est prise en
923
COPY
compte.
FORMAT
Slectionne le format des donnes pour la lecture ou l'criture : text, csv (valeurs spares par des virgules), ou binary.
la valeur par dfaut est text.
OIDS
Copie l'OID de chaque ligne. Une erreur est rapporte si OIDS est utilis pour une table qui ne possde pas d'OID, ou dans le
cas de la copie du rsultat d'une requte.
DELIMITER
Spcifie le caractre qui spare les colonnes sur chaque ligne du fichier. La valeur par dfaut est une tabulation dans le format
texte et une virgule dans le format CSV. Il doit tre un seul caractre sur un seul octet. Cette option n'est pas autorise lors de
l'utilisation du format binary.
NULL
Spcifie la chane qui reprsente une valeur NULL. La valeur par dfaut est \N (antislash-N) dans le format texte et une
chane vide sans guillemets dans le format CSV. Vous pouvez prfrer une chane vide mme dans le format texte pour les cas
o vous ne voulez pas distinguer les valeurs NULL des chanes vides. Cette option n'est pas autorise lors de l'utilisation du
format binary.
Note
Lors de l'utilisation de COPY FROM, tout lment de donnes qui correspond cette chane est stock
comme valeur NULL. Il est donc utile de s'assurer que c'est la mme chane que celle prcise pour le COPY
TO qui est utilise.
HEADER
Le fichier contient une ligne d'en-tte avec les noms de chaque colonne. En sortie, la premire ligne contient les noms de colonne de la table. En entre, elle est ignore. Cette option n'est autorise que lors de l'utilisation du format CSV.
QUOTE
Spcifie le caractre guillemet utiliser lorsqu'une valeur doit tre entre guillemets. Par dfaut, il s'agit du guillemet double.
Cela doit de toute faon tre un seul caractre sur un seul octet. Cette option n'est autorise que lors de l'utilisation du format
CSV.
ESCAPE
Spcifie le caractre qui doit apparatre avant un caractre de donnes qui correspond la valeur QUOTE. La valeur par dfaut
est la mme que la valeur QUOTE (du coup, le caractre guillemet est doubl s'il apparat dans les donnes). Cela doit tre un
seul caractre cod en un seul octet. Cette option n'est autorise que lors de l'utilisation du format CSV.
FORCE_QUOTE
Force l'utilisation des guillemets pour toutes les valeurs non NULL dans chaque colonne spcifie. La sortie NULL n'est jamais
entre guillemets. Si * est indiqu, les valeurs non NULL seront entre guillemets pour toutes les colonnes. Cette option est
seulement autorise avec COPY TO et seulement quand le format CSV est utilis.
FORCE_NOT_NULL
Ne fait pas correspondre les valeurs des colonnes spcifies avec la chane nulle. Dans le cas par dfaut o la chane nulle est
vide, cela signifie que les valeurs vides seront lues comme des chanes de longueur nulle plutt que comme des NULL, mme
si elles ne sont pas entre guillemets. Cette option est seulement autorise avec COPY FROM et seulement quand le format
CSV est utilis.
ENCODING
Spcifie que le fichier est dans l'encodage nom_encodage. Si cette option est omis, l'encodage client par dfaut est utilis.
Voir la partie Notes ci-dessous pour plus de dtails.
Affichage
En cas de succs, une commande COPY renvoie une balise de la forme
COPY nombre
Le nombre correspond au nombre de lignes copies.
Notes
924
COPY
COPY ne peut tre utilis qu'avec des tables relles, pas avec des vues. Nanmoins, vous pouvez crire COPY (SELECT *
FROM nom_vue) TO ....
COPY gre seulement la table nomme ; cette commande ne copie pas les donnes provenant ou vers des tables filles. Donc, par
exemple, COPY table TO affiche les mmes donnes que SELECT * FROM ONLY table. Mais COPY (SELECT *
FROM table) TO ... peut tre utilis pour sauvegarder toutes les donnes d'un hritage.
Le droit SELECT est requis sur la table dont les valeurs sont lues par COPY TO et le droit INSERT sur la table dont les valeurs
sont insres par COPY FROM. Il est suffisant d'avoir des droits sur les colonnes listes dans la commande.
Les fichiers nomms dans une commande COPY sont lus ou crits directement par le serveur, non par l'application cliente. De ce
fait, la machine hbergeant le serveur de bases de donnes doit les hberger ou pouvoir y accder. L'utilisateur PostgreSQL
(l'identifiant de l'utilisateur qui excute le serveur), non le client, doit pouvoir y accder et les lire ou les modifier. L'utilisation de
COPY avec un fichier n'est autoris qu'aux superutilisateurs de la base de donnes car COPY autorise la lecture et l'criture de
tout fichier accessible au serveur.
Il ne faut pas confondre COPY et l'instruction \copy de psql. \copy appelle COPY FROM STDIN ou COPY TO STDOUT, puis
lit/stocke les donnes dans un fichier accessible au client psql. L'accs au fichier et les droits d'accs dpendent alors du client et
non du serveur.
Il est recommand que le chemin absolu du fichier utilis dans COPY soit toujours prcis. Ceci est assur par le serveur dans le
cas d'un COPY TO mais, pour les COPY FROM, il est possible de lire un fichier spcifi par un chemin relatif. Le chemin est
interprt relativement au rpertoire de travail du processus serveur (habituellement dans le rpertoire des donnes), pas par rapport au rpertoire de travail du client.
COPY FROM appelle tous les dclencheurs et contraintes de vrification sur la table de destination, mais pas les rgles.
L'entre et la sortie de COPY sont sensibles datestyle. Pour assurer la portabilit vers d'autres installations de
PostgreSQL qui ventuellement utilisent des paramtrages datestyle diffrents de ceux par dfaut, il est prfrable de configurer datestyle en ISO avant d'utiliser COPY TO. viter d'exporter les donnes avec le IntervalStyle configur
sql_standard est aussi une bonne ide car les valeurs ngatives d'intervalles pourraient tre mal interprtes par un serveur
qui a une autre configuration pour IntervalStyle.
Les donnes en entre sont interprtes suivant la clause ENCODING ou suivant l'encodage actuel du client. Les donnes en sortie
sont codes suivant la clause ENCODING ou suivant l'encodage actuel du client. Ceci est valable mme si les donnes ne passent
pas par le client, c'est--dire si elles sont lues et crites directement sur un fichier du serveur.
COPY stoppe l'opration la premire erreur. Si cela ne porte pas consquence dans le cas d'un COPY TO, il en va diffremment dans le cas d'un COPY FROM. Dans ce cas, la table cible a dj reu les lignes prcdentes. Ces lignes ne sont ni visibles,
ni accessibles, mais occupent de l'espace disque. Il peut en rsulter une perte importante d'espace disque si l'chec se produit lors
d'une copie volumineuse. L'espace perdu peut alors tre rcupr avec la commande VACUUM.
Les donnes en entre sont interprtes suivant l'encodage actuel du client et les donnes en sortie sont encodes suivant
l'encodage client mme si les donnes ne passent pas par le client mais sont lues partir d'un fichier ou crites dans un fichier.
Formats de fichiers
Format texte
Quand le format text est utilis, les donnes sont lues ou crites dans un fichier texte, chaque ligne correspondant une ligne de
la table. Les colonnes sont spares, dans une ligne, par le caractre de dlimitation. Les valeurs des colonnes sont des chanes, engendres par la fonction de sortie ou utilisables par celle d'entre, correspondant au type de donnes des attributs. La chane de
spcification des valeurs NULL est utilise en lieu et place des valeurs nulles. COPY FROM lve une erreur si une ligne du fichier ne contient pas le nombre de colonnes attendues. Si OIDS est prcis, l'OID est lu ou crit dans la premire colonne, avant
celles des donnes utilisateur.
La fin des donnes peut tre reprsente par une ligne ne contenant qu'un antislash et un point (\.). Ce marqueur de fin de donnes n'est pas ncessaire lors de la lecture d'un fichier, la fin du fichier tenant ce rle. Il n'est rellement ncessaire que lors d'une
copie de donnes vers ou depuis une application cliente qui utilise un protocole client antrieur au 3.0.
Les caractres antislash (\) peuvent tre utiliss dans les donnes de COPY pour chapper les caractres qui, sans cela, seraient
considrs comme des dlimiteurs de ligne ou de colonne. Les caractres suivants, en particulier, doivent tre prcds d'un antislash s'ils apparaissent dans la valeur d'une colonne : l'antislash lui-mme, le saut de ligne, le retour chariot et le dlimiteur courant.
La chane NULL spcifie est envoye par COPY TO sans ajout d'antislash ; au contraire, COPY FROM teste l'entre au regard
de la chane NULL avant la suppression des antislash. Ainsi, une chane NULL telle que \N ne peut pas tre confondue avec la
valeur de donne relle \N (reprsente dans ce cas par \\N).
925
COPY
Reprsente
\b
\f
\n
\r
\t
Tabulation (ASCII 9)
\v
\chiffres
Antislash suivi d'un trois chiffres en octal reprsente le caractre qui possde ce
code numrique
\xdigits
Antislash x suivi d'un ou deux chiffres hexadcimaux reprsente le caractre qui possde ce code numrique
Actuellement, COPY TO n'met pas de squence octale ou hexadcimale mais utilise les autres squences listes ci-dessus pour
les caractres de contrle.
Tout autre caractre prcd d'un antislash se reprsente lui-mme. Cependant, il faut faire attention ne pas ajouter d'antislash
qui ne soit pas absolument ncessaire afin d'viter le risque d'obtenir accidentellement une correspondance avec le marqueur de fin
de donnes (\.) ou la chane NULL (\N par dfaut) ; ces chanes sont reconnues avant tout traitement des antislashs.
Il est fortement recommand que les applications qui engendrent des donnes COPY convertissent les donnes de nouvelle ligne
et de retour chariot par les squences respectives \n et \r. A l'heure actuelle, il est possible de reprsenter un retour chariot par un
antislash et un retour chariot, et une nouvelle ligne par un antislash et une nouvelle ligne. Cependant, il n'est pas certain que ces
reprsentations soient encore acceptes dans les prochaines versions. Celles-ci sont, de plus, extrmement sensibles la corruption
si le fichier de COPY est transfr sur d'autres plateformes (d'un Unix vers un Windows ou inversement, par exemple).
COPY TO termine chaque ligne par une nouvelle ligne de style Unix ( \n ). Les serveurs fonctionnant sous Microsoft Windows engendrent un retour chariot/nouvelle ligne ( \r\n ), mais uniquement lorsque les donnes engendres par COPY sont
envoyes dans un fichier sur le serveur. Pour des raisons de cohrence entre les plateformes, COPY TO STDOUT envoie toujours \n quelque soit la plateforme du serveur. COPY FROM sait grer les lignes terminant par une nouvelle ligne, un retour
chariot ou un retour chariot suivi d'une nouvelle ligne. Afin de rduire les risques d'erreurs engendres par des nouvelles lignes ou
des retours chariot non prcds d'antislash, considr de fait comme des donnes, COPY FROM met un avertissement si les
fins de lignes ne sont pas toutes identiques.
Format CSV
Ce format est utilis pour importer et exporter des donnes au format de fichier CSV (acronyme de Comma Separated Value, littralement valeurs spares par des virgules). Ce format est utilis par un grand nombre de programmes, tels les tableurs. la place
des rgles d'chappement utilises par le format texte standard de PostgreSQL, il produit et reconnat le mcanisme
d'chappement habituel de CSV.
Les valeurs de chaque enregistrement sont spares par le caractre DELIMITER. Si la valeur contient ce caractre, le caractre
QUOTE, la chane NULL, un retour chariot ou un saut de ligne, la valeur complte est prfixe et suffixe par le caractre QUOTE.
De plus, toute occurrence du caractre QUOTE ou du caractre ESCAPE est prcde du caractre d'chappement. FORCE QUOTE
peut galement tre utilis pour forcer les guillemets lors de l'affichage de valeur non-NULL dans des colonnes spcifiques.
Le format CSV n'a pas de faon standard de distinguer une valeur NULL d'une chane vide. La commande COPY de
PostgreSQL gre cela avec les guillemets. Un NULL est affich suivant le paramtre NULL et n'est pas entre guillemets, alors
qu'une valeur non NULL correspondant au paramtre NULL est entre guillemets. Par exemple, avec la configuration par dfaut, un
NULL est crit avec la chane vide sans guillemets alors qu'une chane vide est crit avec des guillemets doubles (""). La lecture
des valeurs suit des rgles similaires. Vous pouvez utiliser FORCE NOT NULL pour empcher les comparaisons d'entre NULL
pour des colonnes spcifiques.
L'antislash n'est pas un caractre spcial dans le format CSV. De ce fait, le marqueur de fin de donnes, \., peut apparatre dans
les donne. Afin d'viter toute mauvaise interprtation, une valeur \. qui apparat seule sur une ligne est automatiquement place
entre guillemets en sortie. En entre, si elle est entre guillemets, elle n'est pas interprte comme un marqueur de fin de donnes.
Lors du chargement d'un fichier qui ne contient qu'une colonne, dont les valeurs ne sont pas places entre guillemets, cr par une
autre application, qui contient une valeur \., il est ncessaire de placer cette valeur entre guillemets.
Note
926
COPY
Dans le format CSV, tous les caractres sont significatifs. Une valeur entre guillemets entoure d'espaces ou de tout
autre caractre diffrent de DELIMITER inclut ces caractres. Cela peut tre source d'erreurs en cas d'import de
donnes partir d'un systme qui complte les lignes CSV avec des espaces fines pour atteindre une longueur fixe.
Dans ce cas, il est ncessaire de pr-traiter le fichier CSV afin de supprimer les espaces de compltement avant
d'insrer les donnes dans PostgreSQL.
Note
Le format CSV sait reconnatre et produire des fichiers CSV dont les valeurs entre guillemets contiennent des retours chariot et des sauts de ligne. De ce fait, les fichiers ne contiennent pas strictement une ligne par ligne de table
comme les fichiers du format texte.
Note
Beaucoup de programmes produisent des fichiers CSV tranges et parfois pervers ; le format de fichier est donc
plus une convention qu'un standard. Il est alors possible de rencontrer des fichiers que ce mcanisme ne sait pas importer. De plus, COPY peut produire des fichiers inutilisables par d'autres programmes.
Format binaire
Le format binary fait que toutes les donnes sont stockes/lues au format binaire plutt que texte. Il est un peu plus rapide que
les formats texte et CSV mais un fichier au format binaire est moins portable suivant les architectures des machines et les versions
de PostgreSQL. De plus, le format binaire est trs spcifique au type des donnes ; par exemple, un export de donnes binaires
d'une colonne smallint ne pourra pas tre import dans une colonne integer, mme si cela aurait fonctionn dans le format texte.
Le format de fichier binary consiste en un en-tte de fichier, zro ou plusieurs lignes contenant les donnes de la ligne et un basde-page du fichier. Les en-ttes et les donnes sont dans l'ordre rseau des octets.
Note
Les versions de PostgreSQL antrieures la 7.4 utilisaient un format de fichier binaire diffrent.
Entte du fichier
L'en-tte du fichier est constitute de 15 octets de champs fixes, suivis par une aire d'extension de l'en-tte de longueur variable.
Les champs fixes sont :
Signature
squence de 11 octets PGCOPY\n\377\r\n\0 -- l'octet zro est une partie obligatoire de la signature. La signature est
conue pour permettre une identification aise des fichiers qui ont t dteriors par un transfert non respectueux des huit bits.
Cette signature est modifie par les filtres de traduction de fin de ligne, la suppression des octets zro, la suppression des bits
de poids forts ou la modification de la parit.
Champs de commutateurs
masque entier de 32 bits dcrivant les aspects importants du format de fichier. Les bits sont numrots de 0 (LSB, ou Least Significant Bit, bit de poids faible) 31 (MSB, ou Most Significant Bit, bit de poids fort). Ce champ est stock dans l'ordre rseau des octets (l'octet le plus significatif en premier), comme le sont tous les champs entier utiliss dans le format de fichier.
Les bits 16 31 sont rservs aux problmes critiques de format de fichier ; tout lecteur devrait annuler l'opration s'il trouve
un bit inattendu dans cet ensemble. Les bits 0 15 sont rservs pour signaler les problmes de compatibilit de formats ; un
lecteur devrait simplement ignorer les bits inattendus dans cet ensemble. Actuellement, seul un bit est dfini, le reste doit tre
zro :
Bit 16
si 1, les OID sont inclus dans la donne ; si 0, non
Longueur de l'aire d'extension de l'en-tte
entier sur 32 bits, longueur en octets du reste de l'en-tte, octets de stockage de la longueur non-compris. l'heure actuelle ce
champ vaut zro. La premire ligne suit immdiatement. De futures modifications du format pourraient permettre la prsence
de donnes supplmentaires dans l'en-tte. Tout lecteur devrait ignorer silencieusement toute donne de l'extension de
l'en-tte qu'il ne sait pas traite.
927
COPY
L'aire d'extension de l'en-tte est prvue pour contenir une squence de morceaux s'auto-identifiant. Le champ de commutateurs
n'a pas pour but d'indiquer aux lecteurs ce qui se trouve dans l'aire d'extension. La conception spcifique du contenu de l'extension
de l'en-tte est pour une prochaine version.
Cette conception permet l'ajout d'en-ttes compatible (ajout de morceaux d'extension d'en-tte, ou initialisation des octets commutateurs de poids faible) et les modifications non compatibles (initialisation des octets commutateurs de poids fort pour signaler de
telles modifications, et ajout des donnes de support dans l'aire d'extension si ncessaire).
Tuples
Chaque tuple dbute par un compteur, entier cod sur 16 bits, reprsentant le nombre de champs du tuple. (Actuellement, tous les
tuples d'une table ont le mme compteur, mais il est probable que cela ne soit pas toujours le cas.) On trouve ensuite, rpt pour
chaque champ du tuple, un mot de 32 bits annonant le nombre d'octets de stockage de la donne qui suivent. (Ce mot n'inclut pas
sa longueur propre et peut donc tre nul.) -1, cas spcial, indique une valeur de champ NULL. Dans ce cas, aucun octet de valeur
ne suit.
Il n'y a ni compltement d'alignement ni toute autre donne supplmentaire entre les champs.
Actuellement, toutes les valeurs d'un fichier d'un format binaire sont supposes tre dans un format binaire (code de format). Il est
probable qu'une extension future ajoute un champ d'en-tte autorisant la spcification de codes de format par colonne.
La consultation du code source de PostgreSQL, et en particulier les fonctions *send et *recv associes chaque type de donnes de la colonne, permet de dterminer le format binaire appropri la donne relle. Ces fonctions se situent dans le rpertoire
src/backend/utils/adt/ des sources.
Lorsque les OID sont inclus dans le fichier, le champ OID suit immdiatement le compteur de champ. C'est un champ normal,
ceci prs qu'il n'est pas inclus dans le compteur. En fait, il contient un mot de stockage de la longueur -- ceci permet de faciliter le
passage d'OID sur quatre octets aux OID sur huit octets et permet d'afficher les OID comme tant NULL en cas de besoin.
Queue du fichier
La fin du fichier consiste en un entier sur 16 bits contenant -1. Cela permet de le distinguer aisment du compteur de champs d'un
tuple.
Il est souhaitable que le lecteur rapporte une erreur si le mot compteur de champ ne vaut ni -1 ni le nombre attendu de colonnes.
Cela assure une vrification supplmentaire d'une ventuelle dsynchronisation d'avec les donnes.
Exemples
Copier une table vers le client en utilisant la barre verticale (|) comme dlimiteur de champ :
COPY pays TO STDOUT (DELIMITER '|');
Copier des donnes d'un fichier vers la table pays :
COPY pays FROM '/usr1/proj/bray/sql/pays_donnees';
Pour copier dans un fichier les pays dont le nom commence par 'A' :
COPY (SELECT * FROM pays WHERE nom_pays LIKE 'A%') TO
'/usr1/proj/bray/sql/une_liste_de_pays.copy';
Exemple de donnes convenables pour une copie vers une table depuis STDIN :
AF
AL
DZ
ZM
ZW
AFGHANISTAN
ALBANIE
ALGERIE
ZAMBIE
ZIMBABWE
P
\0
F
\0
G
\0
G
\0
C
O
P
\0 \0 003
H
A
N
\0 002
A
Y
\0
I
L
\n 377 \r \n \0 \0 \0 \0 \0 \0
\0 \0 002
A
F \0 \0 \0 013
A
S
T
A
N 377 377 377 377 \0 003
\0 \0 \0 007
A
L
B
A
N
I
928
COPY
0000100
E 377 377 377 377
0000120 007
A
L
G
E
0000140 \0 002
Z
M \0
0000160 377 377 \0 003 \0
0000200
M
B
A
B
W
\0 003 \0 \0 \0 002
D
R
I
E 377 377 377 377
\0 \0 006
Z
A
M
B
\0 \0 002
Z
W \0 \0
E 377 377 377 377 377 377
Z \0 \0 \0
\0 003 \0 \0
I
E 377 377
\0 \b
Z
I
Compatibilit
Il n'existe pas d'instruction COPY dans le standard SQL.
La syntaxe suivante tait utilise avant PostgreSQL 9.0 et est toujours supporte :
COPY nomtable [ ( colonne [, ...] ) ]
FROM { 'nomfichier' | STDIN }
[ [ WITH ]
[ BINARY ]
[ OIDS ]
[ DELIMITER [ AS ] 'dlimiteur' ]
[ NULL [ AS ] 'chane NULL' ]
[ CSV [ HEADER ]
[ QUOTE [ AS ] 'guillemet' ]
[ ESCAPE [ AS ] 'chappement' ]
[ FORCE NOT NULL colonne [, ...] ] ] ]
COPY { nomtable [ ( colonne [, ...] ) ] | ( requte ) }
TO { 'nomfichier' | STDOUT }
[ [ WITH ]
[ BINARY ]
[ OIDS ]
[ DELIMITER [ AS ] 'dlimiteur' ]
[ NULL [ AS ] 'chane NULL' ]
[ CSV [ HEADER ]
[ QUOTE [ AS ] 'guillemet' ]
[ ESCAPE [ AS ] 'chappement' ]
[ FORCE QUOTE colonne [, ...] | * } ] ] ]
Notez que, dans cette syntaxe, BINARY et CSV sont traits comme des mots-cls indpendants, pas comme des arguments
l'option FORMAT.
La syntaxe suivante, utilise avant PostgreSQL version 7.3, est toujours supporte :
COPY [ BINARY ] nom_table [ WITH OIDS ]
FROM { 'nom_fichier' | STDIN }
[ [USING] DELIMITERS 'caractre_dlimiteur' ]
[ WITH NULL AS 'chane NULL' ]
COPY [ BINARY ] nom_table [ WITH OIDS ]
TO { 'nom_fichier' | STDOUT }
[ [USING] DELIMITERS 'caractre_dlimiteur' ]
[ WITH NULL AS 'chane NULL' ]
929
Nom
CREATE AGGREGATE Dfinir une nouvelle fonction d'agrgat
Synopsis
CREATE AGGREGATE nom ( type_donne_entre [ , ... ] ) (
SFUNC = sfonc,
STYPE = type_donne_tat
[ , FINALFUNC = ffonc ]
[ , INITCOND = condition_initiale ]
[ , SORTOP = operateur_tri ]
)
ou l'ancienne syntaxe
CREATE AGGREGATE nom (
BASETYPE = type_base,
SFUNC = sfonc,
STYPE = type_donne_tat
[ , FINALFUNC = ffonc ]
[ , INITCOND = condition_initiale ]
[ , SORTOP = operateur_tri ]
)
Description
CREATE AGGREGATE dfinit une nouvelle fonction d'agrgat. Quelques fonctions d'agrgat basiques et largement utilises
sont fournies dans la distribution standard ; elles sont documentes dans le Section 9.18, Fonctions d'agrgat . CREATE
AGGREGATE est utilise pour ajouter des fonctionnalits lors de la dfinition de nouveaux types ou si une fonction d'agrgat
n'est pas fournie.
Si un nom de schma est donn (par exemple, CREATE AGGREGATE monschema.monagg ...), alors la fonction
d'agrgat est cre dans le schma prcis. Sinon, elle est cre dans le schma courant.
Une fonction d'agrgat est identifie par son nom et son (ou ses) types de donnes en entre. Deux agrgats dans le mme schma peuvent avoir le mme nom s'ils oprent sur des types diffrents en entre. Le nom et le(s) type(s) de donnes en entre d'un
agrgat doivent aussi tre distincts du nom et du type de donnes de toutes les fonctions ordinaires du mme schma.
Une fonction d'agrgat est ralise partir d'une ou deux fonctions ordinaires : une fonction de transition d'tat sfonc, et une
fonction de traitement final optionnelle ffonc. Elles sont utilises ainsi :
sfonc( tat-interne, nouvelle-valeur-donnes ) ---> prochain-tat-interne
ffonc( tat-interne ) ---> valeur-agrgat
PostgreSQL cre une variable temporaire de type stype pour contenir l'tat interne courant de l'agrgat. chaque ligne en
entre, la valeur de l'argument de l'agrgat est calculeet la fonction de transition d'tat est appel avec la valeur d'tat courante
et la valeur du nouvel argument pour calculer une nouvelle valeur d'tat interne. Une fois que toutes les lignes sont traites, la
fonction finale est appele une seule fois pour calculer la valeur de retour de l'agrgat. S'il n'existe pas de fonction finale, alors la
valeur d'tat final est retourne en l'tat.
Une fonction d'agrgat peut fournir une condition initiale, c'est--dire une valeur initiale pour la valeur de l'tat interne. Elle est
spcifie et stocke en base comme une valeur de type text mais doit tre une reprsentation externe valide d'une constante du
type de donne de la valeur d'tat. Si elle n'est pas fournie, la valeur d'tat est initialement positionne NULL.
Si la fonction de transition d'tat est dclare strict , alors elle ne peut pas tre appele avec des entres NULL. Avec une
telle fonction de transition, l'excution d'agrgat se comporte comme suit. Les lignes avec une valeur NULL en entre sont ignores (la fonction n'est pas appel et la valeur de l'tat prcdent est conserv). Si la valeur de l'tat initial est NULL, alors, la
premire ligne sans valeur NULL, la premire valeur de l'argument remplace la valeur de l'tat, et la fonction de transition est
appele pour les lignes suivantes avec toutes les valeurs non NULL en entre. Cela est pratique pour implmenter des agrgats
comme max. Ce comportement n'est possible que quand type_donne_tat est identique au premier
type_donne_entre. Lorsque ces types sont diffrents, une condition initiale non NULL doit tre fournie, ou une fonction de transition non stricte utilise.
Si la fonction de transition d'tat n'est pas stricte, alors elle sera appele sans condition pour chaque ligne en entre et devra grer les entres NULL et les valeurs de transition NULL. Cela permet l'auteur de l'agrgat d'avoir le contrle complet sur la gestion des valeurs NULL par l'agrgat.
930
CREATE AGGREGATE
Si la fonction finale est dclare strict , alors elle ne sera pas appele quand la valeur d'tat finale est NULL ; la place, un rsultat NULL sera retourn automatiquement. C'est le comportement normal de fonctions strictes. Dans tous les cas, la fonction finale peut retourner une valeur NULL. Par exemple, la fonction finale pour avg renvoie NULL lorsqu'elle n'a aucune lignes en entre.
Les agrgats qui se comportent comme MIN ou MAX peuvent parfois tre optimiss en cherchant un index au lieu de parcourir
toutes les lignes en entre. Si un agrgat peut tre optimis, un oprateur de tri est spcifi. Dans ce cas, il est ncessaire que
l'agrgat fournisse le premier lment dans l'ordre impos par l'oprateur ; en d'autres mots :
SELECT agg(col) FROM tab;
doit tre quivalent :
SELECT col FROM tab ORDER BY col USING sortop LIMIT 1;
On suppose galement que l'agrgat ignore les entres NULL et qu'il fournit un rsultat NULL si et seulement s'il n'y a aucune entre NULL. D'ordinaire, l'oprateur < d'un type de donnes est le bon oprateur de tri pour MIN et > celui pour MAX.
L'optimisation ne prend jamais effet sauf si l'oprateur spcifi est membre de la stratgie less than (NdT : plus petit que) ou
greater than (NdT : plus grand que) d'une classe d'oprateur pour un index B-tree.
Paramtres
nom
Le nom de la fonction d'agrgat crer (ventuellement qualifi du nom du schma).
type_donne_entre
Un type de donne en entre sur lequel opre la fonction d'agrgat. Pur crer une fonction d'agrgat sans argument, placez *
la place de la liste des types de donnes en entre. (la fonction count(*) en est un bon exemple.)
type_base
Dans l'ancienne syntaxe de CREATE AGGREGATE, le type de donnes en entre est spcifie par un paramtre
type_base plutt que d'tre crit la suite du nom de l'agrgat. Notez que cette syntaxe autorise seulement un paramtre en
entre. Pour dfinir une fonction d'agrgat sans argument, indiquez only one input parameter. To define a zero-argument aggregate function, "ANY" (et non pas *) pour le type_base.
sfonc
Le nom de la fonction de transition de l'tat appeler pour chaque ligne en entre. Pour une fonction d'agrgat avec N arguments, sfonc doit prendre N+1 arguments, le premier tant de type type_donnes_tat et le reste devant correspondre
aux types de donnes en entre dclars pour l'agrgat. La fonction doit renvoyer une valeur de type
type_donnes_tat. Cette fonction prend la valeur actuelle de l'tat et les valeurs actuelles des donnes en entre. Elle
renvoit la prochaine valeur de l'tat.
type_donne_tat
Le type de donne pour la valeur d'tat de l'agrgat.
ffonc
Le nom de la fonction finale appeler pour traiter le rsultat de l'agrgat une fois que toutes les lignes en entre ont t parcourues. La fonction prend un seul argument de type type_donne_tat. Le type de retour de l'agrgat de la fonction est
dfini comme le type de retour de cette fonction. Si ffonc n'est pas spcifie, alors la valeur d'tat finale est utilise comme
rsultat de l'agrgat et le type de retour est type_donne_tat.
condition_initiale
La configuration initiale pour la valeur de l'tat. Elle doit tre une constante de type chane de caractres dans la forme accepte par le type de donnes type_donne_tat. Si non spcifi, la valeur d'tat est initialement positionne NULL.
sort_operator
L'oprateur de tri associ pour un agrgat de type MIN ou MAX. C'est seulement le nom de l'oprateur (ventuellement qualifi
du nom du schma). L'oprateur est suppos avoir les mmes types de donnes en entre que l'agrgat (qui doit tre un agrgat un seul argument).
Les paramtres de CREATE AGGREGATE peuvent tre crits dans n'importe quel ordre, pas uniquement dans l'ordre illustr
ci-dessus.
Exemples
Voir Section 35.10, Agrgats utilisateur .
931
CREATE AGGREGATE
Compatibilit
CREATE AGGREGATE est une extension PostgreSQL. Le standard SQL ne fournit pas de fonctions d'agrgat utilisateur.
Voir aussi
ALTER AGGREGATE(7), DROP AGGREGATE(7)
932
Nom
CREATE CAST Dfinir un transtypage
Synopsis
CREATE CAST (type_source AS type_cible)
WITH FUNCTION nom_fonction (type_argument [, ...])
[ AS ASSIGNMENT | AS IMPLICIT ]
CREATE CAST (type_source AS type_cible)
WITHOUT FUNCTION
[ AS ASSIGNMENT | AS IMPLICIT ]
CREATE CAST (type_source AS type_cible)
WITH INOUT
[ AS ASSIGNMENT | AS IMPLICIT ]
Description
CREATE CAST dfinit un transtypage. Un transtypage spcifie l'opration de conversion entre deux types de donnes. Par
exemple :
SELECT CAST(42 AS float8);
convertit la constante entire 42 en float8 en appelant une fonction prcdemment dfinie, float8(int4) dans le cas prsent
(si aucun transtypage convenable n'a t dfini, la conversion choue).
Deux types peuvent tre coercibles binairement, ce qui signifie que le transtypage peut tre fait gratuitement sans invoquer
aucune fonction. Ceci impose que les valeurs correspondantes aient la mme reprsentation interne. Par exemple, les types text
et varchar sont coercibles binairement dans les deux sens. La coercibilit binaire n'est pas forcment une relation symtrique.
Par exemple, le transtypage du type xml au type text peut tre fait gratuitement dans l'implmentation actuelle, mais l'opration
inverse ncessite une fonction qui fasse au moins une validation syntaxique. (Deux types qui sont coercibles binairement dans
les deux sens sont aussi appels binairement compatibles.)
Vous pouvez dfinir un transtypage comme transtypage I/O en utilisant la syntaxe WITH INOUT. Un transtype I/O est effectu
en appelant la fonction de sortie du type de donnes source, et en passant la chane rsultante la fonction d'entre du type de
donnes cible. Dans la plupart des cas, cette fonctionnalit vite d'avoir crire une fonction de transtypage spare pour la
conversion. Un transtypage I/O agit de la mme faon qu'un transtypage standard bas sur une fonction. Seule l'implmentation
diffre.
Un transtypage peut tre appel explicitement. Par exemple : CAST(x AS nomtype) ou x::nomtype.
Si le transtypage est marqu AS ASSIGNMENT (NDT : l'affectation), alors son appel peut tre implicite lors de l'affectation
d'une valeur une colonne du type de donne cible. Par exemple, en supposant que foo.f1 soit une colonne de type text :
INSERT INTO foo (f1) VALUES (42);
est autoris si la conversion du type integer vers le type text est indique AS ASSIGNMENT. Dans le cas contraire, c'est interdit.
Le terme de transtypage d'affectation est utilis pour dcrire ce type de conversion.
Si la conversion est marque AS IMPLICIT, alors elle peut tre appele implicitement dans tout contexte, soit par une affectation soit en interne dans une expression (nous utilisons gnralement le terme conversion implicite pour dcrire ce type de
conversion.) Par exemple, voici une requte :
SELECT 2 + 4.0;
L'analyseur marque au dbut les constantes comme tant de type integer et numeric respectivement. Il n'existe pas d'oprateur
integer + numeric dans les catalogues systmes mais il existe un oprateur numeric + numeric. La requte sera un succs si une
conversion de integer vers numeric est disponible et marque AS IMPLICIT -- ce qui est le cas. L'analyseur appliquera la
conversion implicite et rsoudra la requte comme si elle avait t crite de cette faon :
SELECT CAST ( 2 AS numeric ) + 4.0;
Maintenant, les catalogues fournissent aussi une conversion de numeric vers integer. Si cette conversion tait marque AS IMPLICIT -- mais ce n'est pas le cas -- alors l'analyseur devra choisir entre l'interprtation ci-dessus et son alternative (la conver933
CREATE CAST
sion de la constante numeric en un integer) et appliquer l'oprateur integer + integer. Comme il n'a aucune information qui lui permettrait de choisir le meilleur moyen, il abandonne et dclare la requte comme tant ambige. Le fait qu'une seule des conversions est indique comme implicite est le moyen par lequel nous apprenons l'analyseur de prfrer la premire solution
(c'est--dire de transformer une expression numeric-and-integer en numeric) ; il n'y a pas d'autre moyen.
Il est conseill d'tre conservateur sur le marquage du caractre implicite des transtypages. Une surabondance de transtypages implicites peut conduire PostgreSQL interprter trangement des commandes, voire se retrouver dans l'incapacit totale de les
rsoudre parce que plusieurs interprtations s'avrent envisageables. Une bonne rgle est de ne raliser des transtypages implicites
que pour les transformations entre types de la mme catgorie gnrale et qui prservent l'information. Par exemple, la conversion
entre int2 et int4 peut tre raisonnablement implicite mais celle entre float8 et int4 est probablement rserve l'affectation. Les
transtypages inter-catgories, tels que de text vers int4, sont prfrablement excuts dans le seul mode explicite.
Note
Il est parfois ncessaire, pour des raisons de convivialit ou de respect des standards, de fournir plusieurs transtypages implicites sur un ensemble de types de donnes. Ceux-ci peuvent alors entraner des ambiguits qui ne
peuvent tre vites, comme ci-dessus. L'analyseur possde pour ces cas une heuristique de secours s'appuyant sur
les catgories de types et les types prfrs, qui peut aider fournir le comportement attendu dans ce genre de cas.
Voir CREATE TYPE(7) pour plus de dtails.
Pour crer un transtypage, il faut tre propritaire du type source ou destination. Seul le superutilisateur peut crer un transtypage
binairement compatible (une erreur sur un tel transtypage peut aisment engendrer un arrt brutal du serveur).
Paramtres
typesource
Le nom du type de donne source du transtypage.
typecible
Le nom du type de donne cible du transtypage.
nom_fonction (type_argument [, ...])
La fonction utilise pour effectuer la conversion. Le nom de la fonction peut tre qualifi du nom du schma. Si ce n'est pas le
cas, la fonction est recherche dans le chemin des schmas. Le type de donnes rsultant de la fonction doit correspondre au
type cible du transtypage. Ses arguments sont explicits ci-dessous.
WITHOUT FUNCTION
Indication d'une compatibilit binaire entre le type source et le type cible pour qu'aucune fonction ne soit requise pour effectuer la conversion.
WITH INOUT
Inique que le transtypage est un transtypage I/O, effectu en appelant la fonction de sortie du type de donnes source, et en
passant la chane rsultante la fonction d'entre du type de donnes cible.
AS ASSIGNMENT
Lors d'une affectation, l'invocation du transtypage peut tre implicite.
AS IMPLICIT
L'invocation du transtypage peut tre implicite dans tout contexte.
Les fonctions de transtypage ont un trois arguments. Le premier argument est du mme type que le type source ou doit tre compatible avec ce type. Le deuxime argument, si fourni, doit tre de type integer. Il stocke le modificateur de type associ au type
de destination, ou -1 en l'absence de modificateur. Le troisime argument, si fourni, doit tre de type boolean. Il vaut true si la
conversion est explicite, false dans le cas contraire. Bizarrement, le standard SQL appelle des comportements diffrents pour
les transtypages explicites et implicites dans certains cas. Ce paramtre est fourni pour les fonctions qui implmentent de tel transtypages. Il n'est pas recommand de concevoir des types de donnes utilisateur entrant dans ce cas de figure.
Le type de retour d'une fonction de transtypage doit tre identique ou coercible binairement avec le type cible du transtypage.
En gnral, un transtypage correspond des type source et destination diffrents. Cependant, il est permis de dclarer un transtypage entre types source et destination identiques si la fonction de transtypage a plus d'un argument. Cette possibilit est utilise
pour reprsenter dans le catalogue systme des fonctions de transtypage agissant sur la longueur d'un type. La fonction nomme
est utilise pour convertir la valeur d'un type la valeur du modificateur de type fournie par le second argument.
Quand un transtypage concerne des types source et destination diffrents et que la fonction a plus d'un argument, le transtypage et
la conversion de longeur du type destination sont faites en une seule etape. Quand une telle entre n'est pas disponible, le transtypage vers un type qui utilise un modificateur de type implique deux tapes, une pour convertir les types de donnes et la seconde
934
CREATE CAST
Notes
DROP CAST(7) est utilis pour supprimer les transtypages utilisateur.
Pour convertir les types dans les deux sens, il est obligatoire de dclarer explicitement les deux sens.
Il est n'est pas ncessaire habituellement de crer des conversions entre des types dfinis par l'utilisateur et des types de chane
standards (text, varchar etchar(n), pas plus que pour des types dfinis par l'utilisateur dfinis comme entrant dans la catgorie des
chanes). PostgreSQL fournit un transtypage I/O automatique pour cela. Ce transtypage automatique vers des types chanes est
trait comme des transtypages d'affectation, alors que les transtypages automatiques partir de types chane sont de type explicite
seulement. Vous pouvez changer ce comportement en dclarant votre propre conversion pour remplacer une conversion automatique. La seule raison usuelle de le faire est de vouloir rendre l'appel de la conversion plus simple que le paramtrage standard
(affectation seulement ou explicite seulement). Une autre raison envisageable est de vouloir que la conversion se comporte diffrement de la fonction I/O du type ; mais c'est suffisamment droutant pour que vous y pensiez deux fois avant de le faire. (Un petit
nombre de types internes ont en fait des comportements diffrents pour les conversions, principalement cause des besoins du
standard SQL.)
Avant PostgreSQL 7.3, toute fonction qui portait le mme nom qu'un type de donnes, retournait ce type de donnes et prenait
un argument d'un autre type tait automatiquement dtecte comme une fonction de conversion. Cette convention a t abandonne du fait de l'introduction des schmas et pour pouvoir reprsenter des conversions binairement compatibles dans les catalogues
systme. Les fonctions de conversion intgres suivent toujours le mme schma de nommage mais elle doivent galement tre
prsentes comme fonctions de transtypage dans le catalogue systme pg_cast.
Bien que cela ne soit pas requis, il est recommand de suivre l'ancienne convention de nommage des fonctions de transtypage en
fonction du type de donnes de destination. Beaucoup d'utilisateurs sont habitus convertir des types de donnes l'aide d'une
notation de style fonction, c'est--dire nom_type(x). En fait, cette notation n'est ni plus ni moins qu'un appel la fonction
d'implantation du transtypage ; sa gestion n'est pas spcifique un transtypage. Le non-respect de cette convention peut surprendre
certains utilisateurs. Puisque PostgreSQL permet de surcharger un mme nom de fonction avec diffrents types d'argument, il
n'y a aucune difficult avoir plusieurs fonctions de conversion vers des types diffrents qui utilisent toutes le mme nom de type
destination.
Note
En fait, le paragraphe prcdent est une sur-simplification : il existe deux cas pour lesquels une construction d'appel
de fonction sera traite comme une demande de conversion sans qu'il y ait correspondance avec une fonction relle.
Si un appel de fonction nom(x) ne correspond pas exactement une fonction existante, mais que nom est le nom
d'un type de donnes et que pg_cast fournit une conversion compatible binairement vers ce type partir du type x,
alors l'appel sera construit partir de la conversion compatible binairement. Cette exception est faite pour que les
conversions compatibles binairement puissent tre appeles en utilisant la syntaxe fonctionnelle, mme si la fonction manque. De ce fait, s'il n'y pas d'entre dans pg_cast mais que la conversion serait partir de ou vers un type
chapne, l'appel sera ralis avec une conversion I/O. Cette exception autorise l'appel de conversion I/O en utilisant
la syntaxe fonctionnelle.
Note
Il existe aussi une exception l'exception : le transtypage I/O convertissant des types composites en types chane de
caractres ne peut pas tre appel en utilisant la syntaxe fonctionnelle, mais doit tre crite avec la syntaxe de transtypage explicite (soit CAST soit ::). Cette exception a t ajoute car, aprs l'introduction du transtypage I/O automatique, il tait trop facile de provoquer par erreur une telle conversion alors que l'intention tait de rfrencer une
fonction ou une colonne.
Exemples
Cration d'un transtypage d'affectation du type bigint vers le type int4 l'aide de la fonction int4(bigint) :
CREATE CAST (bigint AS int4) WITH FUNCTION int4(bigint) AS ASSIGNMENT;
(Ce transtypage est dj prdfini dans le systme.)
Compatibilit
La commande CREATE CAST est conforme SQL ceci prs que SQL ne mentionne pas les types binairement compatibles et
935
CREATE CAST
les arguments supplmentaires pour les fonctions d'implantation. AS IMPLICIT est aussi une extension PostgreSQL.
Voir aussi
CREATE FUNCTION(7), CREATE TYPE(7), DROP CAST(7)
936
Nom
CREATE COLLATION dfinit une nouvelle collation
Synopsis
CREATE COLLATION nom (
[ LOCALE = locale, ]
[ LC_COLLATE = lc_collate, ]
[ LC_CTYPE = lc_ctype ]
)
CREATE COLLATION nom FROM collation_existante
Description
CREATE COLLATION dfinit une nouvelle collation utilisant la configuration de locale du systme d'exploitation spcifie
ou par copie d'une collation existante.
Pour pouvoir crer une collation, vous devez possder le privilge CREATE sur le schma de destination.
Paramtres
nom
Le nom de la collation. Le nom de la collation peut tre qualifi par le schma. Si ce n'est pas le cas, la collation est dfinie
dans le schma courant. Le nom de la collation doit tre unique au sein de ce schma. (Le catalogue systme peut contenir
des collations de mme nom pour d'autres encodages, mais ces dernires sont ignores si l'encodage de la base de donnes
ne correspond pas).
locale
Ceci est un raccourci pour positionner d'un mme coup LC_COLLATE et LC_CTYPE. Si vous spcifiez cela, vous ne pouvez plus spcifier aucun de ces deux paramtres-ci.
lc_collate
Utilise la locale systme spcifie comme catgorie de locale de LC_COLLATE. La locale doit tre applicable l'encodage
de la base courante. (cf. CREATE DATABASE(7)pour les rgles prcises.)
lc_ctype
Utilise la locale systme spcifie comme catgorie de locale de LC_CTYPE. La locale doit tre applicable l'encodage de
la base courante. (cf. CREATE DATABASE(7)pour les rgles prcises.)
collation_existante
Le nom d'une collation existante copier. La nouvelle collation aura les mmes proprits que celle copie, mais ce sera un
objet indpendant.
Notes
Utilisez DROP COLLATION pour supprimer une collation dfinie par l'utilisateur.
Voir Section 22.2, Support des collations pour plus d'informations sur le support des collations dans PostgreSQL.
Exemples
Crer une collation partir de la locale systme fr_FR.utf8 (en supposant que l'encodage de la base courante est UTF8):
CREATE COLLATION french (LOCALE = 'fr_FR.utf8');
Crer une collation partir d'une collation existante :
CREATE COLLATION german FROM "de_DE";
Ceci peut tre pratique pour pouvoir utiliser dans des applications des noms de collation indpendants du systme d'exploitation.
937
CREATE COLLATION
Compatibilit
Dans le standard SQL se trouve un ordre CREATE COLLATION, mais il est limit la copie d'une collation existante. La syntaxe de cration d'une nouvelle collation est une extension PostgreSQL.
Voir galement
ALTER COLLATION(7), DROP COLLATION(7)
938
Nom
CREATE CONVERSION Dfinir une nouvelle conversion d'encodage
Synopsis
CREATE [ DEFAULT ] CONVERSION nom
FOR codage_source TO codage_dest FROM nom_fonction
Description
CREATE CONVERSION dfinit une nouvelle conversion entre les encodages de caractres. De plus, les conversions marques DEFAULT peuvent tre utilises pour automatiser une conversion d'encodage entre le client et le serveur. Pour cela, deux
conversions, de l'encodage A vers l'encodage B et de l'encodage B vers l'encodage A, doivent tre dfinies.
Pour crer une conversion, il est ncessaire de possder les droits EXECUTE sur la fonction et CREATE sur le schma de destination.
Paramtres
DEFAULT
La clause DEFAULT indique une conversion par dfaut entre l'encodage source et celui de destination. Il ne peut y avoir,
dans un schma, qu'une seule conversion par dfaut pour un couple d'encodages.
nom
Le nom de la conversion. Il peut tre qualifi du nom du schma. Dans la cas contraire, la conversion est dfinie dans le
schma courant. Le nom de la conversion est obligatoirement unique dans un schma.
codage_source
Le nom de l'encodage source.
codage_dest
Le nom de l'encodage destination.
nom_fonction
La fonction utilise pour raliser la conversion. Son nom peut tre qualifi du nom du schma. Dans le cas contraire, la
fonction est recherche dans le chemin.
La fonction a la signature suivante :
conv_proc(
integer, -integer, -cstring, -internal, -integer
-) RETURNS void;
ID encodage source
ID encodage destination
chane source (chane C termine par un caractre nul)
destination (chane C termine par un caractre nul)
longueur de la chane source
Notes
DROP CONVERSION est utilis pour supprimer une conversion utilisateur.
Il se peut que les droits requis pour crer une conversion soient modifies dans une version ultrieure.
Exemples
Cration d'une conversion de l'encodage UTF8 vers l'encodage LATIN1 en utilisant mafonc :
CREATE CONVERSION maconv FOR 'UTF8' TO 'LATIN1' FROM mafonc;
Compatibilit
CREATE CONVERSION est une extension PostgreSQL. Il n'existe pas d'instruction CREATE CONVERSION dans le
standard SQL. Par contre, il existe une instruction CREATE TRANSLATION qui est trs similaire dans son but et sa syntaxe.
939
CREATE CONVERSION
Voir aussi
ALTER CONVERSION(7), CREATE FUNCTION(7), DROP CONVERSION(7)
940
Nom
CREATE DATABASE Crer une nouvelle base de donnes
Synopsis
CREATE DATABASE nom
[ [ WITH ] [ OWNER [=] nom_utilisateur ]
[ TEMPLATE [=] modle ]
[ ENCODING [=] codage ]
[ LC_COLLATE [=] lc_collate ]
[ LC_CTYPE [=] lc_ctype ]
[ TABLESPACE [=] tablespace ]
[ CONNECTION LIMIT [=] limite_connexion ] ]
Description
CREATE DATABASE cre une nouvelle base de donnes.
Pour crer une base de donnes, il faut tre superutilisateur ou avoir le droit spcial CREATEDB. Voir ce sujet CREATE
USER(7).
Par dfaut, la nouvelle base de donnes est cre en clonant la base systme standard template1. Un modle diffrent peut
tre utilis en crivant TEMPLATE nom. En particulier, la clause TEMPLATE template0 permet de crer une base de donnes vierge qui ne contient que les objets standards pr-dfinis dans la version de PostgreSQL utilise. C'est utile pour ne pas
copier les objets locaux ajouts template1.
Paramtres
nom
Le nom de la base de donnes crer.
nom_utilisateur
Le nom de l'utilisateur propritaire de la nouvelle base de donnes ou DEFAULT pour l'option par dfaut (c'est--dire le
nom de l'utilisateur qui excute la commande). Pour crer une base de donnes dont le propritaire est un autre rle, vous
devez tre un membre direct ou direct de ce rle, ou tre un superutilisateur.
modle
Le nom du modle squelette de la nouvelle base de donnes ou DEFAULT pour le modle par dfaut (template1).
codage
Le jeu de caractres de la nouvelle base de donnes. Peut-tre une chane (par exemple 'SQL_ASCII'), un nombre de jeu
de caractres de type entier ou DEFAULT pour le jeu de caractres par dfaut (en fait, celui de la base modle). Les jeux de
caractres supports par le serveur PostgreSQL sont dcrits dans Section 22.3.1, Jeux de caractres supports . Voir
ci-dessous pour des restrictions supplmentaires.
lc_collate
L'ordre de tri (LC_COLLATE) utiliser dans la nouvelle base. Ceci affecte l'odre de tri appliqu aux chanes, par exemple
dans des requtes avec ORDER BY, ainsi que l'ordre utilis dans les index sur les colonnes texte. Le comportement par dfaut est de choisir l'ordre de tri de la base de donnes modle. Voir ci-dessous pour les restrictions supplmentaires.
lc_ctype
La classification du jeu de caractres (LC_CTYPE) utiliser dans la nouvelle base. Ceci affecte la catgorisation des caractres, par exemple minuscule, majuscule et chiffre. Le comportement par dfaut est d'utiliser la classification de la base de
donnes modle. Voir ci-dessous pour les restrictions supplmentaires.
tablespace
Le nom du tablespace associ la nouvelle base de donnes ou DEFAULT pour le tablespace de la base de donnes modle.
Ce tablespace est celui par dfaut pour les objets crs dans cette base de donnes. Voir CREATE TABLESPACE(7) pour
plus d'informations.
limite_connexion
Le nombre de connexions concurrentes la base de donnes. -1 (valeur par dfaut) signifie qu'il n'y a pas de limite.
L'ordre des paramtres optionnels n'a aucune importance.
941
CREATE DATABASE
Notes
La commande CREATE DATABASE ne peut pas tre excute l'intrieur d'un bloc de transactions.
Les erreurs sur la ligne ne peut initialiser le rpertoire de la base de donnes ( could not initialize database directory dans la
version originale) sont le plus souvent dues des droits insuffisants sur le rpertoire de donnes, un disque plein ou un autre
problme relatif au systme de fichiers.
L'instruction DROP DATABASE(7) est utilise pour supprimer la base de donnes.
Le programme createdb(1) est un enrobage de cette commande fourni par commodit.
Bien qu'il soit possible de copier une base de donnes autre que template1 en spcifiant son nom comme modle, cela n'est pas
(encore) prvu comme une fonctionnalit COPY DATABASE d'usage gnral. La limitation principale est qu'aucune autre
session ne peut tre connecte la base modle pendant sa copie. CREATE DATABASE chouera s'il y a une autre connexion
au moment de son excution ; sinon, les nouveaux connexions la base modle seront verrouilles jusqu' la fin de la commande
CREATE DATABASE. La Section 21.3, Bases de donnes modles fournit plus d'informations ce sujet.
L'encodage du jeu de caractre spcifi pour la nouvelle base de donnes doit tre compatible avec les paramtre de locale
(LC_COLLATE et LC_CTYPE). Si la locale est C (ou de la mme faon POSIX), alors tous les encodages sont autoriss. Pour
d'autres paramtres de locale, il n'y a qu'un encodage qui fonctionnera correctement. (Nanmoins, sur Windows, l'encodage UTF-8
peut tre utilise avec toute locale.) CREATE DATABASE autorisera les superutilisateurs spcifier l'encodage SQL_ASCII
quelque soit le paramtre locale mais ce choix devient obsolte et peut occasionner un mauvais comportement des fonctions sur
les chanes si des donnes dont l'encodage n'est pas compatible avec la locale sont stockes dans la base.
Les paramtres d'encodage et de locale doivent correspondre ceux de la base modle, except quand la base template0 est utilise comme modle. La raison en est que d'autres bases de donnes pourraient contenir des donnes qui ne correspondent pas
l'encodage indiqu, ou pourraient contenir des index dont l'ordre de tri est affect par LC_COLLATE et LC_CTYPE. Copier ces
donnes peut rsulter en une base de donnes qui est corrompue suivant les nouveaux paramtres. template0, par contre, ne
contient aucun index pouvant tre affect par ces paramtres.
L'option CONNECTION LIMIT n'est qu'approximativement contraignante ; si deux nouvelles sessions commencent sensiblement
en mme temps alors qu'un seul connecteur la base est disponible, il est possible que les deux chouent. De plus, les superutilisateurs ne sont pas soumis cette limite.
Exemples
Crer une nouvelle base de donnes :
CREATE DATABASE lusiadas;
Crer une base de donnes ventes possde par l'utilisateur app_ventes utilisant le tablespace espace_ventes comme espace par dfaut :
CREATE DATABASE ventes OWNER app_ventes TABLESPACE espace_ventes;
Crer une base de donnes musique qui supporte le jeu de caractres ISO-8859-1 :
CREATE DATABASE musique ENCODING 'LATIN1' TEMPLATE template0;
Dans cet exemple, la clause TEMPLATE template0 sera uniquement requise si l'encodage de template1 n'est pas ISO8859-1. Notez que modifier l'encodage pourrait aussi ncessiter de slectionner de nouveaux paramtres pour LC_COLLATE et
LC_CTYPE.
Compatibilit
Il n'existe pas d'instruction CREATE DATABASE dans le standard SQL. Les bases de donnes sont quivalentes aux catalogues,
dont la cration est dfinie par l'implantation.
Voir aussi
ALTER DATABASE(7), DROP DATABASE(7)
942
Nom
CREATE DOMAIN Dfinir un nouveau domaine
Synopsis
CREATE DOMAIN nom [AS] type_donnee
[ COLLATE collation ]
[ DEFAULT expression ]
[ contrainte [ ... ] ]
o contrainte est :
[ CONSTRAINT nom_contrainte ]
{ NOT NULL | NULL | CHECK (expression) }
Description
CREATE DOMAIN cre un nouveau domaine. Un domaine est essentiellement un type de donnes avec des contraintes optionnelles (restrictions sur l'ensemble de valeurs autorises). L'utilisateur qui dfinit un domaine devient son propritaire.
Si un nom de schma est donn (par exemple, CREATE DOMAIN monschema.mondomaine ...), alors le domaine est
cr dans le schma spcifi. Sinon, il est cr dans le schma courant. Le nom du domaine doit tre unique parmi les types et
domaines existant dans son schma.
Les domaines permettent d'extraire des contraintes communes plusieurs tables et de les regrouper en un seul emplacement, ce
qui en facilite la maintenance. Par exemple, plusieurs tables pourraient contenir des colonnes d'adresses email, toutes ncessitant
la mme contrainte de vrification (CHECK) permettant de vrifier que le contenu de la colonne est bien une adresse email. Dfinissez un domaine plutt que de configurer la contrainte individuellement sur chaque table.
Paramtres
nom
Le nom du domaine crer (ventuellement qualifi du nom du schma).
type_donnees
Le type de donnes sous-jacent au domaine. Il peut contenir des spcifications de tableau.
collation
Un collationement optionnel pour le domaine. Si aucun collationnement n'est spcifi, le collationnement utilis par dfaut
est celui du type de donnes. Le type doit tre collationnable si COLLATE est spcifi.
DEFAULT expression
La clause DEFAULT permet de dfinir une valeur par dfaut pour les colonnes d'un type de donnes du domaine. La valeur
est une expression quelconque sans variable (les sous-requtes ne sont pas autorises). Le type de donnes de l'expression
par dfaut doit correspondre celui du domaine. Si la valeur par dfaut n'est pas indique, alors il s'agit de la valeur NULL.
L'expression par dfaut est utilise dans toute opration d'insertion qui ne spcifie pas de valeur pour cette colonne. Si une
valeur par dfaut est dfinie sur une colonne particulire, elle surcharge toute valeur par dfaut du domaine. De mme, la
valeur par dfaut surcharge toute valeur par dfaut associe au type de donnes sous-jacent.
CONSTRAINT nom_contrainte
Un nom optionnel pour une contrainte. S'il n'est pas spcifi, le systme en engendre un.
NOT NULL
Les valeurs de ce domaine sont habituellement protges comme les valeurs NULL. Nanmoins, il est toujours possible
qu'un domaine avec cette contrainte prenne une valeur NULL s'il se voit affect un type de domaine qui est devenu NULL,
par exemple via une jointure LEFT OUTER JOIN ou une requte du type INSERT INTO tab (colonne_domaine) VALUES ((SELECT colonne_domaine FROM tab WHERE false)).
NULL
Les valeurs de ce domaine peuvent tre NULL. C'est la valeur par dfaut.
Cette clause a pour seul but la compatibilit avec les bases de donnes SQL non standard. Son utilisation est dcourage
dans les applications nouvelles.
CHECK (expression)
943
CREATE DOMAIN
Les clauses CHECK spcifient des contraintes d'intgrit ou des tests que les valeurs du domaine doivent satisfaire. Chaque
contrainte doit tre une expression produisant un rsultat boolen. VALUE est obligatoirement utilis pour se rfrer la valeur teste.
Actuellement, les expressions CHECK ne peuvent ni contenir de sous-requtes ni se rfrer des variables autres que VALUE.
Exemples
Crer le type de donnes code_postal_us, et l'utiliser dans la dfinition d'une table. Un test d'expression rationnelle est utilis pour
vrifier que la valeur ressemble un code postal US valide :
CREATE DOMAIN code_postal_us AS TEXT
CHECK(
VALUE ~ '^\d{5}$'
OR VALUE ~ '^\d{5}-\d{4}$'
);
CREATE TABLE courrier_us (
id_adresse SERIAL PRIMARY KEY,
rue1 TEXT NOT NULL,
rue2 TEXT,
rue3 TEXT,
ville TEXT NOT NULL,
code_postal code_postal_us NOT NULL
);
Compatibilit
La commande CREATE DOMAIN est conforme au standard SQL.
Voir aussi
ALTER DOMAIN(7), DROP DOMAIN(7)
944
Nom
CREATE EXTENSION installe une nouvelle extension
Synopsis
CREATE EXTENSION [ IF NOT EXISTS ] nom_extension
[ WITH ] [ SCHEMA nom_schma ]
[ VERSION version ]
[ FROM ancienne_version ]
Description
CREATE EXTENSION charge une nouvelle extension dans la base de donne courante. Il ne doit pas y avoir d'extension dj
charge portant le mme nom.
Charger une extension consiste essentiellement excuter le script de l'extension. Ce script va crer dans la plupart des cas de
nouveaux objets SQL comme des fonctions, des types de donnes, des oprateurs et des mthodes d'indexation. La commande
CREATE EXTENSION enregistre en supplment les identifiants de chacun des objets crs, permettant ainsi de les supprimer
lorsque la commande DROP EXTENSION est appele.
Le chargement d'une extension ncessite les mmes droits que ceux qui permettent la cration de ses objets. La plupart des extensions ncessitent ainsi des droits superutilisateur ou d'tre le propritaire de la base de donne. L'utilisateur qui lance la commande CREATE EXTENSION devient alors le propritaire de l'extension (une vrification ultrieure des droits permettra de
le confirmer) et le propritaire de chacun des objets cr par le script de l'extension.
Paramtres
IF NOT EXISTS
Permet de ne pas retourner d'erreur si une extension de mme nom existe dj. Un simple message d'avertissement est alors
rapport. noter que l'extension existante n'a potentiellement aucun lien avec l'extension qui aurait pu tre cre.
nom_extension
Le nom de l'extension installer. PostgreSQL crera alors l'extension en utilisant les instructions du fichier de contrle
SHAREDIR/extension/nom_extension.control .
nom_schma
Le nom du schma dans lequel installer les objets de l'extension, en supposant que l'extension permette de dplacer ses objets dans un autre schma. Le schma en question doit exister au pralable. Si ce nom n'est pas spcifi et que le fichier de
contrle de l'extension ne spcifie pas de schma, le schma par dfaut en cours sera utilis.
Rappelez-vous que l'extension en soit n'est pas considre comme tant dans un schma. Les extensions ont des noms non
qualifis qui doivent tre uniques au niveau de la base de donnes. Par contre, les objets appartenant l'extension peuvent
tre dans des schmas.
version
La version de l'extension installer. Il peut s'agir d'un identifiant autant que d'une chane de caractre. La version par dfaut
est celle spcifie dans le fichier de contrle de l'extension.
ancienne_version
L'option FROM ancienne_version doit tre spcifie si et seulement s'il s'agit de convertir un module ancienne gnration (qui est en fait une simple collection d'objets non empaquete) en extension. Cette option modifie le comportement de
la commande CREATE EXTENSION pour excuter un script d'installation alternatif qui incorpore les objets existant dans
l'extension, plutt que de crer de nouveaux objets. Il faut prendre garde ce que SCHEMA spcifie le schma qui contient
ces objets pr-existant.
La valeur utiliser pour le paramtre ancienne_version est dtermine par l'auteur de l'extension et peut varier s'il
existe plus d'une version du module ancienne gnration qui peut voluer en une extension. Concernant les modules additionnels fournis en standard avant PostgreSQL 9.1, il est ncessaire d'utiliser la valeur unpackaged pour le paramtre
ancienne_version pour les faire voluer en extension.
Notes
Avant d'utiliser la commande CREATE EXTENSION pour charger une extension dans une base de donnes, il est ncessaire
945
CREATE EXTENSION
d'installer les fichiers qui l'accompagnent. Les informations de Modules supplmentaires fournis permettent d'installer les extensions fournies avec PostgreSQL.
Les extensions disponibles l'installation sur le serveur peuvent tre identifies au moyen des vues systmes
pg_available_extensions et pg_available_extension_versions.
Pour obtenir des informations sur l'criture de nouvelles extensions, consultez Section 35.15, Empaqueter des objets dans une
extension .
Exemples
Installer l'extension hstore dans la base de donnes courante :
CREATE EXTENSION hstore;
Mettre jour le module pr-9.1 hstore sous la forme d'une extension :
CREATE EXTENSION hstore SCHEMA public FROM unpackaged;
Prenez garde bien spcifier le schma vers lequel vous souhaitez installer les objets de hstore.
Compatibilit
La commande CREATE EXTENSION est spcifique PostgreSQL.
Voir aussi
ALTER EXTENSION(7), DROP EXTENSION(7)
946
Nom
CREATE FOREIGN DATA WRAPPER dfinit un nouveau wrapper de donnes distantes
Synopsis
CREATE FOREIGN DATA WRAPPER nom
[ HANDLER fonction_handler | NO HANDLER ]
[ VALIDATOR fonction_validation | NO VALIDATOR ]
[ OPTIONS ( option 'valeur' [, ... ] ) ]
Description
CREATE FOREIGN DATA WRAPPER cre un nouveau wrapper de donnes distantes. L'utilisateur qui dfinit un wrapper
de donnes distantes devient son propritaire.
Le nom du wrapper de donnes distantes doit tre unique dans la base de donnes.
Seuls les super-utilisateurs peuvent crer des wrappers de donnes distantes.
Paramtres
nom
Le nom du wrapper de donnes distantes crer.
HANDLER fonction_handler
fonction_handler est le nom d'une fonction enregistre prcdemment qui sera appele pour rcuprer les fonctions
d'excution pour les tables distantes. La fonction de gestion ne prend pas d'arguments et son code retour doit tre
fdw_handler.
Il est possible de crer un wrapper de donnes distantes sans fonction de gestion mais les tables distantes utilisant un tel
wrapper peuvent seulement tre dclares mais pas utilises.
VALIDATOR fonction_validation
fonction_validation est le nom d'une fonction dj enregistre qui sera appele pour vrifier les options gnriques
passes au wrapper de donnes distantes, ainsi que les options fournies au serveur distant et aux correspondances
d'utilisateurs (user mappings) utilisant le wrapper de donnes distantes. Si aucune fonction de validation n'est spcifie ou si
NO VALIDATOR est spcifi, alors les options ne seront pas vrifies au moment de la cration. (Il est possible que les
wrappers de donnes distantes ignorent ou rejettent des spcifications d'options invalides l'excution, en fonction de
l'implmentation) La fonction de validation doit prendre deux arguments : l'un du type text[], qui contiendra le tableau
d'options, tel qu'il est stock dans les catalogues systmes, et l'autre de type oid, qui sera l'OID du catalogue systme contenant les options. Le type de retour est inconnu ; la fonction doit rapporter les options invalides grce la fonction ereport(ERROR).
OPTIONS ( option 'valeur' [, ... ] )
Cette clause spcifie les options pour le nouveau wrapper de donnes distantes. Les noms et valeurs d'options autoriss sont
spcifiques chaque wrapper de donnes distantes. Ils sont valids par la fonction de validation du wrapper de donnes distantes. Les noms des options doivent tre uniques.
Notes
Pour le moment, la fonctionnalit de wrapper de donnes distantes est rudimentaire. Il n'y a pas de support pour mettre jour
une table distante et l'optimisation des requtes est basique (et principalement laisse au wrapper).
Actuellement, une fonction de validation de wrapper de donnes distantes est disponible : postgresql_fdw_validator,
qui accepte les options correspondant aux paramtres de connexion de libpq.
Exemples
Crer un wrapper de donnes distantes bidon :
CREATE FOREIGN DATA WRAPPER bidon;
947
Compatibilit
CREATE FOREIGN DATA WRAPPER est conforme la norme ISO/IEC 9075-9 (SQL/MED), l'exception des clauses
HANDLER et VALIDATOR qui sont des extensions, et des clauses LIBRARY et LANGUAGE qui ne sont pas implmentes dans
PostgreSQL.
Notez, cependant, que la fonctionnalit SQL/MED n'est pas encore conforme dans son ensemble.
Voir aussi
ALTER FOREIGN DATA WRAPPER(7), DROP FOREIGN DATA WRAPPER(7), CREATE SERVER(7), CREATE USER
MAPPING(7)
948
Nom
CREATE FOREIGN TABLE cre une nouvelle table distante
Synopsis
CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [
{ column_name data_type [ NULL | NOT NULL ] }
[, ... ]
] )
SERVER server_name
[ OPTIONS ( option 'value' [, ... ] ) ]
Description
La commande CREATE FOREIGN TABLE cre une nouvelle table distante dans la base de donnes courante. La table distante appartient l'utilisateur qui excute cette commande.
Si un nom de schema est spcifi (par exemple, CREATE FOREIGN TABLE monschema.matable ...), alors la table
sera cre dans le schma spcifi. Dans les autres cas, elle sera cre dans le schma courant. Le nom de la table distante doit
tre diffrent du nom des autres tables distantes, tables, squences, index ou vues du mme schma.
La commande CREATE FOREIGN TABLE cre aussi automatiquement un type de donne qui reprsente le type composite
correspondant une ligne de la table distante. En consquence, une table distante ne peut pas avoir le mme nom qu'un type de
donne existant dans le mme schma.
Paramtres
IF NOT EXISTS
Permet de ne pas retourner d'erreur si une table distante de mme nom existe dj. Une simple notice est alors rapporte.
noter que la table distante existante n'a potentiellement aucun lien avec la table distante qui aurait pu tre cre.
table_name
Le nom de la table distante crer. Il est aussi possible de spcifier le schma qui contient cette table.
column_name
Le nom de la colonne crer dans cette nouvelle table distante.
data_type
Le type de donne de la colonne. Cela peut inclure des spcificateurs de tableaux. Pour plus d'information sur les types de
donnes supports par PostgreSQL, se rfrer Chapitre 8, Types de donnes.
NOT NULL
Interdiction des valeurs NULL dans la colonne.
NULL
Les valeurs NULL sont autorises pour la colonne. Il s'agit du comportement par dfaut.
Cette clause n'est fournie que pour des raisons de compatibilit avec les bases de donnes SQL non standard. Son utilisation
n'est pas encourage dans les nouvelles applications.
server_name
Le nom d'un serveur existant pour la table distante.
OPTIONS ( option 'value' [, ...] )
Options qui peuvent tre associs la nouvelle table distante. Les noms des options autorises et leurs valeurs sont spcifiques chaque wrapper de donnes distantes et sont valides en utilisant la fonction de validation du wrapper de donnes
distantes. Le nom de chaque option doit tre unique.
Exemples
Crer une table distante films avec le serveur film_server :
949
Compatibilit
La commande CREATE FOREIGN TABLE est conforme au standard SQL. Toutefois, tout comme la commande CREATE
TABLE, l'usage de la contrainte NULL et des tables distantes sans colonnes sont autoriss.
Voir aussi
ALTER FOREIGN TABLE(7), DROP FOREIGN TABLE(7), CREATE TABLE(7), CREATE SERVER(7)
950
Nom
CREATE FUNCTION Dfinir une nouvelle fonction
Synopsis
CREATE [ OR REPLACE ] FUNCTION
nom ( [ [ modearg ] [ nomarg ] typearg [ { DEFAULT | = } expression_par_defaut ]
[, ...] ] ) ] )
[ RETURNS type_ret
| RETURNS TABLE ( nom_colonne type_colonne [, ...] ) ]
{ LANGUAGE nom_lang
| WINDOW
| IMMUTABLE | STABLE | VOLATILE
| CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
| [EXTERNAL] SECURITY INVOKER | [EXTERNAL] SECURITY DEFINER
| COST cout_execution
| ROWS nb_lignes_resultat
| SET parametre { TO value | = value | FROM CURRENT }
| AS 'definition'
| AS 'fichier_obj', 'symbole_lien'
} ...
[ WITH ( attribut [, ...] ) ]
Description
CREATE FUNCTION dfinit une nouvelle fonction. CREATE OR REPLACE FUNCTION cre une nouvelle fonction ou
la remplace si elle existe dj. Pour pouvoir crer une fonction, l'utilisateur doit avoir le droit USAGE sur le langage associ.
Si un nom de schma est prcis, la fonction est cre dans le schma indiqu. Sinon, elle est cre dans le schma courant. Le
nom de la nouvelle fonction ne peut pas correspondre celui d'une fonction existant avec les mmes types d'arguments en entre
dans le mme schma. Toutefois, les fonctions de types d'arguments diffrents peuvent partager le mme nom (ceci est appel
surcharge).
Pour remplacer la dfinition actuelle d'une fonction existante, CREATE OR REPLACE FUNCTION est utilis. Il n'est pas
possible de changer le nom ou les types d'argument d'une fonction de cette faon (cela cre une nouvelle fonction distincte). De
mme, CREATE OR REPLACE FUNCTION ne permet pas de modifier le type retour d'une fonction existante. Pour cela, il
est ncessaire de supprimer et de recrer la fonction. (Lors de l'utilisation de paramtres OUT, cela signifie que le type d'un paramtre OUT ne peut tre modifi que par la suppression de la fonction.)
Quand CREATE OR REPLACE FUNCTION est utilis pour remplacer une fonction existante, le propritaire et les droits de
la fonction ne changent pas. Toutes les autres proprits de la fonction se voient affectes les valeurs spcifies dans la commande ou implicites pour les autres. Vous devez tre le propritaire de la fonction pour la remplacer ou tre un membre du rle
propritaire de la fonction.
En cas de suppression et de recraction d'une fonction, la nouvelle fonction n'est pas la mme entit que l'ancienne ; il faut supprimer les rgles, vues, dclencheurs, etc. qui rfrencent l'ancienne fonction. CREATE OR REPLACE FUNCTION permet
de modifier la dfinition d'une fonction sans casser les objets qui s'y rfrent. De plus, ALTER FUNCTION peut tre utilis
pour modifier la plupart des proprits supplmentaires d'une fonction existante.
L'utilisateur qui cre la fonction en devient le propritaire.
Paramtres
nom
Le nom de la fonction crer (ventuellement qualifi du nom du schma).
modearg
Le mode d'un argument : IN, OUT, INOUT ou VARIADIC. En cas d'omission, la valeur par dfaut est IN. Seuls des arguments OUT peuvent suivre un argument VARIADIC. Par ailleurs, des arguments OUT et INOUT ne peuvent pas tre utiliss
en mme temps que la notation RETURNS TABLE.
nomarg
Le nom d'un argument. Quelques langages (incluant PL/pgSQL, mais pas SQL) permettent d'utiliser ce nom dans le corps
de la fonction. Pour les autres langages, le nom d'un argument en entre est purement documentaire en ce qui concerne la
fonction elle-mme. Mais vous pouvez utiliser les noms d'arguments en entre lors de l'appel d'une fonction pour amliorer
951
CREATE FUNCTION
la lisibilit (voir Section 4.3, Fonctions appelantes ). Dans tous les cas, le nom d'un argument en sortie a une utilit car il
dfinit le nom de la colonne dans la ligne rsultat. (En cas d'omission du nom d'un argument en sortie, le systme choisit un
nom de colonne par dfaut.)
argtype
Le(s) type(s) de donnes des arguments de la fonction (ventuellement qualifi du nom du schma), s'il y en a. Les types des
arguments peuvent tre basiques, composites ou de domaines, ou faire rfrence au type d'une colonne.
En fonction du langage, il est possible d'indiquer des pseudotypes , tel que cstring. Les pseudotypes indiquent que le type
d'argument rel est soit non compltement spcifi, soit en dehors de l'ensemble des types de donnes ordinaires du SQL.
Il est fait rfrence au type d'une colonne par nom_table.nomcolonne%TYPE. Cette fonctionnalit peut servir rendre
une fonction indpendante des modifications de la dfinition d'une table.
expression_par_defaut
Une expression utiliser en tant que valeur par dfaut si le paramtre n'est pas spcifi. L'expression doit pouvoir tre coercible dans le type d'argument du paramtre. Seuls les paramtres d'entre (dont les INOUT) peuvent avoir une valeur par dfaut. Tous les paramtres d'entre suivant un paramtre avec une valeur par dfaut doivent aussi avoir une valeur par dfaut.
type_ret
Le type de donnes en retour (ventuellement qualifi du nom du schma). Le type de retour peut tre un type basique, composite ou de domaine, ou faire rfrence au type d'une colonne existante. En fonction du langage, il est possible d'indiquer un
pseudotype , tel que cstring. Si la fonction ne doit pas renvoyer de valeur, on indique void comme type de retour.
Quand il y a des paramtres OUT ou INOUT, la clause RETURNS peut tre omise. Si elle est prsente, elle doit correspondre
au type de rsultat impos par les paramtres de sortie : RECORD s'il y en a plusieurs, ou le type du seul paramtre en sortie.
Le modificateur SETOF indique que la fonction retourne un ensemble d'lments plutt qu'un seul.
Il est fait rfrence au type d'une colonne par nom_table.nomcolonne%TYPE.
nom_colonne
Le nom d'une colonne de sortie dans la syntaxe RETURNS TABLE. C'est une autre faon de dclarer un paramtre OUT
nomm, la diffrence prs que RETURNS TABLE implique aussi RETURNS SETOF.
type_colonne
Le type de donnes d'une colonne de sortie dans la syntaxe RETURNS TABLE.
nom_lang
Le nom du langage d'criture de la fonction. Peut tre SQL, C, internal ou le nom d'un langage procdural utilisateur.
Pour des raisons de compatibilit descendante, le nom peut tre crit entre guillemets simples.
WINDOW
WINDOW indique que la fonction est une fonction window plutt qu'une fonction simple. Ceci n'est l'heure actuelle utilisable
que pour les fonctions crites en C. L'attribut WINDOW ne peut pas tre chang lors du remplacement d'une dfinition de fonction existante.
IMMUTABLE, STABLE, VOLATILE
Ces attributs informent l'optimiseur de requtes sur le comportement de la fonction. Un seul choix est possible. En son absence, VOLATILE est utilis.
IMMUTABLE indique que la fonction ne peut pas modifier la base de donnes et qu' arguments constants, la fonction renvoie
toujours le mme rsultat ; c'est--dire qu'elle n'effectue pas de recherches dans la base de donnes, ou alors qu'elle utilise des
informations non directement prsentes dans la liste d'arguments. Si cette option est prcise, tout appel de la fonction avec
des arguments constants peut tre immdiatement remplac par la valeur de la fonction.
STABLE indique que la fonction ne peut pas modifier la base de donnes et qu' l'intrieur d'un seul parcours de la table, arguments constants, la fonction retourne le mme rsultat, mais celui-ci varie en fonction des instructions SQL. Cette option
est approprie pour les fonctions dont les rsultats dpendent des recherches en base, des variables de paramtres (tel que la
zone horaire courante), etc. (Ce mode est inappropri pour les triggers AFTER qui souhaitent voir les lignes modifies par la
commande en cours.) La famille de fonctions current_timestamp est qualifie de stable car les valeurs de ces fonctions
ne changent pas l'intrieur d'une transaction.
VOLATILE indique que la valeur de la fonction peut changer mme au cours d'un seul parcours de table. Aucune optimisation ne peut donc tre ralise. Relativement peu de fonctions de bases de donnes sont volatiles dans ce sens ; quelques
exemples sont random(), currval(), timeofday(). Toute fonction qui a des effets de bord doit tre classe volatile,
mme si son rsultat est assez prvisible. Cela afin d'viter l'optimisation des appels ; setval() en est un exemple.
Pour des dtails complmentaires, voir Section 35.6, Catgories de volatilit des fonctions .
CALLED ON NULL INPUT, RETURNS NULL ON NULL INPUT, STRICT
952
CREATE FUNCTION
CALLED ON NULL INPUT (la valeur par dfaut) indique que la fonction est appele normalement si certains de ses arguments sont NULL. C'est alors de la responsabilit de l'auteur de la fonction de grer les valeurs NULL.
RETURNS NULL ON NULL INPUT ou STRICT indiquent que la fonction renvoie toujours NULL si l'un de ses arguments
est NULL. Lorsque ce paramtre est utilis et qu'un des arguments est NULL, la fonction n'est pas excute, mais un rsultat
NULL est automatiquement retourn.
[EXTERNAL] SECURITY INVOKER, [EXTERNAL] SECURITY DEFINER
SECURITY INVOKER indique que la fonction est excute avec les droits de l'utilisateur qui l'appelle. C'est la valeur par dfaut. SECURITY DEFINER spcifie que la fonction est excute avec les droits de l'utilisateur qui l'a cr.
Le mot cl EXTERNAL est autoris pour la conformit SQL mais il est optionnel car, contrairement SQL, cette fonctionnalit s'applique toutes les fonctions, pas seulement celles externes.
cout_execution
Un nombre positif donnant le cot estim pour l'excution de la fonction en unit de cpu_operator_cost. Si la fonction renvoie
plusieurs lignes, il s'agit d'un cot par ligne renvoye. Si le cot n'est pas spcifi, une unit est suppose pour les fonctions en
langage C et les fonctions internes. Ce cot est de 100 units pour les fonctions dans tout autre langage. Des valeurs plus importantes feront que le planificateur tentera d'viter l'valuation de la fonction aussi souvent que possible.
nb_lignes_resultat
Un nombre positif donnant le nombre estim de lignes que la fonction renvoie, information utile au planificateur. Ceci est
seulement autoris pour les fonctions qui renvoient plusieurs lignes (fonctions SRF). La valeur par dfaut est de 1000 lignes.
parametre, valeur
La clause SET fait que le paramtre de configuration indique est initialise avec la valeur prcise au lancement de la fonction, puis restaure sa valeur d'origine lors de la sortie de la fonction. SET FROM CURRENT utilise la valeur actuelle de la
session comme valeur appliquer au lancement de la fonction.
Si une clause SET est attache une fonction, alors les effets de la commande SET LOCAL excute l'intrieur de la fonction pour la mme variable sont restreints la fonction : la valeur prcdente du paramtre de configuration est de nouveau
restaure en sortie de la fonction. Nanmoins, une commande SET ordinaire (c'est--dire sans LOCAL) surcharge la clause
SET, comme il le ferait pour une prcdente commande SET LOCAL : les effets d'une telle commande persisteront aprs la
sortie de la fonction sauf si la transaction en cours est annule.
Voir SET(7) et Chapitre 18, Configuration du serveur pour plus d'informations sur les paramtres et valeurs autoriss.
definition
Une constante de type chane dfinissant la fonction ; la signification dpend du langage. Cela peut tre un nom de fonction
interne, le chemin vers un fichier objet, une commande SQL ou du texte en langage procdural.
Il est souvent utile d'utiliser les guillemets dollar (voir Section 4.1.2.4, Constantes de chanes avec guillemet dollar ) pour
crire le code de la fonction, au lie des la syntaxe habituelle des guillemets. Sans les guillemets dollar, tout guillemet ou antislash dans la dfinition de la fonction doit tre chapp en les doublant.
fichier_obj, symbole_lien
Cette forme de clause AS est utilise pour les fonctions en langage C chargeables dynamiquement lorsque le nom de la fonction dans le code source C n'est pas le mme que celui de la fonction SQL. La chane fichier_obj est le nom du fichier
contenant l'objet chargeable dynamiquement et symbole_lien est le symbole de lien de la fonction, c'est--dire le nom de
la fonction dans le code source C. Si ce lien est omis, il est suppos tre le mme que le nom de la fonction SQL dfinie.
Lors d'appels rpts CREATE FUNCTION se rfrant au mme fichier objet, il est charg seulement une fois par session.
Pour dcharger et recharger le fichier (par exemple lors du dveloppement de la fonction), dmarrez une nouvelle session.
attribut
Faon historique d'indiquer des informations optionnelles concernant la fonction. Les attributs suivants peuvent apparatre
ici :
isStrict
quivalent STRICT ou RETURNS NULL ON NULL INPUT.
isCachable
isCachable est un quivalent obsolte de IMMUTABLE ; il est toujours accept pour des raisons de compatibilit ascendante.
Les noms d'attribut sont insensibles la casse.
La lecture de Section 35.3, Fonctions utilisateur fournit des informations supplmentaires sur l'criture de fonctions.
Overloading
953
CREATE FUNCTION
PostgreSQL autorise la surcharge des fonctions ; c'est--dire que le mme nom peut tre utilis pour des fonctions diffrentes si
tant est qu'elles aient des types d'arguments en entre distincts. Nanmoins, les noms C de toutes les fonctions doivent tre diffrents. Il est donc ncessaire de donner des noms diffrents aux fonctions C sucharges (on peut, par exemple, utiliser le type des
arguments dans le nom de la fonction).
Deux fonctions sont considres identiques si elles partagent le mme nom et les mmes types d'argument en entre, sans considration des paramtres OUT. Les dclarations suivantes sont, de fait, en conflit :
CREATE FUNCTION truc(int) ...
CREATE FUNCTION truc(int, out text) ...
Des fonctions ayant des listes de types d'arguments diffrents ne seront pas considres comme en conflit au moment de leur cration, mais si des valeurs par dfauts sont fournies, elles peuvent se retrouver en conflit au moment de l'invocation. Considrez par
exemple :
CREATE FUNCTION truc(int) ...
CREATE FUNCTION truc(int, int default 42) ...
Un appel truc(10) chouera cause de l'ambigut sur la fonction appeler.
Notes
La syntaxe SQL complte des types est autoris pour dclarer les arguments en entre et la valeur de sortie d'une fonction. Nanmoins, les modificateurs du type de la fonction (par exemple le champ prcision pour un numeric) sont ignors par CREATE
FUNCTION. Du coup, par exemple, CREATE FUNCTION foo (varchar(10)) ... est identique CREATE FUNCTION foo (varchar) ....
Lors du remplacement d'une fonction existante avec CREATE OR REPLACE FUNCTION, il existe des restrictions sur le
changement des noms de paramtres. Vous ne pouvez pas modifier le nom de paramtre en entre dj affect mais vous pouvez
ajouter des noms aux paramtres qui n'en avaient pas. S'il y a plus d'un paramtre en sortie, vous ne pouvez pas changer les noms
des paramtres en sortie car cela changera les noms de colonne du type composite anonyme qui dcrit le rsultat de la fonction.
Ces restrictions sont l pour assurer que les appels suivants la fonction ne s'arrtent pas de fonctionner lorsqu'elle est remplace.
Exemples
Quelques exemples triviaux pour bien dbuter sont prsents ci-aprs. Pour plus d'informations et d'exemples, voir Section 35.3,
Fonctions utilisateur .
CREATE FUNCTION add(integer, integer) RETURNS integer
AS 'select $1 + $2;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
Incrmenter un entier, en utilisant le nom de l'argument, dans PL/pgSQL :
CREATE OR REPLACE FUNCTION increment(i integer) RETURNS integer AS $$
BEGIN
RETURN i + 1;
END;
$$ LANGUAGE plpgsql;
Renvoyer un enregistrement contenant plusieurs paramtres en sortie :
CREATE FUNCTION dup(in int, out f1 int, out f2 text)
AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
LANGUAGE SQL;
SELECT * FROM dup(42);
La mme chose, en plus verbeux, avec un type composite nomm explicitement :
CREATE TYPE dup_result AS (f1 int, f2 text);
CREATE FUNCTION dup(int) RETURNS dup_result
AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
LANGUAGE SQL;
SELECT * FROM dup(42);
954
CREATE FUNCTION
Une autre faon de renvoyer plusieurs colonnes est d'utiliser une fonction TABLE :
CREATE FUNCTION dup(int) RETURNS TABLE(f1 int, f2 text)
AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
LANGUAGE SQL;
SELECT * FROM dup(42);
Toutefois, une fonction TABLE est diffrente des exemples prcdents parce qu'elle retourne en fait un ensemble
d'enregistrements, pas juste un enregistrement.
Compatibilit
Une commande CREATE FUNCTION est dfinie en SQL:1999 et ultrieur. La version PostgreSQL est similaire mais pas entirement compatible. Les attributs ne sont pas portables, pas plus que les diffrents langages disponibles.
Pour des raisons de compatibilit avec d'autres systmes de bases de donnes, modearg peut tre crit avant ou aprs nomarg.
Mais seule la premire faon est compatible avec le standard.
Le standard SQL ne dfinit pas de paramtres par dfaut. La syntaxe avec le mot cl DEFAULT provient d'Oracle, et elle est assez
proche de l'esprit du standard : SQL/PSQL l'utilise pour les valeurs par dfaut de variables. La syntaxe avec = est utilise dans TSQL et Firebird.
955
CREATE FUNCTION
Voir aussi
ALTER FUNCTION(7), DROP FUNCTION(7), GRANT(7), LOAD(7), REVOKE(7), createlang(1)
956
Nom
CREATE GROUP Dfinir un nouveau rle de base de donnes
Synopsis
CREATE GROUP nom [ [ WITH ] option [ ... ] ]
o option peut tre :
|
|
|
|
|
|
|
|
|
|
|
|
|
SUPERUSER | NOSUPERUSER
CREATEDB | NOCREATEDB
CREATEROLE | NOCREATEROLE
CREATEUSER | NOCREATEUSER
INHERIT | NOINHERIT
LOGIN | NOLOGIN
[ ENCRYPTED | UNENCRYPTED ] PASSWORD 'motdepasse'
VALID UNTIL 'dateheure'
IN ROLE nom_role [, ...]
IN GROUP nom_role [, ...]
ROLE nom_role [, ...]
ADMIN nom_role [, ...]
USER nom_role [, ...]
SYSID uid
Description
CREATE GROUP est dsormais un alias de CREATE ROLE(7).
Compatibilit
Il n'existe pas d'instruction CREATE GROUP dans le standard SQL.
Voir aussi
CREATE ROLE(7)
957
Nom
CREATE INDEX Dfinir un nouvel index
Synopsis
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ nom ] ON table [ USING mthode ]
( { colonne | ( expression ) } [ COLLATE collation ] [ classeop ] [ ASC | DESC ]
[ NULLS { FIRST | LAST } ] [, ...] )
[ WITH ( parametre_stockage = valeur [, ... ] ) ]
[ TABLESPACE espacelogique ]
[ WHERE prdicat ]
Description
CREATE INDEX construit un index sur le (ou les) colonne(s) spcifie(s) de la table spcifie. Les index sont principalement
utiliss pour amliorer les performances de la base de donnes (bien qu'une utilisation inapproprie puisse produire l'effet inverse).
Les champs cl pour l'index sont spcifis l'aide de noms des colonnes ou par des expressions crites entre parenthses. Plusieurs champs peuvent tre spcifis si la mthode d'indexation supporte les index multi-colonnes.
Un champ d'index peut tre une expression calcule partir des valeurs d'une ou plusieurs colonnes de la ligne de table. Cette
fonctionnalit peut tre utilise pour obtenir un accs rapide des donnes obtenues par transformation des donnes basiques.
Par exemple, un index calcul sur upper(col) autorise la clause WHERE upper(col) = 'JIM' utiliser un index.
PostgreSQL fournit les mthodes d'indexation B-tree (NDT : arbres balancs), hash (NDT : hachage), GiST (NDT : arbres de
recherche gnraliss) et GIN. Il est possible, bien que compliqu, de dfinir des mthodes d'indexation utilisateur.
Lorsque la clause WHERE est prsente, un index partiel est cr. Un index partiel est un index ne contenant des entres que pour
une portion d'une table, habituellement la portion sur laquelle l'indexation est la plus utile. Par exemple, si une table contient des
ordres facturs et d'autres qui ne le sont pas, et que les ordres non facturs n'occupent qu'une petite fraction du total de la table,
qui plus est frquemment utilise, les performances sont amliores par la cration d'un index sur cette portion. Une autre application possible est l'utilisation de la clause WHERE en combinaison avec UNIQUE pour assurer l'unicit sur un sous-ensemble
d'une table. Voir Section 11.8, Index partiels pour plus de renseignements.
L'expression utilise dans la clause WHERE peut ne faire rfrence qu' des colonnes de la table sous-jacente, mais elle peut utiliser toutes les colonnes, pas uniquement celles indexes. Actuellement, les sous-requtes et les expressions d'agrgats sont aussi
interdites dans la clause WHERE. Les mmes restrictions s'appliquent aux champs d'index qui sont des expressions.
Toutes les fonctions et oprateurs utiliss dans la dfinition d'index doivent tre immutable (NDT : immuable), c'est--dire
que leur rsultat ne doit dpendre que de leurs arguments et jamais d'une influence externe (telle que le contenu d'une autre table
ou l'heure). Cette restriction permet de s'assurer que le comportement de l'index est strictement dfini. Pour utiliser une fonction
utilisateur dans une expression d'index ou dans une clause WHERE, cette fonction doit tre marque immutable lors de sa cration.
Paramtres
UNIQUE
Le systme vrifie la prsence de valeurs dupliques dans la table la cration de l'index (si des donnes existent dj) et
chaque fois qu'une donne est ajoute. Les tentatives d'insertion ou de mises jour qui rsultent en des entres dupliques
engendrent une erreur.
CONCURRENTLY
Quand cette option est utilise, PostgreSQL construira l'index sans prendre de verrous qui bloquent les insertions, mises
jour, suppression en parallle sur cette table ; la construction d'un index standard verrouille les critures (mais pas les lectures) sur la table jusqu' la fin de la construction. Il est ncessaire d'avoir quelques connaissances avant d'utiliser cette option -- voir la section intitule Construire des index en parallle .
nom
Le nom de l'index crer. Aucun nom de schma ne peut tre inclus ici ; l'index est toujours cr dans le mme schma que
sa table parent. Si le nom est omis, PostgreSQL choisit un nom convenable bas sur le nom de la table parent et celui des
colonnes indexes.
table
Le nom de la table indexer (ventuellement qualifi du nom du schma).
958
CREATE INDEX
mthode
Le nom de la mthode utiliser pour l'index. Les choix sont btree, hash, gist et gin. La mthode par dfaut est btree.
colonne
Le nom d'une colonne de la table.
expression
Une expression base sur une ou plusieurs colonnes de la table. L'expression doit habituellement tre crite entre parenthses,
comme la syntaxe le prcise. Nanmoins, les parenthses peuvent tre omises si l'expression a la forme d'un appel de fonction.
collation
Le nom du collationnement utiliser pour l'index. Par dfaut, l'index utilise le collationnement dclar pour la colonne indexer ou le collationnement rsultant de l'expression indexer. Les index avec des collationnements spcifiques peuvent tre
utiles pour les requtes qui impliquent des expressions utilisant des collationnements spcifiques.
classeop
Le nom d'une classe d'oprateur. Voir plus bas pour les dtails.
ASC
Spcifie un ordre de tri ascendant (valeur par dfaut).
DESC
Spcifie un ordre de tri descendant.
NULLS FIRST
Spcifie que les valeurs NULL sont prsentes avant les valeurs non NULL. Ceci est la valeur par dfaut quand DESC est indiqu.
NULLS LAST
Spcifie que les valeurs NULL sont prsentes aprs les valeurs non NULL. Ceci est la valeur par dfaut quand ASC est indiqu.
paramtre_stockage
Le nom d'un paramtre de stockage spcifique la mthode d'indexage. Voir la section intitule Paramtres de stockage des
index pour les dtails.
espacelogique
Le tablespace dans lequel crer l'index. S'il n'est pas prcis, default_tablespace est consult, sauf si la table est temporaire auquel cas temp_tablespaces est utilis.
prdicat
L'expression de la contrainte pour un index partiel.
959
CREATE INDEX
Note
Dsactiver FASTUPDATE via ALTER INDEX empche les insertions futures d'aller dans la liste d'entres
d'index traiter, mais ne nettoie pas les entres prcdentes de cette liste. Vous voudrez peut tre ensuite excuter un VACUUM sur la table, afin de garantir que la liste traiter soit vide.
Notes
Chapitre 11, Index prsente des informations sur le moment o les index peuvent tre utiliss, quand ils ne le sont pas et dans
quelles situations particulires ils peuvent tre utiles.
Actuellement, seules les mthodes d'indexation B-tree, GiST et GIN supportent les index multi-colonnes. Jusqu' 32 champs
960
CREATE INDEX
peuvent tre spcifis par dfaut. (Cette limite peut tre modifie la compilation de PostgreSQL.) Seul B-tree supporte actuellement les index uniques.
Une classe d'oprateur peut tre spcifie pour chaque colonne d'un index. La classe d'oprateur identifie les oprateurs utiliser
par l'index pour cette colonne. Par exemple, un index B-tree sur des entiers cods sur quatre octets utilise la classe int4_ops,
qui contient des fonctions de comparaison pour les entiers sur quatre octets. En pratique, la classe d'oprateur par dfaut pour le
type de donnes de la colonne est gnralement suffisant. Les classes d'oprateur trouvent leur intrt principal dans l'existence,
pour certains types de donnes, de plusieurs ordonnancements significatifs.
Soit l'exemple d'un type de donnes nombre complexe qui doit tre class par sa valeur absolue ou par sa partie relle. Cela
peut tre ralis par la dfinition de deux classes d'oprateur pour le type de donnes, puis par la slection de la classe approprie
lors de la cration d'un index.
De plus amples informations sur les classes d'oprateurs sont disponibles dans Section 11.9, Classes et familles d'oprateurs et
dans Section 35.14, Interfacer des extensions d'index .
Pour les mthodes d'indexage qui supportent les parcours ordonns (actuellement seulement pour les B-tree), les clauses optionnelles ASC, DESC, NULLS FIRST et/ou NULLS LAST peuvent tre spcifies pour modifier l'ordre de tri normal de l'index.
Comme un index ordonn peut tre parcouru en avant et en arrire, il n'est habituellement pas utile de crer un index DESC sur
une colonne -- ce tri est dj disponible avec un index standard. L'intrt de ces options se rvle avec les index multi-colonnes.
Ils peuvent tre crs pour correspondre un tri particulier demand par une requte, comme SELECT ... ORDER BY x
ASC, y DESC. Les options NULLS sont utiles si vous avez besoin de supporter le comportement nulls sort low , plutt que le
nulls sort high par dfaut, dans les requtes qui dpendent des index pour viter l'tape du tri.
Pour la plupart des mthodes d'indexation, la vitesse de cration d'un index est dpendante du paramtre maintenance_work_mem.
Une plus grande valeur rduit le temps ncessaire la cration d'index, tant qu'elle ne dpasse pas la quantit de mmoire vraiment disponible, afin d'viter que la machine ne doive paginer. Pour les index de type hash, la valeur de effective_cache_size est
aussi importante pour le temps de cration de l'index : PostgreSQL utilisera une des deux mthodes de cration d'index hash
disponibles selon que la taille estime de l'index crer est suprieure ou infrieure effective_cache_size. Pour obtenir
les meilleurs rsultats, assurez-vous que ce paramtre est aussi positionn quelque chose qui reflte la quantit de mmoire disponible, et soyez attentif ce que la somme de maintenance_work_mem et effective_cache_size soit infrieure la
quantit de mmoire disponible de la machine pour PostgreSQL (en prenant en compte les autres programmes en cours
d'excution sur la machine).
DROP INDEX(7) est utilis pour supprimer un index.
Les versions prcdentes de PostgreSQL ont aussi une mthode d'index R-tree. Cette mthode a t supprime car elle n'a pas
d'avantages par rapport la mthode GiST. Si USING rtree est indiqu, CREATE INDEX l'interprtera comme USING
gist pour simplifier la conversions des anciennes bases GiST.
Exemples
Crer un index B-tree sur la colonne titre dans la table films :
CREATE UNIQUE INDEX title_idx ON films (title);
Pour crer un index sur l'expression lower(titre), permettant une recherche efficace quelque soit la casse :
CREATE INDEX ON films ((lower(titre)));
(dans cet exemple, nous avons choisi d'omettre le nom de l'index, donc le systme choisira un nom, typiquement
films_lower_idx.)
Pour crer un index avec un collationnement spcifique :
CREATE INDEX title_idx_german ON films (title COLLATE "de_DE");
Attention
Les oprations sur les index hash ne sont pas enregistres dans les journaux de transactions. Du coup, les index
hash doivent tre reconstruit avec REINDEX aprs un arrt brutal de la base de donnes si des modifications n'ont
pas t crites. De plus, les modifications dans les index hash ne sont pas rpliques avec la rplication Warm
Standby aprs la sauvegarde de base initiale, donc ces index donneront de mauvaises rponses aux requtes qui les
utilisent. Pour ces raisons, l'utilisation des index hash est actuellement dconseille.
Pour crer un index avec un ordre de tri des valeurs NULL diffrent du standard :
961
CREATE INDEX
Compatibilit
CREATE INDEX est une extension du langage PostgreSQL. Les index n'existent pas dans le standard SQL.
Voir aussi
ALTER INDEX(7), DROP INDEX(7)
962
Nom
CREATE LANGUAGE Dfinir un nouveau langage procdural
Synopsis
CREATE [ OR REPLACE ] [ PROCEDURAL ] LANGUAGE nom
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE nom
HANDLER gestionnaire_appel [ VALIDATOR fonction_validation ]
Description
CREATE LANGUAGE enregistre un nouveau langage procdural une base de donnes PostgreSQL. En consquence, les
fonctions et les procdures de dclencheurs peuvent tre dfinies dans ce nouveau langage.
Note
partir de PostgreSQL 9.1, la plupart des langages procduraux ont t tranforms en extensions , et
doivent du coup tre installs avec CREATE EXTENSION(7), et non pas avec CREATE LANGUAGE.
L'utilisation directe de CREATE LANGUAGE devrait maintenant tre rserve aux scripts d'installation
d'extension. Si vous avez un langage nu dans votre base de donnes, peut-tre comme rsultat d'une mise
jour, vous pouvez le convertir en extension en utilisant CREATE EXTENSION nom_langage FROM unpackaged.
CREATE LANGUAGE associe en fait le nom du langage un ou des fonctions de gestion qui sont responsable de l'excution
des fonctions crites dans le langage. Chapitre 38, Langages de procdures offre de plus amples informations sur les gestionnaires de fonctions.
La commande CREATE LANGUAGE existe sous deux formes. Dans la premire, l'utilisateur ne fournit que le nom du langage dsir et le serveur PostgreSQL consulte le catalogue systme pg_pltemplate pour dterminer les paramtres adquats.
Dans la seconde, l'utilisateur fournit les paramtres du langage avec son nom. Cette forme peut tre utilise pour crer un langage non dfini dans pg_pltemplate. Cette approche est cependant obsolte.
Si le serveur trouve une entre dans le catalogue pg_pltemplate pour le nom donn, il utilise les donnes du catalogue quand
bien mme la commande incluerait les paramtres du langage. Ce comportement simplifie le chargement des anciens fichiers de
sauvegarde ; ceux-ci prsentent le risque de contenir des informations caduques sur les fonctions de support du langage.
Habituellement, l'utilisateur doit tre un superutilisateur PostgreSQL pour enregistrer un nouveau langage. Nanmoins, le propritaire d'une base de donnes peut enregistrer un nouveau langage dans sa base si le langage est list dans le catalogue
pg_pltemplate et est marqu comme autoris tre cr par les propritaires de base (tmpldbacreate true). La valeur par
dfaut est que les langages de confiance peuvent tre crs par les propritaires de base de donnes, mais cela peut tre modifi
par les superutilisateurs en ajustant le contenu de pg_pltemplate. Le crateur d'un langage devient son propritaire et peut ensuite le supprimer, le renommer ou le donner un autre propritaire.
CREATE OR REPLACE LANGUAGE crera un nouveau langage ou remplacera une dfinition existante. Si le langage
existe dj, ces paramtres sont mis jour suivant les valeurs indiques ou prises de pg_pltemplate mais le propritaire et les
droits du langage ne sont pas modifis et toutes fonctions existantes cres dans le langage sont supposes tre toujours valides.
En plus des droits ncessaires pour crer un langage, un utilisateur doit tre superutilisateur ou propritaire du langage existant.
Le cas REPLACE a pour but principal d'tre utilis pour s'assurer que le langage existe. Si le langage a une entre pg_pltemplate
alors REPLACE ne modifiera rien sur la dfinition existante, sauf dans le cas inhabituel o l'entre pg_pltemplate a t modifie
depuis que le langage a t cr.
Paramtres
TRUSTED
TRUSTED indique que le langage ne donne pas accs aux donnes auquel l'utilisateur n'a pas normalement accs. Si ce mot
cl est omis l'enregistrement du langage, seuls les superutilisateurs peuvent utiliser ce langage pour crer de nouvelles
fonctions.
PROCEDURAL
Sans objet.
nom
Le nom du nouveau langage procdural, insensible la casse. Il ne peut y avoir deux langages portant le mme nom au sein
963
CREATE LANGUAGE
de la base de donnes.
Pour des raisons de compatibilit descendante, le nom doit tre entour de guillemets simples.
HANDLER gestionnaire_appel
gestionnaire_appel est le nom d'une fonction prcdemment enregistre. C'est elle qui est appele pour excuter les
fonctions du langage procdural. Le gestionnaire d'appels d'un langage procdural doit tre crit dans un langage compil, tel
que le C, avec la convention d'appel version 1 et enregistr dans PostgreSQL comme une fonction ne prenant aucun argument et retournant le type language_handler, type servant essentiellement identifier la fonction comme gestionnaire
d'appels.
INLINE gestionnaire_en_ligne
gestionnaire_en_ligne est le nom d'une fonction dj enregistre qui sera appele pour excuter un bloc de code anonyme (voir la commande DO(7)) dans ce langage. Si aucune fonction gestionnaire_en_ligne n'est indique, le langage ne supporte pas les blocs de code anonymes. La fonction de gestion doit prendre un argument du type internal, qui sera
la reprsentation interne de la commande DO, et il renverra le type void. La valeur de retour du gestionnaire est ignore.
VALIDATOR fonction_validation
fonction_validation est le nom d'une fonction prcdemment enregistre. C'est elle qui est appele pour valider toute
nouvelle fonction crite dans ce langage. Si aucune fonction de validation n'est spcifie, alors toute nouvelle fonction n'est
pas vrifie sa cration. La fonction de validation prend obligatoirement un argument de type oid, OID de la fonction
crer, et renvoie par convention void.
Une fonction de validation contrle gnralement le corps de la fonction pour s'assurer de sa justesse syntaxique mais peut
galement vrifier d'autres proprits de la fonction (l'incapacit du langage grer certains types d'argument, par exemple).
Le signalement d'erreur se fait l'aide de la fonction ereport(). La valeur de retour de la fonction est ignore.
L'option TRUSTED et le(s) nom(s) de la fonction de support sont ignors s'il existe une entre dans la table pg_pltemplate pour le
nom du langage spcifi.
Notes
Le programme createlang(1) est un simple enrobage de la commande CREATE LANGUAGE. Il facilite l'installation des langages procduraux partir de la ligne de commande du shell.
DROP LANGUAGE(7), ou mieux, le programme droplang(1) sont utiliss pour supprimer des langages procduraux.
Le catalogue systme pg_language (voir Section 45.27, pg_language ) contient des informations sur les langages installs.
De plus, createlang dispose d'une option pour lister ces langages.
Pour crer des fonctions dans un langage procdural, l'utilisateur doit possder le droit USAGE pour ce langage. Par dfaut,
USAGE est donn PUBLIC (c'est--dire tout le monde) pour les langages de confiance. Ce droit peut tre rvoqu si ncessaire.
Les langages procduraux sont installes par base. Nanmoins, un langage peut tre install dans la base de donnes template1,
ce qui le rend automatiquement disponible dans toutes les bases de donnes cres par la suite.
Le gestionnaire d'appels, le gestionnaire en ligne (s'il y en a un) et la fonction de validation (s'il y en a une) doivent exister pralablement si le serveur ne possde pas d'entre pour ce langage dans pg_pltemplate. Dans le cas contraire, les fonctions n'ont pas besoin de pr-exister ; elles sont automatiquement dfinies si elles ne sont pas prsentes dans la base de donnes. (Cela peut amener
CREATE LANGUAGE chouer si la bibliothque partage implmentant le langage n'est pas disponible dans l'installation.)
Dans les versions de PostgreSQL antrieures 7.3, il tait ncessaire de dclarer des fonctions de gestion renvoyant le type
opaque, plutt que language_handler. Pour accepter le chargement d'anciens fichiers de sauvegarde, CREATE LANGUAGE accepte toute fonction retournant le type opaque mais affiche un message d'avertissement et modifie le type de retour de la fonction
en language_handler.
Exemples
Tout langage procdural standard sera prfrentiellement cr ainsi :
CREATE LANGUAGE plperl;
Pour un langage inconnu du catalogue pg_pltemplate, une squence comme celle-ci est ncessaire :
CREATE FUNCTION plsample_call_handler() RETURNS language_handler
AS '$libdir/plsample'
LANGUAGE C;
CREATE LANGUAGE plsample
HANDLER plsample_call_handler;
964
CREATE LANGUAGE
Compatibilit
CREATE LANGUAGE est un extension de PostgreSQL.
Voir aussi
ALTER LANGUAGE(7), CREATE FUNCTION(7), DROP LANGUAGE(7), GRANT(7), REVOKE(7), createlang(1), droplang(1)
965
Nom
CREATE OPERATOR Dfinir un nouvel oprateur
Synopsis
CREATE OPERATOR nom (
PROCEDURE = nom_fonction
[, LEFTARG = type_gauche ]
[, RIGHTARG = type_droit ]
[, COMMUTATOR = op_com ]
[, NEGATOR = op_neg ]
[, RESTRICT = proc_res ]
[, JOIN = proc_join ]
[, HASHES ] [, MERGES ]
)
Description
CREATE OPERATOR dfinit un nouvel oprateur, nom. L'utilisateur qui dfinit un oprateur en devient propritaire. Si un
nom de schma est donn, l'oprateur est cr dans le schma spcifi. Sinon, il est cr dans le schma courant.
Le nom de l'oprateur est une squence d'au plus NAMEDATALEN-1 (63 par dfaut) caractres parmi la liste suivante :
+-*/<>=~!@#%^&|`?
Il existe quelques restrictions dans le choix du nom :
-- et /* ne peuvent pas apparatre dans le nom d'un oprateur car ils sont pris pour le dbut d'un commentaire.
Un nom d'oprateur multicaractres ne peut pas finir avec + ou - sauf si le nom contient l'un, au moins, de ces caractres :
~!@#%^&|`?
Par exemple, @- est un nom d'oprateur autoris mais *- n'en est pas un. Cette restriction permet PostgreSQL
d'analyser les commandes compatibles SQL sans ncessiter d'espaces entre les lexmes.
L'utilisation de => comme nom d'oprateur est dconseille. Il pourrait tre compltement interdit dans une prochaine version.
L'oprateur != est remplac par <> la saisie, ces deux noms sont donc toujours quivalents.
Au moins un des deux LEFTARG et RIGHTARG doit tre dfini. Pour les oprateurs binaires, les deux doivent l'tre. Pour les
oprateurs unaires droits, seul LEFTARG doit l'tre, RIGHTARG pour les oprateurs unaires gauches.
La procdure nom_fonction doit avoir t prcdemment dfinie par CREATE FUNCTION et doit accepter le bon nombre
d'arguments (un ou deux) des types indiqus.
Les autres clauses spcifient des clauses optionnelles d'optimisation d'oprateur. Leur signification est dtaille dans Section 35.13, Informations sur l'optimisation d'un oprateur .
Paramtres
nom
Le nom de l'oprateur dfinir. Voir ci-dessus pour les caractres autoriss. Le nom peut tre qualifi du nom du schma,
par exemple CREATE OPERATOR monschema.+ (...). Dans le cas contraire, il est cr dans le schma courant.
Deux oprateurs dans le mme schma peuvent avoir le mme nom s'ils oprent sur des types de donnes diffrents. On
parle alors de surchargement.
nom_fonction
La fonction utilise pour implanter cet oprateur.
type_gauche
Le type de donnes de l'oprande gauche de l'oprateur, s'il existe. Cette option est omise pour un oprateur unaire gauche.
type_droit
Le type de donnes de l'oprande droit de l'oprateur, s'il existe. Cette option est omise pour un oprateur unaire droit.
966
CREATE OPERATOR
op_com
Le commutateur de cet oprateur.
op_neg
La ngation de cet oprateur.
proc_res
La fonction d'estimation de la slectivit de restriction pour cet oprateur.
proc_join
La fonction d'estimation de la slectivit de jointure pour cet oprateur.
HASHES
L'oprateur peut supporter une jointure de hachage.
MERGES
L'oprateur peut supporter une jointure de fusion.
La syntaxe OPERATOR() est utilise pour prciser un nom d'oprateur qualifi d'un schma dans op_com ou dans les autres arguments optionnels. Par exemple :
COMMUTATOR = OPERATOR(mon_schema.===) ,
Notes
Section 35.12, Oprateurs dfinis par l'utilisateur fournit de plus amples informations.
Il n'est pas possible de spcifier la prcdence lexicale d'un oprateur dans CREATE OPERATOR car le comportement de prcdence de l'analyseur n'est pas modifiable. Voir Section 4.1.6, Prcdence d'oprateurs pour des dtails sur la gestion de la
prcdence.
Les options obsoltes, SORT1, SORT2, LTCMP et GTCMP taient utilises auparavant pour spcifier les noms des oprateurs de
tris associs avec un oprateur joignable par fusion (mergejoinable). Ceci n'est plus ncessaire car l'information sur les oprateurs associs est disponible en cherchant les familles d'oprateur B-tree. Si une des ces options est fournie, elle est ignore mais
configure implicitement MERGES true.
DROP OPERATOR(7) est utilis pour supprimer les oprateurs utilisateur, ALTER OPERATOR(7) pour les modifier.
Exemples
La commande suivante dfinit un nouvel oprateur, area-equality , pour le type de donnes box :
CREATE OPERATOR === (
LEFTARG = box,
RIGHTARG = box,
PROCEDURE = area_equal_procedure,
COMMUTATOR = ===,
NEGATOR = !==,
RESTRICT = area_restriction_procedure,
JOIN = area_join_procedure,
HASHES, MERGES
);
Compatibilit
CREATE OPERATOR est une extension PostgreSQL. Il n'existe pas d'oprateurs utilisateur dans le standard SQL.
Voir aussi
ALTER OPERATOR(7), CREATE OPERATOR CLASS(7), DROP OPERATOR(7)
967
Nom
CREATE OPERATOR CLASS Dfinir une nouvelle classe d'oprateur
Synopsis
CREATE OPERATOR CLASS nom [ DEFAULT ] FOR TYPE type_donnee
USING methode_indexage [ FAMILY nom_famille ] AS
{ OPERATOR numero_strategie nom_operateur [ ( type_op, type_op ) ] [ FOR SEARCH |
FOR ORDER BY nom_famille_tri ]
| FUNCTION numero_support [ ( type_op [ , type_op ] ) ] nom_fonction (
type_argument [, ...] )
| STORAGE type_stockage
} [, ... ]
Description
CREATE OPERATOR CLASS cre une nouvelle classe d'oprateur. Une classe d'oprateur dfinit la faon dont un type de
donnes particulier peut tre utilis avec un index. La classe d'oprateur spcifie le rle particulier ou la stratgie que jouent
certains oprateurs pour ce type de donnes et cette mthode d'indexation. La classe d'oprateur spcifie aussi les procdures de
support utiliser par la mthode d'indexation quand la classe d'oprateur est slectionne pour une colonne d'index. Tous les
oprateurs et fonctions utiliss par une classe d'oprateur doivent tre dfinis avant la cration de la classe d'oprateur.
Si un nom de schma est donn, la classe d'oprateur est cre dans le schma spcifi. Sinon, elle est cre dans le schma courant. Deux classes d'oprateur ne peuvent avoir le mme nom que s'ils concernent des mthodes d'indexation diffrentes.
L'utilisateur qui dfinit une classe d'oprateur en devient propritaire. Actuellement, le crateur doit tre superutilisateur. Cette
restriction existe parce qu'une dfinition errone d'une classe d'oprateur peut gner le serveur, voire causer un arrt brutal de
celui-ci.
Actuellement, CREATE OPERATOR CLASS ne vrifie pas si la dfinition de la classe d'oprateur inclut tous les oprateurs
et fonctions requis par la mthode d'indexation. Il ne verifie pas non plus si les oprateurs et les fonctions forment un ensemble
cohrent. Il est de la responsabilit de l'utilisateur de dfinir une classe d'oprateur valide.
Les classes d'oprateur en relation peuvent tre groupes dans des familles d'oprateurs. Pour ajouter une nouvelle classe
d'oprateur une famille existante, indiquez l'option FAMILY dans CREATE OPERATOR CLASS. Sans cette option, la nouvelle classe est place dans une famille de mme nom (crant la famille si elle n'existe pas).
Section 35.14, Interfacer des extensions d'index fournit de plus amples informations.
Paramtres
nom
Le nom (ventuellement qualifi du nom du schm) de la classe d'oprateur crer.
DEFAULT
La classe d'oprateur est celle par dfaut pour son type de donnes. Il ne peut y avoir qu'une classe d'oprateur par dfaut
pour un type de donnes et une mthode d'indexation particuliers.
type_donnes
Le type de donnes de la colonne auquel s'applique cette classe d'oprateur.
mthode_index
Le nom de la mthode d'indexation laquelle s'applique la classe d'oprateur.
nom_famille
Le nom d'une famille d'oprateur existante pour lui ajouter cette classe d'oprateur. Si non spcifi, une famille du mme
nom que l'oprateur est utilise (la crant si elle n'existe pas dj).
numro_stratgie
Le numro de stratgie de la mthode d'indexation pour un oprateur associ la classe d'oprateur.
nom_oprateur
Le nom (ventuellement qualifi du nom du schma) d'un oprateur associ la classe d'oprateur.
op_type
Dans une clause OPERATOR, le(s) type(s) de donnes de l'oprande d'un oprateur ou NONE pour signifier un oprateur
968
unaire (droite ou gauche). Les types de donnes de l'oprande peuvent tre omis dans le cas o ils sont identiques au type de
donnes de la classe d'oprateur.
Dans une clause FUNCTION, le (ou les) types de donnes en oprande, support par la fonction, si diffrent du type de donnes en entre de la fonction (pour les index B-tree et hash) ou le type de donnes de la classe (pour les index GIN et GiST).
Ces valeurs par dfaut sont toujours correctes, donc il n'est pas ncessaire de prciser type_op dans une clause FUNCTION
de la commande CREATE OPERATOR CLASS, mais l'option est fournie pour des raisons de cohrence avec la syntaxe de
ALTER OPERATOR FAMILY.
nom_famille_tri
Le nom (ventuellement qualifi du nom du schma) d'une famille d'oprateur btree qui dcrit l'ordre de tri associ un
oprateur de tri.
Si ni FOR SEARCH ni FOR ORDER BY ne sont spcifis, FOR SEARCH est la valeur par dfaut.
numro_support
Le numro de procdure support de la mthode d'indexation pour une fonction associe la classe d'oprateur.
nom_fonction
Le nom (ventuellement qualifi du nom du schma) d'une fonction procdure support pour la mthode d'indexation de la
classe d'oprateur.
types_argument
Le(s) type(s) de donnes des paramtres de la fonction.
type_stockage
Le type de donnes rellement stock dans l'index. C'est normalement le mme que le type de donnes de la colonne mais certaines mthodes d'indexage (GIN et GiST actuellement) autorisent un type diffrent. La clause STORAGE doit tre omise sauf
si la mthode d'indexation autorise un type diffrent.
L'ordre des clauses OPERATOR, FUNCTION et STORAGE n'a aucune importance.
Notes
Comme toute la partie d'indexage ne vrifie pas les droits d'accs aux fonctions avant de les utiliser, inclure une fonction ou un
oprateur dans une classe d'oprateur the index machinery does not check access permissions on functions before using them, including a function or operator in an operator class is quivalent donner les droits d'excution PUBLIC sur celle-ci. Ce n'est pas
un problme habituellement pour les types de fonctions utiles dans une classe d'oprateur.
Les oprateurs ne doivent pas tre dfinis par des fonctions SQL. Une fonction SQL peut tre intgre dans la requte appelante,
ce qui empche l'optimiseur de faire la correspondance avec un index.
Avant PostgreSQL 8.4, la clause OPERATOR pouvait inclure l'option RECHECK. Cela n'est plus support car le fait qu'un index
soit perte est maintenant dtermin l'excution. Ceci permet une gestion plus efficace des cas o l'oprateur pourrait ou non
tre perte.
Exemples
La commande issue de l'exemple suivant dfinit une classe d'oprateur d'indexation GiST pour le type de donnes _int4 (tableau
de int4). Voir le module intarray pour l'exemple complet.
CREATE OPERATOR CLASS gist__int_ops
DEFAULT FOR TYPE _int4 USING gist AS
OPERATOR
3
&&,
OPERATOR
6
= (anyarray, anyarray),
OPERATOR
7
@>,
OPERATOR
8
<@,
OPERATOR
20
@@ (_int4, query_int),
FUNCTION
1
g_int_consistent (internal, _int4, int, oid, internal),
FUNCTION
2
g_int_union (internal, internal),
FUNCTION
3
g_int_compress (internal),
FUNCTION
4
g_int_decompress (internal),
FUNCTION
5
g_int_penalty (internal, internal, internal),
FUNCTION
6
g_int_picksplit (internal, internal),
FUNCTION
7
g_int_same (_int4, _int4, internal);
Compatibilit
CREATE OPERATOR CLASS est une extension PostgreSQL. Il n'existe pas d'instruction CREATE OPERATOR CLASS
969
Voir aussi
ALTER OPERATOR CLASS(7), DROP OPERATOR CLASS(7), CREATE OPERATOR FAMILY(7), ALTER OPERATOR
FAMILY(7)
970
Nom
CREATE OPERATOR FAMILY dfinir une nouvelle famille d'oprateur
Synopsis
CREATE OPERATOR FAMILY nom USING methode_indexage
Description
CREATE OPERATOR FAMILY cre une nouvelle famille d'oprateurs. Une famille d'oprateurs dfinit une collection de
classes d'oprateur en relation et peut-tre quelques oprateurs et fonctions de support supplmentaires compatibles avec ces
classes d'oprateurs mais non essentiels au bon fonctionnement des index individuels. (Les oprateurs et fonctions essentiels aux
index doivent tre groups avec la classe d'oprateur adquate, plutt qu'tre des membres lches dans la famille d'oprateur.
Typiquement, les oprateurs sur un seul type de donnes peuvent tre lches dans une famille d'oprateur contenant des classes
d'oprateur pour les deux types de donnes.)
La nouvelle famille d'oprateur est initialement vide. Elle sera remplie en excutant par la suite des commandes CREATE
OPERATOR CLASS pour ajouter les classes d'oprateurs contenues et, en option, des commandes ALTER OPERATOR
FAMILY pour ajouter des oprateurs et leur fonctions de support correspondantes en tant que membres lches .
Si un nom de schma est prcise, la famille d'oprateur est cre dans le schma en question. Sinon elle est cre dans le schma en cours. Deux familles d'oprateurs du mme schma ne peuvent avoir le mme nom que s'ils sont des mthodes d'indexage
diffrentes.
L'utilisateur qui dfinit une famille d'oprateur devient son propritaire. Actuellement, l'utilisateur qui cre doit tre un superutilisateur. (Cette restriction est ncessaire car une dfinition errone d'une famille d'oprateur pourrait gner le serveur, voire
mme l'arrter brutalement.)
Voir Section 35.14, Interfacer des extensions d'index pour plus d'informations.
Paramtres
nom
Le nom de la famille d'oprateur (pouvant tre qualifi du schma).
methode_indexage
Le nom de la mthode d'indexage utilise par cette famille d'oprateur.
Compatibilit
CREATE OPERATOR FAMILY est un extension PostgreSQL. Il n'existe pas d'instruction CREATE OPERATOR FAMILY dans le standard SQL.
Voir aussi
ALTER OPERATOR FAMILY(7), DROP OPERATOR FAMILY(7), CREATE OPERATOR CLASS(7), ALTER OPERATOR CLASS(7), DROP OPERATOR CLASS(7)
971
Nom
CREATE ROLE Dfinir un nouveau rle de base de donnes
Synopsis
CREATE ROLE nom [ [ WITH ] option [ ... ] ]
o option peut tre :
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SUPERUSER | NOSUPERUSER
CREATEDB | NOCREATEDB
CREATEROLE | NOCREATEROLE
CREATEUSER | NOCREATEUSER
INHERIT | NOINHERIT
LOGIN | NOLOGIN
REPLICATION | NOREPLICATION
CONNECTION LIMIT limite_connexion
[ ENCRYPTED | UNENCRYPTED ] PASSWORD 'motdepasse'
VALID UNTIL 'heuredate'
IN ROLE nom_role [, ...]
IN GROUP nom_role [, ...]
ROLE nom_role [, ...]
ADMIN nom_role [, ...]
USER nom_role [, ...]
SYSID uid
Description
CREATE ROLE ajoute un nouveau rle dans une grappe (cluster) de bases de donnes PostgreSQL. Un rle est une entit
qui peut possder des objets de la base de donnes et avoir des droits sur la base. Il peut tre considr comme un utilisateur ,
un groupe ou les deux suivant la faon dont il est utilis. Chapitre 20, Rles de la base de donnes et Chapitre 19, Authentification du client donnent de plus amples informations sur la gestion des utilisateurs et l'authentification. Il est ncessaire de
possder le droit CREATEROLE ou d'tre superutilisateur pour utiliser cette commande.
Les rles sont dfinis au niveau de la grappe de bases de donnes, et sont donc valides dans toutes les bases de la grappe.
Paramtres
nom
Le nom du nouveau rle.
SUPERUSER, NOSUPERUSER
Ces clauses dfinissent si le nouveau rle est un superutilisateur et peut ainsi outrepasser les droits d'accs la base de
donnes. Le statut de superutilisateur est dangereux et ne doit tre utilis que lorsque cela est rellement ncessaire. Seul un
superutilisateur peut crer un superutilisateur. NOSUPERUSER est la valeur par dfaut.
CREATEDB, NOCREATEDB
Ces clauses prcisent le droit de cration de bases de donnes. Si CREATEDB est spcifi, l'autorisation est donne au rle,
NOCREATEDB produit l'effet inverse. NOCREATEDB est la valeur par dfaut.
CREATEROLE, NOCREATEROLE
Ces clauses prcisent le droit de cration de nouveaux rles (c'est--dire d'excuter CREATE ROLE). Un rle qui possde
le droit CREATEROLE peut aussi modifier ou supprimer d'autres rles. NOCREATEROLE est la valeur par dfaut.
CREATEUSER, NOCREATEUSER
Ces clauses, obsoltes mais toujours acceptes, sont quivalentes SUPERUSER et NOSUPERUSER. Elles ne sont pas quivalentes CREATEROLE.
INHERIT, NOINHERIT
Ces clauses prcisent si un rle hrite des droits d'un rle dont il est membre. Un rle qui possde l'attribut INHERIT
peut automatiquement utiliser tout privilge dtenu par un rle dont il est membre direct ou indirect. Sans INHERIT,
l'appartenance un autre rle lui confre uniquement la possibilit d'utiliser SET ROLE pour acqurir les droits de l'autre
rle ils ne sont disponibles qu'aprs cela. INHERIT est la valeur par dfaut.
LOGIN, NOLOGIN
972
CREATE ROLE
Ces clauses prcisent si un rle est autoris se connecter, c'est--dire si le rle peut tre donn comme nom pour
l'autorisation initiale de session la connexion du client. Un rle ayant l'attribut LOGIN peut tre vu comme un utilisateur.
Les rles qui ne disposent pas de cet attribut sont utiles pour grer les privilges de la base de donnes mais ne sont pas des
utilisateurs au sens habituel du mot. NOLOGIN est la valeur par dfaut, sauf lorsque CREATE ROLE est appel travers la
commande CREATE USER.
REPLICATION, NOREPLICATION
Ces clauses dterminent si un rle peut initier une rplication en flux ou placer le systme en mode sauvegarde ou l'en sortir.
Un rle ayant l'attribut REPLICATION est un rle trs privilgi et ne devrait tre utilis que pour la rplication. NOREPLICATION est la valeur par dfaut sauf pour les superutilisateurs.
CONNECTION LIMIT limiteconnexion
Le nombre maximum de connexions concurrentes possibles pour le rle, s'il possde le droit de connexion. -1 (valeur par dfaut) signifie qu'il n'y a pas de limite.
PASSWORD motdepasse
Le mot de passe du rle. Il n'est utile que pour les rles ayant l'attribut LOGIN, mais il est possible d'en dfinir un pour les
rles qui ne l'ont pas. Cette option peut tre omise si l'authentification par mot de passe n'est pas envisage. Si aucun mot de
passe n'est spcifi, le mot de passe sera NULL et l'authentification par mot de passe chouera toujours pour cet utilisateur.
Un mot de passe NULL peut aussi tre indiqu explicitement avec PASSWORD NULL.
ENCRYPTED, UNENCRYPTED
Ces mots cls contrlent le chiffrement du mot de passe stock dans les catalogues systme. En l'absence de prcision, le
comportement par dfaut est dtermin par le paramtre de configuration password_encryption. Si le mot de passe prsent
est dj une chane chiffre avec MD5, il est stock ainsi, quelque soit le mot-cl spcifi, ENCRYPTED ou UNENCRYPTED
(le systme ne peut pas dchiffrer la chane dj chiffre). Cela permet de recharger des mots de passe chiffrs lors
d'oprations de sauvegarde/restauration.
D'anciens clients peuvent ne pas disposer du support pour le mcanisme d'authentification MD5, ncessaire pour travailler
avec les mots de passe stocks chiffrs.
VALID UNTIL 'dateheure'
Cette clause configure la date et l'heure de fin de validit du mot de passe. Sans prcision, le mot de passe est indfiniment
valide.
IN ROLE nom_role
Cette clause liste les rles dont le nouveau rle est membre. Il n'existe pas d'option pour ajouter le nouveau rle en tant
qu'administrateur ; cela se fait l'aide d'une commande GRANT spare.
IN GROUP nom_role
IN GROUP est un quivalent obsolte de IN ROLE.
ROLE nom_role
Cette clause liste les rles membres du nouveau rle. Le nouveau rle devient ainsi un groupe .
ADMIN nom_role
Cette clause est quivalente la clause ROLE, la diffrence que les rles nomms sont ajouts au nouveau rle avec l'option
WITH ADMIN OPTION. Cela leur confre le droit de promouvoir d'autres rles l'appartenance celui-ci.
USER nom_role
USER est un quivalent osbolte de ROLE.
SYSID uid
La clause SYSID est ignore, mais toujours accepte pour des raisons de compatibilit.
Notes
ALTER ROLE(7) est utilis pour modifier les attributs d'un rle, et DROP ROLE(7) pour supprimer un rle. Tous les attributs positionns par CREATE ROLE peuvent tre modifis par la suite l'aide de commandes ALTER ROLE.
Il est prfrable d'utiliser GRANT(7) et REVOKE(7) pour ajouter et supprimer des membres de rles utiliss comme groupes.
La clause VALID UNTIL dfinit les date et heure d'expiration du mot de passe uniquement, pas du rle. En particulier, les date et
heure d'expiration ne sont pas vrifies lors de connexions l'aide de mthodes d'authentification qui n'utilisent pas les mots de
passe.
L'attribut INHERIT gouverne l'hritage des droits confrables (c'est--dire les droits d'accs aux objets de la base de donnes et
les appartenances aux rles). Il ne s'applique pas aux attributs de rle spciaux configurs par CREATE ROLE et ALTER
ROLE. Par exemple, tre membre d'un rle disposant du droit CREATEDB ne confre pas automatiquement le droit de cration de
973
CREATE ROLE
bases de donnes, mme avec INHERIT positionn ; il est ncessaire d'acqurir ce rle via SET ROLE(7) avant de crer une base
de donnes.
L'attribut INHERIT est la valeur par dfaut pour des raisons de compatibilit descendante : dans les prcdentes versions de PostgreSQL, les utilisateurs avaient toujours accs tous les droits des groupes dont ils taient membres. Toutefois, NOINHERIT
est plus respectueux de la smantique spcifie dans le standard SQL.
Le privilge CREATEROLE impose quelques prcautions. Il n'y a pas de concept d'hritage des droits pour un tel rle. Cela signifie qu'un rle qui ne possde pas un droit spcifique, mais est autoris crer d'autres rles, peut aisment crer un rle possdant
des droits diffrents des siens (sauf en ce qui concerne la cration des rles superutilisateur). Par exemple, si le rle user a le
droit CREATEROLE mais pas le droit CREATEDB, il peut toujours crer un rle possdant le droit CREATEDB. Il est de ce fait important de considrer les rles possdant le privilge CREATEROLE comme des superutilisateurs en puissance.
PostgreSQL inclut un programme, createuser(1) qui possde les mmes fonctionnalits que CREATE ROLE (en fait, il appelle
cette commande) et peut tre lanc partir du shell.
L'option CONNECTION LIMIT n'est vrifie qu'approximativement. Si deux nouvelles sessions sont lances peu prs simultanment alors qu'il ne reste qu'un seul emplacement de connexion disponible pour le rle, il est possible que les deux chouent.
De plus, la limite n'est jamais vrifie pour les superutilisateurs.
Faites attention lorsque vous donnez un mot de passe non chiffr avec cette commande. Le mot de passe sera transmis en clair au
serveur. Ce dernier pourrait tre tracer dans l'historique des commandes du client ou dans les traces du serveur. Nanmoins, la
commande createuser(1) transmet le mot de passe chiffr. De plus, psql(1) contient une commande \password que vous pouvez
utiliser pour modifier en toute scurit votre mot de passe.
Exemples
Crer un rle qui peut se connecter mais sans lui donner de mot de passe :
CREATE ROLE jonathan LOGIN;
Crer un rle avec un mot de passe :
CREATE USER davide WITH PASSWORD 'jw8s0F4';
(CREATE USER est identique CREATE ROLE mais implique LOGIN.)
Crer un rle avec un mot de passe valide jusqu' fin 2006. Une seconde aprs le passage 2007, le mot de passe n'est plus valide.
CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2007-01-01';
Crer un rle qui peut crer des bases de donnes et grer des rles :
CREATE ROLE admin WITH CREATEDB CREATEROLE;
Compatibilit
L'instruction CREATE ROLE est dfinie dans le standard SQL. Ce dernier n'impose que la syntaxe
CREATE ROLE nom [ WITH ADMIN nom_role ]
La possibilit d'avoir plusieurs administrateurs initiaux et toutes les autres options de CREATE ROLE sont des extensions PostgreSQL.
Le standard SQL dfinit les concepts d'utilisateurs et de rles mais les considre comme des concepts distincts et laisse la spcification des commandes de dfinition des utilisateurs l'implantation de chaque base de donnes. PostgreSQL a pris le parti
d'unifier les utilisateurs et les rles au sein d'une mme entit. Ainsi, les rles ont plus d'attributs optionnels que dans le standard.
Le comportement spcifi par le standard SQL peut tre approch en donnant aux utilisateurs l'attribut NOINHERIT et aux rles
l'attribut INHERIT.
Voir aussi
SET ROLE(7), ALTER ROLE(7), DROP ROLE(7), GRANT(7), REVOKE(7), createuser(1)
974
Nom
CREATE RULE Dfinir une nouvelle rgle de rcriture
Synopsis
CREATE [ OR REPLACE ] RULE nom AS ON vnement
TO table [ WHERE condition ]
DO [ ALSO | INSTEAD ] { NOTHING | commande | ( commande ; commande ... ) }
Description
CREATE RULE dfinit une nouvelle rgle sur une table ou une vue. CREATE OR REPLACE RULE cre une nouvelle
rgle ou remplace la rgle si elle existe dj.
Le systme de rgles de PostgreSQL autorise la dfinition d'actions alternatives sur les insertions, mises jour ou suppressions dans les tables. Pour rsumer, une rgle impose des commandes supplmentaires lors de l'excution d'une instruction sur
une table donne. Une rgle INSTEAD, au contraire, permet de remplacer une commande par une autre, voire d'empcher sa
ralisation. Ce sont galement les rgles qui sont utilises pour implanter les vues.
Une rgle est un mcanisme de transformation de commandes, une macro . La transformation intervient avant l'excution de
la commande. Pour obtenir une opration qui s'excute indpendamment pour chaque ligne physique, il faut utiliser des dclencheurs. On trouvera plus d'informations sur le systme des rgles dans Chapitre 37, Systme de rgles.
l'heure actuelle, les rgles ON SELECT doivent tre des rgles INSTEAD inconditionnelles. Chacune de leurs actions ne peut
tre constitue que d'une simple commande SELECT. Ainsi, une rgle ON SELECT a pour rsultat la transformation effective
d'une table en une vue dont le contenu visible est compos des lignes retournes par la commande SELECT de la rgle ; ce ne
sont pas les lignes stockes dans la table (s'il y en a) qui sont retournes. Le cration d'une vue l'aide de la commande
CREATE VIEW est toujours prfrable la cration d'une table relle associe une rgle ON SELECT.
On peut donner l'illusion d'une vue actualisable ( updatable view ) par la dfinition de rgles ON INSERT, ON UPDATE et
ON DELETE (ou tout sous-ensemble de celles-ci) pour remplacer les actions de mises jour de la vue par des mises jours des
tables adquates. Si vous voulez supporter INSERT RETURNING, alors assurez-vous de placer une clause RETURNING adquate chacune de ces rgles. Autrement, une vue actualisable peut tre implmente en utilisant des triggers INSTEAD OF
(voir CREATE TRIGGER(7)).
Il y a quelques chausse-trappes viter lors de l'utilisation de rgles conditionnelles pour la mise jour de vues : chaque action
autorise sur la vue doit correspondre une rgle INSTEAD inconditionnelle. Si la rgle est conditionnelle ou n'est pas une rgle
INSTEAD, alors le systme rejette toute tentative de mise jour, ceci afin d'viter toute action sur la table virtuelle de la vue.
Pour grer tous les cas utiles l'aide de rgles conditionnelles, il convient d'ajouter une rgle inconditionnelle DO INSTEAD
NOTHING afin de prciser au systme qu'il ne recevra jamais de demande de mise jour d'une table virtuelle. La clause INSTEAD des rgles conditionnelles peut alors tre supprime ;dans les cas o ces rgles s'appliquent, l'action INSTEAD NOTHING est utilise. (Nanmoins, cette mthode ne fonctionne pas actuellement avec les requtes RETURNING.)
Paramtres
nom
Le nom de la rgle crer. Elle doit tre distincte du nom de toute autre rgle sur la mme table. Les rgles multiples sur la
mme table et le mme type d'vnement sont appliques dans l'ordre alphabtique des noms.
vnement
SELECT, INSERT, UPDATE ou DELETE.
table
Le nom (ventuellement qualifi du nom du schma) de la table ou de la vue sur laquelle s'applique la rgle.
condition
Toute expression SQL conditionnelle (renvoyant un type boolean). L'expression de la condition ne peut pas faire rfrence
une table autre que NEW ou OLD ni contenir de fonction d'agrgat.
INSTEAD
Les commandes sont excutes la place de la commande originale.
ALSO
Les commandes sont excutes en plus de la commande originale.
975
CREATE RULE
Notes
Vous devez tre le propritaire de la table crer ou sur laquelle vous ajoutez des rgles.
Dans une rgle pour l'action INSERT, UPDATE ou DELETE sur une vue, vous pouvez ajouter une clause RETURNING qui met
les colonnes de la vue. Cette clause sera utilise pour calculer les sorties si la rgle est dclenche respectivement par une commande INSERT RETURNING, UPDATE RETURNINGou DELETE RETURNING. Quand la rgle est dclenche par une
commande sans clause RETURNING, la clause RETURNING de la rgle est ignore. L'implmentation actuelle autorise seulement
des rgles INSTEAD sans condition pour contenir RETURNING ; de plus, il peut y avoir au plus une clause RETURNING parmi
toutes les rgles pour le mme vnement. (Ceci nous assure qu'il y a seulement une clause RETURNING candidate utilise pour
calculer les rsultats.) Les requtes RETURNING sur la vue seront rejetes s'il n'existe pas de clause RETURNING dans une des
rgles disponibles.
Une attention particulire doit tre porte aux rgles circulaires. Ainsi dans l'exemple suivant, bien que chacune des deux dfinitions de rgles soit accepte par PostgreSQL, la commande SELECT produira une erreur cause de l'expansion rcursive de la
rgle :
CREATE RULE "_RETURN" AS
ON SELECT TO t1
DO INSTEAD
SELECT * FROM t2;
CREATE RULE "_RETURN" AS
ON SELECT TO t2
DO INSTEAD
SELECT * FROM t1;
SELECT * FROM t1;
Actuellement, si l'action d'une rgle contient une commande NOTIFY, cette commande est excute sans condition, c'est--dire
que NOTIFY est dclench mme si la rgle ne s'applique aucune ligne. Par exemple, dans :
CREATE RULE notify_me AS ON UPDATE TO matable DO ALSO NOTIFY matable;
UPDATE matable SET name = 'foo' WHERE id = 42;
un vnement NOTIFY est lanc durant un UPDATE, qu'il y ait ou non des lignes satisfaisant la condition id = 42. Cette restriction pourrait tre corrige dans les prochaines versions.
Compatibilit
CREATE RULE est une extension PostgreSQL, tout comme l'est le systme complet de rcriture de requtes.
976
Nom
CREATE SCHEMA Dfinir un nouveau schma
Synopsis
CREATE SCHEMA nom_schma [ AUTHORIZATION nom_utilisateur ] [ lment_schma [ ... ] ]
CREATE SCHEMA AUTHORIZATION nom_utilisateur [ lment_schma [ ... ] ]
Description
CREATE SCHEMA cre un nouveau schma dans la base de donnes. Le nom du schma doit tre unique au sein de la base
de donnes.
Un schma est essentiellement un espace de noms : il contient des objets nomms (tables, types de donnes, fonctions et oprateurs) dont les noms peuvent tre identiques ceux d'objets d'autres schmas. Les objets nomms sont accessibles en prfixant
leur nom de celui du schma (on dit alors que le nom est qualifi du nom du schma), ou par la configuration d'un chemin de
recherche incluant le(s) schma(s) dsir(s). Une commande CREATE qui spcifie un objet non qualifi cre l'objet dans le
schma courant (le premier dans le chemin de recherche, obtenu par la fonction current_schema).
CREATE SCHEMA peut ventuellement inclure des sous-commandes de cration d'objets dans le nouveau schma. Les souscommandes sont traites la faon de commandes spares lances aprs la cration du schma. La diffrence rside dans
l'utilisation de la clause AUTHORIZATION. Dans ce cas, l'utilisateur est propritaire de tous les objets crs.
Paramtres
nom_schma
Le nom du schma crer. S'il est oubli, le paramtre nomutilisateur est utilis comme nom de schma. Le nom ne
peut pas dbuter par pg_, ces noms tant rservs aux schmas du systme.
nom_utilisateur
Le nom de l'utilisateur qui appartient le schma. Par dfaut, il s'agit de l'utilisateur qui excute la commande. Pour crer
un schma dont le propritaire est un autre rle, vous devez tre un membre direct ou indirect de ce rle, ou tre un superutilisateur.
lment_schma
Une instruction SQL qui dfinit un objet crer dans le schma. ce jour, seules CREATE TABLE, CREATE VIEW,
CREATE SEQUENCE, CREATE TRIGGER et GRANT peuvent tre utilises dans la commande CREATE SCHEMA. Les autres types d'objets sont crs dans des commandes spares aprs la cration du schma.
Notes
Pour crer un schma, l'utilisateur doit avoir le droit CREATE sur la base de donnes. (Les superutilisateurs contournent cette
vrification.)
Exemples
Crer un schma :
CREATE SCHEMA mon_schema;
Crer un schma pour l'utilisateur joe, schma nomm joe :
CREATE SCHEMA AUTHORIZATION joe;
Crer un schma et lui ajouter une table et une vue :
CREATE SCHEMA hollywood
CREATE TABLE films (titre text, sortie date, recompenses text[])
CREATE VIEW gagnants AS
SELECT titre, sortie FROM films WHERE recompenses IS NOT NULL;
Les sous-commandes ne sont pas termines par un point-virgule.
La mme chose, autre criture :
977
CREATE SCHEMA
Compatibilit
Le standard SQL autorise une clause DEFAULT CHARACTER SET dans CREATE SCHEMA, et des types de sous-commandes
en plus grand nombre que ceux supports actuellement par PostgreSQL.
Le standard SQL n'impose pas d'ordre d'apparition des sous-commandes dans CREATE SCHEMA. L'implantation actuelle de
PostgreSQL ne gre pas tous les cas de rfrences futures dans les sous-commandes. Il peut s'avrer ncessaire de rordonner
les sous-commandes pour viter ces rfrences.
Dans le standard SQL, le propritaire d'un schma est galement propritaire de tous les objets qui s'y trouvent. PostgreSQL
permet un schma de contenir des objets qui n'appartiennent pas son propritaire. Cela n'est possible que si le propritaire du
schma transmet le privilge CREATE sur son schma ou si un superutilisateur choisir d'y crer des objets.
Voir aussi
ALTER SCHEMA(7), DROP SCHEMA(7)
978
Nom
CREATE SEQUENCE Dfinir un nouveau gnrateur de squence
Synopsis
CREATE [ TEMPORARY | TEMP ] SEQUENCE nom [ INCREMENT [ BY ] incrment ]
[ MINVALUE valeurmin | NO MINVALUE ]
[ MAXVALUE valeurmax | NO MAXVALUE ]
[ START [ WITH ] dbut ]
[ CACHE cache ]
[ [ NO ] CYCLE ]
[ OWNED BY { table.colonne | NONE } ]
Description
CREATE SEQUENCE cre un nouveau gnrateur de squence de nombres. Cela implique la cration et l'initialisation d'une
nouvelle table une seule ligne nomme nom. Le gnrateur appartient l'utilisateur qui excute la commande.
Si un nom de schma est donn, la squence est cre dans le schma spcifi. Sinon, elle est cre dans le schma courant. Les
squences temporaires existent dans un schma spcial, il n'est donc pas utile de prciser un nom de schma lors de la cration
d'une squence temporaire. Le nom de la squence doit tre distinct du nom de toute autre squence, table, index, vue ou table
distante du schma.
Aprs la cration d'une squence, les fonctions nextval, currval et setval sont utilises pour agir sur la squence. Ces
fonctions sont documentes dans Section 9.15, Fonctions de manipulation de squences .
Bien qu'il ne soit pas possible de mettre jour une squence en accdant directement la table, une requte telle que :
SELECT * FROM nom;
peut tre utilise pour examiner les paramtres et l'tat courant d'une squence. En particulier, le champ last_value affiche
la dernire valeur alloue par une session. (Cette valeur peut tre rendue obsolte l'affichage par des appels effectifs de nextval dans des sessions concurrentes.)
Paramtres
TEMPORARY ou TEMP
Si ce paramtre est spcifi, l'objet squence n'est cr que pour la session en cours et est automatiquement supprim lors de
la sortie de session. Les squences permanentes portant le mme nom ne sont pas visibles (dans cette session) tant que la squence temporaire existe, sauf tre rfrences par les noms qualifis du schma.
nom
Le nom (ventuellement qualifi du nom du schma) de la squence crer.
incrment
La clause optionnelle INCREMENT BY incrment prcise la valeur ajouter la valeur courante de la squence pour
crer une nouvelle valeur. Une valeur positive cre une squence ascendante, une valeur ngative une squence descendante. 1 est la valeur par dfaut.
valeurmin, NO MINVALUE
La clause optionnelle MINVALUE valeurmin dtermine la valeur minimale de la squence. Si cette clause n'est pas
fournie ou si NO MINVALUE est spcifi, alors les valeurs par dfaut sont utilises. Ces valeurs sont, respectivement, 1 et 263-1 pour les squences ascendantes et descendantes.
valeurmax, NO MAXVALUE
La clause optionnelle MAXVALUE valeurmax dtermine la valeur maximale de la squence. Si cette clause n'est pas
fournie ou si NO MAXVALUE est specifi, alors les valeurs par dfaut sont utilises. Ces valeurs sont, respectivement, 263-1
et -1 pour les squences ascendantes et descendantes.
dbut
La clause optionnelle START WITH dbut permet la squence de dmarrer n'importe o. La valeur de dbut par dfaut est valeurmin pour les squences ascendantes et valeurmax pour les squences descendantes.
cache
La clause optionnelle CACHE cache spcifie le nombre de numros de squence prallouer et stocker en mmoire pour
un accs plus rapide. 1 est la valeur minimale (une seule valeur est engendre la fois, soit pas de cache) et la valeur par d979
CREATE SEQUENCE
faut.
CYCLE, NO CYCLE
L'option CYCLE autorise la squence recommencer au dbut lorsque valeurmax ou valeurmin sont atteintes, respectivement, par une squence ascendante ou descendante. Si la limite est atteinte, le prochain nombre engendr est respectivement valeurmin ou valeurmax.
Si NO CYCLE est spcifi, tout appel nextval alors que la squence a atteint la valeur maximale (dans le cas d'une squence ascendante) ou la valeur minimale (dans l'autre cas) retourne une erreur. En l'absence de prcision, NO CYCLE est la
valeur par dfaut.
OWNED BY table.colonne, OWNED BY NONE
L'option OWNED BY permet d'associer la squence une colonne de table spcifique. De cette faon, la squence sera automatiquement supprime si la colonne (ou la table entire) est supprime. La table indique doit avoir le mme propritaire et
tre dans le mme schma que la squence. OWNED BY NONE, valeur par dfaut, indique qu'il n'y a pas d'association.
Notes
DROP SEQUENCE est utilis pour supprimer une squence.
Les squences sont fondes sur l'arithmtique bigint, leur chelle ne peut donc pas excder l'chelle d'un entier sur huit octets
(-9223372036854775808 9223372036854775807). Sur certaines vieilles plateformes, il peut ne pas y avoir de support compilateur pour les entiers cods sur huit octets. Dans ce cas les squences utilisent l'arithmtique des entiers traditionnels (type integer)
(de -2147483648 +2147483647).
Des rsultats inattendus peuvent tre obtenus dans le cas d'un paramtrage de cache suprieur un pour une squence utilise
concurrentiellement par plusieurs sessions. Chaque session alloue et cache des valeurs de squences successives lors d'un accs
la squence et augmente en consquence la valeur de last_value. Les cache-1 appels suivants de nextval au cours de la
session session retourne simplement les valeurs pralloues sans toucher la squence. De ce fait, tout nombre allou mais non
utilis au cours d'une session est perdu la fin de la session, crant ainsi des trous dans la squence.
De plus, bien qu'il soit garanti que des sessions diffrentes engendrent des valeurs de squence distinctes, si l'on considre toutes
les sessions, les valeurs peuvent ne pas tre engendres squentiellement. Par exemple, avec un paramtrage du cache 10, la
session A peut rserver les valeurs 1..10 et rcuprer nextval=1 ; la session B peut alors rserver les valeurs 11..20 et rcuprer
nextval=11 avant que la session A n'ait engendr nextval=2. De ce fait, un paramtrage de cache un permet d'assumer
que les valeurs retournes par nextval sont engendres squentiellement ; avec un cache suprieur, on ne peut qu'assumer que
les valeurs retournes par nextval sont tous distinctes, non qu'elles sont rellement engendres squentiellement. De plus,
last_value reflte la dernire valeur rserve pour toutes les sessions, que nextval ait ou non retourn cette valeur.
D'autre part, setval excut sur une telle squence n'est pas pris en compte par les autres sessions avant qu'elle n'aient utilis
toutes les valeurs pralloues et caches.
Exemples
Crer une squence ascendante appele serie, dmarrant 101 :
CREATE SEQUENCE serie START 101;
Slectionner le prochain numro de cette squence :
SELECT nextval('serie');
nextval
--------101
Rcuprer le prochain numro d'une squence :
SELECT nextval('serial');
nextval
--------102
Utiliser cette squence dans une commande INSERT :
INSERT INTO distributors VALUES (nextval('serie'), 'nothing');
980
CREATE SEQUENCE
Compatibilit
CREATE SEQUENCE est conforme au standard SQL, exception faites des remarques suivantes :
Obtenir la prochaine valeur se fait en utilisant la fonction nextval() au lieu de l'expression standard NEXT VALUE FOR.
Voir aussi
ALTER SEQUENCE(7), DROP SEQUENCE(7)
981
Nom
CREATE SERVER Dfinir un nouveau serveur distant
Synopsis
CREATE SERVER nom_serveur [ TYPE 'type_serveur' ] [ VERSION 'version_serveur' ]
FOREIGN DATA WRAPPER nom_fdw
[ OPTIONS ( option 'valeur' [, ... ] ) ]
Description
CREATE SERVER dfinit un nouveau serveur de donnes distantes. L'utilisateur qui dfinit le serveur devient son propritaire.
Un serveur distant englobe typiquement des informations de connexion qu'un wrapper de donnes distantes utilise pour accder
une ressource externe de donnes. Des informations de connexions supplmentaires spcifiques l'utilisateur pourraient tre
fournies par l'intermdiaire des correspondances d'utilisateur.
Le nom du serveur doit tre unique dans la base de donnes.
La cration d'un serveur ncessite d'avoir le droit USAGE sur le wrapper de donnes distant qui est utilis.
Paramtres
nom_serveur
Nom du serveur de donnes distant qui sera cr.
type_serveur
Type de serveur (optionnel).
version_serveur
Version du serveur (optionnel).
nom_fdw
Nom du wrapper de donnes distantes qui gre le serveur.
OPTIONS ( option 'valeur' [, ... ] )
Cette clause spcifie les options pour le serveur. Typiquement, les options dfinissent les dtails de connexion au serveur,
mais les noms et valeurs relles dpendent du wrapper de donnes distantes du serveur.
Notes
Lors de l'utilisation du module dblink (voir dblink), le nom du serveur distant peut tre utilis comme argument de la fonction
dblink_connect(3) pour indiquer les paramtres de connexion. Voir aussi ici pour plus d'exemples. Il est ncessaire de disposer
du droit USAGE sur le serveur distant pour tre capable de l'utiliser de cette faon.
Exemples
Crer un serveur truc qui utilise le wrapper de donnes distantes inclus default :
CREATE SERVER truc FOREIGN DATA WRAPPER "default";
Crer un serveur monserveur qui utilise le wrapper de donnes distantes pgsql :
CREATE SERVER monserveur FOREIGN DATA WRAPPER pgsql OPTIONS (host 'truc', dbname
'trucdb', port '5432');
Compatibilit
CREATE SERVER est conforme ISO/IEC 9075-9 (SQL/MED).
982
CREATE SERVER
Voir aussi
ALTER SERVER(7), DROP SERVER(7), CREATE FOREIGN DATA WRAPPER(7), CREATE USER MAPPING(7)
983
Nom
CREATE TABLE Dfinir une nouvelle table
Synopsis
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ]
nom_table ( [
{ nom_colonne type_donnees [ COLLATE collation ] [ contrainte_colonne [ ... ] ]
| contrainte_table
| LIKE table_parent [ option_like ... ] }
[, ... ]
] )
[ INHERITS ( table_parent [, ... ] ) ]
[ WITH ( parametre_stockage [= valeur] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace ]
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE nom_table
OF nom_type [ (
{ nom_colonne WITH OPTIONS [ contrainte_colonne [ ... ] ]
| contrainte_table }
[, ... ]
) ]
[ WITH ( parametre_stockage [= valeur] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace ]
o contrainte_colonne
peut tre :
[ CONSTRAINT nom_contrainte ]
{ NOT NULL | NULL |
CHECK ( expression ) |
DEFAULT expression_par_dfaut |
UNIQUE parametres_index |
PRIMARY KEY parametres_index |
EXCLUDE [ USING methode_index ] ( lment_exclude WITH oprateur [, ... ] )
paramtres_index [ WHERE ( prdicat ) ] |
REFERENCES table_reference [ ( colonne_reference ) ] [ MATCH FULL
| MATCH PARTIAL | MATCH SIMPLE ]
[ ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
et option_like peut
valoir :
{ INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS |
ALL }
et contrainte_table :
[ CONSTRAINT nom_contrainte ]
{ UNIQUE ( nom_colonne [, ... ] ) parametres_index |
PRIMARY KEY ( nom_colonne [, ... ] ) parametres_index |
CHECK ( expression ) |
FOREIGN KEY ( nom_colonne [, ...
] ) REFERENCES table_reference [ (
colonne_reference [, ... ] ) ]
[ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE
action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
Les paramtres_index dans les
contraintes UNIQUE, PRIMARY KEY et
EXCLUDE sont :
[ WITH ( paramtre_stockage [= valeur] [, ... ] ) ]
984
CREATE TABLE
Description
CREATE TABLE cre une nouvelle table initialement vide dans la base de donnes courante. La table appartient l'utilisateur
qui excute cette commande.
Si un nom de schma est donn (par exemple, CREATE TABLE monschema.matable ...), alors la table est cre dans le
schma spcifi. Dans le cas contraire, elle est cre dans le schma courant. Les tables temporaires existent dans un schma spcial, il n'est donc pas ncessaire de fournir un nom de schma lors de la cration d'une table temporaire. Le nom de la table doit
tre distinct du nom des autres tables, squences, index, vues ou tables distantes dans le mme schma.
CREATE TABLE cre aussi automatiquement un type de donnes qui reprsente le type compos correspondant une ligne de
la table. Ainsi, les tables doivent avoir un nom distinct de tout type de donnes du mme schma.
Les clauses de contrainte optionnelles prcisent les contraintes (ou tests) que les nouvelles lignes ou les lignes mises jour doivent
satisfaire pour qu'une opration d'insertion ou de mise jour russisse. Une contrainte est un objet SQL qui aide dfinir
l'ensemble des valeurs valides de diffrentes faons.
Il existe deux faons de dfinir des contraintes : celles de table et celles de colonnes. Une contrainte de colonne fait partie de la dfinition de la colonne. Une dfinition de contrainte de tables n'est pas lie une colonne particulire et peut englober plusieurs colonnes. Chaque contrainte de colonne peut tre crite comme une contrainte de table ; une contrainte de colonne n'est qu'un outil
de notation utilis lorsque la contrainte n'affecte qu'une colonne.
Paramtres
TEMPORARY ou TEMP
La table est temporaire. Les tables temporaires sont automatiquement supprimes la fin d'une session ou, optionnellement,
la fin de la transaction en cours (voir ON COMMIT ci-dessous). Les tables permanentes qui portent le mme nom ne sont
pas visibles dans la session courante tant que la table temporaire existe sauf s'il y est fait rfrence par leur nom qualifi du
schma. Tous les index crs sur une table temporaire sont automatiquement temporaires.
Le dmon autovacuum ne peut pas accder et, du coup, ne peut pas excuter un VACUUM ou un ANALYZE sur les tables
temporaires. Pour cette raison, les oprations VACUUM et ANALYZE doivent tre traites via des commandes SQL de session. Par exemple, si une table temporaire doit tre utilise dans des requtes complexes, il est raisonnable d'excuter ANALYZE sur la table temporaire aprs qu'elle ait t peuple.
On peut ventuellement crire GLOBAL ou LOCAL avant TEMPORARY ou TEMP. Cela ne fait pas de diffrence dans PostgreSQL (cf. la section intitule Compatibilit ).
UNLOGGED
Si spcifi, la table est cre en tant que table non trace. Les donnes crites dans ce type de table ne sont pas crites dans les
journaux de transactions (voir Chapitre 29, Fiabilit et journaux de transaction), ce qui les rend considrablement plus rapides
que les tables ordinaires. Nanmoins, elles ne sont pas sres en cas d'arrt brutal : une table non trace est automatiquement
vide aprs un arrt brutal. Le contenu d'une table non trace n'est pas rpliqu vers les serveurs en attente. Tout index cr
sur une table non trace est aussi automatiquement non trac ; nanmoins, les index GiST non tracs ne sont pas encore supports. Ils ne peuvent donc pas tre ajouts une table non trace.
IF NOT EXISTS
N'affiche pas d'erreur si une relation de mme nom existe dj. Un message de niveau notice est retourn dans ce cas. Notez
qu'il n'existe aucune garantie que la relation existante ressemble celle qui devait tre cre..
nom_table
Le nom (ventuellement qualifi du nom du schma) de la table crer.
OF nom_type
Cre une table type, qui prend sa structure partir du type composite spcifi (son nom peut tre qualifi du schma). Une
table type est lie son type ; par exemple, la table sera supprime si le type est supprim (avec DROP TYPE ... CASCADE).
Quand une table type est cre, les types de donnes des colonnes sont dtermins par le type composite sous-jacent et ne
sont pas indiqus par la commande CREATE TABLE. Mais la commande CREATE TABLE peut ajouter des valeurs par dfaut et des contraintes la table. Elle peut aussi indiquer des paramtres de stockage.
985
CREATE TABLE
nom_colonne
Le nom d'une colonne de la nouvelle table.
type_donnes
Le type de donnes de la colonne. Cela peut inclure des spcificateurs de tableaux. Pour plus d'informations sur les types de
donnes supports par PostgreSQL, on se rfrera Chapitre 8, Types de donnes.
COLLATE collation
La clause COLLATE affecte un collationnement une colonne (qui doit tre d'un type de donnes collationnable). Sans information, le collationnement par dfaut du type de donnes de la colonne est utilis.
INHERITS ( table_parent [, ... ])
La clause optionnelle INHERITS indique une liste de tables dont les colonnes sont automatiquement hrites par la nouvelle
table.
L'utilisation d'INHERITS cre une relation persistante entre la nouvelle table enfant et sa table parent. Les modifications de
schma du(des) parent(s) se propagent normalement aux enfants et, par dfaut, les donnes de la table enfant sont incluses
dans les parcours de(s) parent(s).
Si un mme nom de colonne existe dans plusieurs tables parentes, une erreur est rapporte, moins que les types de donnes
des colonnes ne correspondent dans toutes les tables parentes. S'il n'y a pas de conflit, alors les colonnes dupliques sont assembles pour former une seule colonne dans la nouvelle table. Si la liste des noms de colonnes de la nouvelle table contient
un nom de colonne hrit, le type de donnes doit correspondre celui des colonnes hrites et les dfinitions des colonnes
sont fusionnes. Si la nouvelle table spcifie explicitement une valeur par dfaut pour la colonne, cette valeur surcharge toute
valeur par dfaut hrite. Dans le cas contraire, les parents qui spcifient une valeur par dfaut doivent tous spcifier la mme,
sans quoi une erreur est rapporte.
Les contraintes CHECK sont fusionnes, dans les grandes lignes, de la mme faon que les colonnes : si des tables parentes
multiples et/ou la nouvelle dfinition de table contient des contraintes CHECK de mme nom, ces contraintes doivent toutes
avoir la mme expression de vrification, ou une erreur sera retourne. Les contraintes qui ont le mme nom et la mme expression seront fusionnes en une seule. Notez qu'une contrainte CHECK non nomme dans la nouvelle table ne sera jamais
fusionne puisqu'un nom unique lui sera toujours affect.
Les paramtres STORAGE de la colonne sont aussi copis des tables parents.
LIKE table_parent [ option_like ... ]
La clause LIKE spcifie une table partir de laquelle la nouvelle table copie automatiquement tous les noms de colonnes,
leur types de donnes et les contraintes non NULL.
Contrairement INHERITS, la nouvelle table et la table originale sont compltement dcouples la fin de la cration. Les
modifications sur la table originale ne sont pas appliques la nouvelle table et les donnes de la nouvelle table sont pas
prises en compte lors du parcours de l'ancienne table.
Les expressions par dfaut des dfinitions de colonnes ne seront copies que si INCLUDING DEFAULTS est spcifi. Le
comportement par dfaut les exclut, ce qui conduit des valeurs par dfaut NULL pour les colonnes copies de la nouvelle
table.
Les contraintes NOT NULL sont toujours copies sur la nouvelle table. Les contraintes CHECK seront seulement copies si
INCLUDING CONSTRAINTS est indiqu ; les autres types de contraintes ne sont jamais copies. De plus, aucune distinction
n'est faite entre les contraintes de colonnes et les contraintes de tables -- quand les contraintes sont demandes, toutes les
contraintes de vrification sont copies.
Tout index sur la table originale ne sera pas cr sur la nouvelle table sauf si la clause INCLUDING INDEXES est prcise.
Des paramtres STORAGE pour les dfinitions de la colonne copie seront seulement copis si INCLUDING STORAGE est
spcifi. Le comportement par dfaut est d'exclure des paramtres STORAGE, rsultant dans les colonnes copies dans la nouvelle table ayant des paramtres par dfaut spcifiques par type. Pour plus d'informations sur STORAGE, voir Section 55.2,
TOAST .
Les commentaires pour les colonnes, contraintes et index copis seront seulement copis si INCLUDING COMMENTS est
spcifi. Le comportement par dfaut est d'exclure les commentaires, ce qui rsulte dans des colonnes et contraintes copies
dans la nouvelle table mais sans commentaire.
INCLUDING ALL est une forme abrge de INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING
INDEXES INCLUDING STORAGE INCLUDING COMMENTS.
Contrairement INHERITS, les colonnes et les contraintes copies par LIKE ne sont pas assembles avec des colonnes et
des contraintes nommes de faon similaire. Si le mme nom est indiqu explicitement ou dans une autre clause LIKE, une
erreur est rapporte.
986
CREATE TABLE
CONSTRAINT nom_contrainte
Le nom optionnel d'une contrainte de colonne ou de table. Si la contrainte est viole, le nom de la contrainte est prsente dans
les messages d'erreur. Donc les noms de contraintes comme col doit tre positive peut tre utiliss pour communiquer des informations utiles aux applications clients. (Des doubles guillemets sont ncessaires pour indiquer les noms des
contraintes qui contiennent des espaces.) Si un nom de contrainte n'est pas donn, le systme en cre un.
NOT NULL
Interdiction des valeurs NULL dans la colonne.
NULL
Les valeurs NULL sont autorises pour la colonne. Comportement par dfaut.
Cette clause n'est fournie que pour des raisons de compatibilit avec les bases de donnes SQL non standard. Son utilisation
n'est pas encourage dans les nouvelles applications.
CHECK ( expression )
La clause CHECK spcifie une expression de rsultat boolen que les nouvelles lignes ou celles mises jour doivent satisfaire
pour qu'une opration d'insertion ou de mise jour russisse. Les expressions de rsultat TRUE ou UNKNOWN russissent.
Si une des lignes de l'opration d'insertion ou de mise jour produit un rsultat FALSE, une exception est leve et la base de
donnes n'est pas modifie. Une contrainte de vrification sur une colonne ne fait rfrence qu' la valeur de la colonne tandis
qu'une contrainte sur la table fait rfrence plusieurs colonnes.
Actuellement, les expressions CHECK ne peuvent ni contenir des sous-requtes ni faire rfrence des variables autres que les
colonnes de la ligne courante.
DEFAULT expression_par_dfaut
La clause DEFAULT, apparaissant dans la dfinition d'une colonne, permet de lui affecter une valeur par dfaut. La valeur est
une expression libre de variable (les sous-requtes et rfrences croises aux autres colonnes de la table courante ne sont pas
autorises). Le type de donnes de l'expression par dfaut doit correspondre au type de donnes de la colonne.
L'expression par dfaut est utilise dans les oprations d'insertion qui ne spcifient pas de valeur pour la colonne. S'il n'y a pas
de valeur par dfaut pour une colonne, elle est NULL.
UNIQUE (contrainte de colonne), UNIQUE ( nom_colonne [, ... ] ) (contrainte de table)
La contrainte UNIQUE indique qu'un groupe d'une ou plusieurs colonnes d'une table ne peut contenir que des valeurs uniques.
Le comportement de la contrainte de table unique est le mme que celui des contraintes de colonnes avec la capacit supplmentaire de traiter plusieurs colonnes.
Pour une contrainte unique, les valeurs NULL ne sont pas considres comme gales.
Chaque contrainte unique de table doit nommer un ensemble de colonnes qui est diffrent de l'ensemble de colonnes nommes par toute autre contrainte unique ou de cl primaire dfinie pour la table. (Sinon elle ne ferait que lister la mme
contrainte deux fois.)
PRIMARY KEY (contrainte de colonne), PRIMARY KEY ( nom_colonne [, ... ] ) (contrainte de table)
La contrainte de cl primaire spcifie qu'une ou plusieurs colonnes d'une table ne peut contenir que des valeurs uniques (non
dupliques) et non NULL. Techniquement, une contrainte PRIMARY KEY est tout simplement une combinaison d'une
contrainte UNIQUE et d'une contrainte NOT NULL, mais l'identification d'un ensemble de colonnes en tant que cl primaire
fournit aussi une mtainformation sur le schma car la cl primaire indique que les autres tables peuvent se baser sur cet ensemble de colonnes comme d'un identifiant unique des lignes.
Seule une cl primaire peut tre spcifie pour une table, soit en tant que contrainte de colonne ou que contrainte de table.
La contrainte de cl primaire devrait nommer un ensemble de colonnes qui est diffrent des autres ensembles de colonnes
nommes par une contrainte unique dfinie pour la mme table.
EXCLUDE [ USING mthode_index ] ( lment_exclusion WITH oprateur [, ... ] ) paramtres_index [ WHERE ( prdicat ) ]
La clause EXCLUDE dfinit une contrainte d'exclusion qui garantit que si deux lignes sont compares sur la ou les colonnes
spcifies ou des expressions utilisant le ou les oprateurs spcifis, seulement certaines de ces comparaisons, mais pas
toutes, renverront TRUE. Si tous les oprateurs spcifis testent une galit, ceci est quivalent une contrainte UNIQUE bien
qu'une contrainte unique ordinaire sera plus rapide. Nanmoins, ces contraintes d'exclusion peuvent spcifier des contraintes
qui sont plus gnrales qu'une simple galit. Par exemple, vous pouvez spcifier qu'il n'y a pas deux lignes dans la table
contenant des cercles de surcharge (voir Section 8.8, Types gomtriques ) en utilisant l'oprateur &&.
Des contraintes d'exclusion sont implantes en utilisant un index, donc chaque oprateur prcis doit tre associ avec une
classe d'oprateurs approprie (voir Section 11.9, Classes et familles d'oprateurs ) pour la mthode d'accs par index,
nomme mthode_index. Les oprateurs doivent tre commutatifs. Chaque lment_exclusion peut spcifier en option une classe d'oprateur et/ou des options de tri ; ils sont dcrits compltement sous CREATE INDEX(7).
987
CREATE TABLE
La mthode d'accs doit supporter amgettuple (voir Chapitre 52, Dfinition de l'interface des mthodes d'accs aux
index) ; ds prsent, cela signifie que GIN ne peut pas tre utilis. Bien que cela soit autoris, il existe peu de raison pour
utiliser des index B-tree ou hash avec une contrainte d'exclusion parce que cela ne fait rien de mieux que ce que peut faire une
contrainte unique ordinaire. Donc, en pratique, la mthode d'accs sera toujours GiST.
Le prdicat vous permet de spcifier une contrainte d'exclusion sur un sous-ensemble de la table ; en interne, un index
partiel est cr. Notez que ces parenthses sont requis autour du prdicat.
REFERENCES table_reference [ ( colonne_reference ) ] [ MATCH matchtype ] [ ON DELETE
action ] [ ON UPDATE action ] (contrainte de colonne), FOREIGN KEY ( colonne [, ... ] ) REFERENCES table_reference [ ( colonne_reference [, ... ] ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (contrainte de colonne)
Ces clauses spcifient une contrainte de cl trangre. Cela signifie qu'un groupe de colonnes de la nouvelle table ne peut
contenir que des valeurs correspondant celles des colonnes de rfrence de la table de rfrence. Si colonne_reference est omis, la cl primaire de la table_reference est utilise. Les colonnes rfrences doivent tre
celles d'une contrainte d'unicit ou de cl primaire, non dferrable, dans la table rfrence. Les contraintes de type cl trangre ne peuvent pas tre dfinies entre des tables temporaires et des tables permanentes.
Une valeur insre dans les colonnes de la nouvelle table est compare aux valeurs des colonnes de rfrence dans la table de
rfrence l'aide du type de concordance fourni. Il existe trois types de correspondance : MATCH FULL (NDT : correspondance totale), MATCH PARTIAL (NDT : correspondance partielle) et MATCH SIMPLE (NDT : correspondance simple), qui
est aussi la valeur par dfaut. MATCH FULL n'autorise une colonne d'une cl trangre composite tre NULL que si
l'ensemble des colonnes de la cl trangre sont NULL. MATCH SIMPLE autorise une colonne de cl trangre tre NULL
mme si les autres parties de la cl trangre ne sont pas nulles. MATCH PARTIAL n'est pas encore implant.
Lorsque les donnes des colonnes rfrences sont modifies, des actions sont ralises sur les donnes de la table rfrenant. La clause ON DELETE spcifie l'action raliser lorsqu'une ligne rfrence de la table de rfrence est supprime.
De la mme faon, la clause ON UPDATE spcifie l'action raliser lorsqu'une colonne rfrence est mise jour. Si la ligne
est mise jour sans que la valeur de la colonne rfrence ne soit modifie, aucune action n'est ralise. Les actions rfrentielles autres que la vrification NO ACTION ne peuvent pas tre diffres mme si la contrainte est dclare retardable. Les
actions suivantes sont possibles pour chaque clause :
NO ACTION
Une erreur est produite pour indiquer que la suppression ou la mise jour entrane une violation de la contrainte de cl trangre. Si la contrainte est diffre, cette erreur est produite au moment de la vrification, si toutefois il existe encore des lignes
de rfrence. C'est le comportement par dfaut.
RESTRICT
Une erreur est produite pour indiquer que la suppression ou la mise jour entrane une violation de la contrainte de cl trangre. Ce comportement est identique NO ACTION, si ce n'est que la vrification n'est pas dcalable dans le temps.
CASCADE
La mise jour ou la suppression de la ligne de rfrence est propage l'ensemble des lignes qui la rfrencent, qui sont, respectivement, mises jour ou supprimes.
SET NULL
La valeur de la colonne qui rfrence est positionne NULL.
SET DEFAULT
La valeur de la colonne qui rfrence est positionne celle par dfaut.
Si les colonnes rfrences sont modifies frquemment, il est conseill d'ajouter un index sur la colonne de cl trangre de
faon acclrer les actions rfrentielles associes la colonne de cl trangre.
DEFERRABLE, NOT DEFERRABLE
Ces clauses contrlent la possibilit de diffrer la contrainte. Une contrainte qui n'est pas dcalable dans le temps est vrifie
immdiatement aprs chaque commande. La vrification des contraintes dcalables est repousse la fin de la transaction (
l'aide de la commande SET CONSTRAINTS(7)). NOT DEFERRABLE est la valeur par dfaut. Actuellement, seules les
contraintes UNIQUE, PRIMARY KEY, EXCLUDE et REFERENCES (cl trangre) acceptent cette clause. Les
contraintesNOT NULL et CHECK ne sont pas dferrables.
INITIALLY IMMEDIATE, INITIALLY DEFERRED
Si une contrainte est dcalable dans le temps, cette clause prcise le moment de la vrification. Si la contrainte est INITIALLY IMMEDIATE, elle est vrifie aprs chaque instruction. Si la contrainte est INITIALLY DEFERRED, elle n'est vrifie
qu' la fin de la transaction. Le moment de vrification de la contrainte peut tre modifi avec la commande SET
CONSTRAINTS(7).
WITH ( paramtre_stockage [= valeur] [, ... ] )
988
CREATE TABLE
Cette clause spcifie les paramtres de stockage optionnels pour une table ou un index ; voir la section intitule Paramtres
de stockage pour plus d'informations. La clause WITH peut aussi inclure pour une table OIDS=TRUE (ou simplement
OIDS) pour indiquer que les lignes de la nouvelle table doivent se voir affecter des OID (identifiants d'objets) ou
OIDS=FALSE pour indiquer que les lignes ne doivent pas avoir d'OID. Si OIDS n'est pas indiqu, la valeur par dfaut dpend du paramtre de configuration default_with_oids. (Si la nouvelle table hrite d'une table qui a des OID,
alorsOIDS=TRUE est forc mme si la commande prcise OIDS=FALSE.)
Si OIDS=FALSE est indiqu ou implicite, la nouvelle table ne stocke pas les OID et aucun OID n'est affect pour une ligne
insre dans cette table. Ceci est gnralement bien considr car cela rduit la consommation des OID et retarde du coup le
retour zro du compteur sur 32 bits. Une fois que le compteur est revenu zro, les OID ne sont plus considrs uniques ce
qui les rend beaucoup moins utiles. De plus, exclure les OID d'une table rduit l'espace requis pour stocker la table sur le
disque de quatre octets par ligne (la plupart des machines), amliorant lgrement les performances.
Pour supprimer les OID d'une table une fois qu'elle est cre, utilisez ALTER TABLE(7).
WITH OIDS, WITHOUT OIDS
Ce sont les syntaxes obsoltes mais quivalentes, respectivement de WITH (OIDS) et WITH (OIDS=FALSE). Si vous
souhaitez indiquer la fois l'option OIDS et les paramtres de stockage, vous devez utiliser la syntaxe WITH ( ... ) ;
voir ci-dessus.
ON COMMIT
Le comportement des tables temporaires la fin d'un bloc de transactions est contrl l'aide de la clause ON COMMIT. Les
trois options sont :
PRESERVE ROWS
Aucune action n'est entreprise la fin des transactions. Comportement par dfaut.
DELETE ROWS
Toutes les lignes de la table temporaire sont dtruites la fin de chaque bloc de transactions. En fait, un TRUNCATE(7) automatique est ralis chaque validation.
DROP
La table temporaire est supprime la fin du bloc de transactions.
TABLESPACE tablespace
tablespace est le nom du tablespace dans lequel est cre la nouvelle table. S'il n'est pas spcifi, default_tablespace est
consult, sauf si la table est temporaire auquel cas temp_tablespaces est utilis.
USING INDEX TABLESPACE tablespace
Les index associs une contrainte UNIQUE, PRIMARY KEY, ou EXCLUDE sont crs dans le tablespace nomm tablespace. S'il n'est pas prcis, default_tablespace est consult, sauf si la table est temporaire auquel cas temp_tablespaces est
utilis.
Paramtres de stockage
La clause WITH spcifie des paramtres de stockage pour les tables ainsi que pour les index associs avec une contrainte
UNIQUE, PRIMARY KEY, ou EXCLUDE. Les paramtres de stockage des index sont documents dans CREATE INDEX(7). Les
paramtres de stockage actuellement disponibles pour les tables sont lists ci-dessous. Pour chaque paramtre, sauf contre-indication, il y a un paramtre additionnel, de mme nom mais prfix par toast., qui peut tre utilis pour contrler le le comportement de la table TOAST (stockage supplmentaire), si elle existe (voir Section 55.2, TOAST pour plus d'informations sur
TOAST). La table TOAST hrite ses valeurs autovacuum de sa table parente s'il n'y a pas de paramtre
toast.autovacuum_* positionn.
fillfactor (integer)
Le facteur de remplissage d'une table est un pourcentage entre 10 et 100. 100 (paquet complet) est la valeur par dfaut. Quand
un facteur de remplissage plus petit est indiqu, les oprations INSERT remplissent les pages de table d'au maximum ce
pourcentage ; l'espace restant sur chaque page est rserv la mise jour des lignes sur cette page. Cela donne UPDATE
une chance de placer la copie d'une ligne mise jour sur la mme page que l'original, ce qui est plus efficace que de la placer
sur une page diffrente. Pour une table dont les entres ne sont jamais mises jour, la valeur par dfaut est le meilleur choix,
mais pour des tables mises jour frquemment, des facteurs de remplissage plus petits sont mieux appropris. Ce paramtre
n'est pas disponible pour la table TOAST.
autovacuum_enabled, toast.autovacuum_enabled (boolean)
Active ou dsactive le processus d'autovacuum sur une table particulire. Si true, le processus d'autovacuum dmarrera une
opration VACUUM sur une table particulire quand le nombre d'enregistrements mis jour ou supprims dpassera autovacuum_vacuum_threshold plus autovacuum_vacuum_scale_factor multipli par le nombre
d'enregistrements estims actifs dans la relation. De faon similaire, il dmarrera une opration ANALYZE quand le nombre
989
CREATE TABLE
d'enregistrements insrs, mis jour ou supprims dpassera autovacuum_analyze_threshold plus autovacuum_analyze_scale_factor multipli par le nombre d'enregistrements estims actifs dans la relation. Si false, la
table ne sera pas traite par autovacuum, sauf pour prvenir le bouclage des identifiants de transaction. Voir Section 23.1.4,
viter les cycles des identifiants de transactions pour plus d'information sur la prvention de ce bouclage. Notez que cette
variable hrite sa valeur du paramtre autovacuum.
autovacuum_vacuum_threshold, toast.autovacuum_vacuum_threshold (integer)
Nombre minimum d'enregistrements mis jour ou supprims avant de dmarrer une opration VACUUM sur une table particulire.
autovacuum_vacuum_scale_factor, toast.autovacuum_vacuum_scale_factor (float4)
Coefficient multiplicateur pour reltuples (nombre estim d'enregistrements d'une relation) ajouter autovacuum_vacuum_threshold.
autovacuum_analyze_threshold (integer)
Nombre minimum d'enregistrements insrs, mis jour ou supprims avant de dmarrer une opration ANALYZE sur une
table particulire.
autovacuum_analyze_scale_factor (float4)
Coefficient multiplicateur pour reltuples (nombre estim d'enregistrements d'une relation) ajouter autovacuum_analyze_threshold.
autovacuum_vacuum_cost_delay, toast.autovacuum_vacuum_cost_delay (integer)
Paramtre autovacuum_vacuum_cost_delay personnalis.
autovacuum_vacuum_cost_limit, toast.autovacuum_vacuum_cost_limit (integer)
Paramtre autovacuum_vacuum_cost_limit personnalis.
autovacuum_freeze_min_age, toast.autovacuum_freeze_min_age (integer)
Paramtre vacuum_freeze_min_age personnalis. Notez que autovacuum rejettera les tentatives de positionner un autovacuum_freeze_min_age plus grand que le paramtre autovacuum_freeze_max_age la moiti de la plage systme
d'identifiants.
autovacuum_freeze_max_age, toast.autovacuum_freeze_max_age (integer)
Paramtre autovacuum_freeze_max_age personnalis. L'autovacuum rejettera les tentatives de positionner un autovacuum_freeze_max_age plus grand que le paramtre systme (il ne peut tre que plus petit). Mme si autovacuum_freeze_max_age peut tre positionn de trs petites valeurs, voire zro, c'est habituellement dconseill parce
que cela forcera des oprations VACUUM trs frquentes.
autovacuum_freeze_table_age, toast.autovacuum_freeze_table_age (integer)
Paramtre vacuum_freeze_table_age personnalis.
Notes
Utiliser les OID dans les nouvelles applications n'est pas recommand : dans la mesure du possible, un type SERIAL ou un autre
gnrateur de squence sera utilis comme cl primaire de la table. Nanmoins, si l'application utilise les OID pour identifier des
lignes spcifiques d'une table, il est recommand de crer une contrainte unique sur la colonne oid de cette table afin de s'assurer
que les OID de la table identifient les lignes de faon rellement unique mme si le compteur est rinitialis. Il n'est pas garanti
que les OID soient uniques sur l'ensemble des tables. Dans le cas o un identifiant unique sur l'ensemble de la base de donnes est
ncessaire, on utilise prfrentiellement une combinaison de tableoid et de l'OID de la ligne.
Astuce
L'utilisation de OIDS=FALSE est dconseille pour les tables dpourvues de cl primaire. En effet, sans OID ou
cl de donnes unique, il est difficile d'identifier des lignes spcifiques.
PostgreSQL cre automatiquement un index pour chaque contrainte d'unicit ou cl primaire afin d'assurer l'unicit. Il n'est
donc pas ncessaire de crer un index spcifiqueme pour les colonnes de cls primaires. Voir CREATE INDEX(7) pour plus
d'informations.
Les contraintes d'unicit et les cls primaires ne sont pas hrites dans l'implantation actuelle. Cela diminue la fonctionnalit des
combinaisons d'hritage et de contraintes d'unicit.
Une table ne peut pas avoir plus de 1600 colonnes (en pratique, la limite relle est habituellement plus basse du fait de contraintes
sur la longueur des lignes).
Exemples
990
CREATE TABLE
CREATE TABLE
CREATE TABLE
Compatibilit
La commande CREATE TABLE est conforme au standard SQL, aux exceptions indiques ci-dessous.
Tables temporaires
Bien que la syntaxe de CREATE TEMPORARY TABLE ressemble celle du SQL standard, l'effet n'est pas le mme. Dans le
standard, les tables temporaires sont dfinies une seule fois et existent automatiquement (vide de tout contenu au dmarrage) dans
toute session les utilisant. PostgreSQL, au contraire, impose chaque session de lancer une commande CREATE TEMPORARY
TABLE pour chaque table temporaire utilise. Cela permet des sessions diffrentes d'utiliser le mme nom de table temporaire
dans des buts diffrents (le standard contraint toutes les instances d'une table temporaire donne pointer sur la mme structure de
table).
Le comportement des tables temporaires tel que dfini par le standard est largement ignore. Le comportement de PostgreSQL
sur ce point est similaire celui de nombreuses autres bases de donnes SQL.
PostgreSQL ne respecte pas la distinction impose par le standard entre tables temporaires globales et locales. En effet, cette
distinction repose sur le concept de modules que PostgreSQL ne gre pas. Pour des raisons de compatibilit, PostgreSQL accepte nanmoins les mots-cls GLOBAL et LOCAL dans la dfinition d'une table temporaire, mais ils n'ont aucun effet.
La clause ON COMMIT sur les tables temporaires diffre quelque peu du standard SQL. Si la clause ON COMMIT est omise, SQL
spcifie ON COMMIT DELETE ROWS comme comportemant par dfaut. PostgreSQL utilise ON COMMIT PRESERVE
ROWS par dfaut. De plus, l'option ON COMMIT DROP n'existe pas en SQL.
EXCLUDE Constraint
Le type de contrainte EXCLUDE est une extension PostgreSQL.
Contrainte NULL
La contrainte NULL (en fait, une non-contrainte) est une extension PostgreSQL au standard SQL, incluse pour des raisons
de compatibilit avec d'autres systmes de bases de donnes (et par symtrie avec la contrainte NOT NULL). Comme c'est la valeur par dfaut de toute colonne, sa prsence est un simple bruit.
Hritage
L'hritage multiple via la clause INHERITS est une extension du langage PostgreSQL. SQL:1999 et les versions ultrieures dfinissent un hritage simple en utilisant une syntaxe et des smantiques diffrentes. L'hritage style SQL:1999 n'est pas encore
support par PostgreSQL.
WITH clause
La clause WITH est une extension PostgreSQL ; ni les paramtres de stockage ni les OID ne sont dans le standard.
993
CREATE TABLE
Tablespaces
Le concept PostgreSQL de tablespace n'est pas celui du standard. De ce fait, les clauses TABLESPACE et USING INDEX
TABLESPACE sont des extensions.
Tables types
Les tables types implmentent un sous-ensemble du standard SQL. Suivant le standard, une table type a des colonnes correspondant au type composite ainsi qu'une autre colonne qui est la colonne auto-rfrente . PostgreSQL ne supporte pas ces colonnes
auto-rfrentes explicitement mais le mme effet est disponible en utilisant la fonctionnalit OID.
Voir aussi
ALTER TABLE(7), DROP TABLE(7), CREATE TABLESPACE(7)
994
Nom
CREATE TABLE AS Dfinir une nouvelle table partir des rsultats d'une requte
Synopsis
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE nom_table
[ (nom_colonne [, ...] ) ]
[ WITH ( parametre_stockage [= valeur] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE espace_logique ]
AS requte
[ WITH [ NO ] DATA ]
Description
CREATE TABLE AS cre une table et y insre les donnes rcupres par une commande SELECT. Les colonnes de la table
ont les noms et les types de donnes associs aux colonnes en sortie du SELECT (les noms des colonnes peuvent toutefois tre
surchargs).
CREATE TABLE AS semble possder des similitudes avec la cration d'une vue mais est, en fait, assez diffrente : elle cre
une nouvelle table et n'value la requte qu'une seule fois, pour le chargement initial de la nouvelle table. Les modifications ultrieures de la table source ne sont pas prises en compte. Au contraire, une vue rvalue l'instruction SELECT de dfinition
chaque appel.
Paramtres
GLOBAL ou LOCAL
Ignor. Conserv pour la compatibilit (cf. CREATE TABLE(7)).
TEMPORARY ou TEMP
Si spcifi, la table est temporaire (cf. CREATE TABLE(7)).
UNLOGGED
Si spcifi, la table est cre comme une table non trace dans les journaux de transactions. Voir CREATE TABLE(7) pour
plus de dtails.
nom_table
Le nom de la table crer (ventuellement qualifi du nom du schma).
nom_colonne
Le nom d'une colonne dans la nouvelle table. Si les noms de colonnes ne sont pas prciss, ils sont issus des noms des colonnes en sortie de la requte. Les noms des colonnes ne peuvent pas tre prciss lorsque la table est cre partir d'une
commande EXECUTE.
WITH ( paramtre_stockage [= valeur] [, ... ] )
Cette clause indique les paramtres de stockage optionnels pour la nouvelle table ; voir la section intitule Paramtres de
stockage pour plus d'informations. La clause WITH peut aussi inclure OIDS=TRUE (ou simplement OIDS) pour indiquer
que les lignes de la nouvelle table doivent avoir des OID (identifiants d'objets) ou OIDS=FALSE pour indiquer le contraire.
Voir CREATE TABLE(7) pour plus d'informations.
WITH OIDS, WITHOUT OIDS
Ce sont les syntaxes obsoltes mais quivalentes, respectivement de WITH (OIDS) et WITH (OIDS=FALSE). Si vous
souhaitez indiquer la fois l'option OIDS et les paramtres de stockage, vous devez utiliser la syntaxe WITH ( ... ) ;
voir ci-dessus.
ON COMMIT
Le comportement des tables temporaires la fin d'un bloc de transaction est contrlable en utilisant ON COMMIT. Voici les
trois options :
PRESERVE ROWS
Aucune action spciale n'est effectue la fin de la transaction. C'est le comportement par dfaut.
DELETE ROWS
Toutes les lignes de la table temporaire seront supprimes la fin de chaque bloc de transaction. Habituellement, un TRUNCATE(7) automatique est effectu chaque COMMIT.
995
CREATE TABLE AS
DROP
La table temporaire sera supprime la fin du bloc de transaction en cours.
TABLESPACE espace_logique
L'espace_logique est le nom du tablespace dans lequel est cre la nouvelle table. S'il n'est pas indiqu, default_tablespace est consult, sauf si la table est temporaire auquel cas temp_tablespaces est utilis.
requte
Une commande SELECT(7), TABLE ou VALUES(7), voire une commande EXECUTE(7) qui excute un SELECT prpar,
TABLE ou une requte VALUES.
WITH [ NO ] DATA
Cette clause indique si les donnes produites par la requtes doivent tre copies dans la nouvelle table. Si non, seule la structure de la table est copie. La valeur par dfaut est de copier les donnes.
Notes
Cette commande est fonctionnellement quivalente SELECT INTO(7). Elle lui est cependant prfre car elle prsente moins de
risques de confusion avec les autres utilisations de la syntaxe SELECT INTO. De plus, CREATE TABLE AS offre plus de
fonctionnalits que SELECT INTO.
Avant PostgreSQL 8.0, CREATE TABLE AS incluait toujours les OIDs dans la table cre. partir de PostgresSQL 8.0, la
commande CREATE TABLE AS autorise l'utilisateur spcifier explicitement la prsence des OID. En l'absence de prcision, la
variable de configuration default_with_oids est utilise. partir de PostgreSQL 8.1, la valeur par dfaut de cette variable est
faux ; le comportement par dfaut n'est donc pas identique celui des versions prcdant la 8.0. Il est prfrable que les applications qui ncessitent des OID dans la table cre par CREATE TABLE AS indiquent explicitement WITH (OIDS) pour
s'assurer du comportement souhait.
Exemples
Crer une table films_recent contenant les entres rcentes de la table films :
CREATE TABLE films_recent AS
SELECT * FROM films WHERE date_prod >= '2006-01-01';
Pour copier une table compltement, la forme courte utilisant la clause TABLE peut aussi tre utilise :
CREATE TABLE films2 AS
TABLE films;
Crer une nouvelle table temporaire films_recents consistant des seules entres rcentes provenant de la table films en utilisant une instruction prpare. La nouvelle table a des OID et sera supprime la validation (COMMIT) :
PREPARE films_recents(date) AS
SELECT * FROM films WHERE date_prod > $1;
CREATE TEMP TABLE films_recents WITH (OIDS) ON COMMIT DROP AS
EXECUTE films_recents('2002-01-01');
Compatibilit
CREATE TABLE AS est conforme au standard SQL. The following are nonstandard extensions :
Le standard requiert des parenthses autour de la clause de la sous-requte ; elles sont optionnelles dans PostgreSQL.
Dans le standard, la clause WITH [ NO ] DATA est requise alors que PostgreSQL la rend optionnelle.
PostgreSQL gre les tables temporaires d'une faon bien diffrente de celle du standard ; voir CREATE TABLE(7) pour les
dtails.
La clause WITH est une extension PostgreSQL ; ni les paramtres de stockage ni les OID ne sont dans le standard.
Le concept PostgreSQL des tablespaces ne fait pas partie du standard. Du coup, la clause TABLESPACE est une extension.
Voir aussi
CREATE TABLE(7), EXECUTE(7), SELECT(7), SELECT INTO(7), VALUES(7)
996
Nom
CREATE TABLESPACE Dfinir un nouvel tablespace
Synopsis
CREATE TABLESPACE nom_tablespace
[ OWNER nom_utilisateur ]
LOCATION 'rpertoire'
Description
CREATE TABLESPACE enregistre un nouveau tablespace pour la grappe de bases de donnes. Le nom du tablespace doit
tre distinct du nom de tout autre tablespace de la grappe.
Un tablespace permet aux superutilisateurs de dfinir un nouvel emplacement sur le systme de fichiers pour le stockage des fichiers de donnes contenant des objets de la base (comme les tables et les index).
Un utilisateur disposant des droits appropris peut passer nom_tablespace comme paramtre de CREATE DATABASE,
CREATE TABLE, CREATE INDEX ou ADD CONSTRAINT pour que les fichiers de donnes de ces objets soient stocks
l'intrieur du tablespace spcifi.
Paramtres
nom_tablespace
Le nom du tablespace crer. Le nom ne peut pas commencer par pg_, de tels noms sont rservs pour les tablespaces systme.
nom_utilisateur
Le nom de l'utilisateur, propritaire du tablespace. En cas d'omission, il s'agit de l'utilisateur ayant excut la commande.
Seuls les superutilisateurs peuvent crer des tablespaces mais ils peuvent en donner la proprit des utilisateurs standard.
rpertoire
Le rpertoire qui sera utilis pour le tablespace. Le rpertoire doit tre vide et doit appartenir l'utilisateur systme PostgreSQL. Le rpertoire doit tre spcifi par un chemin absolu.
Notes
Les tablespaces ne sont supports que sur les systmes grant les liens symboliques.
CREATE TABLESPACE ne peut pas tre excut l'intrieur d'un bloc de transactions.
Exemples
Crer un tablespace espace_base sur /data/dbs :
CREATE TABLESPACE espace_base LOCATION '/data/dbs';
Crer un tablespace espace_index sur /data/indexes et en donner la proprit l'utilisatrice genevieve :
CREATE TABLESPACE espace_index OWNER genevieve LOCATION '/data/indexes';
Compatibilit
CREATE TABLESPACE est une extension PostgreSQL.
Voir aussi
CREATE DATABASE(7), CREATE TABLE(7), CREATE INDEX(7), DROP TABLESPACE(7), ALTER TABLESPACE(7)
997
Nom
CREATE TEXT SEARCH CONFIGURATION dfinir une nouvelle configuration de recherche plein texte
Synopsis
CREATE TEXT SEARCH CONFIGURATION nom (
PARSER = nom_analyseur |
COPY = config_source
)
Description
CREATE TEXT SEARCH CONFIGURATION cre une nouvelle configuration de recherche plein texte. Une configuration
indique l'analyseur qui peut diviser une chane en jetons, ainsi que les dictionnaires pouvant tre utiliss pour dterminer les jetons intressants rechercher.
Si seul l'analyseur est indiqu, la nouvelle configuration de recherche plein texte n'a initialement aucune relation entre les types
de jeton et les dictionnaires et, du coup, ignorera tous les mots. De nouveaux appels aux commandes ALTER TEXT SEARCH
CONFIGURATION doivent tre utiliss pour crer les correspondances et rendre la configuration rellement utile. Autrement,
une configuration de recherche plein texte peut tre copie.
Si un nom de schma est prcis, alors le modle de recherche plein texte est cr dans le schma indiqu. Sinon il est cr dans
le schma en cours.
L'utilisateur qui dfinit une configuration de recherche plein texte en devient son propritaire.
Voir Chapitre 12, Recherche plein texte pour plus d'informations.
Paramtres
nom
Le nom de la configuration de recherche plein texte (pouvant tre qualifi du schma).
parser_name
Le nom de l'analyseur de recherche plein texte utiliser pour cette configuration.
source_config
Le nom d'une configuration existante de recherche plein texte copier.
Notes
Les options PARSER et COPY sont mutuellement exclusives car, quand une configuration existante est copie, sa slection de
son analyseur est aussi copie.
Compatibilit
Il n'existe pas d'instruction CREATE TEXT SEARCH CONFIGURATION dans le standard SQL.
Voir aussi
ALTER TEXT SEARCH CONFIGURATION(7), DROP TEXT SEARCH CONFIGURATION(7)
998
Nom
CREATE TEXT SEARCH DICTIONARY dfinir un dictionnaire de recherche plein texte
Synopsis
CREATE TEXT SEARCH DICTIONARY nom (
TEMPLATE = modele
[, option = valeur [, ... ]]
)
Description
CREATE TEXT SEARCH DICTIONARY cre un nouveau dictionnaire de recherche plein texte. Un dictionnaire de recherche plein texte indique une faon de distinguer les mots intressants rechercher des mots inintressants. Un dictionnaire
dpend d'un modle de recherche plein texte qui spcifie les fonctions qui font rellement le travail. Typiquement, le dictionnaire fournit quelques options qui contrlent le comportement dtaill des fonctions du modle.
Si un nom de schma est prcis, alors le dictionnaire de recherche plein texte est cr dans le schma indiqu. Sinon il est cr
dans le schma en cours.
L'utilisateur qui dfinit un dictionnaire de recherche plein texte en devient son propritaire.
Voir Chapitre 12, Recherche plein texte pour plus d'informations.
Paramtres
nom
Le nom du dictionnaire de recherche plein texte (pouvant tre qualifi du schma).
modele
Le nom du modle de recherche plein texte qui dfinira le comportement basique de ce dictionnaire.
option
Le nom d'une option, spcifique au modle, configurer pour ce dictionnaire.
valeur
La valeur utiliser pour une option spcifique au modle. Si la valeur n'est pas un simple identifiant ou un nombre, elle doit
tre entre guillemets simples (mais vous pouvez toujours le faire si vous le souhaitez).
Les options peuvent apparatre dans n'importe quel ordre.
Exemples
La commande exemple suivante cre un dictionnaire bas sur Snowball avec une liste spcifique de mots d'arrt.
CREATE TEXT SEARCH DICTIONARY mon_dico_russe (
template = snowball,
language = russian,
stopwords = myrussian
);
Compatibilit
Il n'existe pas d'instructions CREATE TEXT SEARCH DICTIONARY dans le standard SQL.
Voir aussi
ALTER TEXT SEARCH DICTIONARY(7), DROP TEXT SEARCH DICTIONARY(7)
999
Nom
CREATE TEXT SEARCH PARSER dfinir un nouvel analyseur de recherche plein texte
Synopsis
CREATE TEXT SEARCH PARSER nom (
START = fonction_debut ,
GETTOKEN = function_gettoken ,
END = fonction_fin ,
LEXTYPES = fonction_lextypes
[, HEADLINE = fonction_headline ]
)
Description
CREATE TEXT SEARCH PARSER cre un nouvel analyseur de recherche plein texte. Un analyseur de recherche plein texte
dfinit une mthode pour diviser une chane en plusieurs jetons et pour assigner des types (catgories) aux jetons. Un analyseur
n'est pas particulirement utile en lui-mme mais doit tre limit dans une configuration de recherche plein texte avec certains
dictionnaires de recherche plein texte utiliser pour la recherche.
Si un nom de schma est prcis, alors le dictionnaire de recherche plein texte est cr dans le schma indiqu. Sinon il est cr
dans le schma en cours.
Vous devez tre un superutilisateur pour utiliser CREATE TEXT SEARCH PARSER. (Cette restriction est faite parce que la
dfinition d'un analyseur de recherche plein texte peut gner, voire arrter brutalement, le serveur.)
Voir Chapitre 12, Recherche plein texte pour plus d'informations.
Paramtres
name
Le nom d'un analyseur de recherche plein texte (pouvant tre qualifi du schma).
fonction_debut
Le nom d'une fonction de dmarrage pour l'analyseur.
fonction_gettoken
Le nom d'une fonction pour l'obtention du prochain jeton (get-next-token) pour l'analyseur.
fonction_fin
Le nom de la fonction d'arrt de l'analyseur.
fonction_lextypes
Le nom de la fonction lextypes pour l'analyseur (une fonction qui renvoie de l'information sur l'ensemble de types de jeton
qu'il produit).
fonction_headline
Le nom de la fonction headline pour l'analyseur (une fonction qui rsume un ensemble de jetons).
Les noms des fonctions peuvent se voir qualifier du nom du schma si ncessaire. Le type des arguments n'est pas indiqu car la
liste d'argument pour chaque type de fonction est prdtermin. Toutes les fonctions sont obligatoires sauf headline.
Les options peuvent apparatre dans n'importe quel ordre, pas seulement celui indiqu ci-dessus.
Compatibilit
Il n'existe pas d'instruction CREATE TEXT SEARCH PARSER dans le standard SQL.
Voir aussi
ALTER TEXT SEARCH PARSER(7), DROP TEXT SEARCH PARSER(7)
1000
Nom
CREATE TEXT SEARCH TEMPLATE dfinir un nouveau modle de recherche plein texte
Synopsis
CREATE TEXT SEARCH TEMPLATE nom (
[ INIT = fonction_init , ]
LEXIZE = fonction_lexize
)
Description
CREATE TEXT SEARCH TEMPLATE cre un nouveau modle de recherche plein texte. Les modles de recherche plein
texte dfinissent les fonctions qui implmentent les dictionnaires de recherche plein texte. Un modle n'est pas utile en lui-mme
mais doit tre instanci par un dictionnaire pour tre utilis. Le dictionnaire spcifie typiquement les paramtres donner aux
fonctions modle.
Si un nom de schma est prcis, alors le modle de recherche plein texte est cr dans le schma indiqu. Sinon il est cr dans
le schma en cours.
Vous devez tre un superutilisateur pour utiliser CREATE TEXT SEARCH TEMPLATE. Cette restriction est faite parce que
la dfinition d'un modle de recherche plein texte peut gner, voire arrter brutalement le serveur. La raison de la sparation des
modles et des dictionnaires est qu'un modle encapsule les aspects non srs de la dfinition d'un dictionnaire. Les paramtres qui peuvent tre dfinis lors de la mise en place d'un dictionnaire sont suffisamment srs pour tre utilis par des utilisateurs sans droits. Du coup, la cration d'un dictionnaire ne demande pas de droits particuliers.
Voir Chapitre 12, Recherche plein texte pour plus d'informations.
Paramtres
nom
Le nom du modle de recherche plein texte (pouvant tre qualifi du schma).
fonction_init
Le nom de la fonction d'initialisation du modle.
fonction_lexize
Le nom de la fonction lexize du modle.
Les noms des fonctions peuvent se voir qualifier du nom du schma si ncessaire. Le type des arguments n'est pas indiqu car la
liste d'argument pour chaque type de fonction est prdtermin. La fonction lexize est obligatoire mais la fonction init est optionnelle.
Les arguments peuvent apparatre dans n'importe quel ordre, pas seulement dans celui indiqu ci-dessus.
Compatibilit
Il n'existe pas d'instruction CREATE TEXT SEARCH TEMPLATE dans le standard SQL.
Voir aussi
ALTER TEXT SEARCH TEMPLATE(7), DROP TEXT SEARCH TEMPLATE(7)
1001
Nom
CREATE TRIGGER Dfinir un nouveau dclencheur
Synopsis
CREATE [ CONSTRAINT ] TRIGGER nom { BEFORE | AFTER | INSTEAD OF } { vnement [ OR
... ] }
ON table
[ FROM nom_table_referencee ]
[ NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } ]
[ FOR [ EACH ] { ROW | STATEMENT } ]
[ WHEN ( condition ) ]
EXECUTE PROCEDURE nom_fonction ( arguments )
o vnement fait partie de :
INSERT
UPDATE [ OF nom_colonne [, ... ] ]
DELETE
TRUNCATE
Description
CREATE TRIGGER cre un nouveau dclencheur. Le dclencheur est associ la table ou la vue spcifie et excute la
fonction nom_fonction lorsque certains vnements surviennent.
L'appel du dclencheur peut avoir lieu avant que l'opration ne soit tente sur une ligne (avant la vrification des contraintes et
la tentative d'INSERT, UPDATE ou DELETE) ou une fois que l'opration est termine (aprs la vrification des contraintes et
la fin de la commande INSERT, UPDATE ou DELETE) ; ou bien en remplacement de l'opration (dans le cas d'oprations
INSERT, UPDATE ou DELETE sur une vue). Si le dclencheur est lanc avant l'vnement ou en remplacement de
l'vnement, le dclencheur peut ignorer l'opration sur la ligne courante ou modifier la ligne en cours d'insertion (uniquement
pour les oprations INSERT et UPDATE). Si le dclencheur est activ aprs l'vnement, toute modification, dont celles effectues par les autres dclencheurs, est visible par le dclencheur.
Un dclencheur marqu FOR EACH ROW est appel pour chaque ligne que l'opration modifie. Par exemple, un DELETE affectant dix lignes entrane dix appels distincts de tout dclencheur ON DELETE sur la relation cible, une fois par ligne supprime. Au contraire, un dclencheur marqu FOR EACH STATEMENT ne s'excute qu'une fois pour une opration donne,
quelque soit le nombre de lignes modifies (en particulier, une opration qui ne modifie aucune ligne rsulte toujours en
l'excution des dclencheurs FOR EACH STATEMENT applicables).
Les dclencheurs dfinis en remplacement (INSTEAD OF) doivent obligatoirement tre marqus FOR EACH ROW, et ne
peuvent tre dfinis que sur des vues. Les dclencheurs BEFORE et AFTER portant sur des vues devront quant eux tre marqus FOR EACH STATEMENT.
Les dclencheurs peuvent galement tre dfinis pour l'vnement TRUNCATE, mais ne pourront, dans ce cas, qu'tre marqus
FOR EACH STATEMENT.
Le tableau suivant rcapitule quels types de dclencheurs peuvent tre utiliss sur les tables et les vues :
Dclenchement
vnement
Niveau ligne
Niveau instruction
BEFORE
INSERT/UPDATE/DELETE
TRUNCATE
--
Tables
AFTER
INSERT/UPDATE/DELETE
Tables
Tables et vues
TRUNCATE
--
Tables
INSERT/UPDATE/DELETE
Vues
--
TRUNCATE
--
--
INSTEAD OF
Tables
Tables et vues
De plus, les triggers peuvent tre dfinis pour tre dclenchs suite l'excution d'un TRUNCATE, mais seulement dans le cas
d'un trigger FOR EACH STATEMENT.
En outre, la dfinition d'un trigger peut spcifier une condition WHEN qui sera teste pour vrifier si le trigger doit rellement
tre dclench. Dans les triggers au niveau ligne, la condition WHEN peut examiner l'ancienne et/ou la nouvelle valeurs des co1002
CREATE TRIGGER
lonnes de la ligne. Les triggers au niveau instruction peuvent aussi avoir des conditions WHEN, bien que la fonctionnalit n'est pas
aussi utile pour elles car la condition ne peut pas faire rfrence aux valeurs de la table.
Si plusieurs dclencheurs du mme genre sont dfinis pour le mme vnement, ils sont dclenchs suivant l'ordre alphabtique de
leur nom.
Lorsque l'option CONSTRAINT est spcifie, cette commande cre un dclencheur contrainte. Ce nouvel objet est identique aux
dclencheurs normaux except le fait que le moment de dclenchement peut alors tre ajust via l'utilisation de SET
CONSTRAINTS(7). Les dclencheurs contraintes ne peuvent tre que de type AFTER ROW. Ils peuvent tre dclenchs soit la
fin de l'instruction causant l'vnement, soit la fin de la transaction ayant contenu l'instruction de dclenchement ; dans ce dernier cas, ils sont alors dfinis comme diffrs. L'excution d'un dclencheur diffr peut galement tre force en utilisant l'option
SET CONSTRAINTS. Le comportement attendu des dclencheurs contraintes est de gnrer une exception en cas de violation de
la contrainte qu'ils implmentent.
SELECT ne modifie aucune ligne ; la cration de dclencheurs sur SELECT n'est donc pas possible. Les rgles et vues sont plus
appropries dans ce cas.
Chapitre 36, Dclencheurs (triggers) prsente de plus amples informations sur les dclencheurs.
Paramtres
nom
Le nom du nouveau dclencheur. Il doit tre distinct du nom de tout autre dclencheur sur la table. Le nom ne peut pas tre
qualifi d'un nom de schma, le dclencheur hritant du schma de sa table. Pour un dclencheur contrainte, c'est galement le
nom utiliser lorsqu'il s'agira de modifier son comportement via la commande SET CONSTRAINTS.
BEFORE, AFTER, INSTEAD OF
Dtermine si la fonction est appele avant, aprs ou en remplacement de l'vnement. Un dclencheur contrainte ne peut tre
spcifi qu'AFTER.
vnement
Peut-tre INSERT, UPDATE ou DELETE ou TRUNCATE ; prcise l'vnement qui active le dclencheur. Plusieurs vnements peuvent tre prciss en les sparant par OR.
Pour les triggers se dclenchant suite un UPDATE, il est possible de spcifier une liste de colonnes utilisant cette syntaxe :
UPDATE OF nom_colonne_1 [, nom_colonne_2 ... ]
Le trigger se dclenchera seulement si au moins une des colonnes listes est mentionne comme cible de la commande UPDATE.
Les vnements INSTEAD OF UPDATE ne supportent pas de listes de colonnes.
table
Le nom (ventuellement qualifi du nom du schma) de la table ou de la vue laquelle est rattach le dclencheur.
nom_table_referencee
Le nom d'une autre table (possiblement qualifie par un nom de schma) rfrence par la contrainte. Cette option est utiliser pour les contraintes de cls trangres et n'est pas recommande pour d'autres types d'utilisation. Elle ne peut tre spcifie
que pour les dclencheurs contraintes.
DEFERRABLE, NOT DEFERRABLE, INITIALLY IMMEDIATE, INITIALLY DEFERRED
La spcification du moment de dclenchement par dfaut. Voir la partie CREATE TABLE(7) pour plus de dtails sur cette
option. Elle ne peut tre spcifie que pour les dclencheurs contraintes.
FOR EACH ROW, FOR EACH STATEMENT
Prcise si la procdure du dclencheur doit tre lance pour chaque ligne affecte par l'vnement ou simplement pour chaque
instruction SQL. FOR EACH STATEMENT est la valeur par dfaut. Constraint triggers can only be specified FOR EACH
ROW.
condition
Une expression boolenne qui dtermine si la fonction trigger sera rellement excute. Si WHEN est indiqu, la fonction sera
seulement appele si la condition renvoie true. Pour les triggers FOR EACH ROW, la condition WHEN peut faire rfrence aux valeurs des colonnes des ancienne et nouvelle lignes en utilisant la notation OLD.nom_colonne ou
NEW.nom_colonne, respectivement. Bien sr, le triggers sur INSERT ne peuvent pas faire rfrence OLD et ceux sur
DELETE ne peuvent pas faire rfrence NEW.
Les dclencheurs INSTEAD OF ne supportent pas de condition WHEN.
1003
CREATE TRIGGER
Notes
Pour crer un dclencheur sur une table, l'utilisateur doit possder le droit TRIGGER sur la table. L'utilisateur doit aussi avoir le
droit EXECUTE sur la fonction trigger.
Utiliser DROP TRIGGER(7) pour supprimer un dclencheur.
Un trigger sur colonne spcifique (one defined using the UPDATE OF nom_colonne syntax) se dclenchera quand une des colonnes indiques est liste comme cible de la liste SET pour la commande UPDATE. Il est possible qu'une valeur de colonne
change mme si le trigger n'est pas dclench parceque les modifications au contenu de la ligne par les triggers BEFORE UPDATE ne sont pas pris en compte. De mme, une commande comme UPDATE ... SET x = x ... dclenchera le trigger
sur la colonne x, bien que la valeur de cette colonne ne change pas.
Dans un trigger BEFORE, la condition WHEN est value juste avant l'excution de la fonction, donc utiliser WHEN n'est pas matriellement diffrent de tester la mme condition au dbut de la fonction trigger. Notez en particulier que la ligne NEW vu par la
condition est sa valeur courante et possiblement modifie par des triggers prcdents. De plus, la condition WHEN d'un trigger BEFORE n'est pas autoris examiner les colonnes systme de la ligne NEW (comme l'oid), car elles n'auront pas encore t initialises.
Dans un trigger AFTER, la condition WHEN est value juste aprs la mise jour de la ligne et elle dtermine si un vnement doit
dclencher le trigger la fin de l'instruction. Donc, quand la condition WHEN d'un trigger AFTER ne renvoie pas true, il n'est pas
ncessaire de prparer un vnement ou de relire la ligne la fin de l'instruction. Cela peut apporter une amlioration significative
des performances dans les instructions qui modifient de nombreuses lignes, si le trigger a besoin d'tre dclencher pour quelques
lignes.
Dans les versions de PostgreSQL antrieures la 7.3, il tait ncessaire de dclarer un type opaque de retour pour les fonctions
dclencheur, plutt que trigger. Pour pouvoir charger d'anciens fichiers de sauvegarde, CREATE TRIGGER accepte qu'une
fonction dclare une valeur de retour de type opaque, mais il affiche un message d'avertissement et change le type de retour dclar en trigger.
Exemples
Excutez la fonction check_account_update quand une ligne de la table accounts est sur le point d'tre mise jour :
CREATE TRIGGER check_update
BEFORE UPDATE ON accounts
FOR EACH ROW
EXECUTE PROCEDURE check_account_update();
Idem, mais avec une excution de la fonction seulement si la colonne balance est spcifie comme cible de la commande UPDATE :
CREATE TRIGGER check_update
BEFORE UPDATE OF balance ON accounts
FOR EACH ROW
EXECUTE PROCEDURE check_account_update();
Cette forme excute la fonction seulement si la colonne balance a rellement chang de valeur :
CREATE TRIGGER check_update
BEFORE UPDATE ON accounts
1004
CREATE TRIGGER
Compatibilit
L'instruction CREATE TRIGGER de PostgreSQL implante un sous-ensemble du standard SQL. Les fonctionnalits manquantes sont :
SQL permet de dfinir des alias pour les lignes old et new ou pour les tables utilise dans la dfinition des actions dclenches (c'est--dire CREATE TRIGGER ... ON nomtable REFERENCING OLD ROW AS unnom NEW ROW
AS unautrenom...). PostgreSQL autorise l'criture de procdures de dclencheurs dans tout langage l'utilisateur. De ce
fait, l'accs aux donnes est gr spcifiquement pour chaque langage.
PostgreSQL n'autorise comme action dclenche que l'excution d'une fonction utilisateur. Le standard SQL, en revanche,
autorise l'excution d'autres commandes SQL, telles que CREATE TABLE. Cette limitation de PostgreSQL peut tre facilement contourne par la cration d'une fonction utilisateur qui excute les commandes dsires.
Le standard SQL dfinit l'ordre de cration comme ordre de lancement des dclencheurs multiples. PostgreSQL utilise l'ordre
alphabtique de leur nom, jug plus pratique.
Le standard SQL prcise que les dclencheurs BEFORE DELETE sur des suppressions en cascade se dclenchent aprs la fin du
DELETE en cascade. PostgreSQL dfinit que BEFORE DELETE se dclenche toujours avant l'action de suppression, mme
lors d'une action en cascade. Cela semble plus cohrent. Il existe aussi un comportement non standard quand les triggers BEFORE
modifient les lignes ou empchent les mises jour causes par une action rfrente. Ceci peut amener des violations de
contraintes ou au stockage de donnes qui n'honorent pas la contrainte rfrentielle.
La capacit prciser plusieurs actions pour un seul dclencheur avec OR est une extension PostgreSQL.
La possibilit d'excuter un trigger suite une commande TRUNCATE est une extension PostgreSQL du standard SQL, tout
comme la possibilit de dfinir des dclencheurs de niveau instruction sur des vues.
CREATE CONSTRAINT TRIGGER est une extension spcifique PostgreSQL du standard SQL.
Voir aussi
CREATE FUNCTION(7), ALTER TRIGGER(7), DROP TRIGGER(7), SET CONSTRAINTS(7)
1005
Nom
CREATE TYPE Dfinir un nouveau type de donnes
Synopsis
CREATE TYPE nom AS
( nom_attribut type_donne [ COLLATE collation ] [, ... ] )
CREATE TYPE nom AS ENUM
( [ 'label' [, ... ] ] )
CREATE TYPE nom (
INPUT = fonction_entre,
OUTPUT = fonction_sortie
[ , RECEIVE = fonction_rception ]
[ , SEND = fonction_envoi ]
[ , TYPMOD_IN = type_modifier_input_function ]
[ , TYPMOD_OUT = type_modifier_output_function ]
[ , ANALYZE = fonction_analyse ]
[ , INTERNALLENGTH = { longueurinterne | VARIABLE } ]
[ , PASSEDBYVALUE ]
[ , ALIGNMENT = alignement ]
[ , STORAGE = stockage ]
[ , LIKE = type_like ]
[ , CATEGORY = catgorie ]
[ , PREFERRED = prfr ]
[ , DEFAULT = dfaut ]
[ , ELEMENT = lment ]
[ , DELIMITER = dlimiteur ]
[ , COLLATABLE = collatable ]
)
CREATE TYPE nom
Description
CREATE TYPE enregistre un nouveau type de donnes utilisable dans la base courante. L'utilisateur qui dfinit un type en devient le propritaire.
Si un nom de schma est prcis, le type est cr dans ce schma. Sinon, il est cr dans le schma courant. Le nom du type doit
tre distinct du nom de tout type ou domaine existant dans le mme schma. Les tables possdent des types de donnes associs.
Il est donc ncessaire que le nom du type soit galement distinct du nom de toute table existant dans le mme schma.
Types composites
La premire forme de CREATE TYPE cre un type composite. Le type composite est dfini par une liste de noms d'attributs et
de types de donnes. Un collationnement d'attribute peut aussi tre spcifi si son type de donnes est collationnable. Un type
composite est essentiellement le mme que le type ligne (NDT : row type en anglais) d'une table, mais l'utilisation de CREATE
TYPE permet d'viter la cration d'une table relle quand seule la dfinition d'un type est voulue. Un type composite autonome
est utile, par exemple, comme type d'argument ou de retour d'une fonction.
Types numrs
La seconde forme de CREATE TYPE cre un type numr (enum), comme dcrit dans Section 8.7, Types numration .
Les types enum prennent une liste de un plusieurs labels entre guillemets, chacun devant faire moins de NAMEDATALEN octets (64 dans une installation PostgreSQL standard).
Types de base
La troisime forme de CREATE TYPE cre un nouveau type de base (type scalaire). Pour crer un nouveau type de base, il
faut tre superutilisateur. (Cette restriction est impose parce qu'une dfinition de type errone pourrait embrouiller voire arrter
brutalement le serveur.)
L'ordre des paramtres, dont la plupart sont optionnels, n'a aucune d'importance. Avant de dfinir le type, il est ncessaire de dfinir au moins deux fonctions ( l'aide de la commande CREATE FUNCTION). Les fonctions de support fonc1006
CREATE TYPE
CREATE TYPE
Le paramtre alignement spcifie l'alignement de stockage requis pour le type de donnes. Les valeurs permises sont des alignements sur 1, 2, 4 ou 8 octets. Les types de longueurs variables ont un alignement d'au moins quatre octets car leur premier
composant est ncessairement un int4.
Le paramtre stockage permet de choisir une stratgie de stockage pour les types de donnes de longueur variable. (Seul
plain est autoris pour les types de longueur fixe.) plain indique des donnes stockes en ligne et non compresses. Dans le
cas d'extended le systme essaie tout d'abord de compresser une valeur longue et dplace la valeur hors de la ligne de la table
principale si elle est toujours trop longue. external permet la valeur d'tre dplace hors de la table principale mais le systme ne tente pas de la compresser. main autorise la compression mais ne dplace la valeur hors de la table principale qu'en dernier recours. (Ils seront dplacs s'il n'est pas possible de placer la ligne dans la table principale, mais sont prfrentiellement
conservs dans la table principale, contrairement aux lments extended et external.)
Le paramtre type_like fournit une mthode alternative pour spcifier les proprits de reprsentation de base d'un type de
donnes : les copier depuis un type existant. Les valeurs de longueurinterne, passedbyvalue, alignement et stockage sont copies du type indiqu. (C'est possible, mais habituellement non souhait, d'craser certaines de ces valeurs en les
spcifiant en mme temps que la clause LIKE.) Spcifier la reprsentation de cette faon est particulirement pratique quand
l'implmentation de bas niveau du nouveau type emprunte celle d'un type existant d'une faon ou d'une autre.
Les paramtres catgorie et prfr peuvent tre utiliss pour aider contrler la conversion implicite applique en cas
d'ambigut. Chaque type de donnes appartient une catgorie identifie par un seul caractre ASCII, et chaque type est
prfr ou pas de sa catgorie. L'analyseur prfrera convertir vers des types prfrs (mais seulement partir d'autres types
dans la mme catgorie) quand cette rgle peut servir rsoudre des fonctions ou oprateurs surchargs. Pour plus de dtails, voir
Chapitre 10, Conversion de types. Pour les types qui n'ont pas de conversion implicite de ou vers d'autres types, on peut se contenter de laisser ces paramtres aux valeurs par dfaut. Par contre, pour un groupe de types lis entre eux qui ont des conversions implicites, il est souvent pratique de les marquer tous comme faisant partie d'une mme catgorie, et de choisir un ou deux des types
les plus gnraux comme tant les types prfrs de la catgorie. Le paramtre catgorie est particulirement utile quand
on ajoute un type dfini par l'utilisateur un type interne, comme un type numrique ou chane. Toutefois, c'est aussi tout fait
possible de crer des catgories de types entirement nouvelles. Choisissez un caractre ASCII autre qu'une lettre en majuscule
pour donner un nom une catgorie de ce genre.
Une valeur par dfaut peut tre spcifie dans le cas o l'utilisateur souhaite que cette valeur soit diffrente de NULL pour les colonnes de ce type. La valeur par dfaut est prcise l'aide du mot cl DEFAULT. (Une telle valeur par dfaut peut tre surcharge
par une clause DEFAULT explicite attache une colonne particulire.)
Pour indiquer qu'un type est un tableau, le type des lments du tableau est prcis par le mot cl ELEMENT. Par exemple, pour
dfinir un tableau d'entiers de quatre octets (int4), ELEMENT = int4 est utilis. Plus de dtails sur les types tableau apparaissent ci-dessous.
Pour prciser le dlimiteur de valeurs utilis dans la reprsentation externe des tableaux de ce type, dlimiteur peut tre positionn un caractre particulier. Le dlimiteur par dfaut est la virgule (,). Le dlimiteur est associ avec le type lment de tableau, pas avec le type tableau.
Si le paramtre boolen optionnel collatable vaut true, les dfinitions et expressions de colonnes du type peuvent embarquer
une information de collationnement via la clause COLLATE. C'est aux implmentations des fonctions du type de faire bon usage
de cette information. Cela n'arrive pas automatiquement en marquant le type collationnable.
Types tableau
chaque fois qu'un type dfini par un utilisateur est cr, PostgreSQL cre automatiquement un type tableau associ dont le
nom est compos partir du type de base prfix d'un tiret bas et tronqu si ncessaire pour que le nom gnr fasse moins de NAMEDATALEN octets. (Si le nom gnr est en conflit avec un autre nom, le traitement est rpt jusqu' ce qu'un nom sans
conflit soit trouv.) Ce type tableau cr implicitement est de longueur variable et utilise les fonctions d'entre et sortie array_in et array_out. Le type tableau trace tout changement dans du type de base pour le propritaire et le schma. Il est aussi
supprim quand le type de base l'est.
Pourquoi existe-t-il une option ELEMENT si le systme fabrique automatiquement le bon type tableau ? La seule utilit d'ELEMENT est la cration d'un type de longueur fixe reprsent en interne par un tableau d'lments identiques auxquels on souhaite accder directement par leurs indices (en plus de toute autre opration effectue sur le type dans sa globalit). Par exemple, le type
point est reprsent par deux nombres virgule flottante, qui sont accessibles par point[0] et point[1]. Cette fonctionnalit
n'est possible qu'avec les types de longueur fixe dont la forme interne est strictement une squence de champs de longueur fixe.
Un type de longueur variable est accessible par ses indices si sa reprsentation interne gnralise est celle utilise par array_in
et array_out. Pour des raisons historiques (c'est--dire pour de mauvaises raisons, mais il est trop tard pour changer) les indices
des tableaux de types de longueur fixe commencent zro et non un comme c'est le cas pour les tableaux de longueur variable.
Paramtres
1008
CREATE TYPE
nom
Le nom (ventuellement qualifi du nom du schma) du type crer.
nom_attribut
Le nom d'un attribut (colonne) du type composite.
type_donnes
Le nom d'un type de donnes existant utilis comme colonne du type composite.
label
Une chane reprsentant le label associ une valeur du type enum.
fonction_entre
Le nom d'une fonction de conversion des donnes de la forme textuelle externe du type en forme interne.
fonction_sortie
Le nom d'une fonction de conversion des donnes de la forme interne du type en forme textuelle externe.
fonction_rception
Le nom d'une fonction de conversion des donnes de la forme binaire externe du type en forme interne.
fonction_envoi
Le nom d'une fonction de conversion des donnes de la forme interne du type en forme binaire externe.
type_modifier_input_function
Le nom d'une fonction qui convertit un tableau de modifieurs pour le type vers sa forme interne.
type_modifier_output_function
Le nom d'une fonction qui convertit la forme interne des modifieurs du type vers leur forme textuelle externe.
analyze_function
Le nom d'une fonction d'analyses statistiques pour le type de donnes.
longueurinterne
Une constante numrique qui prcise la longueur en octets de la reprsentation interne du nouveau type. Suppose variable
par dfaut.
alignement
La spcification d'alignement du stockage du type de donnes. Peut tre char, int2, int4 ou double ; int4 par dfaut.
stockage
La stratgie de stockage du type de donnes. Peut tre plain, external, extended ou main ; plain par dfaut.
type_like
Le nom d'un type de donnes existant dont le nouveau type partagera la reprsentation. Les valeurs de longueurinterne,
passedbyvalue, alignement et stockage sont recopies partir de ce type, sauf si elles sont crases explicitement
ailleurs dans la mme commande CREATE TYPE.
catgorie
Le code de catgorie (un unique caractre ASCII) pour ce type. La valeur par dfaut est U pour user-defined type (type dfini par l'utilisateur). Les autres codes standard de catgorie peuvent tre trouvs dans Tableau 45.49, Codes typcategory . Vous pouvez aussi choisir d'autres caractres ASCII pour crer vos propres catgories personnalises.
prfr
True si ce type est un type prfr dans sa catgorie de types, sinon false. La valeur par dfaut est false. Faites trs attention
en crant un nouveau type prfr l'intrieur d'une catgorie existante car cela pourrait crer des modifications surprenantes
de comportement.
dfaut
La valeur par dfaut du type de donnes. Omise, elle est NULL.
lment
Type des lments du type tableau cr.
dlimiteur
Le caractre dlimiteur des valeurs des tableaux de ce type.
collatable
Vrai si les oprations de ce type peuvent utiliser les informations de collationnement. Par dfaut, faux.
1009
CREATE TYPE
Notes
Comme il n'y a pas de restrictions l'utilisation d'un type de donnes une fois qu'il a t cr, crer un type de base est quivalent
donner les droits d'excution ssur les fonctions mentionnes dans la dfinition du type. Ce n'est pas un problme habituellement
pour le genre de fonctions utiles dans la dfinition d'un type mais rflchissez bien avant de concevoir un type d'une faon qui ncessiterait que des informations secrtes soient utilises lors de sa convertion vers ou partir d'une forme externe.
Avant PostgreSQL version 8.3, le nom d'un type tableau gnr tait toujours exactement le nom du type lment avec un caractre tiret bas (_) en prfixe. (Les noms des types taient du coup limits en longueur un caractre de moins que les autres
noms.) Bien que cela soit toujours le cas, le nom d'un type tableau peut varier entre ceci dans le cas des noms de taille maximum
et les collisions avec des noms de type utilisateur qui commencent avec un tiret bas. crire du code qui dpend de cette convention
est du coup obsolte. la place, utilisez pg_type.typarray pour situer le type tableau associ avec un type donn.
Il est conseill d'viter d'utiliser des noms de table et de type qui commencent avec un tiret bas. Alors que le serveur changera les
noms des types tableau gnrs pour viter les collisions avec les noms donns par un utilisateur, il reste toujours un risque de
confusion, particulirement avec les anciens logiciels clients qui pourraient supposer que les noms de type commenant avec un tiret bas reprsentent toujours des tableaux.
Avant PostgreSQL version 8.2, la syntaxe CREATE TYPE nom n'existait pas. La faon de crer un nouveau type de base tait
de crer en premier les fonctions paramtres. Dans cette optique, PostgreSQL verra tout d'abord le nom d'un nouveau type de
donnes comme type de retour de la fonction en entre. Le type shell est cr implicitement dans ce cas et il est ensuite rfrenc
dans le reste des fonctions d'entre/sortie. Cette approche fonctionne toujours mais est obsolte et pourrait tre interdite dans une
version future. De plus, pour viter de faire grossir les catalogues de faon accidentelle avec des squelettes de type errons, un
squelette sera seulement cr quand la fonction en entre est crit en C.
Dans les versions de PostgreSQL antrieures la 7.3, la cration d'un type coquille tait habituellement vite en remplaant les
rfrences des fonctions au nom du type par le pseudotype opaque. Les arguments cstring et les rsultats taient galement dclars opaque. Pour supporter le chargement d'anciens fichiers de sauvegarde, CREATE TYPE accepte les fonctions
d'entres/sorties dclares avec le pseudotype opaque mais un message d'avertissement est affich. La dclaration de la fonction
est galement modifie pour utiliser les bons types.
Exemples
Crer un type composite utilis dans la dfinition d'une fonction :
CREATE TYPE compfoo AS (f1 int, f2 text);
CREATE FUNCTION getfoo() RETURNS SETOF compfoo AS $$
SELECT fooid, fooname FROM foo
$$ LANGUAGE SQL;
Cet exemple cre un type numr et l'utilise dans la cration d'une table :
CREATE TYPE statut_bogue AS ENUM ('nouveau', 'ouvert', 'ferm');
CREATE TABLE bogue (
id serial,
description text,
status statut_bogue
);
Crer le type de donnes basique box utilis dans la dfinition d'une table :
CREATE TYPE box;
CREATE FUNCTION ma_fonction_entree_box(cstring) RETURNS box AS ... ;
CREATE FUNCTION ma_fonction_sortie_box(box) RETURNS cstring AS ... ;
CREATE TYPE box (
INTERNALLENGTH = 16,
INPUT = ma_fonction_entree_box,
OUTPUT = ma_fonction_sortie_box
);
CREATE TABLE myboxes (
id integer,
description box
);
1010
CREATE TYPE
Si la structure interne de box est un tableau de quatre lments float4, on peut crire :
CREATE TYPE box (
INTERNALLENGTH = 16,
INPUT = ma_fonction_entree_box,
OUTPUT = ma_fonction_sortie_box,
ELEMENT = float4
);
ce qui permet d'accder aux nombres composant la valeur d'une bote par les indices. Le comportement du type n'est pas modifi.
Crer un objet large utilis dans la dfinition d'une table :
CREATE TYPE bigobj (
INPUT = lo_filein, OUTPUT = lo_fileout,
INTERNALLENGTH = VARIABLE
);
CREATE TABLE big_objs (
id integer,
obj bigobj
);
D'autres exemples, intgrant des fonctions utiles d'entre et de sortie, peuvent tre consults dans Section 35.11, Types utilisateur .
Compatibilit
La premire forme de la commande CREATE TYPE, qui cre un type composite, est conforme au standard SQL. Les autres
formes sont des extensions de PostgreSQL. L'instruction CREATE TYPE du standard SQL dfinit aussi d'autres formes qui ne
sont pas implmentes dans PostgreSQL.
La possibilit de crer un type composite sans attributs est une diffrence spcifique de PostgreSQL que le standard ne propose
pas (de faon analogue au CREATE TABLE).
Voir aussi
ALTER TYPE(7), CREATE DOMAIN(7), CREATE FUNCTION(7), DROP TYPE(7)
1011
Nom
CREATE USER Dfinir un nouveau rle de base de donnes
Synopsis
CREATE USER nom [ [ WITH ] option [ ... ] ]
o option peut tre :
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SUPERUSER | NOSUPERUSER
CREATEDB | NOCREATEDB
CREATEROLE | NOCREATEROLE
CREATEUSER | NOCREATEUSER
INHERIT | NOINHERIT
LOGIN | NOLOGIN
REPLICATION | NOREPLICATION
CONNECTION LIMIT limite_connexion
[ ENCRYPTED | UNENCRYPTED ] PASSWORD 'motdepasse'
VALID UNTIL 'dateheure'
IN ROLE nom_role [, ...]
IN GROUP nom_role [, ...]
ROLE nom_role [, ...]
ADMIN nom_role [, ...]
USER nom_role [, ...]
SYSID uid
Description
CREATE USER est dornavant un alias de CREATE ROLE(7). Il y a toutefois une petite diffrence entre les deux commandes. Lorsque la commande CREATE USER est xcute, LOGIN est le comportement par dfaut. Au contraire, quand
CREATE ROLE est excute, NOLOGIN est utilis.
Compatibilit
L'instruction CREATE USER est une extension PostgreSQL. Le standard SQL laisse la dfinition des utilisateurs
l'implantation.
Voir aussi
CREATE ROLE(7)
1012
Nom
CREATE USER MAPPING Dfinir une nouvelle correspondance d'utilisateur (user mapping) pour un serveur distant
Synopsis
CREATE USER MAPPING FOR { nom_utilisateur | USER | CURRENT_USER | PUBLIC }
SERVER nom_serveur
[ OPTIONS ( option 'valeur' [ , ... ] ) ]
Description
CREATE USER MAPPING dfinit une nouvelle correspondance d'utilisateur (user mapping) pour un serveur distant. Une
correspondance d'utilisateur englobe typiquement les informations de connexion qu'un wrapper de donnes distantes utilise avec
l'information d'un serveur distant pour accder des ressources externes de donnes.
Le propritaire d'un serveur distant peut crer des correspondances d'utilisateur pour ce serveur pour n'importe quel utilisateur.
Par ailleurs, un utilisateur peut crer une correspondance d'utilisateur pour son propre nom d'utilisateur si le droit USAGE a t
donn sur le serveur son utilisateur.
Paramtres
nom_utilisateur
Le nom d'un utilisateur existant qui est mis en correspondance sur un serveur distant. CURRENT_USER et USER correspondent au nom de l'utilisateur courant. Quand PUBLIC est ajoute, une correspondance appele publique est cre pour
tre utilise quand aucune correspondance d'utilisateur spcifique n'est applicable.
nom_serveur
Le nom d'un serveur existant pour lequel la correspondance d'utilisateur sera cre.
OPTIONS ( option 'valeur' [, ... ] )
Cette clause dfinit les options pour la correspondance d'utilisateurs. Les options dfinissent typiquement le nom et le mot
de passe rels de la correspondance. Les nom d'options doivent tre uniques. Les noms et valeurs d'options autoriss sont
propres au wrapper de donnes trangre du serveur.
Exemples
Crer une correspondance d'utilisateur pour l'utilisateur bob, sur le serveur truc :
CREATE USER MAPPING FOR bob SERVER truc OPTIONS (user 'bob', password 'secret');
Compatibilit
CREATE USER MAPPING est conforme la norme ISO/IEC 9075-9 (SQL/MED).
Voir aussi
ALTER USER MAPPING(7), DROP USER MAPPING(7), CREATE FOREIGN DATA WRAPPER(7), CREATE SERVER(7)
1013
Nom
CREATE VIEW Dfinir une vue
Synopsis
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW nom [ ( nom_colonne [, ...] ) ]
AS requte
Description
CREATE VIEW dfinit une vue d'aprs une requte. La vue n'est pas matrialise physiquement. Au lieu de cela, la requte est
lance chaque fois qu'une vue est utilise dans une requte.
CREATE OR REPLACE VIEW a la mme finalit, mais si une vue du mme nom existe dj, elle est remplace. La nouvelle
requte doit gnrer les mmes colonnes que celles de l'ancienne requte (c-est--dire les mmes noms de colonnes dans le
mme ordre avec les mmes types de donnes). Par contre, elle peut ajouter des colonnes supplmentaires en fin de liste. Les
traitements qui donnent les colonnes en sortie pourraient tre compltement diffrents.
Si un nom de schma est donn (par exemple CREATE VIEW monschema.mavue ...), alors la vue est cre dans ce
schma. Dans le cas contraire, elle est cre dans le schma courant. Les vues temporaires existent dans un schma spcial. Il
n'est donc pas ncessaire de fournir de schma pour les vues temporaires. Le nom de la vue doit tre diffrent du nom de toute
autre vue, table, squence, index ou table distante du mme schma.
Paramtres
TEMPORARY ou TEMP
La vue est temporaire. Les vues temporaires sont automatiquement supprimes en fin de session. Les relations permanentes
qui portent le mme nom ne sont plus visibles pour la session tant que la vue temporaire existe, sauf s'il y est fait rfrence
avec le nom du schma.
Si l'une des tables rfrences par la vue est temporaire, la vue est alors elle-aussi temporaire (que TEMPORARY soit spcifi ou non).
nom
Le nom de la vue crer (ventuellement qualifi du nom du schma).
nom de colonne
Une liste optionnelle de noms utiliser pour les colonnes de la vue. Si elle n'est pas donne, le nom des colonnes est dduit
de la requte.
requte
Une commande SELECT(7) ou VALUES(7) qui fournira les colonnes et lignes de la vue.
Notes
Actuellement, les vues sont en lecture seule : le systme n'autorise pas une insertion, une mise jour ou une suppression sur une
vue. Les effets d'une vue actualisable peuvent tre reproduits par la cration de triggers INSTEAD sur la vue, qui devront transformer les insertions (ou autres) tentes sur la vue en actions appropries sur les autres tables. Voir CREATE TRIGGER(7) pour
plus d'informations. Une autre possibilit revient crer des rgles (voir CREATE RULE(7)). En pratique, il est plus facile de
comprendre et d'utiliser correctement les triggers.
L'instruction DROP VIEW(7) est utilise pour supprimer les vues.
Il est important de s'assurer que le nom et le type des colonnes de la vue correspondent ce qui est souhait. Ainsi :
CREATE VIEW vista AS SELECT 'Hello World';
prsente deux dfauts majeurs : le nom de la colonne prend la valeur implicite ?column? et son type de donnes le type implicite unknown. Pour obtenir une chane de caractres dans le rsultat de la vue, on peut crire :
CREATE VIEW vista AS SELECT text 'Hello World' AS hello;
L'accs aux tables rfrences dans la vue est dtermin par les droits du propritaire de la vue. Dans certains cas, cela peut tre
utilis pour fournir un accs scuris. Cependant, toutes les vues ne sont pas scurisables ; voir Section 37.4, Rgles et droits
pour des dtails. Les fonctions appeles dans la vue sont traites de la mme faon que si elles avaient t appeles directement
1014
CREATE VIEW
dans la requte utilisant la vue. Du coup, l'utilisateur d'une vue doit avoir les droits pour appeler toutes les fonctions utilises par la
vue.
Quand CREATE OR REPLACE VIEW est utilis sur une vue existante, seule la rgle SELECT dfinissant la vue est modifie.
Les autres proprits, comme les droits, le propritaire et les rgles autres que le SELECT, ne sont pas modifies. Vous devez tre
le propritaire de la vue pour la remplacer (ceci incluant aussi les membres du rle propritaire).
Exemples
Crer une vue compose des comdies :
CREATE VIEW comedies AS
SELECT *
FROM films
WHERE genre = 'Comdie';
Cette requte cre une vue contenant les colonnes de la table film au moment de la cration de la vue. Bien que l'toile (*) soit
utilise pour crer la vue, les colonnes ajoutes par la suite la table film ne feront pas partie de la vue.
Compatibilit
Le standard SQL spcifie quelques possibilits supplmentaires pour l'instruction CREATE VIEW :
CREATE VIEW nom [ ( nom_colonne [, ...] ) ]
AS requte
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
Les clauses optionnelles de la commande SQL complte sont :
CHECK OPTION
Cette option concerne les vues actualisables. Toutes les commandes INSERT et UPDATE appliques la vue sont contrles pour s'assurer que les donnes satisfont les conditions de dfinition de la vue (les nouvelles donnes sont visibles au travers de la vue). Si ce n'est pas le cas, la mise jour est rejete.
LOCAL
Contrle d'intgrit de la vue.
CASCADED
Contrle d'intgrit de la vue et de toutes les vues dpendantes. CASCADED est implicite si ni CASCADED ni LOCAL ne sont
prciss.
CREATE OR REPLACE VIEW est une extension PostgreSQL, tout comme le concept de vue temporaire.
Voir aussi
ALTER VIEW(7), DROP VIEW(7)
1015
Nom
DEALLOCATE Dsaffecter (librer) une instruction prpare
Synopsis
DEALLOCATE [ PREPARE ] { nom | ALL }
Description
DEALLOCATE est utilis pour dsaffecter une instruction SQL prpare prcdemment. Une instruction prpare qui n'est pas
explicitement libre l'est automatiquement en fin de session.
Pour plus d'informations sur les instructions prpares, voir PREPARE(7).
Paramtres
PREPARE
Mot cl ignor.
nom
Le nom de l'instruction prpare dsaffecter.
ALL
Dsaffecte toutes les instructions prpares.
Compatibilit
Le standard SQL inclut une instruction DEALLOCATE qui n'est utilise que pour le SQL imbriqu.
Voir aussi
EXECUTE(7), PREPARE(7)
1016
Nom
DECLARE Dfinir un curseur
Synopsis
DECLARE nom [ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ]
CURSOR [ { WITH | WITHOUT } HOLD ] FOR requte
Description
DECLARE permet un utilisateur de crer des curseurs. Ils peuvent tre utiliss pour rcuprer un petit nombre de lignes la
fois partir d'une requte plus importante. Aprs la cration du curseur, les lignes sont rcupres en utilisant FETCH(7).
Note
Cette page dcrit l'utilisation des curseurs au niveau de la commande SQL. Si vous voulez utiliser des curseurs
dans une fonction PL/pgSQL, les rgles sont diffrentes -- voir Section 39.7, Curseurs .
Paramtres
nom
Le nom du curseur crer.
BINARY
Le curseur retourne les donnes au format binaire.
INSENSITIVE
Les donnes rcupres partir du curseur ne doivent pas tre affectes par les mises jour des tables concernes par le
curseur qui surviennent une fois que ce dernier est cr. Dans PostgreSQL, c'est le comportement par dfaut ; ce mot-cl
n'a aucun effet. Il est seulement accept pour des raisons de compatibilit avec le standard SQL.
SCROLL, NO SCROLL
SCROLL indique une utilisation possible du curseur pour rcuprer des lignes de faon non squentielle (c'est--dire en remontant la liste). En fonction de la complexit du plan d'excution de la requte, SCROLL peut induire des pertes de performance sur le temps d'excution de la requte. NO SCROLL indique que le curseur ne peut pas tre utilis pour rcuprer
des lignes de faon non squentielle. La valeur par dfaut autorise la non-squentialit du curseur dans certains cas ; ce n'est
pas la mme chose que de spcifier SCROLL. Voir la section intitule Notes pour les dtails.
WITH HOLD, WITHOUT HOLD
WITH HOLD (NDT : persistant) indique une utilisation possible du curseur aprs la validation de la transaction qui l'a cr.
WITHOUT HOLD (NDT : volatil) interdit l'utilisation du curseur en dehors de la transaction qui l'a cr. WITHOUT HOLD
est la valeur par dfaut.
requte
Une commande SELECT(7) ou VALUES(7) qui fournira les lignes renvoyer par le curseur.
Les mots cls BINARY, INSENSITIVE et SCROLL peuvent apparatre dans n'importe quel ordre.
Notes
Les curseurs normaux renvoient les donnes au format texte, le mme que produirait un SELECT. L'option BINARY spcifie
que le curseur doit renvoyer les donnes au format binaire. Ceci rduit les efforts de conversion pour le serveur et le client, au
cot d'un effort particulier de dveloppement pour la gestion des formats de donnes binaires dpendants des plateformes.
Comme exemple, si une requte renvoie une valeur de un dans une colonne de type integer, vous obtiendrez une chane 1 avec
un curseur par dfaut. Avec un curseur binaire, vous obtiendrez un champ sur quatre octet contenant la reprsentation interne de
la valeur (dans l'ordre big-endian).
Les curseurs binaires doivent tre utiliss en faisant trs attention. Beaucoup d'applications, incluant psql, ne sont pas prpares
grer des curseurs binaires et s'attendent ce que les donnes reviennent dans le format texte.
Note
1017
DECLARE
Quand l'application cliente utilise le protocole des requtes tendues pour excuter la commande FETCH, le
message Bind du protocole spcifie si les donnes sont rcuprer au format texte ou binaire. Ce choix surcharge
la faon dont le curseur est dfini. Le concept de curseur binaire est donc obsolte lors de l'utilisation du protocole
des requtes tendues -- tout curseur peut tre trait soit en texte soit en binaire.
Si la clause WITH HOLD n'est pas prcise, le curseur cr par cette commande ne peut tre utilis qu' l'intrieur d'une transaction. Ainsi, DECLARE sans WITH HOLD est inutile l'extrieur d'un bloc de transaction : le curseur survivrait seulement jusqu'
la fin de l'instruction. PostgreSQL rapporte donc une erreur si cette commande est utilise en dehors d'un bloc de transactions.
On utilise BEGIN(7) et COMMIT(7) (ou ROLLBACK(7)) pour dfinir un bloc de transaction.
Si la clause WITH HOLD est prcise, et que la transaction qui a cr le curseur est valide, ce dernier reste accessible par les transactions ultrieures de la session. Au contraire, si la transaction initiale est annule, le curseur est supprim. Un curseur cr avec
la clause WITH HOLD est ferm soit par un appel explicite la commande CLOSE, soit par la fin de la session. Dans
l'implantation actuelle, les lignes reprsentes par un curseur persistant (WITH HOLD) sont copies dans un fichier temporaire ou
en mmoire afin de garantir leur disponibilit pour les transactions suivantes.
WITH HOLD n'est pas utilisable quand la requte contient dj FOR UPDATE ou FOR SHARE.
L'option SCROLL est ncessaire la dfinition de curseurs utiliss en rcupration remontante (retour dans la liste des rsultats,
backward fetch), comme prcis par le standard SQL. Nanmoins, pour des raisons de compatibilit avec les versions antrieures,
PostgreSQL autorise les rcuprations remontantes sans que l'option SCROLL ne soit prcis, sous rserve que le plan
d'excution du curseur soit suffisamment simple pour tre gr sans surcharge. Toutefois, il est fortement conseill aux dveloppeurs d'application ne pas utiliser les rcuprations remontantes avec des curseurs qui n'ont pas t crs avec l'option SCROLL. Si
NO SCROLL est spcifi, les rcuprations remontantes sont toujours dvalides.
Les parcours inverses sont aussi interdits lorsque la requte inclut les clauses FOR UPDATE et FOR SHARE ; donc SCROLL peut
ne pas tre indiqu dans ce cas.
Attention
Les curseurs scrollables et avec l'option WITH HOLD pourraient donner des rsultats inattendues s'ils font appel
des fonctions volatiles (voir Section 35.6, Catgories de volatilit des fonctions ). Quand une ligne prcdemment rcupre est de nouveau rcupre, la fonction pourrait tre r-excute, amenant peut-tre des rsultats diffrentes de la premire excution. Un contournement est de dclarer le curseur WITH HOLD et de valider la transaction avant de lire toute ligne de ce curseur. Cela forcera la sortie entire du cuseur tre matrialise dans un
stockage temporaire, pour que les fonctions volatiles soient excutes exactement une fois pour chaque ligne.
Si la requte du curseur inclut les clauses FOR UPDATE ou FOR SHARE, alors les lignes renvoyes sont verrouilles au moment
o elles sont rcupres, de la mme faon qu'une commande SELECT(7) standard avec ces options. De plus, les lignes renvoyes
seront les versions les plus jour ; du coup, ces options fournissent l'quivalent de ce que le standard SQL appelle un curseur
sensible . (Indiquer INSENSITIVE avec soit FOR UPDATE soit FOR SHARE est une erreur.)
Attention
Il est gnralement recommand d'utiliser FOR UPDATE si le curseur doit tre utilis avec UPDATE ... WHERE
CURRENT OF ou DELETE ... WHERE CURRENT OF. Utiliser FOR UPDATE empche les autres sessions de
modifier les lignes entre le moment o elles sont rcupres et celui o elles sont modifies. Sans FOR UPDATE,
une commande WHERE CURRENT OF suivante n'aura pas d'effet si la ligne a t modifie depuis la cration du
curseur.
Une autre raison d'utiliser FOR UPDATE est que, sans ce dernier, un appel suivant WHERE CURRENT OF pourrait chouer si la requte curseur ne rpond pas aux rgles du standard SQL d'tre mise jour simplement (en
particulier, le curseur doit rfrencer une seule table et ne pas utiliser de regroupement ou de tri comme ORDER
BY). Les curseurs qui ne peuvent pas tre mis jour pourraient fonctionner, ou pas, suivant les dtails du plan choisi ; dans le pire des cas, une application pourrait fonctionner lors des tests puis chouer en production.
La principale raison de ne pas utiliser FOR UPDATE avec WHERE CURRENT OF est si vous avez besoin que le
curseur soit dplaable ou qu'il soit insensible aux mises jour suivantes (c'est--dire qu'il continue afficher les
anciennes donnes). Si c'est un prrequis, faites trs attention aux problmes expliqus ci-dessus.
Le standard SQL ne mentionne les curseurs que pour le SQL embarqu. PostgreSQL n'implante pas l'instruction OPEN pour les
curseurs ; un curseur est considr ouvert sa dclaration. Nanmoins, ECPG, le prprocesseur de SQL embarqu pour PostgreSQL, supporte les conventions du standard SQL relatives aux curseurs, dont celles utilisant les instructions DECLARE et
OPEN.
1018
DECLARE
Vous pouvez voir tous les curseurs disponibles en excutant une requte sur la vue systme pg_cursors.
Exemples
Dclarer un curseur :
DECLARE liahona CURSOR FOR SELECT * FROM films;
Voir FETCH(7) pour plus d'exemples sur l'utilisation des curseurs.
Compatibilit
Le standard SQL indique que la sensibilit des curseurs aux mises jour en parallle des donnes rcupres est dpendante de
l'implantation par dfaut. Dans PostgreSQL, les curseurs n'ont pas ce comportement par dfaut, mais peuvent le devenir en
ajoutant FOR UPDATE. D'autres produits peuvent grer cela diffrement.
Le standard SQL n'autorise les curseurs que dans le SQL embarqu et dans les modules. PostgreSQL permet une utilisation interactive des curseurs.
Le standard SQL autorise les curseurs mettre jour les donnes d'une table. Tous les curseurs PostgreSQL sont en lecture
seule.
Les curseurs binaires sont une extension PostgreSQL.
Voir aussi
CLOSE(7), FETCH(7), MOVE(7)
1019
Nom
DELETE Supprimer des lignes d'une table
Synopsis
[ WITH [ RECURSIVE ] requte_with [, ...] ]
DELETE FROM [ ONLY ] table [ * ] [ [ AS ] alias ]
[ USING liste_using ]
[ WHERE condition | WHERE CURRENT OF nom_curseur ]
[ RETURNING * | expression_sortie [ [ AS ] output_name ] [, ...] ]
Description
DELETE supprime de la table spcifie les lignes qui satisfont la clause WHERE. Si la clause WHERE est absente, toutes les
lignes de la table sont supprimes. Le rsultat est une table valide, mais vide.
Astuce
TRUNCATE(7) est une extension PostgreSQL qui fournit un mcanisme plus rapide de suppression de
l'ensemble des lignes d'une table.
Il existe deux faons de supprimer des lignes d'une table en utilisant les informations d'autres tables de la base de donnes : les
sous-slections ou la spcification de tables supplmentaires dans la clause USING. La technique la plus approprie dpend des
circonstances.
La clause RETURNING optionnelle fait que DELETE calcule et renvoie le(s) valeur(s) base(s) sur chaque ligne en cours de
suppression. Toute expression utilisant les colonnes de la table et/ou les colonnes de toutes les tables mentionnes dans USING
peut tre calcule. La syntaxe de la liste RETURNING est identique celle de la commande SELECT.
Il est ncessaire de possder le droit DELETE sur la table pour en supprimer des lignes, et le droit SELECT sur toute table de la
clause USING et sur toute table dont les valeurs sont lues dans la condition.
Paramtres
requte_with
La clause WITH vous permet de spcifier une ou plusieurs sous-requtes qui peuvent tre rfrences par nom dans la requteDELETE. Voir Section 7.8, Requtes WITH (Common Table Expressions) et SELECT(7) pour les dtails.
table
Le nom (ventuellement qualifi du nom du schma) de la table dans laquelle il faut supprimer des lignes. Si ONLY est indiqu avant le nom de la table, les lignes supprimes ne concernent que la table nomme. Si ONLY n'est pas indique, les
lignes supprimes font partie de la table nomme et de ses tables filles. En option, * peut tre ajout aprs le nom de la
table pour indiquer explicitement que les tables filles doivent tre inclues.
alias
Un nom de substitution pour la table cible. Quand un alias est fourni, il cache compltement le nom rel de la table. Par
exemple, avec DELETE FROM foo AS f, le reste de l'instruction DELETE doit rfrencer la table avec f et non plus
foo.
liste_using
Une liste d'expressions de table, qui permet de faire apparatre des colonnes d'autres tables dans la condition WHERE. C'est
semblable la liste des tables utilises dans la clause la section intitule Clause FROM d'une instruction SELECT ; un
alias du nom d'une table peut ainsi tre utilis. La table cible ne doit pas tre prcise dans liste_using, sauf si une auto-jointure est envisage.
condition
Une expression retournant une valeur de type boolean. Seules les lignes pour lesquelles cette expression renvoie true seront supprimes.
nom_curseur
Le nom du curseur utiliser dans une condition WHERE CURRENT OF. La ligne supprimer est la dernire ligne rcupre avec ce curseur. Le curseur doit tre une requte sans regroupement sur la table cible du DELETE. Notez que WHERE
CURRENT OF ne peut pas se voir ajouter de condition boolenne. Voir DECLARE(7) pour plus d'informations sur
1020
DELETE
Sorties
En cas de succs, une commande DELETE renvoie une information de la forme
DELETE nombre
Le nombre correspond au nombre de lignes supprimes. Si nombre vaut 0, c'est qu'aucune ligne ne correspond condition
(ce qui n'est pas considr comme une erreur).
Si la commande DELETE contient une clause RETURNING, le rsultat sera similaire celui d'une instruction SELECT contenant les colonnes et les valeurs dfinies dans la liste RETURNING, partir de la liste des lignes supprimes par la commande.
Notes
PostgreSQL autorise les rfrences des colonnes d'autres tables dans la condition WHERE par la spcification des autres tables
dans la clause USING. Par exemple, pour supprimer tous les films produits par un producteur donn :
DELETE FROM films USING producteurs
WHERE id_producteur = producteurs.id AND producteurs.nom = 'foo';
Pour l'essentiel, une jointure est tablie entre films et producteurs avec toutes les lignes jointes marques pour suppression. Cette
syntaxe n'est pas standard. Une faon plus standard de procder consiste utiliser une sous-selection :
DELETE FROM films
WHERE id_producteur IN (SELECT id FROM producteur WHERE nom = 'foo');
Dans certains cas, la jointure est plus facile crire ou plus rapide excuter que la sous-slection.
Exemples
Supprimer tous les films qui ne sont pas des films musicaux :
DELETE FROM films WHERE genre <> 'Comdie musicale';
Effacer toutes les lignes de la table films :
DELETE FROM films;
Supprimer les tches termines tout en renvoyant le dtail complet des lignes supprimes :
DELETE FROM taches WHERE statut = 'DONE' RETURNING *;
Supprimer la ligne de taches sur lequel est positionn le curseur c_taches :
DELETE FROM taches WHERE CURRENT OF c_taches;
Compatibilit
Cette commande est conforme au standard SQL, l'exception des clauses USING et RETURNING, qui sont des extensions de
PostgreSQL, comme la possibilit d'utiliser la clause WITH avec DELETE.
1021
Nom
DISCARD Annuler l'tat de la session
Synopsis
DISCARD { ALL | PLANS | TEMPORARY | TEMP }
Description
DISCARD libre les ressources internes associes avec une session de la base de donnes. Ces ressources sont normalementlibrer la fin de la session.
DISCARD TEMP supprime toutes les tables temporaires cres pendant cette session. DISCARD PLANS libre tous les plans
internes de requte mis en cache. DISCARD ALL rinitialise une session son tat d'origine, supprimant ainsi les ressources
temporaires et rinitialisant les modifications locales de configuration de la session.
Paramtres
TEMPORARY or TEMP
Supprime toutes les tables temporaires cres pendant cette session.
PLANS
Libre tous les plans de requte mis en cache.
ALL
Libre les ressources temporaires associes cette session et rinitialise une session son tat d'origine. Actuellement, ceci
a le mme effet que la squence d'instructions suivantes :
SET SESSION AUTHORIZATION DEFAULT;
RESET ALL;
DEALLOCATE ALL;
CLOSE ALL;
UNLISTEN *;
SELECT pg_advisory_unlock_all();
DISCARD PLANS;
DISCARD TEMP;
Notes
DISCARD ALL ne peut pas tre utilis dans un bloc de transaction.
Compatibilit
DISCARD est une extension PostgreSQL.
1022
Nom
DO excute un bloc de code anonyme
Synopsis
DO [ LANGUAGE nom_langage ] code
Description
DO excute un bloc de code anonyme, autrement dit une fonction temporaire dans le langage de procdure indiqu.
Le bloc de code est trait comme le corps d'une fonction sans paramtre et renvoyant void. Il est analys et excut une seule
fois.
La clause LANGUAGE optionnelle est utilisable avant ou aprs le bloc de code.
Paramtres
code
Le code excuter. Il doit tre spcifi comme une chane litrale, tout comme une fonction CREATE FUNCTION.
L'utilisation de la syntaxe des guillemets dollar est recommande.
nom_langage
Le nom du langage utilis par le code. Par dfaut plpgsql.
Notes
Le langage de procdure utilis doit dj tre install dans la base de donnes avec l'instruction CREATE LANGUAGE.
plpgsql est install par dfaut contrairement aux autres langages.
L'utilisateur doit avoir le droit USAGE sur le langage de procdures ou tre un superutilisateur s'il ne s'agit pas d'un langage de
confiance. Il s'agit des mmes prrequis que pour la cration d'une fonction dans ce langage.
Exemples
Donner les droits sur toutes les vues du schma public au rle webuser :
DO $$DECLARE r record;
BEGIN
FOR r IN SELECT table_schema, table_name FROM information_schema.tables
WHERE table_type = 'VIEW' AND table_schema = 'public'
LOOP
EXECUTE 'GRANT ALL ON ' || quote_ident(r.table_schema) || '.' ||
quote_ident(r.table_name) || ' TO webuser';
END LOOP;
END$$;
Compatibilit
Il n'existe pas d'instruction DO dans le standard SQL.
Voir aussi
CREATE LANGUAGE(7)
1023
Nom
DROP AGGREGATE Supprimer une fonction d'agrgat
Synopsis
DROP AGGREGATE [ IF EXISTS ] nom ( type ) [ CASCADE | RESTRICT ]
Description
DROP AGGREGATE supprime une fonction d'agrgat. Pour excuter cette commande, l'utilisateur courant doit tre le propritaire de la fonction.
Paramtres
IF EXISTS
Ne pas renvoyer une erreur si l'agrgat n'existe pas. Un message d'avertissement est affich dans ce cas.
nom
Le nom (ventuellement qualifi du nom de schma) d'une fonction d'agrgat.
type
Un type de donnes en entre avec lequel la fonction d'agrgat opre. input data type on which the aggregate function operates. Pour rfrencer une fonction d'agrgat sans arguments, crivez * la place de la liste des types.
CASCADE
Les objets qui dpendent de la fonction d'agrgat sont automatiquement supprims.
RESTRICT
La fonction d'agrgat n'est pas supprime si un objet en dpend. Comportement par dfaut.
Exemples
Supprimer la fonction d'agrgat mamoyenne pour le type integer :
DROP AGGREGATE mamoyenne(integer);
Compatibilit
Il n'existe pas d'instruction DROP AGGREGATE dans le standard SQL.
Voir aussi
ALTER AGGREGATE(7), CREATE AGGREGATE(7)
1024
Nom
DROP CAST Supprimer un transtypage
Synopsis
DROP CAST [ IF EXISTS ] (type_source AS type_cible) [ CASCADE | RESTRICT ]
Description
DROP CAST supprime un transtypage (conversion entre deux types de donnes) prcdemment dfini.
Seul le propritaire du type de donnes source ou cible peut supprimer un transtypage. Les mmes droits sont requis que pour la
cration d'un transtypage.
Paramtres
IF EXISTS
Ne pas renvoyer une erreur si l'agrgat n'existe pas. Un message d'avertissement est affich dans ce cas.
type_source
Le nom du type de donnes source du transtypage.
type_cible
Le nom du type de donnes cible du transtypage.
CASCADE, RESTRICT
Ces mots cls n'ont pas d'effet car il n'y aucune dpendance dans les transtypages.
Exemples
Supprimer le transtypage du type text en type int :
DROP CAST (text AS int);
Compatibilit
La commande DROP CAST est conforme au standard SQL.
Voir aussi
CREATE CAST(7)
1025
Nom
DROP COLLATION supprime une collation
Synopsis
DROP COLLATION [ IF EXISTS ] nom [ CASCADE | RESTRICT ]
Description
DROP COLLATION supprime une collation que vous avez dfini auparavant. Pour pouvoir supprimer une collation, vous devez en tre propritaire.
Paramtres
IF EXISTS
Ne gnre pas d'erreur si la collation n'existe pas. Dans ce cas, un avertissement est gnr.
nom
Le nom de la collation. Le nom de la collation peut tre prfix par le schma.
CASCADE
Supprime automatiquement les objets qui sont dpendants de la collation.
RESTRICT
Refuse de supprimer la collection si un quelconque objet en dpend. C'est l'option par dfaut.
Exemples
Pour supprimer la collation nomme allemand:
DROP COLLATION allemand;
Compatibilit
La commande DROP COLLATION est conforme au standard SQL , sauf pour l'option IF EXISTS , qui est une extension
PostgreSQL.
Voir galement
ALTER COLLATION(7), CREATE COLLATION(7)
1026
Nom
DROP CONVERSION Supprimer une conversion
Synopsis
DROP CONVERSION [ IF EXISTS ] nom [ CASCADE | RESTRICT ]
Description
DROP CONVERSION supprime une conversion prcdemment dfinie. Seul son propritaire peut supprimer une conversion.
Paramtres
IF EXISTS
Ne pas renvoyer une erreur si l'agrgat n'existe pas. Un message d'avertissement est affich dans ce cas.
nom
Le nom de la conversion (ventuellement qualifi du nom de schma).
CASCADE, RESTRICT
Ces mots cls n'ont pas d'effet car il n'existe pas de dpendances sur les conversions.
Exemples
Supprimer la conversion nomme mon_nom :
DROP CONVERSION mon_nom;
Compatibilit
Il n'existe pas d'instruction DROP CONVERSION dans le standard SQL. Par contre, une instruction DROP TRANSLATION
est disponible. Elle va de paire avec l'instruction CREATE TRANSLATION qui est similaire l'instruction CREATE
CONVERSION de PostgreSQL.
Voir aussi
ALTER CONVERSION(7), CREATE CONVERSION(7)
1027
Nom
DROP DATABASE Supprimer une base de donnes
Synopsis
DROP DATABASE [ IF EXISTS ] nom
Description
La commande DROP DATABASE dtruit une base de donnes. Elle supprime les entres du catalogue pour la base et le rpertoire contenant les donnes. Elle ne peut tre excute que par le propritaire de la base de donnes ou le superutilisateur. De
plus, elle ne peut tre excute si quelqu'un est connect sur la base de donnes cible, y compris l'utilisateur effectuant la demande de suppression. (On peut se connecter postgres ou toute autre base de donnes pour lancer cette commande.)
DROP DATABASE ne peut pas tre annule. Il convient donc de l'utiliser avec prcaution !
Paramtres
IF EXISTS
Ne pas renvoyer une erreur si l'agrgat n'existe pas. Un message d'avertissement est affich dans ce cas.
name
Le nom de la base de donnes supprimer.
Notes
DROP DATABASE ne peut pas tre excute l'intrieur d'un bloc de transactions.
Cette commande ne peut pas tre excute en cas de connexion la base de donnes cible. Il peut paratre plus facile d'utiliser le
programme dropdb(1) la place, qui est un enrobage de cette commande.
Compatibilit
Il n'existe pas d'instruction DROP DATABASE dans le standard SQL.
Voir aussi
CREATE DATABASE(7), Variables d'environnement (Section 31.13, Variables d'environnement )
1028
Nom
DROP DOMAIN Supprimer un domaine
Synopsis
DROP DOMAIN [ IF EXISTS ] nom [, ...]
[ CASCADE | RESTRICT ]
Description
DROP DOMAIN supprime un domaine. Seul le propritaire d'un domaine peut le supprimer.
Paramtres
IF EXISTS
Ne pas renvoyer une erreur si l'agrgat n'existe pas. Un message d'avertissement est affich dans ce cas.
nom
Le nom (ventuellement qualifi du nom du schma) d'un domaine.
CASCADE
Les objets qui dpendent du domaine (les colonnes de table, par exemple) sont automatiquement supprims.
RESTRICT
Le domaine n'est pas supprim si un objet en dpend. Comportement par dfaut.
Exemples
Supprimer le domaine boite :
DROP DOMAIN boite;
Compatibilit
Cette commande est conforme au standard SQL, l'exception de l'option IF EXISTS qui est une extension PostgreSQL.
Voir aussi
CREATE DOMAIN(7), ALTER DOMAIN(7)
1029
Nom
DROP EXTENSION Supprime une extension
Synopsis
DROP EXTENSION [ IF EXISTS ] extension_name [, ...] [ CASCADE | RESTRICT ]
Description
DROP EXTENSION supprime les extensions de la base de donnes. La suppression d'une extension entraine la suppression
des objets inclus dans l'extension.
Vous devez tre propritaire de l'extension pour utiliser DROP EXTENSION.
Paramtres
IF EXISTS
Permet de ne pas retourner d'erreur si l'extension n'existe pas. Une simple notice est alors rapporte.
extension_name
Le nom d'une extension pralablement installe.
CASCADE
Supprime automatiquement les objets dont dpend cette extension.
RESTRICT
Permet de spcifier que l'extension ne sera pas supprime si des objets en dpendent (des objets autres que ses propres objets et autres que les autres extensions supprimes simultanment dans la mme commande DROP). Il s'agit du comportement par dfaut.
Exemples
Pour supprimer l'extension hstore de la base de donnes en cours:
DROP EXTENSION hstore;
Cette commande va chouer si parmi les objets de hstore certains sont en cours d'utilisation sur la base de donnes. Par
exemple, si des tables ont des colonnes du type hstore. Dans ce cas de figure, ajoutez l'option cascade CASCADE pour forcer la
suppression de ces objets.
Compatibilit
DROP EXTENSION est une extension PostgreSQL.
Voir aussi
CREATE EXTENSION(7), ALTER EXTENSION(7)
1030
Nom
DROP FOREIGN DATA WRAPPER Supprimer un wrapper de donnes distantes
Synopsis
DROP FOREIGN DATA WRAPPER [ IF EXISTS ] nom [ CASCADE | RESTRICT ]
Description
DROP FOREIGN DATA WRAPPER supprime un wrapper de donnes distantes existant. Pour excuter cette commande,
l'utilisateur courant doit tre le propritaire du wrapper de donnes distantes.
Paramtres
IF EXISTS
Ne gnre pas d'erreur si le wrapper de donnes distantes n'existe pas. Un avertissement est mis dans ce cas.
nom
Le nom d'un wrapper de donnes distantes existant.
CASCADE
Supprime automatiquement les objets dpendant du wrapper de donnes distantes (tels que les serveurs).
RESTRICT
Refuse de supprimer le wrapper de donnes distantes si un objet dpend de celui-ci. C'est le cas par dfaut.
Exemples
Supprimer le wrapper de donnes distantes dbi :
DROP FOREIGN DATA WRAPPER dbi;
Compatibilit
DROP FOREIGN DATA WRAPPER est conforme la norme ISO/IEC 9075-9 (SQL/MED). La clause IF EXISTS est une
extension PostgreSQL .
Voir aussi
CREATE FOREIGN DATA WRAPPER(7), ALTER FOREIGN DATA WRAPPER(7)
1031
Nom
DROP FOREIGN TABLE Supprime une table distante
Synopsis
DROP FOREIGN TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
Description
DROP FOREIGN TABLE supprime une table distante.
Vous devez tre propritaire de la table distante pour utiliser DROP FOREIGN TABLE.
Paramtres
IF EXISTS
Permet de ne pas retourner d'erreur si la table distante n'existe pas. Une simple notice est alors rapporte.
name
Le nom de la table distante supprimer. Il est aussi possible de spcifier le schma qui contient cette table.
CASCADE
Supprime automatiquement les objets qui dpendent de cette table distante (comme les vues par exemple).
RESTRICT
Permet de spcifier que la table distante ne sera pas supprime si des objets en dpendent. Il s'agit du comportement par dfaut.
Exemples
Pour supprimer deux tables distantes, films et distributeurs:
DROP FOREIGN TABLE films, distributeurs;
Cette commande va chouer s'il existe des objets qui dpendent de films ou distributeurs. Par exemple, si des
contraintes sont lies des colonnes de films. Dans ce cas de figure, ajoutez l'option cascade CASCADE pour forcer la suppression de ces objets.
Compatibilit
Cette commande est conforme avec le standard ISO/IEC 9075-9 (SQL/MED), aux exceptions prtes que ce standard n'accepte la
suppression que d'une table distante par commande, et de l'option IF EXISTS, qui est une spcificit de PostgreSQL.
Voir aussi
ALTER FOREIGN TABLE(7), CREATE FOREIGN TABLE(7)
1032
Nom
DROP FUNCTION Supprimer une fonction
Synopsis
DROP FUNCTION [ IF EXISTS ] nom ( [ [ modearg ] [ nomarg ] typearg [, ...] ] )
[ CASCADE | RESTRICT ]
Description
DROP FUNCTION supprime la dfinition d'une fonction. Seul le propritaire de la fonction peut excuter cette commande.
Les types d'argument de la fonction doivent tre prciss car plusieurs fonctions peuvent exister avec le mme nom et des listes
diffrentes d'arguments.
Paramtres
IF EXISTS
Ne pas renvoyer une erreur si l'agrgat n'existe pas. Un message d'avertissement est affich dans ce cas.
nom
Le nom (ventuellement qualifi du nom du schma) de la fonction.
modearg
Le mode d'un argument : IN, OUT, INOUT ou VARIADIC. Sans prcision, la valeur par dfaut est IN. DROP FUNCTION ne s'intresse pas aux arguments OUT car seuls ceux en entre dterminent l'identit de la fonction. Il est ainsi suffisant de lister les arguments IN, INOUT et VARIADIC.
nomarg
Le nom d'un argument. DROP FUNCTION ne tient pas compte des noms des arguments car seuls les types de donnes
sont ncessaires pour dterminer l'identit de la fonction.
typearg
Le(s) type(s) de donnes des arguments de la fonction (ventuellement qualifi(s) du nom du schma).
CASCADE
Les objets qui dpendent de la fonction (oprateurs ou dclencheurs) sont automatiquement supprims.
RESTRICT
La fonction n'est pas supprime si un objet en dpend. Comportement par dfaut.
Exemples
Supprimer la fonction de calcul d'une racine carre :
DROP FUNCTION sqrt(integer);
Compatibilit
Une instruction DROP FUNCTION est dfinie dans le standard SQL mais elle n'est pas compatible avec celle dcrite ici.
Voir aussi
CREATE FUNCTION(7), ALTER FUNCTION(7)
1033
Nom
DROP GROUP Supprimer un rle de base de donnes
Synopsis
DROP GROUP [ IF EXISTS ] nom [, ... ]
Description
DROP GROUP est dsormais un alias de DROP ROLE(7).
Compatibilit
Il n'existe pas d'instruction DROP GROUP dans le standard SQL.
Voir aussi
DROP ROLE(7)
1034
Nom
DROP INDEX Supprimer un index
Synopsis
DROP INDEX [ IF EXISTS ] nom [, ...] [ CASCADE | RESTRICT ]
Description
DROP INDEX supprime un index. Seul le propritaire de l'index peut excuter cette commande.
Paramtres
IF EXISTS
Ne pas renvoyer une erreur si l'agrgat n'existe pas. Un message d'avertissement est affich dans ce cas.
nom
Le nom (ventuellement qualifi du nom du schma) de l'index supprimer.
CASCADE
Les objets qui dpendent de l'index sont automatiquement supprims.
RESTRICT
L'index n'est pas supprim si un objet en dpend. Comportement par dfaut.
Exemples
Supprimer l'index title_idx :
DROP INDEX title_idx;
Compatibilit
DROP INDEX est une extension PostgreSQL. Il n'est pas fait mention des index dans le standard SQL.
Voir aussi
CREATE INDEX(7)
1035
Nom
DROP LANGUAGE Supprimer un langage procdural
Synopsis
DROP [ PROCEDURAL ] LANGUAGE [ IF EXISTS ] nom [ CASCADE | RESTRICT ]
Description
DROP LANGUAGE supprime la dfinition d'un langage procdural enregistr prcdemment. Vous devez tre un superutilisateur ou le propritaire du langage pour utiliser DROP LANGUAGE.
Note
partir de PostgreSQL 9.1, la plupart des langages procduraux sont devenus des extensions et doivent du
coup tre supprims avec la commande DROP EXTENSION(7), et non pas avec DROP LANGUAGE.
Paramtres
IF EXISTS
Ne pas renvoyer une erreur si le langage n'existe pas. Un message d'avertissement est affich dans ce cas.
nom
Le nom du langage procdural supprimer. Pour une compatibilit ascendante, le nom peut tre entour de guillemets
simples.
CASCADE
Les objets qui dpendent du langage (fonctions, par exemple) sont automatiquement supprims.
RESTRICT
Le langage n'est pas supprim si un objet en dpend. Comportement par dfaut.
Exemples
Supprimer le langage procdural plexemple :
DROP LANGUAGE plexemple;
Compatibilit
Il n'existe pas d'instruction DROP LANGUAGE dans le standard SQL.
Voir aussi
ALTER LANGUAGE(7), CREATE LANGUAGE(7), droplang(1)
1036
Nom
DROP OPERATOR Supprimer un oprateur
Synopsis
DROP OPERATOR [ IF EXISTS ] nom ( { type_gauche | NONE }, { type_droit | NONE } )
[ CASCADE | RESTRICT ]
Description
DROP OPERATOR supprime un oprateur. Seul le propritaire de l'oprateur peut excuter cette commande.
Paramtres
IF EXISTS
Ne pas renvoyer une erreur si l'agrgat n'existe pas. Un message d'avertissement est affich dans ce cas.
nom
Le nom de l'oprateur (ventuellement qualifi du nom du schma) supprimer.
type_gauche
Le type de donnes de l'oprande gauche de l'oprateur ; NONE est utilis si l'oprateur n'en a pas.
type_droit
Le type de donnes de l'oprande droit de l'oprateur ; NONE est utilis si l'oprateur n'en a pas.
CASCADE
Les objets qui dpendent de l'oprateur sont automatiquement supprims.
RESTRICT
L'oprateur n'est pas supprim si un objet en dpend. Comportement par dfaut.
Exemples
Supprimer l'oprateur puissance a^b sur le type integer :
DROP OPERATOR ^ (integer, integer);
Supprimer l'oprateur de complment binaire ~b sur le type bit :
DROP OPERATOR ~ (none, bit);
Supprimer l'oprateur unaire factorielle x! sur le type bigint :
DROP OPERATOR ! (bigint, none);
Compatibilit
Il n'existe pas d'instruction DROP OPERATOR dans le standard SQL.
Voir aussi
CREATE OPERATOR(7), ALTER OPERATOR(7)
1037
Nom
DROP OPERATOR CLASS Supprimer une classe d'oprateur
Synopsis
DROP OPERATOR CLASS [ IF EXISTS ] nom USING mthode_index [ CASCADE | RESTRICT ]
Description
DROP OPERATOR CLASS supprime une classe d'oprateur. Seul le propritaire de la classe peut la supprimer.
DROP OPERATOR CLASS ne supprime aucun des oprateurs et aucune des fonctions rfrencs par la classe. Si un index
dpend de la classe d'oprateur, vous devez indiquer CASCADE pour que la suppression se fasse rellement.
Paramtres
IF EXISTS
Ne pas renvoyer une erreur si l'agrgat n'existe pas. Un message d'avertissement est affich dans ce cas.
nom
Le nom (ventuellement qualifi du nom du schma) d'une classe d'oprateur.
mthode_index
Le nom de la mthode d'accs aux index pour laquelle l'oprateur est dfini.
CASCADE
Les objets qui dpendent de cette classe sont automatiquement supprims.
RESTRICT
La classe d'oprateur n'est pas supprime si un objet en dpend. Comportement par dfaut.
Notes
DROP OPERATOR CLASS ne supprimera pas la famille d'oprateur contenant la classe, mme si la famille en devient vide
(en particulier, dans le cas o la famille a t implicitement cre par CREATE OPERATOR CLASS). Avoir une famille
d'oprateur vide est sans risque. Pour plus de claret, il est prfrable de supprimer la famille avec DROP OPERATOR FAMILY ; ou encore mieux, utilisez DROP OPERATOR FAMILY ds le dbut.
Exemples
Supprimer la classe d'oprateur widget_ops des index de type arbre-balanc (B-tree) :
DROP OPERATOR CLASS widget_ops USING btree;
La commande choue si un index utilise la classe d'oprateur. CASCADE permet de supprimer ces index simultanment.
Compatibilit
Il n'existe pas d'instruction DROP OPERATOR CLASS dans le standard SQL.
Voir aussi
ALTER OPERATOR CLASS(7), CREATE OPERATOR CLASS(7), DROP OPERATOR FAMILY(7)
1038
Nom
DROP OPERATOR FAMILY Supprimer une famille d'oprateur
Synopsis
DROP OPERATOR FAMILY [ IF EXISTS ] nom USING methode_indexage [ CASCADE | RESTRICT ]
Description
DROP OPERATOR FAMILY supprime une famille d'oprateur existante. Pour excuter cette commande, vous devez tre le
propritaire de la famille d'oprateur.
DROP OPERATOR FAMILY inclut la suppression de toutes classes d'oprateur contenues dans la famille, mais elle ne supprime pas les oprateurs et fonctions rfrences par la famille. Si des index dpendent des classes d'oprateur de la famille,
vous devez ajouter CASCADE pour que la suppression russisse.
Paramtres
IF EXISTS
Ne renvoie pas une erreur si la famille d'oprateur n'existe pas. Un message de niveau NOTICE est enregistr dans ce
cas.
nom
Le nom de la famille d'oprateur (quelque fois qualifi du schma).
methode_indexage
Le nom de la mthode d'accs l'index associe la famille d'oprateur.
CASCADE
Supprime automatiquement les objets dpendant de cette famille d'oprateur.
RESTRICT
Refuse la suppression de la famille d'oprateur si des objets en dpendent. C'est la valeur par dfaut.
Exemples
Supprimer la famille d'oprateur B-tree float_ops :
DROP OPERATOR FAMILY float_ops USING btree;
Cette commande chouera car il existe des index qui utilisent les classes d'oprateur de cette famille. Ajoutez CASCADE pour
supprimer les index avec la famille d'oprateurs.
Compatibilit
Il n'existe pas d'instruction DROP OPERATOR FAMILY dans le standard SQL.
Voir aussi
ALTER OPERATOR FAMILY(7), CREATE OPERATOR FAMILY(7), ALTER OPERATOR CLASS(7), CREATE OPERATOR CLASS(7), DROP OPERATOR CLASS(7)
1039
Nom
DROP OWNED Supprimer les objets de la base possds par un rle
Synopsis
DROP OWNED BY nom [, ...] [ CASCADE | RESTRICT ]
Description
DROP OWNED supprime tous les objets de la base qui ont pour propritaire un des rles spcifis. Tout droit donn un des
rles sur ces objets ainsi qu'aux objets partags (bases de donnes, tablespaces) sera aussi supprim.
Paramtres
nom
Le nom d'un rle dont les objets seront supprims et dont les droits seront rvoqus.
CASCADE
Supprime automatiquement les objets qui dpendent des objets affects.
RESTRICT
Refuse de supprimer les objets possds par un rle si un autre objet de la base dpend de ces objets. C'est la valeur par dfaut.
Notes
DROP OWNED est souvent utilis pour prparer la suppression d'un ou plusieurs rles. Comme DROP OWNED affecte
seulement les objets de la base en cours, il est gnralement ncessaire d'excuter cette commande dans chaque base contenant
des objets appartenant au rle supprimer.
Utiliser l'option CASCADE pourrait demander la suppression d'objets appartenant d'autres utilisateurs.
La commande REASSIGN OWNED(7) est une alternative qui r-affecte la proprit de tous les objets de la base possds par
un ou plusieurs rles.
Les bases de donnes et les tablespaces appartenant au(x) rle(s) ne seront pas supprims.
Compatibilit
L'instruction DROP OWNED est une extension PostgreSQL.
Voir aussi
REASSIGN OWNED(7), DROP ROLE(7)
1040
Nom
DROP ROLE Supprimer un rle de base de donnes
Synopsis
DROP ROLE [ IF EXISTS ] nom [, ...]
Description
DROP ROLE supprime le(s) rle(s) spcifi(s). Seul un superutilisateur peut supprimer un rle de superutilisateur. Le droit
CREATEROLE est ncessaire pour supprimer les autres rles.
Un rle ne peut pas tre supprim s'il est toujours rfrenc dans une base de donnes du groupe. Dans ce cas, toute tentative
aboutit l'affichage d'une erreur. Avant de supprimer un rle, il est ncessaire de supprimer au pralable tous les objets qu'il
possde (ou de modifier leur appartenance) et de supprimer tous les droits dfinis par ce rle. Les commandes REASSIGN OWNED(7) et DROP OWNED(7) peuvent tre utiles pour cela.
Nanmoins, il n'est pas ncessaire de supprimer toutes les appartenances de rle impliquant ce rle ; DROP ROLE supprime
automatiquement toute appartenance du rle cible dans les autres rles et des autres rles dans le rle cible. Les autres rles ne
sont pas supprims ou affects.
Paramtres
IF EXISTS
Ne pas renvoyer une erreur si l'agrgat n'existe pas. Un message d'avertissement est affich dans ce cas.
nom
Le nom du rle supprimer.
Notes
PostgreSQL inclut un programme dropuser(1) qui a la mme fonctionnalit que cette commande (en fait, il appelle cette commande) mais qui est lanc partir du shell.
Exemples
Supprimer un rle :
DROP ROLE jonathan;
Compatibilit
Le standard SQL dfinit DROP ROLE mais il ne permet la suppression que d'un seul rle la fois et il spcifie d'autres droits
obligatoires que ceux utiliss par PostgreSQL.
Voir aussi
CREATE ROLE(7), ALTER ROLE(7), SET ROLE(7)
1041
Nom
DROP RULE Supprimer une rgle de rcriture
Synopsis
DROP RULE [ IF EXISTS ] nom ON table [ CASCADE | RESTRICT ]
Description
DROP RULE supprime une rgle de rcriture.
Paramtres
IF EXISTS
Ne pas renvoyer une erreur si l'agrgat n'existe pas. Un message d'avertissement est affich dans ce cas.
nom
Le nom de la rgle supprimer.
table
Le nom (ventuellement qualifi du nom du schma) de la table ou vue sur laquelle s'applique la rgle.
CASCADE
Les objets qui dpendent de la rgle sont automatiquement supprims.
RESTRICT
La rgle n'est pas supprime si un objet en dpend. Comportement par dfaut.
Exemples
Suppression de la rgle de rcriture nouvellergle :
DROP RULE nouvellergle ON matable;
Compatibilit
Il n'existe pas d'instruction DROP RULE dans le standard SQL.
Voir aussi
CREATE RULE(7)
1042
Nom
DROP SCHEMA Supprimer un schma
Synopsis
DROP SCHEMA [ IF EXISTS ] nom [, ...] [ CASCADE | RESTRICT ]
Description
DROP SCHEMA supprime des schmas de la base de donnes.
Un schma ne peut tre supprim que par son propritaire ou par un superutilisateur. Son propritaire peut supprimer un schma
et tous les objets qu'il contient quand bien mme il ne possde pas tous les objets contenus dans ce schma.
Paramtres
IF EXISTS
Ne pas renvoyer une erreur si l'agrgat n'existe pas. Un message d'avertissement est affich dans ce cas.
nom
Le nom du schma.
CASCADE
Les objets (tables, fonctions...) contenus dans le schma sont automatiquement supprims.
RESTRICT
Le schma n'est pas supprim s'il contient des objets. Comportement par dfaut.
Exemples
Supprimer le schma mes_affaires et son contenu :
DROP SCHEMA mes_affaires CASCADE;
Compatibilit
DROP SCHEMA est totalement compatible avec le standard SQL. Le standard n'autorise cependant pas la suppression de plusieurs schmas en une seule commande. L'option IF EXISTS est aussi une extension de PostgreSQL.
Voir aussi
ALTER SCHEMA(7), CREATE SCHEMA(7)
1043
Nom
DROP SEQUENCE Supprimer une squence
Synopsis
DROP SEQUENCE [ IF EXISTS ] nom [, ...] [ CASCADE | RESTRICT ]
Description
DROP SEQUENCE permet de supprimer les gnrateurs de nombres squentiels. Une squence peut seulement tre supprime
par son propritaire ou par un superutilisateur.
Paramtres
IF EXISTS
Ne pas renvoyer une erreur si l'agrgat n'existe pas. Un message d'avertissement est affich dans ce cas.
nom
Le nom de la squence (ventuellement qualifi du nom du schma).
CASCADE
Les objets qui dpendent de la squence sont automatiquement supprims.
RESTRICT
La squence n'est pas supprime si un objet en dpend. Comportement par dfaut.
Exemples
Supprimer la squence serie :
DROP SEQUENCE serie;
Compatibilit
DROP SEQUENCE est conforme au standard SQL. Cependant, le standard n'autorise pas la suppression de plusieurs squences en une seule commande. De plus, l'option IF EXISTS est une extension de PostgreSQL.
Voir aussi
CREATE SEQUENCE(7), ALTER SEQUENCE(7)
1044
Nom
DROP SERVER Supprimer un descripteur de serveur distant
Synopsis
DROP SERVER [ IF EXISTS ] nom_serveur [ CASCADE | RESTRICT ]
Description
DROP SERVER supprime un descripteur de serveur distant existant. Pour excuter cette commande, l'utilisateur courant doit
tre le propritaire du serveur.
Paramtres
IF EXISTS
Ne gnre pas d'erreur si le serveur n'existe pas. Un avertissement est mis dans ce cas.
nom_serveur
Nom d'un serveur existant.
CASCADE
Supprime automatiquement les objets dpendant du serveur (tels que les correspondances d'utilisateur).
RESTRICT
Refuse de supprimer le serveur si des objets en dpendent. C'est le cas par dfaut.
Exemples
Supprimer un serveur truc s'il existe :
DROP SERVER IF EXISTS truc;
Compatibilit
DROP SERVER est conforme la norme ISO/IEC 9075-9 (SQL/MED). La clause IF EXISTS est une extension
PostgreSQL .
Voir aussi
CREATE SERVER(7), ALTER SERVER(7)
1045
Nom
DROP TABLE Supprimer une table
Synopsis
DROP TABLE [ IF EXISTS ] nom [, ...] [ CASCADE | RESTRICT ]
Description
DROP TABLE supprime des tables de la base de donnes. Seul son propritaire peut dtruire une table. DELETE(7) et TRUNCATE(7) sont utilises pour supprimer les lignes d'une table sans dtruire la table.
DROP TABLE supprime tout index, rgle, dclencheur ou contrainte qui existe sur la table cible. Nanmoins, pour supprimer
une table rfrence par une vue ou par une contrainte de cl trangre d'une autre table, CASCADE doit tre ajout. (CASCADE
supprime compltement une vue dpendante mais dans le cas de la cl trangre, il ne supprime que la contrainte, pas l'autre
table.)
Paramtres
IF EXISTS
Ne pas renvoyer une erreur si l'agrgat n'existe pas. Un message d'avertissement est affich dans ce cas.
nom
Le nom de la table supprimer (ventuellement qualifi du nom du schma).
CASCADE
Les objets qui dpendent de la table (vues, par exemple) sont automatiquement supprims.
RESTRICT
La table n'est pas supprime si un objet en dpend. Comportement par dfaut.
Exemples
Supprimer les deux tables films et distributeurs :
DROP TABLE films, distributeurs;
Compatibilit
Cette commande est conforme au standard SQL. Cependant, le standard n'autorise pas la suppression de plusieurs tables en une
seule commande. De plus, l'option IF EXISTS est une extension de PostgreSQL.
Voir aussi
ALTER TABLE(7), CREATE TABLE(7)
1046
Nom
DROP TABLESPACE Supprimer un tablespace
Synopsis
DROP TABLESPACE [ IF EXISTS ] nom_tablespace
Description
DROP TABLESPACE supprime un tablespace du systme.
Un tablespace ne peut tre supprim que par son propritaire ou par un superutilisateur. Le tablespace doit tre vide de tout objet
de base de donnes avant sa suppression. Mme si le tablespace ne contient plus d'objets de la base de donnes courante, il est
possible que des objets d'autres bases de donnes l'utilisent. De plus, si le tablespace se trouve parmi les tablespaces du paramtre temp_tablespaces d'une session active, la commande DROP pourrait chouer cause de fichiers temporaires stocks dans
le tablespace.
Paramtres
IF EXISTS
Ne pas renvoyer une erreur si l'agrgat n'existe pas. Un message d'avertissement est affich dans ce cas.
nom_tablespace
Le nom du tablespace.
Notes
DROP TABLESPACE ne peut pas tre excut l'intrieur d'un bloc de transactions.
Exemples
Supprimer le tablespace mes_affaires :
DROP TABLESPACE mes_affaires;
Compatibilit
DROP TABLESPACE est une extension PostgreSQL.
Voir aussi
CREATE TABLESPACE(7), ALTER TABLESPACE(7)
1047
Nom
DROP TEXT SEARCH CONFIGURATION Supprimer une configuration de recherche plein texte
Synopsis
DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] nom [ CASCADE | RESTRICT ]
Description
DROP TEXT SEARCH CONFIGURATION supprime une configuration existante de la recherche plein texte. Pour excuter
cette commande, vous devez tre le propritaire de la configuration.
Paramtres
IF EXISTS
Ne renvoie pas une erreur si la configuration de recherche plein texte n'existe pas. Un message de niveau NOTICE est
enregistr dans ce cas.
name
Le nom de la configuration de recherche plein texte (quelque fois qualifi du schma).
CASCADE
Supprime automatiquement les objets dpendant de cette configuration de recherche plein texte.
RESTRICT
Refuse la suppression de la configuration de recherche plein texte si des objets en dpendent. C'est la valeur par dfaut.
Exemples
Supprimer la configuration de recherche plein texte the text search configuration my_english:
DROP TEXT SEARCH CONFIGURATION my_english;
Cette commande chouera s'il existe des index qui rfrencent la configuration dans des appels to_tsvector. Ajoutez CASCADE pour supprimer ces index avec la configuration de recherche plein texte.
Compatibilit
Il n'existe pas d'instruction DROP TEXT SEARCH CONFIGURATION dans le standard SQL.
Voir aussi
ALTER TEXT SEARCH CONFIGURATION(7), CREATE TEXT SEARCH CONFIGURATION(7)
1048
Nom
DROP TEXT SEARCH DICTIONARY Supprimer un dictionnaire de recherche plein texte
Synopsis
DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] nom [ CASCADE | RESTRICT ]
Description
DROP TEXT SEARCH DICTIONARY supprime un dictionnaire existant de la recherche plein texte. Pour excuter cette
commande, vous devez tre le propritaire du dictionnaire.
Paramtres
IF EXISTS
Ne renvoie pas une erreur si le dictionnaire de recherche plein texte n'existe pas. Un message de niveau NOTICE est enregistr dans ce cas.
name
Le nom du dictionnaire de recherche plein texte (quelque fois qualifi du schma).
CASCADE
Supprime automatiquement les objets dpendant de ce dictionnaire de recherche plein texte.
RESTRICT
Refuse la suppression du dictionnaire de recherche plein texte si des objets en dpendent. C'est la valeur par dfaut.
Exemples
Supprimer le dictionnaire de recherche plein texte english :
DROP TEXT SEARCH DICTIONARY english;
Cette commande chouera s'il existe des configurations qui utilisent ce dictionnaire. Ajoutez CASCADE pour supprimer ces
configurations avec le dictionnaire de recherche plein texte.
Compatibilit
Il n'existe pas d'instruction DROP TEXT SEARCH DICTIONARY dans le standard SQL.
Voir aussi
ALTER TEXT SEARCH DICTIONARY(7), CREATE TEXT SEARCH DICTIONARY(7)
1049
Nom
DROP TEXT SEARCH PARSER Supprimer un analyseur de recherche plein texte
Synopsis
DROP TEXT SEARCH PARSER [ IF EXISTS ] nom [ CASCADE | RESTRICT ]
Description
DROP TEXT SEARCH PARSER supprime un analyseur existant de la recherche plein texte. Pour excuter cette commande,
vous devez tre superutilisateur.
Paramtres
IF EXISTS
Ne renvoie pas une erreur si l'analyseur de recherche plein texte n'existe pas. Un message de niveau NOTICE est enregistr dans ce cas.
name
Le nom de l'analyseur de recherche plein texte (quelque fois qualifi du schma).
CASCADE
Supprime automatiquement les objets dpendant de l'analyseur de recherche plein texte.
RESTRICT
Refuse la suppression de l'analyseur de recherche plein texte si des objets en dpendent. C'est la valeur par dfaut.
Exemples
Supprimer l'analyseur de recherche plein texte mon_analyseur :
DROP TEXT SEARCH PARSER mon_analyseur;
Cette commande chouera s'il existe des configurations qui utilisent ce dictionnaire. Ajoutez CASCADE pour supprimer ces
configurations avec l'analyseur de recherche plein texte.
Compatibilit
Il n'existe pas d'instruction DROP TEXT SEARCH PARSER dans le standard SQL.
Voir aussi
ALTER TEXT SEARCH PARSER(7), CREATE TEXT SEARCH PARSER(7)
1050
Nom
DROP TEXT SEARCH TEMPLATE Supprimer un modle de recherche plein texte
Synopsis
DROP TEXT SEARCH TEMPLATE [ IF EXISTS ] nom [ CASCADE | RESTRICT ]
Description
DROP TEXT SEARCH TEMPLATE supprime un modle existant de la recherche plein texte. Pour excuter cette commande, vous devez superutilisateur.
Paramtres
IF EXISTS
Ne renvoie pas une erreur si le modle de recherche plein texte n'existe pas. Un message de niveau NOTICE est enregistr dans ce cas.
name
Le nom du modle de recherche plein texte (quelque fois qualifi du schma).
CASCADE
Supprime automatiquement les objets dpendant de ce modle de recherche plein texte.
RESTRICT
Refuse la suppression du modle de recherche plein texte si des objets en dpendent. C'est la valeur par dfaut.
Exemples
Supprimer le modle de recherche plein texte thesaurus :
DROP TEXT SEARCH TEMPLATE thesaurus;
Cette commande chouera s'il existe des dictionnaires qui utilisent ce modles. Ajoutez CASCADE pour supprimer ces dictionnaires avec le modle de recherche plein texte.
Compatibilit
Il n'existe pas d'instruction DROP TEXT SEARCH TEMPLATE dans le standard SQL.
Voir aussi
ALTER TEXT SEARCH TEMPLATE(7), CREATE TEXT SEARCH TEMPLATE(7)
1051
Nom
DROP TRIGGER Supprimer un dclencheur
Synopsis
DROP TRIGGER [ IF EXISTS ] nom ON table [ CASCADE | RESTRICT ]
Description
DROP TRIGGER supprime la dfinition d'un dclencheur. Seul le propritaire de la table sur laquelle le dclencheur est dfini
peut excuter cette commande.
Paramtres
IF EXISTS
Ne pas renvoyer une erreur si l'agrgat n'existe pas. Un message d'avertissement est affich dans ce cas.
nom
Le nom du dclencheur supprimer.
table
Le nom de la table (ventuellement qualifi du nom du schma) sur laquelle le dclencheur est dfini.
CASCADE
Les objets qui dpendent du dclencheur sont automatiquement supprims.
RESTRICT
Le dclencheur n'est pas supprim si un objet en dpend. Comportement par dfaut.
Exemples
Destruction du dclencheur si_dist_existe de la table films :
DROP TRIGGER si_dist_existe ON films;
Compatibilit
L'instruction DROP TRIGGER de PostgreSQL est incompatible avec le standard SQL. Dans le standard, les noms de dclencheurs ne se dfinissent pas par rapport aux tables. La commande est donc simplement DROP TRIGGER nom.
Voir aussi
CREATE TRIGGER(7)
1052
Nom
DROP TYPE Supprimer un type de donnes
Synopsis
DROP TYPE [ IF EXISTS ] nom [, ...] [ CASCADE | RESTRICT ]
Description
DROP TYPE supprime un type de donnes utilisateur. Seul son propritaire peut le supprimer.
Paramtres
IF EXISTS
Ne pas renvoyer une erreur si l'agrgat n'existe pas. Un message d'avertissement est affich dans ce cas.
nom
Le nom du type de donnes (ventuellement qualifi du nom de schma) supprimer.
CASCADE
Les objets qui dpendent du type (colonnes de table, fonctions, oprateurs...) sont automatiquement supprims.
RESTRICT
Le type n'est pas supprim si un objet en dpend. Comportement par dfaut.
Exemples
Supprimer le type de donnes boite :
DROP TYPE boite;
Compatibilit
Cette commande est similaire celle du standard SQL en dehors de l'option IF EXISTS qui est une extension PostgreSQL.
La majorit de la commande CREATE TYPE et les mcanismes d'extension de type de donnes de PostgreSQL diffrent du
standard.
Voir aussi
ALTER TYPE(7), CREATE TYPE(7)
1053
Nom
DROP USER Supprimer un rle de base de donnes
Synopsis
DROP USER [ IF EXISTS ] nom [, ...]
Description
DROP USER est dsormais un alias de DROP ROLE(7).
Compatibilit
L'instruction DROP USER est une extension PostgreSQL. Le standard SQL laisse la dfinition des utilisateurs
l'implantation.
Voir aussi
DROP ROLE(7)
1054
Nom
DROP USER MAPPING Supprimer une correspondance d'utilisateur pour un serveur distant
Synopsis
DROP USER MAPPING [ IF EXISTS ] FOR { nom_utilisateur | USER | CURRENT_USER | PUBLIC
} SERVER nom_serveur
Description
DROP USER MAPPING supprime une correspondance d'utilisateur existant pour un serveur distant.
Le propritaire d'un serveur distant peut supprimer les correspondances d'utilisateur pour ce serveur pour n'importe quel utilisateur. Par ailleurs, un utilisateur peut supprimer une correspondance d'utilisateur pour son propre nom d'utilisateur s'il a reu le
droit USAGE sur le serveur.
Paramtres
IF EXISTS
Ne gnre pas d'erreur si la correspondance d'utilisateur n'existe pas. Un avertissement est mis dans ce cas.
nom_utilisateur
Nom d'utilisateur de la correspondance. CURRENT_USER et USER correspondent au nom de l'utilisateur courant. PUBLIC
est utilis pour correspondre tous les noms d'utilisateurs prsents et futurs du systme.
nom_serveur
Nom du serveur de la correspondance d'utilisateur.
Exemples
Supprimer une correspondance d'utilisateur bob, sur le serveur truc si elle existe :
DROP USER MAPPING IF EXISTS FOR bob SERVER truc;
Compatibilit
DROP USER MAPPING est conforme la norme ISO/IEC 9075-9 (SQL/MED). La clause IF EXISTS est une extension
PostgreSQL.
Voir aussi
CREATE USER MAPPING(7), ALTER USER MAPPING(7)
1055
Nom
DROP VIEW Supprimer une vue
Synopsis
DROP VIEW [ IF EXISTS ] nom [, ...] [ CASCADE | RESTRICT ]
Description
DROP VIEW supprime une vue existante. Seul le propritaire de la vue peut excuter cette commande.
Paramtres
IF EXISTS
Ne pas renvoyer une erreur si l'agrgat n'existe pas. Un message d'avertissement est affich dans ce cas.
nom
Le nom de la vue (ventuellement qualifi du nom de schma) supprimer.
CASCADE
Les objets qui dpendent de la vue (d'autres vues, par exemple) sont automatiquement supprims.
RESTRICT
La vue n'est pas supprime si un objet en dpend. Comportement par dfaut.
Exemples
Supprimer la vue genre :
DROP VIEW genre;
Compatibilit
Cette commande est conforme au standard SQL. Cependant, le standard n'autorise pas la suppression de plusieurs vues en une
seule commande. De plus, l'option IF EXISTS est une extension de PostgreSQL.
Voir aussi
ALTER VIEW(7), CREATE VIEW(7)
1056
Nom
END Valider la transaction en cours
Synopsis
END [ WORK | TRANSACTION ]
Description
END valide la transaction en cours. Toutes les modifications ralises lors de la transaction deviennent visibles pour les autres
utilisateurs et il est garanti que les donnes ne seront pas perdues si un arrt brutal survient. Cette commande est une extension
PostgreSQL quivalente COMMIT(7).
Paramtres
WORK, TRANSACTION
Mots cls optionnels. Ils n'ont pas d'effet.
Notes
ROLLBACK(7) est utilis pour annuler une transaction.
Lancer END l'extrieur d'une transaction n'a aucun effet mais provoque un message d'avertissement.
Exemples
Valider la transaction en cours et rendre toutes les modifications persistantes :
END;
Compatibilit
END est une extension PostgreSQL fournissant une fonctionnalit quivalente COMMIT(7), spcifi dans le standard SQL.
Voir aussi
BEGIN(7), COMMIT(7), ROLLBACK(7)
1057
Nom
EXECUTE Excuter une instruction prpare
Synopsis
EXECUTE nom [ (paramtre [, ...] ) ]
Description
EXECUTE est utilis pour excuter une instruction prpare au pralable. Comme les instructions prpares existent seulement
pour la dure d'une session, l'instruction prpare doit avoir t cre par une instruction PREPARE excute plus tt dans la
session en cours.
Si l'instruction PREPARE qui cre l'instruction est appele avec des paramtres, un ensemble compatible de paramtres doit
tre pass l'instruction EXECUTE, sinon une erreur est leve. Contrairement aux fonctions, les instructions prpares ne sont
pas surcharges en fonction de leur type ou du nombre de leurs paramtres ; le nom d'une instruction prpare doit tre unique
au sein d'une session.
Pour plus d'informations sur la cration et sur l'utilisation des instructions prpares, voir PREPARE(7).
Paramtres
nom
Le nom de l'instruction prpare excuter.
paramtre
La valeur relle du paramtre d'une instruction prpare. Ce paramtre doit tre une expression ramenant une valeur dont le
type est compatible avec celui spcifi pour ce paramtre positionnel dans la commande PREPARE qui a cr l'instruction
prpare.
Sorties
La sortie renvoye par la commande EXECUTE est celle de l'instruction prpare, et non celle de la commande EXECUTE.
Exemples
Des exemples sont donns dans la section la section intitule Exemples de la documentation de PREPARE(7).
Compatibilit
Le standard SQL inclut une instruction EXECUTE qui n'est utilise que dans le SQL embarqu. La syntaxe utilise par cette
version de l'instruction EXECUTE diffre quelque peu.
Voir aussi
DEALLOCATE(7), PREPARE(7)
1058
Nom
EXPLAIN Afficher le plan d'excution d'une instruction
Synopsis
EXPLAIN [ ( option [, ...] ) ] instruction
EXPLAIN [ ANALYZE ] [ VERBOSE ] instruction
o option est :
ANALYZE [ boolean ]
VERBOSE [ boolean ]
COSTS [ boolean ]
BUFFERS [ boolean ]
FORMAT { TEXT | XML | JSON | YAML }
Description
Cette commande affiche le plan d'excution que l'optimiseur de PostgreSQL engendre pour l'instruction fournie. Le plan
d'excution dcrit le parcours de la (des) table(s) utilise(s) dans la requte -- parcours squentiel, parcours d'index, etc. -- . Si
plusieurs tables sont rfrences, il prsente galement les algorithmes de jointures utiliss pour rassembler les lignes issues des
diffrentes tables.
La partie la plus importante de l'affichage concerne l'affichage des cots estims d'excution. Ils reprsentent l'estimation faite
par le planificateur des temps d'excution de la requte (mesurs en units de rcupration de pages sur le disque). Deux
nombres sont affichs : le temps de dmarrage, coul avant que la premire ligne soit renvoye, et le temps d'excution total,
ncessaire au renvoi de toutes les lignes. Pour la plupart des requtes, le temps qui importe est celui d'excution totale. Mais
dans certains cas, tel que pour une sous-requte dans la clause EXISTS, le planificateur choisira le temps de dmarrage le plus
court, et non celui d'excution totale (car, de toute faon, l'excuteur s'arrte aprs la rcupration d'une ligne). De mme, lors de
la limitation des rsultats retourner par une clause LIMIT, la planificateur effectue une interpolation entre les deux temps limites pour choisir le plan rellement le moins coteux.
L'option ANALYZE impose l'excution de la requte en plus de sa planification. Le temps total d'excution de chaque nud du
plan (en millisecondes) et le nombre total de lignes effectivement retournes sont ajouts l'affichage. C'est utile pour vrifier la
vracit des informations fournies par le planificateur.
Important
Il ne faut pas oublier que l'instruction est rellement excute avec l'option ANALYZE. Bien qu'EXPLAIN inhibe
l'affichage des retours d'une commande SELECT, les autres effets de l'instruction sont prsents. Si EXPLAIN
ANALYZE doit tre utilis sur une instruction INSERT, UPDATE, DELETE CREATE TABLE AS ou EXECUTE sans que la commande n'affecte les donnes, l'approche suivante peut tre envisage :
BEGIN;
EXPLAIN ANALYZE ...;
ROLLBACK;
Seules les options ANALYZE et VERBOSE peuvent tre utilises et dans cet ordre seulement si la liste d'options
entre parenthses n'est pas utilis. Avant PostgreSQL 9.0, la seule syntaxe supporte tait celle sans parenthses. Les nouvelles options ne seront supportes que par la nouvelle syntaxe, celle avec les parenthses.
Paramtres
ANALYZE
Excute la commande et affiche les temps d'excution rels. Ce paramtre est par dfaut FALSE.
VERBOSE
Affiche des informations supplmentaires sur le plan. Cela inclut la liste des colonnes en sortie pour chaque nud du plan,
les noms des tables et fonctions avec le nom du schma, les labels des variables dans les expressions avec des alias de tables
et le nom de chaque trigger pour lesquels les statistiques sont affiches. Ce paramtre est par dfaut FALSE.
COSTS
1059
EXPLAIN
Inclut des informations sur le cot estim au dmarrage et au total de chaque nud du plan, ainsi que le nombre estim de
lignes et la largeur estime de chaque ligne. Ce paramtre est par dfaut TRUE.
BUFFERS
Inclut des informations sur l'utilisation des blocs. Cela inclut le nombre de lecture de blocs partags en cache, sur le disque
ainsi que le nombre de blocs crits. Cela inclut aussi le nombre de blocs locaux lus dans le cache, sur le disque et le nombre
de blocs locaux crits. Enfin, cela inclut le nombre de blocs temporaires lus et crits. Les blocs partags, les blocs locaux et
les blocs temporaires contiennent respectivement des tables et des index, des tables temporaires et des index temporaires, et
les blocs disques utiliss dans les tris et les plans matrialiss. Le nombre de blocs affichs pour un nud de haut niveau inclut ceux utiliss par tous ses enfants. Dans le format texte, seuls les valeurs diffrentes de zro sont affichs. Ce paramtre
pourrait seulement tre utilis avec le paramtre ANALYZE. Il vaut par dfaut FALSE.
FORMAT
Indique le format de sortie. Il peut valoir TEXT, XML, JSON ou YAML. Toutes les sorties contiennent les mmes informations, mais les programmes pourront plus facilement traiter les sorties autres que TEXT. Ce paramtre est par dfaut TEXT.
boolean
Spcifie si l'option slectionne doit tre active ou dsactive. Vous pouvez crire TRUE, ON ou 1 pour activer l'option, et
FALSE, OFF ou 0 pour la dsactiver. La valeur de type boolean peut aussi tre omise, auquel cas la valeur sera TRUE.
instruction
Toute instruction SELECT, INSERT, UPDATE, DELETE, VALUES EXECUTE, DECLARE ou CREATE TABLE AS
dont le plan d'excution est souhait.
Notes
La documentation sur l'utilisation faite par l'optimiseur des informations de cot est assez rduite dans PostgreSQL. On peut se
rfrer Section 14.1, Utiliser EXPLAIN pour plus d'informations.
Pour que le planificateur de requtes de PostgreSQL puisse prendre des dcisions en connaissance de cause, l'instruction ANALYZE(7) doit avoir t excute afin d'enregistrer les statistiques de distribution des donnes dans la table. Si cela n'a pas t fait,
(ou si la distribution statistique des donnes dans la table a chang de manire significative depuis la dernire excution de la commande ANALYZE) les cots estims risquent de ne pas reflter les proprits relles de la requte. De ce fait, un plan de requte
infrieur risque d'tre choisi.
Pour mesurer le cot d'excution du plan d'excution, l'implmentation actuelle de EXPLAIN ANALYZE peut ajouter un dlai
considrable l'excution de la requte cause du profilage. De ce fait, excuter EXPLAIN ANALYZE sur une requte peut
prendre bien plus de temps que d'excuter la requte seule. Ce dlai dpend de la nature de la requte.
Exemples
Afficher le plan d'une requte simple sur une table d'une seule colonne de type integer et 10000 lignes :
EXPLAIN SELECT * FROM foo;
QUERY PLAN
--------------------------------------------------------Seq Scan on foo (cost=0.00..155.00 rows=10000 width=4)
(1 row)
Voici le mme plan, mais format avec JSON :
EXPLAIN (FORMAT JSON) SELECT * FROM foo;
QUERY PLAN
-------------------------------[
+
{
+
"Plan": {
+
"Node Type": "Seq Scan",+
"Relation Name": "foo", +
"Alias": "foo",
+
"Startup Cost": 0.00,
+
"Total Cost": 155.00,
+
"Plan Rows": 10000,
+
"Plan Width": 4
+
}
+
}
+
]
1060
EXPLAIN
(1 row)
S'il existe un index et que la requte contient une condition WHERE indexable, EXPLAIN peut afficher un plan diffrent :
EXPLAIN SELECT * FROM foo WHERE i = 4;
QUERY PLAN
-------------------------------------------------------------Index Scan using fi on foo (cost=0.00..5.98 rows=1 width=4)
Index Cond: (i = 4)
(2 rows)
Voici le mme plan, mais format avec YAML :
EXPLAIN (FORMAT YAML) SELECT * FROM foo WHERE i='4';
QUERY PLAN
------------------------------- Plan:
+
Node Type: "Index Scan" +
Scan Direction: "Forward"+
Index Name: "fi"
+
Relation Name: "foo"
+
Alias: "foo"
+
Startup Cost: 0.00
+
Total Cost: 5.98
+
Plan Rows: 1
+
Plan Width: 4
+
Index Cond: "(i = 4)"
(1 row)
L'obtention du format XML est laiss en exercice au lecteur.
Voici le mme plan avec les cots supprims :
EXPLAIN (COSTS FALSE) SELECT * FROM foo WHERE i = 4;
QUERY PLAN
---------------------------Index Scan using fi on foo
Index Cond: (i = 4)
(2 rows)
Exemple de plan de requte pour une requte utilisant une fonction d'agrgat :
EXPLAIN SELECT sum(i) FROM foo WHERE i < 10;
QUERY PLAN
--------------------------------------------------------------------Aggregate (cost=23.93..23.93 rows=1 width=4)
-> Index Scan using fi on foo (cost=0.00..23.92 rows=6 width=4)
Index Cond: (i < 10)
(3 rows)
Exemple d'utilisation de EXPLAIN EXECUTE pour afficher le plan d'excution d'une requte prpare :
PREPARE query(int, int) AS SELECT sum(bar) FROM test
WHERE id > $1 AND id < $2
GROUP BY foo;
EXPLAIN ANALYZE EXECUTE query(100, 200);
QUERY PLAN
------------------------------------------------------------------------------------HashAggregate (cost=39.53..39.53 rows=1 width=8) (actual time=0.661..0.672 rows=7
loops=1)
-> Index Scan using test_pkey on test (cost=0.00..32.97 rows=1311 width=8) (actual
time=0.050..0.395 rows=99 loops=1)
Index Cond: ((id > $1) AND (id < $2))
Total runtime: 0.851 ms
1061
EXPLAIN
(4 rows)
Il est vident que les nombres prsents ici dpendent du contenu effectif des tables impliques. De plus, les nombres, et la stratgie slectionne elle-mme, peuvent diffrer en fonction de la version de PostgreSQL du fait des amliorations apportes au
planificateur. Il faut galement savoir que la commande ANALYZE calcule les statistiques des donnes partir d'extraits alatoires ; il est de ce fait possible que les cots estims soient modifis aprs l'excution de cette commande, alors mme la distribution relle des donnes dans la table n'a pas chang.
Compatibilit
L'instruction EXPLAIN n'est pas dfinie dans le standard SQL.
Voir aussi
ANALYZE(7)
1062
Nom
FETCH Rcuprer les lignes d'une requte l'aide d'un curseur
Synopsis
FETCH [ direction [ FROM | IN ] ] nom_curseur
o direction peut tre vide ou tre :
NEXT
PRIOR
FIRST
LAST
ABSOLUTE nombre
RELATIVE nombre
nombre
ALL
FORWARD
FORWARD nombre
FORWARD ALL
BACKWARD
BACKWARD nombre
BACKWARD ALL
Description
FETCH rcupre des lignes en utilisant un curseur prcdemment ouvert.
un curseur est associe une position associe utilise par FETCH. Le curseur peut tre positionn avant la premire ligne du
rsultat de la requte, sur une ligne particulire du rsultat ou aprs la dernire ligne du rsultat. sa cration, le curseur est positionn avant la premire ligne. Aprs rcupration de lignes, le curseur est positionn sur la ligne la plus rcemment rcupre.
Si FETCH atteint la fin des lignes disponibles, il est positionn aprs la dernire ligne ou avant la premire ligne dans le cas
d'une rcupration remontante. FETCH ALL ou FETCH BACKWARD ALL positionne toujours le curseur aprs la dernire
ligne ou avant la premire ligne.
Les formes NEXT, PRIOR, FIRST, LAST, ABSOLUTE, RELATIVE rcuprent une seule ligne aprs dplacement appropri du
curseur. Si cette ligne n'existe pas, un rsultat vide est renvoy et le curseur est positionn avant la premire ligne ou aprs la
dernire ligne, en fonction du sens de la progression.
Les formes utilisant FORWARD et BACKWARD rcuprent le nombre de lignes indiqu en se dplaant en avant ou en arrire,
laissant le curseur positionn sur la dernire ligne renvoye (ou aprs/avant toutes les lignes si nombre dpasse le nombre de
lignes disponibles).
RELATIVE 0, FORWARD 0 et BACKWARD 0 rcuprent tous la ligne actuelle sans dplacer le curseur, c'est--dire qu'ils effectuent une nouvelle rcupration de la ligne dernirement rcupre. La commande russit sauf si le curseur est positionn
avant la premire ligne ou aprs la dernire ligne ; dans ce cas, aucune ligne n'est renvoye.
Note
Cette page dcrit l'utilisation des curseurs au niveau de la commande SQL. Si vous voulez utiliser des curseurs
dans une fonction PL/pgSQL, les rgles sont diffrentes -- voir Section 39.7, Curseurs .
Paramtres
direction
La direction et le nombre de lignes rcuprer. Ce paramtre peut prendre les valeurs suivantes :
NEXT
La ligne suivante est rcupre. C'est le comportement par dfaut si direction est omis.
PRIOR
La ligne prcdente est rcupre.
FIRST
1063
FETCH
Sorties
En cas de succs, une commande FETCH renvoie une balise de commande de la forme
FETCH nombre
Le nombre est le nombre de lignes rcupres (ventuellement zro). Dans psql, la balise de commande n'est pas rellement affiche car psql affiche la place les lignes rcupres.
Notes
Le curseur doit tre dclar avec l'option SCROLL si les variantes de FETCH autres que FETCH NEXT ou FETCH FORWARD avec un nombre positif sont utilises. Pour les requtes simples, PostgreSQL autorise les parcours inverses partir de
curseurs non dclars avec SCROLL. il est toutefois prfrable de ne pas se fonder sur ce comportement. Si le curseur est dclar
avec NO SCROLL, aucun parcours inverse n'est autoris.
Les rcuprations ABSOLUTE ne sont pas plus rapides que la navigation vers la ligne dsire par dplacement relatif : de toute
faon, l'implantation sous-jacente doit parcourir toutes les lignes intermdiaires. Les rcuprations absolues ngatives font mme
pis : la requte doit tre lue jusqu' la fin pour trouver la dernire ligne, puis relue en sens inverse partir de l. Nanmoins, remonter vers le dbut de la requte (comme avec FETCH ABSOLUTE 0) est rapide.
DECLARE(7) est utilis pour dfinir un curseur. MOVE(7) est utilis pour modifier la position du curseur sans rcuprer les donnes.
1064
FETCH
Exemples
Parcourir une table l'aide d'un curseur :
BEGIN WORK;
-- Initialiser le curseur :
DECLARE liahona SCROLL CURSOR FOR SELECT * FROM films;
-- Rcuprer les 5 premires lignes du curseur liahona :
FETCH FORWARD 5 FROM liahona;
code |
titre
| did | date_prod |
genre | longueur
-------+-------------------------+-----+------------+----------+----------BL101 | The Third Man
| 101 | 1949-12-23 | Drama
| 01:44
BL102 | The African Queen
| 101 | 1951-08-11 | Romantic | 01:43
JL201 | Une Femme est une Femme | 102 | 1961-03-12 | Romantic | 01:25
P_301 | Vertigo
| 103 | 1958-11-14 | Action
| 02:08
P_302 | Becket
| 103 | 1964-02-03 | Drama
| 02:28
-- Rcuprer la ligne prcdente :
FETCH PRIOR FROM liahona;
code | titre | did | date_prod | genre | longueur
-------+---------+-----+------------+--------+----------P_301 | Vertigo | 103 | 1958-11-14 | Action | 02:08
-- Fermer le curseur et terminer la transaction:
CLOSE liahona;
COMMIT WORK;
Compatibilit
Le standard SQL ne dfinit FETCH que pour une utilisation en SQL embarqu. La variante de FETCH dcrite ici renvoie les
donnes comme s'il s'agissait du rsultat d'un SELECT plutt que de le placer dans des variables htes. part cela, FETCH est
totalement compatible avec le standard SQL.
Les formes de FETCH qui impliquent FORWARD et BACKWARD, ainsi que les formes FETCH nombre et FETCH ALL, dans
lesquelles FORWARD est implicite, sont des extensions PostgreSQL.
Le standard SQL n'autorise que FROM devant le nom du curseur ; la possibilit d'utiliser IN, ou de les laisser, est une extension.
Voir aussi
CLOSE(7), DECLARE(7), MOVE(7)
1065
Nom
GRANT Dfinir les droits d'accs
Synopsis
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[, ...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] nom_table [, ...]
| ALL TABLES IN SCHEMA nom_schma [, ...] }
TO { [ GROUP ] nom_rle | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( nom_colonne [, ...] )
[, ...] | ALL [ PRIVILEGES ] ( nom_colonne [, ...] ) }
ON [ TABLE ] nom_table [, ...]
TO { [ GROUP ] nom_rle | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { { USAGE | SELECT | UPDATE }
[, ...] | ALL [ PRIVILEGES ] }
ON { SEQUENCE nom_squence [, ...]
| ALL SEQUENCES IN SCHEMA nom_schma [, ...] }
TO { [ GROUP ] nom_rle | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE nom_base [, ...]
TO { [ GROUP ] nom_rle | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN DATA WRAPPER nom_fdw [, ...]
TO { [ GROUP ] nom_rle | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN SERVER nom_serveur [, ...]
TO { [ GROUP ] nom_rle | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { EXECUTE | ALL [ PRIVILEGES ] }
ON { FUNCTION nom_fonction ( [ [ mode_arg ] [ nom_arg ] type_arg [, ...] ] ) [,
...]
| ALL FUNCTIONS IN SCHEMA nom_schma [, ...] }
TO { [ GROUP ] nom_rle | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON LANGUAGE nom_lang [, ...]
TO { [ GROUP ] nom_rle | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
ON LARGE OBJECT loid [, ...]
TO { [ GROUP ] nom_rle | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
ON SCHEMA nom_schma [, ...]
TO { [ GROUP ] nom_rle | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT { CREATE | ALL [ PRIVILEGES ] }
ON TABLESPACE tablespace_name [, ...]
TO { [ GROUP ] nom_rle | PUBLIC } [, ...] [ WITH GRANT OPTION ]
GRANT nom_rle [, ...] TO nom_rle [, ...] [ WITH ADMIN OPTION ]
Description
La commande GRANT a deux variantes basiques : la premire donne des droits sur un objet de la base de donnes (table, colonne, vue, table distante, squence, base de donnes, wrapper de donnes distantes, serveur distant, fonction, langage de procdure, schma ou espace logique), la seconde gre les appartenances un rle. Ces variantes sont assez similaires mais somme
toute assez diffrentes pour tre dcrites sparment.
GRANT
Cette variante de la commande GRANT donne des droits spcifiques sur un objet de la base de donnes a un ou plusieurs rles.
Ces droits sont ajouts ceux dj possds, s'il y en a.
Il existe aussi une option pour donner les droits sur tous les objets d'un mme type sur un ou plusieurs schmas. Cette fonctionnalit n'est actuellement propose que pour les tables, squences et fonctions (mais notez que ALL TABLES incluent aussi les vues
et les tables distantes).
Le mot cl PUBLIC indique que les droits sont donns tous les rles, y compris ceux crs ultrieurement. PUBLIC peut tre vu
comme un groupe implicitement dfini qui inclut en permanence tous les rles. Un rle particulier dispose de la somme des droits
qui lui sont acquis en propre, des droits de tout rle dont il est membre et des droits donns PUBLIC.
Si WITH GRANT OPTION est prcis, celui qui reoit le droit peut le transmettre son tour (NDT : par la suite on parlera d'
option de transmission de droit , l o en anglais il est fait mention de grant options ). Sans l'option GRANT, l'utilisateur ne
peut pas le faire. Cette option ne peut pas tre donne PUBLIC.
Il n'est pas ncessaire d'accorder des droits au propritaire d'un objet (habituellement l'utilisateur qui l'a cr) car, par dfaut, le
propritaire possde tous les droits. (Le propritaire peut toutefois choisir de rvoquer certains de ses propres droits.)
Le droit de supprimer un objet ou de modifier sa dfinition n'est pas configurable avec cette commande. Il est spcifique au propritaire de l'objet. Ce droit ne peut ni tre donn ni supprim. Nanmoins, il est possible d'avoir le mme effet en rendant un utilisateur membre du rle qui possde cet object ou en le supprimant de ce rle. Le propritaire a aussi implicitement les options de
transmission de droits pour l'objet.
En fonction du type de l'objet, les privilges initiaux par dfaut peuvent inclure la transmission de certains privilges PUBLIC.
Par dfaut, aucun accs public n'est accord sur les tables, colonnes, schmas et tablespaces ; le droit de cration de table
CONNECT et TEMP est accord sur les bases de donnes ; le droit EXECUTE sur les fonctions ; et le droit USAGE sur les langages.
Le propritaire de l'objet peut videmment choisir de rvoquer ces droits. (Pour un maximum de scurit, REVOKE est lanc
dans la mme transaction que la cration de l'objet ; ainsi, il n'y a pas de laps de temps pendant lequel un autre utilisateur peut utiliser l'objet.) De plus, cette configuration des droits par dfaut peut tre modifie en utilisant la commande ALTER DEFAULT
PRIVILEGES(7).
Les droits possibles sont :
SELECT
Autorise SELECT(7) sur toutes les colonnes, ou sur les colonnes listes spcifiquement, de la table, vue ou squence indique. Autorise aussi l'utilisation de COPY(7) TO. De plus, ce droit est ncessaire pour rfrencer des valeurs de colonnes
existantes avec UPDATE(7) ou DELETE(7). Pour les squences, ce droit autorise aussi l'utilisation de la fonction currval.
Pour les Large Objects , ce droit permet la lecture de l'objet.
INSERT
Autorise INSERT(7) d'une nouvelle ligne dans la table indique. Si des colonnes spcifiques sont listes, seules ces colonnes
peuvent tre affectes dans une commande INSERT, (les autres colonnes recevront par consquent des valeurs par dfaut).
Autorise aussi COPY(7) FROM.
UPDATE
Autorise UPDATE(7) sur toute colonne de la table spcifie, ou sur les colonnes spcifiquement listes. (En fait, toute commande UPDATE non triviale ncessite aussi le droit SELECT car elle doit rfrencer les colonnes pour dterminer les lignes
mettre jour et/ou calculer les nouvelles valeurs des colonnes.) SELECT ... FOR UPDATE et SELECT ... FOR
SHARE requirent galement ce droit sur au moins une colonne en plus du droit SELECT. Pour les squences, ce droit autorise l'utilisation des fonctions nextval et setval. Pour les Large Objects , ce droit permet l'criture et le tronquage de
l'objet.
DELETE
Autorise DELETE(7) d'une ligne sur la table indique. (En fait, toute commande DELETE non triviale ncessite aussi le
droit SELECT car elle doit rfrencer les colonnes pour dterminer les lignes supprimer.)
TRUNCATE
Autorise TRUNCATE(7) sur la table indique.
REFERENCES
Ce droit est requis sur les colonnes de rfrence et les colonnes qui rfrencent pour crer une contrainte de cl trangre. Le
droit peut tre accord pour toutes les colonnes, ou seulement des colonnes spcifiques.
TRIGGER
Autorise la cration d'un dclencheur sur la table indique. (Voir l'instruction CREATE TRIGGER(7).)
CREATE
Pour les bases de donnes, autorise la cration de nouveaux schmas dans la base de donnes.
1067
GRANT
Pour les schmas, autorise la cration de nouveaux objets dans le schma. Pour renommer un objet existant, il est ncessaire
d'en tre le propritaire et de possder ce droit sur le schma qui le contient.
Pour les tablespaces, autorise la cration de tables, d'index et de fichiers temporaires dans le tablespace et autorise la cration
de bases de donnes utilisant ce tablespace par dfaut. (Rvoquer ce privilge ne modifie pas l'emplacement des objets existants.)
CONNECT
Autorise l'utilisateur se connecter la base indique. Ce droit est vrifi la connexion (en plus de la vrification des restrictions imposes par pg_hba.conf).
TEMPORARY, TEMP
Autorise la cration de tables temporaires lors de l'utilisation de la base de donnes spcifie.
EXECUTE
Autorise l'utilisation de la fonction indique et l'utilisation de tout oprateur dfini sur cette fonction. C'est le seul type de
droit applicable aux fonctions. (Cette syntaxe fonctionne aussi pour les fonctions d'agrgat.)
USAGE
Pour les langages procduraux, autorise l'utilisation du langage indiqu pour la cration de fonctions. C'est le seul type de
droit applicable aux langages procduraux.
Pour les schmas, autorise l'accs aux objets contenus dans le schma indiqu (en supposant que les droits des objets soient
respects). Cela octroie, pour l'essentiel, au bnficiaire le droit de consulter les objets contenus dans ce schma. Sans ce
droit, il est toujours possible de voir les noms des objets en lanant des requtes sur les tables systme. De plus, aprs avoir
rvoqu ce droit, les processus serveur existants pourraient recevoir des requtes qui ont dj ralis cette recherche auparavant, donc ce n'est pas un moyen compltement scuris d'empcher l'accs aux objets.
Pour les squences, ce droit autorise l'utilisation des fonctions currval et nextval.
Pour des wrappers de donnes distantes, ce droit autorise son bnficiaire crer de nouveaux serveurs utilisant ce wrapper.
Pour les serveurs distants, ce droit autorise son bnficiaire crer, modifier et supprimer les correspondances utilisateur de
l'utilisateur associ ce serveur. De plus, il autorise son bnficiaire interroger les options du serveur et les correspondances
d'utilisateurs associes.
ALL PRIVILEGES
Octroie tous les droits disponibles en une seule opration. Le mot cl PRIVILEGES est optionnel sous PostgreSQL mais
est requis dans le standard SQL.
Les droits requis par les autres commandes sont lists sur les pages de rfrence de ces commandes.
Notes
La commande REVOKE(7) est utilise pour retirer les droits d'accs.
Depuis PostgreSQL 8.1, le concept des utilisateurs et des groupes a t unifi en un seul type d'entit appel rle. Il n'est donc
plus ncessaire d'utiliser le mot cl GROUP pour indiquer si le bnficiaire est un utilisateur ou un groupe. GROUP est toujours autoris dans cette commande mais est ignor.
Un utilisateur peut excuter des SELECT, INSERT, etc. sur une colonne si il a le privilge soit sur cette colonne spcifique, soit
sur la table entire. Donner un privilge de table puis le rvoquer pour une colonne ne fera pas ce que vous pourriez esprer :
l'autorisation au niveau de la table n'est pas affecte par une opration au niveau de la colonne.
Quand un utilisateur, non propritaire d'un objet, essaie d'octroyer des droits sur cet objet, la commande choue si l'utilisateur n'a
aucun droit sur l'objet. Tant que des privilges existent, la commande s'excute, mais n'octroie que les droits pour lesquels
1068
GRANT
l'utilisateur dispose de l'option de transmission. Les formes GRANT ALL PRIVILEGES engendrent un message d'avertissement
si aucune option de transmission de droit n'est dtenue, tandis que les autres formes n'engendrent un message que lorsque les options de transmission du privilge concern par la commande ne sont pas dtenues. (Cela s'applique aussi au propritaire de l'objet,
mais comme on considre toujours que ce dernier dtient toutes les options de transmission, le problme ne se pose jamais.)
Les superutilisateurs de la base de donnes peuvent accder tous les objets sans tenir compte des droits qui les rgissent. Cela est
comparable aux droits de root sur un systme Unix. Comme avec root, il est dconseill d'oprer en tant que superutilisateur,
sauf en cas d'imprieuse ncessit.
Si un superutilisateur lance une commande GRANT ou REVOKE, tout se passe comme si la commande tait excute par le propritaire de l'objet concern. Les droits octroys par cette commande semblent ainsi l'avoir t par le propritaire de l'objet.
(L'appartenance rle, elle, semble tre donne par le rle conteneur.)
GRANT et REVOKE peuvent aussi tre excutes par un rle qui n'est pas le propritaire de l'objet considr, mais est membre
du rle propritaire de l'objet, ou membre du rle titulaire du privilge WITH GRANT OPTION sur cet objet. Dans ce cas, les
droits sont enregistrs comme donns par le rle propritaire de l'objet ou titulaire du privilge WITH GRANT OPTION. Par
exemple, si la table t1 appartient au rle g1, dont le rle u1 est membre, alors u1 peut donner les droits sur t1 u2, mais ces
droits apparaissent octroys directement par g1. Tout autre membre du rle g1 peut les rvoquer par la suite.
Si le rle qui excute GRANT dtient, de manire indirecte, les droits souhaits travers plus d'un niveau d'appartenance, il est
difficile de prvoir le rle reconnu comme fournisseur du privilge. Dans de tels cas, le meilleur moyen d'utiliser SET ROLE est
de devenir le rle qui doit octroyer les droits.
Donner un droit sur une table n'tend pas automatiquement les droits sur les squences utilises par cette table, ceci incluant les
squences lies par des colonnes de type SERIAL. Les droits sur les squences doivent tre donns sparment.
La commande \dp de psql(1) permet d'obtenir des informations sur les droits existants pour les tables et colonnes, par exemple :
=> \z matable
Access privileges
Schema | Name
| Type |
Access privileges
| Column access privileges
--------+---------+-------+-----------------------+-------------------------public | mytable | table | miriam=arwdDxt/miriam | col1:
: =r/miriam
:
miriam_rw=rw/miriam
: admin=arw/miriam
(1 row)
Les entres affiches par \dp sont interprtes ainsi :
rolename=xxxx -- privileges granted to a role
=xxxx -- privileges granted to PUBLIC
r
w
a
d
D
x
t
X
U
C
c
T
arwdDxt
*
---------------
SELECT ("lecture")
UPDATE ("criture")
INSERT ("ajout")
DELETE
TRUNCATE
REFERENCES
TRIGGER
EXECUTE
USAGE
CREATE
CONNECT
TEMPORARY
ALL PRIVILEGES (pour les tables, varie pour les autres objets)
option de transmission du privilge qui prcde
GRANT
VOKE sur un objet instancie les droits par dfaut (produisant, par exemple, {=,miriam=arwdDxt/miriam}) puis les modifie en fonction de la requte spcifie. Les entres sont affiches en Privilges d'accs aux colonnes seulement pour les colonnes qui ont des privilges diffrents de ceux par dfaut. (Notez que, dans ce but, default privileges signifie toujours les
droits par dfaut inhrents au type de l'objet. Un objet dont les droits ont t modifis avec la commande ALTER DEFAULT
PRIVILEGES sera toujours affich avec une entre de droit effective qui inclut les effets de la commande ALTER.)
Les options de transmission de privilges implicites du propritaire ne sont pas indiques dans l'affichage des droits d'accs. Une
* apparat uniquement lorsque les options de transmission ont t explicitement octroyes.
Exemples
Donner le droit d'insertion tous les utilisateurs sur la table films :
GRANT INSERT ON films TO PUBLIC;
Donner tous les droits possibles l'utilisateur manuel sur la vue genres :
GRANT ALL PRIVILEGES ON genres TO manuel;
Bien que la commande ci-dessus donne tous les droits lorsqu'elle est excute par un superutilisateur ou par le propritaire de
genres, excute par quelqu'un d'autre, elle n'accorde que les droits pour lesquels cet utilisateur possde l'option de transmission.
Rendre joe membre de admins :
GRANT admins TO joe;
Compatibilit
Conformment au standard SQL, le mot cl PRIVILEGES est requis dans ALL PRIVILEGES. Le standard SQL n'autorise pas
l'initialisation des droits sur plus d'un objet par commande.
PostgreSQL autorise un propritaire d'objet rvoquer ses propres droits ordinaires : par exemple, le propritaire d'un objet peut
le placer en lecture seule pour lui-mme en rvoquant ses propres droits INSERT, UPDATE, DELETE et TRUNCATE. Le standard
SQL ne l'autorise pas. La raison en est que PostgreSQL traite les droits du propritaire comme ayant t donns par le propritaire ; il peut, de ce fait, aussi les rvoquer. Dans le standard SQL, les droits du propritaire sont donns par une entit
_SYSTEM . N'tant pas _SYSTEM , le propritaire ne peut pas rvoquer ces droits.
Le standard SQL fournit un droit USAGE sur d'autres types d'objet : jeux de caractres, collations, conversions, domaines.
Les droits sur les bases de donnes, tablespaces, langages, schmas et squences sont des extensions PostgreSQL.
Voir aussi
REVOKE(7), ALTER DEFAULT PRIVILEGES(7)
1070
Nom
INSERT Insrer de nouvelles lignes dans une table
Synopsis
[ WITH [ RECURSIVE ] requte_with [, ...] ]
INSERT INTO table [ ( colonne [, ...] ) ]
{ DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | requte
}
[ RETURNING * | expression_sortie [ [ AS ] nom_sortie ] [, ...] ]
Description
INSERT insre de nouvelles lignes dans une table. Vous pouvez insrer une ou plusieurs lignes spcifies par les expressions
de valeur, ou zro ou plusieurs lignes provenant d'une requte.
L'ordre des noms des colonnes n'a pas d'importance. Si aucune liste de noms de colonnes n'est donne, toutes les colonnes de la
table sont utilise dans l'ordre de leur dclaration (les N premiers noms de colonnes si seules N valeurs de colonnes sont fournies
dans la clause VALUES ou dans la requte). Les valeurs fournies par la clause VALUES ou par la requte sont associes
la liste explicite ou implicite des colonnes de gauche droite.
Chaque colonne absente de la liste, implicite ou explicite, des colonnes se voit attribuer sa valeur par dfaut, s'il y en a une, ou
NULL dans le cas contraire.
Un transtypage automatique est entrepris lorsque l'expression d'une colonne ne correspond pas au type de donne dclar.
La clause RETURNING optionnelle fait que INSERT calcule et renvoie le(s) valeur(s) base(s) sur chaque ligne en cours
d'insertion. C'est principalement utile pour obtenir les valeurs qui ont t fournies par dfaut, comme un numro de squence.
Nanmoins, toute expression utilisant les colonnes de la table est autorise. La syntaxe de la liste RETURNING est identique
celle de la commande SELECT.
Le droit INSERT sur une table est requis pour pouvoir y insrer des lignes. Si une liste de colonne est indique, vous avez
seulement besoin d'avoir le droit INSERT sur les colonnes listes. L'utilisation de la clause RETURNING ncessite le droit SELECT sur tous les colonnes mentionnes dans RETURNING. Si la clause requte est utilise pour insrer des lignes, le droit
SELECT sur toute table ou colonne utilise dans la requte est galement requis.
Paramtres
with_query
La clause WITH vous permet de spcifier une ou plusieurs sous-requtes qui peuvent tre rfrences par nom dans la requte INSERT. Voir Section 7.8, Requtes WITH (Common Table Expressions) et SELECT(7) pour des dtails.
Il est possible que la requte (instruction SELECT) contienne aussi une clause WITH. Dans ce cas, les deux ensembles
de requte_with peuvent tre rfrencs l'intrieur de la requte mais la deuxime prend prcdence car elle est
plus fortement imbrique.
table
Le nom de la table (ventuellement qualifi du nom du schma).
colonne
Le nom d'une colonne de table. Le nom de la colonne peut tre qualifi avec un nom de sous-champ ou un indice de tableau, si ncessaire. (N'insrer que certains champs d'une colonne composite laisse les autres champs NULL.)
DEFAULT VALUES
Toutes les colonnes se voient attribuer leur valeur par dfaut.
expression
Une expression ou une valeur affecter la colonne correspondante.
DEFAULT
La colonne correspondante se voit attribuer sa valeur par dfaut.
requte
Une requte (instruction SELECT) dont le rsultat fournit les lignes insrer. La syntaxe complte de la commande est dcrite dans la documentation de l'instruction SELECT(7).
1071
INSERT
expression_sortie
Une expression calculer et renvoye par la commande INSERT aprs chaque insertion de ligne. L'expression peut utiliser
tout nom de colonne de la table. Indiquez * pour que toutes les colonnes soient renvoyes.
nom_sortie
Un nom utiliser pour une colonne renvoye.
Sorties
En cas de succs, la commande INSERT renvoie un code de la forme
INSERT oid nombre
nombre correspond au nombre de lignes insres. Si nombre vaut exactement un et que la table cible contient des OID, alors
oid est l'OID affect la ligne insre. Sinon, oid vaut zro.
Si la commande INSERT contient une clause RETURNING, le rsultat sera similaire celui d'une instruction SELECT contenant
les colonnes et les valeurs dfinies dans la liste RETURNING, partir de la liste des lignes insres par la commande.
Exemples
Insrer une ligne dans la table films :
INSERT INTO films
VALUES ('UA502', 'Bananas', 105, '1971-07-13', 'Comdie', '82 minutes');
Dans l'exemple suivant, la colonne longueur est omise et prend donc sa valeur par dfaut :
INSERT INTO films (code, titre, did, date_prod, genre)
VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drame');
L'exemple suivant utilise la clause DEFAULT pour les colonnes date plutt qu'une valeur prcise :
INSERT INTO films VALUES
('UA502', 'Bananas', 105, DEFAULT, 'Comdie', '82 minutes');
INSERT INTO films (code, titre, did, date_prod, genre)
VALUES ('T_601', 'Yojimbo', 106, DEFAULT, 'Drame');
Insrer une ligne constitue uniquement de valeurs par dfaut :
INSERT INTO films DEFAULT VALUES;
Pour insrer plusieurs lignes en utilisant la syntaxe multi-lignes VALUES :
INSERT INTO films (code, titre, did, date_prod, genre) VALUES
('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');
Insrer dans la table films des lignes extraites de la table tmp_films (la disposition des colonnes est identique dans les deux
tables) :
INSERT INTO films SELECT * FROM tmp_films WHERE date_prod < '2004-05-07';
Insrer dans des colonnes de type tableau :
-- Crer un jeu de 3 cases sur 3
INSERT INTO tictactoe (game, board[1:3][1:3])
VALUES (1, '{{" "," "," "},{" "," "," "},{" "," "," "}}');
-- Les indices de l'exemple ci-dessus ne sont pas vraiment ncessaires
INSERT INTO tictactoe (game, board)
VALUES (2, '{{X," "," "},{" ",O," "},{" ",X," "}}');
Insrer une ligne simple dans la table distributeurs, en renvoyant le numro de squence gnr par la clause DEFAULT :
INSERT INTO distributeurs (did, dnom) VALUES (DEFAULT, 'XYZ Widgets')
RETURNING did;
Augmenter le nombre de ventes du vendeur qui gre le compte Acme Corporation, et enregistrer la ligne compltement mise
jour avec l'heure courante dans une table de traage :
1072
INSERT
WITH upd AS (
UPDATE employees SET sales_count = sales_count + 1 WHERE id =
(SELECT sales_person FROM accounts WHERE name = 'Acme Corporation')
RETURNING *
)
INSERT INTO employees_log SELECT *, current_timestamp FROM upd;
Compatibilit
INSERT est conforme au standard SQL, sauf la clause RETURNING qui est une extension PostgreSQL, comme la possibilit
d'utiliser la clause WITH avec l'instruction INSERT. Le standard n'autorise toutefois pas l'omission de la liste des noms de colonnes alors qu'une valeur n'est pas affecte chaque colonne, que ce soit l'aide de la clause VALUES ou partir de la
requte.
Les limitations possibles de la clause requte sont documentes sous SELECT(7).
1073
Nom
LISTEN Attendre une notification
Synopsis
LISTEN canal
Description
LISTEN enregistre la session courante comme listener du canal de notification canal. Si la session courante est dj enregistre comme listener de ce canal de notification, il ne se passe rien de plus.
chaque appel de la commande NOTIFY canal, que ce soit par cette session ou par une autre connecte la mme base de
donnes, toutes les sessions attendant sur ce canal en sont avises et chacune en avise en retour son client. Voir NOTIFY pour
plus d'informations.
La commande UNLISTEN permet d'annuler l'enregistrement d'une session comme listener d'un canal de notification. Les enregistrements d'coute d'une session sont automatiquement effacs lorsque la session se termine.
La mthode utilis par un client pour dtecter les vnements de notification dpend de l'interface de programmation PostgreSQL qu'il utilise. Avec la bibliothque libpq, l'application excute LISTEN comme une commande SQL ordinaire, puis appelle priodiquement la fonction PQnotifies pour savoir si un vnement de notification est reu. Les autres interfaces, telle
libpgtcl, fournissent des mthodes de plus haut niveau pour grer les vnements de notification ; en fait, avec libpgtcl, le dveloppeur de l'application n'a mme pas lancer LISTEN ou UNLISTEN directement. Tous les dtails se trouvent dans la documentation de l'interface utilise.
NOTIFY(7) dcrit plus en dtails l'utilisation de LISTEN et NOTIFY.
Paramtres
canal
Le nom d'un canal de notification (tout identifiant).
Notes
LISTEN prend effet la validation de la transaction. Si LISTEN ou UNLISTEN est excut dans une transaction qui sera ensuite annule, l'ensemble des canaux de notification couts sera inchang.
Une transaction qui a excut LISTEN ne peut pas tre prpare pour la validation en deux phases.
Exemples
Configurer et excuter une squence listen/notify partir de psql :
LISTEN virtual;
NOTIFY virtual;
Notification asynchrone "virtual" reue en provenance du processus serveur de PID
8448.
Compatibilit
Il n'existe pas d'instruction LISTEN dans le standard SQL.
Voir aussi
NOTIFY(7), UNLISTEN(7)
1074
Nom
LOAD Charger une bibliothque partage
Synopsis
LOAD 'fichier'
Description
Cette commande charge une bibliothque partage dans l'espace d'adressage de PostgreSQL. Si le fichier a dj t charg, la
commande ne fait rien. Les fichiers des bibliothques partages contenant des fonctions C sont automatiquement chargs
chaque fois qu'une de leur fonctions est appele. Du coup, un appel explicite LOAD est habituellement seulement ncessaire
pour charger une bibliothque qui modifie le comportement du serveur via des points d'accroche plutt qu'en fournissant un
ensemble de fonctions.
Le nom du fichier est indiqu de la mme faon que pour les noms de bibliothques partages dans CREATE FUNCTION(7) ;
il est, en particulier, possible d'utiliser un chemin de recherche et l'ajout automatique de l'extension de la bibliothque partage,
suivant les standards systme. Voir Section 35.9, Fonctions en langage C pour plus d'informations sur ce thme.
Les utilisateurs normaux peuvent seulement utiliser LOAD avec des bibliothques situes dans $libdir/plugins/ -- le
nom_fichier indiqu doit commencer avec cette chane exacte. (Il est de la responsabilit de l'administrateur de bases de
donnes de s'assurer que seules des bibliothques sres y sont installes.)
Compatibilit
LOAD est une extension PostgreSQL.
Voir aussi
CREATE FUNCTION(7)
1075
Nom
LOCK verrouiller une table
Synopsis
LOCK [ TABLE ] [ ONLY ] nom [ * ] [, ...] [ IN mode_verrou MODE ] [ NOWAIT ]
o mode_verrou peut tre :
ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE | SHARE | SHARE
ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE
Description
LOCK TABLE prend un verrou de niveau table, attendant si ncessaire que tout verrou conflictuel soit relch. Si NOWAIT est
spcifi, LOCK TABLE n'attend pas l'acquisition du verrou dsir : s'il ne peut pas tre obtenu immdiatement, la commande
est annule et une erreur est mise. Une fois obtenu, le verrou est conserv jusqu' la fin de la transaction en cours. (Il n'y a pas
de commande UNLOCK TABLE ; les verrous sont systmatiquement relchs la fin de la transaction.)
Lors de l'acquisition automatique de verrous pour les commandes qui rfrencent des tables, PostgreSQL utilise toujours le
mode de verrou le moins restrictif possible. LOCK TABLE est utilisable lorsqu'il est ncessaire d'obtenir des verrous plus restrictifs.
Soit, par exemple, une application qui excute une transaction de niveau d'isolation lecture des valids (Read Committed).
Pour s'assurer que les donnes de la table sont immuables pendant toute la dure de la transaction, un verrou SHARE de niveau
table peut tre obtenu avant d'effectuer la requte. Cela empche toute modification concurrente des donnes. Cela assure galement que toute lecture intervenant ensuite sur la table accde la mme vue des donnes valides. En effet, un verrou SHARE
entre en conflit avec le verrou ROW EXCLUSIVE pris par les modificateurs et l'instruction LOCK TABLE nom IN SHARE
MODE attend que tout dtenteur concurrent de verrous de mode ROW EXCLUSIVE valide ou annule. De ce fait, une fois le
verrou obtenu, il ne reste aucune criture non valide en attente ; de plus, aucune ne peut commencer tant que le verrou acquis
n'est pas relch.
Pour obtenir un effet similaire lors de l'excution d'une transaction de niveau d'isolation REPEATABLE READ ou SERIALIZABLE, il est ncessaire d'excuter l'instruction LOCK TABLE avant toute instruction SELECT ou de modification de donnes. La vue des donnes utilise par une transaction REPEATABLE READ or SERIALIZABLE est fige au moment o dbute
la premire instruction SELECT ou de modification des donnes. Un LOCK TABLE ultrieur empche encore les critures
concurrentes -- mais il n'assure pas que la transaction lit les dernires donnes valides.
Si une telle transaction modifie les donnes de la table, elle doit utiliser le mode de verrou SHARE ROW EXCLUSIVE au lieu
du mode SHARE. Cela assure l'excution d'une seule transaction de ce type la fois. Sans cela, une situation de verrou mort est
possible : deux transactions peuvent acqurir le mode SHARE et tre ensuite incapables d'acqurir aussi le mode ROW EXCLUSIVE pour rellement effectuer leurs mises jour. (Les verrous d'une transaction ne sont jamais en conflit. Une transaction peut
de ce fait acqurir le mode ROW EXCLUSIVE alors qu'elle dtient le mode SHARE -- mais pas si une autre transaction dtient le
mode SHARE.) Pour viter les verrous bloquants, il est prfrable que toutes les transactions qui acquirent des verrous sur les
mmes objets le fassent dans le mme ordre. De plus si de multiples modes de verrous sont impliqus pour un mme objet, le
verrou de mode le plus restrictif doit tre acquis le premier.
Plus d'informations sur les modes de verrou et les stratgies de verrouillage sont disponibles dans Section 13.3, Verrouillage
explicite .
Paramtres
nom
Le nom d'une table verrouiller (ventuellement qualifi du nom du schma). Si ONLY est prcis avant le nom de la table,
seule cette table est verrouille. Dans le cas contraire, la table et toutes ses tables filles (si elle en a) sont verrouilles. En
option, * peut tre plac aprs le nom de la table pour indiquer explicitement que les tables filles sont inclues.
La commande LOCK a, b; est quivalente LOCK a; LOCK b;. Les tables sont verrouilles une par une dans l'ordre
prcis par la commande LOCK TABLE.
modeverrou
Le mode de verrou prcise les verrous avec lesquels ce verrou entre en conflit. Les modes de verrou sont dcrits dans Section 13.3, Verrouillage explicite .
1076
LOCK
Si aucun mode de verrou n'est prcis, ACCESS EXCLUSIVE, mode le plus restrictif, est utilis.
NOWAIT
LOCK TABLE n'attend pas que les verrous conflictuels soient relchs : si le verrou indiqu ne peut tre acquis immdiatement sans attente, la transaction est annule.
Notes
LOCK TABLE ... IN ACCESS SHARE MODE requiert les droits SELECT sur la table cible. Toutes les autres formes de
LOCK requirent au moins un des droits UPDATE, DELETE et TRUNCATE au niveau table.
LOCK TABLE est inutile l'extrieur d'un bloc de transaction : le verrou est dtenu jusqu' la fin de l'instruction. Du coup, PostgreSQL renvoie une erreur si LOCK est utilis en dehors d'un bloc de transaction. Utilisez BEGIN(7) et COMMIT(7) (ou
ROLLBACK(7)) pour dfinir un bloc de transaction.
LOCK TABLE ne concernent que les verrous de niveau table. Les noms de mode contenant ROW sont donc tous mal nomms.
Ces noms de modes doivent gnralement tre compris comme indiquant l'intention de l'utilisateur d'acqurir des verrous de niveau ligne l'intrieur de la table verrouille. Le mode ROW EXCLUSIVE est galement un verrou de table partageable. Tous les
modes de verrou ont des smantiques identiques en ce qui concerne LOCK TABLE ; ils ne diffrent que dans les rgles de conflit
entre les modes. Pour des informations sur la faon d'acqurir un vrai verrou de niveau ligne, voir Section 13.3.2, Verrous au niveau ligne et la section intitule Clause FOR UPDATE/FOR SHARE dans la documentation de rfrence de SELECT.
Exemples
Obtenir un verrou SHARE sur une table avec cl primaire avant de raliser des insertions dans une table disposant de la cl trangre :
BEGIN WORK;
LOCK TABLE films IN SHARE MODE;
SELECT id FROM films
WHERE nom = 'Star Wars : Episode I - La menace fantme';
-- Effectuer un ROLLBACK si aucun enregistrement n'est retourn
INSERT INTO commentaires_films VALUES
(_id_, 'SUPER ! Je l''attendais depuis si longtemps !');
COMMIT WORK;
Prendre un verrou SHARE ROW EXCLUSIVE sur une table avec cl primaire lors du dbut des oprations de suppression :
BEGIN WORK;
LOCK TABLE films IN SHARE ROW EXCLUSIVE MODE;
DELETE FROM commentaires_films WHERE id IN
(SELECT id FROM films WHERE score < 5);
DELETE FROM films WHERE score < 5;
COMMIT WORK;
Compatibilit
LOCK TABLE n'existe pas dans le standard SQL. la place, il utilise SET TRANSACTION pour spcifier les niveaux de
concurrence entre transactions. PostgreSQL en dispose galement ; voir SET TRANSACTION(7) pour les dtails.
l'exception des modes de verrous ACCESS SHARE, ACCESS EXCLUSIVE et SHARE UPDATE EXCLUSIVE, les modes de
verrou PostgreSQL et la syntaxe LOCK TABLE sont compatibles avec ceux prsents dans Oracle.
1077
Nom
MOVE positionner un curseur
Synopsis
MOVE [ direction [ FROM | IN ] ] nom_curseur
o direction peut tre
vide ou faire partie de :
NEXT
PRIOR
FIRST
LAST
ABSOLUTE nombre
RELATIVE nombre
nombre
ALL
FORWARD
FORWARD nombre
FORWARD ALL
BACKWARD
BACKWARD nombre
BACKWARD ALL
Description
MOVE repositionne un curseur sans retourner de donne. MOVE fonctionne exactement comme la commande FETCH la
diffrence que MOVE ne fait que positionner le curseur et ne retourne aucune ligne.
Les paramtres de la commande MOVE sont identiques ceux de la commande FETCH. FETCH(7) contient les dtails de
syntaxe et d'utilisation.
Sortie
En cas de russite, une commande MOVE retourne une balise de commande de la forme
MOVE compteur
compteur est le nombre de lignes qu'une commande FETCH avec les mmes paramtres aurait renvoye (ventuellement zro).
Exemples
BEGIN WORK;
DECLARE liahona CURSOR FOR SELECT * FROM films;
-- Saute les 5 premires lignes :
MOVE FORWARD 5 IN liahona;
MOVE 5
-- Rcupre la 6me ligne partir du curseur liahona :
FETCH 1 FROM liahona;
code | titre | did | date_prod | genre | longueur
-------+--------+-----+------------+--------+----------P_303 | 48 Hrs | 103 | 1982-10-22 | Action | 01:37
(1 row)
-- Ferme le curseur liahona et termine la transaction :
CLOSE liahona;
COMMIT WORK;
Compatibilit
Il n'existe pas d'instruction MOVE dans le standard SQL.
1078
MOVE
Voir aussi
CLOSE(7), DECLARE(7), FETCH(7)
1079
Nom
NOTIFY engendrer une notification
Synopsis
NOTIFY canal [ , charge ]
Description
La commande NOTIFY envoie une notification avec une chane de charge supplmentaire chaque application cliente qui a
excut prcdemment la commande LISTEN canal dans la base de donnes courante pour le nom du canal indiqu.
NOTIFY fournit un mcanisme simple de communication interprocessus pour tout ensemble de processus accdant la mme
base de donnes PostgreSQL. Une chane de charge peut tre envoye avec la notification, et des mcanismes de plus haut niveau permettant de passer des donnes structures peuvent tre construits en utilisant les tables de la base de donnes.
L'information passe au client pour une notification inclut le nom de la notification et le PID du processus serveur de la session
le notifiant.
C'est au concepteur de la base de donnes de dfinir les noms de notification utiliss dans une base de donnes prcise et la signification de chacun. Habituellement, le nom du canal correspond au nom d'une table dans la base de donnes. L'vnement
notify signifie essentiellement J'ai modifi cette table, jetez-y un il pour vrifier ce qu'il y a de nouveau . Mais cette association n'est pas contrle par les commandes NOTIFY et LISTEN. Un concepteur de bases de donnes peut, par exemple, utiliser plusieurs noms de canal diffrents pour signaler diffrentes sortes de modifications au sein d'une mme table. Sinon, la
chane de charge peut tre utilise pour diffrencier plusieurs cas.
Lorsque NOTIFY est utilis pour signaler des modifications sur une table particulire, une technique de programmation utile
est de placer le NOTIFY dans une rgle dclenche par les mises jour de la table. De cette faon, la notification est automatique lors d'une modification de la table et le programmeur de l'application ne peut accidentellement oublier de le faire.
NOTIFY interagit fortement avec les transactions SQL. Primo, si un NOTIFY est excut l'intrieur d'une transaction, les
vnements notify ne sont pas dlivrs avant que la transaction ne soit valide, et cette condition uniquement. En effet, si la
transaction est annule, les commandes qu'elle contient n'ont aucun effet, y compris NOTIFY. Cela peut toutefois s'avrer dconcertant pour quiconque s'attend une dlivrance immdiate des notifications.
Secondo, si une session l'coute reoit un signal de notification alors qu'une transaction y est active, la notification n'est pas
dlivre au client connect avant la fin de cette transaction (par validation ou annulation). L encore, si une notification est dlivre l'intrieur d'une transaction finalement annule, on pourrait esprer annuler cette notification par quelque moyen -- mais
le serveur ne peut pas reprendre une notification dj envoye au client. C'est pourquoi les notifications ne sont dlivrs
qu'entre les transactions. Il est, de ce fait, important que les applications qui utilisent NOTIFY pour l'envoi de signaux en temps
rel conservent des transactions courtes.
Si le mme nom de canal est signal plusieurs fois partir de la mme transaction avec des chanes de charge identiques, le serveur de bases de donnes peut dcider de dlivrer une seule notification. Par contre, les notifications avec des chanes de charges
distinctes seront toujours dlivres par des notifications distinctes. De faon similaire, les notifications provenant de diffrentes
transactions ne seront jamais regroupes en une seule notification. Sauf pour supprimer des instances ultrieures de notifications
dupliques, la commande NOTIFY garantie que les notifications de la mme transaction seront dlivres dans l'ordre o elles
ont t envoyes. Il est aussi garantie que les messages de transactions diffrentes seront dlivres dans l'ordre dans lequel les
transactions ont t valides.
Il est courant qu'un client qui excute NOTIFY coute lui-mme des notifications de mme canal. Dans ce cas, il rcupre une
notification, comme toutes les autres sessions en coute. Suivant la logique de l'application, cela peut engendre un travail inutile,
par exemple lire une table de la base de donnes pour trouver les mises jour que cette session a elle-mme crites. Il est possible d'viter ce travail supplmentaire en verifiant si le PID du processus serveur de la session notifiante (fourni dans le message d'vnement de la notification) est le mme que le PID de la session courante (disponible partir de libpq). S'ils sont identiques, la notification est le retour du travail actuel et peut tre ignore.
Paramtres
canal
Nom du canal signaler (identifiant quelconque).
charge
La chane de charge communiquer avec la notification. Elle doit tre spcifie comme une chane litrale. Dans la
1080
NOTIFY
configuration par dfaut, elle doit avoir une taille infrieure 8000 octets. (Si des donnes binaires ou de tailles plus importantes doivent tre communiques, il est mieux de les placer dans une table de la base et d'envoyer la cl correspondant
l'enregistrement.)
Notes
Il existe une queue qui rcupre les notifications qui ont t envoyes mais pas encore traites par les sessions en coute. Si la
queue est remplie, les transactions appelant NOTIFY choueront la validation. La queue est assez large (8 Go dans une installation standard) et devrait tre suffisamment bien taille dans la majorit des cas. Nanmoins, aucun nettoyage ne peut se faire si
une session excute LISTEN puis entre en transaction pendant une longue priode. Une fois qu'une queue est moiti pleine, des
messages d'avertissements seront envoys dans les traces indiquant la session qui empche le nettoyage. Dans ce cas, il faut
s'assurer que la session termine sa transaction en cours pour que le nettoyage puisse se faire.
Une transaction qui a excut NOTIFY ne peut pas tre prpare pour une validation en deux phases.
pg_notify
Pour envoyer une notification, vous pouvez aussi utiliser la fonction pg_notify(text, text). La fonction prend en premier
argument le nom du canal et en second la charge. La fonction est bien plus simple utiliser que la commande NOTIFY si vous
avez besoin de travailler avec des noms de canaux et des charges non constants.
Exemples
Configurer et excuter une squence listen/notify partir de psql :
LISTEN virtual;
NOTIFY virtual;
Asynchronous notification "virtual" received from server process with PID 8448.
NOTIFY virtual, 'This is the payload';
Asynchronous notification "virtual" with payload "This is the payload" received from
server process with PID 8448.
LISTEN foo;
SELECT pg_notify('fo' || 'o', 'pay' || 'load');
Asynchronous notification "foo" with payload "payload" received from server process
with PID 14728.
Compatibilit
Il n'y a pas d'instruction NOTIFY dans le standard SQL.
Voir aussi
LISTEN(7), UNLISTEN(7)
1081
Nom
PREPARE prpare une instruction pour excution
Synopsis
PREPARE nom [ (type_donnes [, ...] ) ] AS instruction
Description
PREPARE cre une instruction prpare. Une instruction prpare est un objet ct serveur qui peut tre utilis pour optimiser
les performances. Quand l'instruction PREPARE est excute, l'instruction spcifie est analyse, rcrite et planifie. Quand
une commande EXECUTE est lance par la suite, l'instruction prpare a seulement besoin d'tre excute. Du coup, les tapes
d'analyse, de rcriture et de planification sont ralises une seule fois, la place de chaque fois que l'instruction est excute.
Les instructions prpares peuvent prendre des paramtres : les valeurs sont substitues dans l'instruction lorsqu'elle est excute. Lors de la cration de l'instruction prpare, faites rfrence aux paramtres suivant leur position, $1, $2, etc. Une liste correspondante des types de donnes des paramtres peut tre spcifie si vous le souhaitez. Quand le type de donne d'un paramtre n'est pas indiqu ou est dclar comme inconnu (unknown), le type est infr partir du contexte dans lequel le paramtre est utilis (si possible). Lors de l'excution de l'instruction, indiquez les valeurs relles de ces paramtres dans l'instruction
EXECUTE. Rfrez-vous EXECUTE(7) pour plus d'informations ce sujet.
Les instructions prpares sont seulement stockes pour la dure de la session en cours. Lorsque la session se termine,
l'instruction prpare est oublie et, du coup, elle doit tre recre avant d'tre utilise de nouveau. Ceci signifie aussi qu'une
seule instruction prpare ne peut pas tre utilise par plusieurs clients de bases de donnes simultanment ; nanmoins, chaque
client peut crer sa propre instruction prpare utiliser. L'instruction prpare peut tre supprims manuellement en utilisant la
commande DEALLOCATE(7).
Les instructions prpares sont principalement intressantes quand une seule session est utilise pour excuter un grand nombre
d'instructions similaires. La diffrence de performances est particulirement significative si les instructions sont complexes
planifier ou rcrire, par exemple, si la requte implique une jointure de plusieurs tables ou requiert l'application de diffrentes
rgles. Si l'instruction est relativement simple planifier ou rcrire mais assez coteuse excuter, l'avantage de performance
des instructions prpares est moins net.
Paramtres
nom
Un nom quelconque donn cette instruction prpare particulire. Il doit tre unique dans une session et est utilis par la
suite pour excuter ou dsallouer cette instruction prpare.
type_donnes
Le type de donnes d'un paramtre de l'instruction prpare. Si le type de donnes d'un paramtre particulier n'est pas spcifi ou est spcifi comme tant inconnu (unknown), il sera inferr partir du contexte dans lequel le paramtre est utilis.
Pour rfrencer les paramtres de l'instruction prpare, utilisez $1, $2, etc.
instruction
Toute instruction SELECT, INSERT, UPDATE, DELETE ou VALUES.
Notes
Dans certaines situations, le plan de requte produit par une instruction prpare est infrieur au plan qui aurait t produit si
l'instruction avait t soumise et excute normalement. C'est parce que, quand l'instruction est planifie et que le planificateur
tente de dterminer le plan de requte optimal, les valeurs relles de tous les paramtres spcifis dans l'instruction ne sont pas
disponibles. PostgreSQL rcupre les statistiques de la distribution des donnes dans la table et peut utiliser les valeurs
constantes dans une instruction pour deviner le rsultat probable de l'excution de l'instruction. Comme cette donne n'est pas
disponible lors de la planification d'instructions prpares avec paramtres, le plan choisi pourrait ne pas tre optimal. Pour examiner le plan de requte que PostgreSQL a choisi pour une instruction prpare, utilisez EXPLAIN(7).
Pour plus d'informations sur la planification de la requte et les statistiques rcupres par PostgreSQL dans ce but, voir la
documentation de ANALYZE(7).
Vous pouvez voir toutes les instructions prpares disponibles d'une session en excutant une requte sur la vue systme
pg_prepared_statements.
1082
PREPARE
Exemples
Cre une instruction prpare pour une instruction INSERT, puis l'excute :
PREPARE fooplan (int, text, bool, numeric) AS
INSERT INTO foo VALUES($1, $2, $3, $4);
EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);
Cre une instruction prpare pour une instruction SELECT, puis l'excute :
PREPARE usrrptplan (int) AS
SELECT * FROM users u, logs l WHERE u.usrid=$1 AND u.usrid=l.usrid
AND l.date = $2;
EXECUTE usrrptplan(1, current_date);
Note that the data type of the second parameter is not specified, so it is inferred from the context in which $2 is used.
Compatibilit
Le standard SQL inclut une instruction PREPARE mais il est seulement utilis en SQL embarqu. Cette version de l'instruction
PREPARE utilise aussi une syntaxe quelque peu diffrente.
Voir aussi
DEALLOCATE(7), EXECUTE(7)
1083
Nom
PREPARE TRANSACTION prpare la transaction en cours pour une validation en deux phases
Synopsis
PREPARE TRANSACTION id_transaction
Description
PREPARE TRANSACTION prpare la transaction courante en vue d'une validation en deux phases. la suite de cette commande, la transaction n'est plus associe la session courante ; au lieu de cela, son tat est entirement stock sur disque. La
probabilit est donc forte qu'elle puisse tre valide avec succs, y compris en cas d'arrt brutal de la base de donnes avant la
demande de validation.
Une fois prpare, une transaction peut tre valide ou annule ultrieurement par, respectivement, COMMIT PREPARED(7) et
ROLLBACK PREPARED(7). Ces commandes peuvent tre excutes partir d'une session quelconque. Il n'est pas ncessaire
de le faire depuis celle qui a excut la transaction initiale.
Du point de vue de la session l'initiant, PREPARE TRANSACTION diffre peu de la commande ROLLBACK : aprs son
excution, il n'y a plus de transaction active et les effets de la transaction prpare ne sont plus visibles. (Les effets redeviendront visibles si la transaction est valide.)
Si la commande PREPARE TRANSACTION choue, quelqu'en soit la raison, elle devient une commande ROLLBACK : la
transaction courante est annule.
Paramtres
id_transaction
Un identifiant arbitraire de la transaction pour les commandes COMMIT PREPARED et ROLLBACK PREPARED.
L'identifiant, obligatoirement de type chane littrale, doit tre d'une longueur infrieure 200 octets. Il ne peut tre identique un autre identifiant de transaction prpare.
Notes
PREPARE TRANSACTION n'a pas pour but d'tre utilis dans des applications ou des sessions interactives. Son but est de
permettre un gestionnaire de transactions externe pour raliser des transactions globales atomiques au travers de plusieurs
bases de donnes ou de ressources transactionnelles. Sauf si vous crivez un gestionnaire de transactions, vous ne devriez probablement pas utiliser PREPARE TRANSACTION.
Cette commande doit tre utilise dans un bloc de transaction, initi par BEGIN(7).
Il n'est actuellement pas possible de prparer (PREPARE) une transaction qui a excut des oprations impliquant des tables
temporaires ou qui a cr des curseurs WITH HOLD, ou qui a excut LISTEN ou UNLISTEN. Ces fonctionnalits sont trop
intgres la session en cours pour avoir la moindre utilit dans une transaction prpare.
Si la transaction a modifi des paramtres en excution l'aide de la commande SET (sans l'option LOCAL), ces effets persistent
au-del du PREPARE TRANSACTION et ne seront pas affects par les commandes COMMIT PREPARED et ROLLBACK PREPARED. Du coup, dans ce cas, PREPARE TRANSACTION agit plus comme COMMIT que comme ROLLBACK.
Toutes les transactions prpares disponibles sont listes dans la vue systme pg_prepared_xacts.
Attention
Il est prfrable de ne pas conserver trop longtemps des transactions prpares dans cet tat ; cela compromet, par
exemple, les possibilits de rcupration de l'espace par VACUUM, et dans certains cas extrmes peut causer
l'arrt de la base de donnes pour empcher une rutilisation d'identifiants de transactions (voir Section 23.1.4,
viter les cycles des identifiants de transactions ). Il ne faut pas oublier non plus qu'une telle transaction maintient les verrous qu'elle a pos. L'usage principal de cette fonctionnalit consiste valider ou annuler une transaction prpare ds lors qu'un gestionnaire de transactions externe a pu s'assurer que les autres bases de donnes
sont prpares la validation.
Si vous n'avez pas configur un gestionnaire de transactions externe pour grer les transactions prpares et vous
1084
PREPARE TRANSACTION
assurer qu'elles sont fermes rapidement, il est prfrable de dsactiver la fonctionnalit des transactions prpares
en configurant max_prepared_transactions zro. Ceci empchera toute cration accidentelle de transactions prpares qui pourraient alors tre oublies, ce qui finira par causer des problmes.
Exemples
Prparer la transaction en cours pour une validation en deux phases en utilisant foobar comme identifiant de transaction :
PREPARE TRANSACTION 'foobar';
Voir aussi
COMMIT PREPARED(7), ROLLBACK PREPARED(7)
1085
Nom
REASSIGN OWNED Modifier le propritaire de tous les objets de la base appartenant un rle spcifique
Synopsis
REASSIGN OWNED BY ancien_rle [, ...] TO nouveau_rle
Description
REASSIGN OWNED demande au systme de changer le propritaire certains objets de la base. Les objets appartenant ancien_rle auront ensuite comme propritaire nouveau_rle.
Paramtres
ancien_rle
Le nom d'un rle. Tous les objets de la base appartenant ce rle seront la proprit de nouveau_rle.
nouveau_rle
Le nom du rle qui sera le nouveau propritaire des objets affects.
Notes
REASSIGN OWNED est souvent utilis pour prparer la suppression de un ou plusieurs rles. Comme REASSIGN OWNED touche seulement les objets de la base o l'utilisateur est connect, il est gnralement ncessaire d'excuter cette commande pour chaque base contenant des objets dont le rle supprimer est propritaire.
REASSIGN OWNED ncessite des droits sur le rle source et sur le rle cible.
La commande DROP OWNED(7) est une alternative qui supprime tous les objets de la base possds par un ou plusieurs rles.
Notez aussi que DROP OWNED ncessite seulement des droits sur le rle source.
La commande REASSIGN OWNED ne modifie pas les droits donns ancien_rle pour les objets dont il n'est pas propritaire. Utilisez DROP OWNED pour supprimer ces droits.
La commande REASSIGN OWNED ne modifie pas le propritaire des bases de donnes, mme si le rle est en propritaire.
Utilisez ALTER DATABASE(7) pour modifier le propritaire des bases de donnes.
Compatibilit
L'instruction REASSIGN OWNED est une extension PostgreSQL.
Voir aussi
DROP OWNED(7), DROP ROLE(7), ALTER DATABASE(7)
1086
Nom
REINDEX reconstruit les index
Synopsis
REINDEX { INDEX | TABLE | DATABASE | SYSTEM } nom [ FORCE ]
Description
REINDEX reconstruit un index en utilisant les donnes stockes dans la table, remplaant l'ancienne copie de l'index. Il y a plusieurs raisons pour utiliser REINDEX :
Un index a t corrompu et ne contient plus de donnes valides. Bien qu'en thorie, ceci ne devrait jamais arriver, en pratique, les index peuvent se corrompre cause de bogues dans le logiciel ou d'checs matriels. REINDEX fournit une mthode de rcupration.
L'index en question a explos , c'est--dire qu'il contient beaucoup de pages d'index mortes ou presque mortes. Ceci peut
arriver avec des index B-tree dans PostgreSQL sous certains modles d'accs inhabituels. REINDEX fournit un moyen de
rduire la consommation d'espace de l'index en crivant une nouvelle version de l'index sans les pages mortes. Voir Section 23.2, R-indexation rgulire pour plus d'informations.
Vous avez modifi un paramtre de stockage (par exemple, fillfactor) pour un index et vous souhaitez vous assurer que la
modification a t prise en compte.
La construction d'un index avec l'option CONCURRENTLY a chou, laissant un index invalide . De tels index sont inutiles donc il est intressant d'utiliser REINDEX pour les reconstruire. Notez que REINDEX n'excutera pas une construction en parallle. Pour construire l'index sans interfrer avec le systme en production, vous devez supprimer l'index et rexcuter la commande CREATE INDEX CONCURRENTLY.
Paramtres
INDEX
Recre l'index spcifi.
TABLE
Recre tous les index de la table spcifie. Si la table a une seconde table TOAST , elle est aussi rindexe.
DATABASE
Recre tous les index de la base de donnes en cours. Les index sur les catalogues systme partags sont aussi traits. Cette
forme de REINDEX ne peut pas tre excut l'intrieur d'un bloc de transaction.
SYSTEM
Recre tous les index des catalogues systme l'intrieur de la base de donnes en cours. Les index sur les catalogues systme partags sont aussi inclus. Les index des tables utilisateur ne sont pas traits. Cette forme de REINDEX ne peut pas
tre excut l'intrieur d'un bloc de transaction.
nom
Le nom de l'index, de la table ou de la base de donnes spcifique rindexer. Les noms de table et d'index peuvent tre
qualifis du nom du schma. Actuellement, REINDEX DATABASE et REINDEX SYSTEM ne peuvent rindexer que la
base de donnes en cours, donc ce paramtre doit correspondre au nom de la base de donnes en cours.
FORCE
Ceci est une option obsolte ; elle sera ignore si celle-ci est spcifie.
Notes
Si vous suspectez la corruption d'un index sur une table utilisateur, vous pouvez simplement reconstruire cet index, ou tous les
index de la table, en utilisant REINDEX INDEX ou REINDEX TABLE.
Les choses sont plus difficiles si vous avez besoin de rcuprer la corruption d'un index sur une table systme. Dans ce cas, il est
important pour le systme de ne pas avoir utilis lui-mme un des index suspects. (En fait, dans ce type de scnario, vous pourriez constater que les processus serveur s'arrtent brutalement au lancement du service, en cause l'utilisation des index corrompus.) Pour rcuprer proprement, le serveur doit tre lanc avec l'option -P, qui inhibe l'utilisation des index pour les recherches
1087
REINDEX
Exemples
Reconstruit un index simple :
REINDEX INDEX my_index;
Recre les index sur la table ma_table :
REINDEX TABLE ma_table;
Reconstruit tous les index d'une base de donnes particulire sans faire confiance la validit des index systme :
$ export PGOPTIONS="-P"
$ psql broken_db
...
broken_db=> REINDEX DATABASE broken_db;
broken_db=> \q
Compatibilit
Il n'existe pas de commande REINDEX dans le standard SQL.
1088
Nom
RELEASE SAVEPOINT dtruit un point de sauvegarde prcdemment dfini
Synopsis
RELEASE [ SAVEPOINT ] nom_pointsauvegarde
Description
RELEASE SAVEPOINT dtruit un point de sauvegarde dfini prcdemment dans la transaction courante.
La destruction d'un point de sauvegarde le rend indisponible comme point de retour. C'est, pour l'utilisateur, le seul comportement visible. Elle ne dfait pas les commandes excutes aprs l'tablissement du point de sauvegarde (pour cela, voir ROLLBACK TO SAVEPOINT(7)). Dtruire un point de sauvegarde quand il n'est plus ncessaire peut permettre au systme de rcuprer certaines ressources sans attendre la fin de la transaction.
RELEASE SAVEPOINT dtruit aussi tous les points de sauvegarde crs ultrieurement au point de sauvegarde indiqu.
Paramtres
nom_pointsauvegarde
Le nom du point de sauvegarde dtruire.
Notes
Spcifier un nom de point de sauvegarde qui n'a pas t dfini est une erreur.
Il n'est pas possible de librer un point de sauvegarde lorsque la transaction est dans un tat d'annulation.
Si plusieurs points de transaction ont le mme nom, seul le plus rcent est libr.
Exemples
Pour tablir puis dtruire un point de sauvegarde :
BEGIN;
INSERT INTO table1 VALUES (3);
SAVEPOINT mon_pointsauvegarde;
INSERT INTO table1 VALUES (4);
RELEASE SAVEPOINT mon_pointsauvegarde;
COMMIT;
La transaction ci-dessus insre la fois 3 et 4.
Compatibilit
Cette commande est conforme au standard SQL. Le standard impose le mot cl SAVEPOINT mais PostgreSQL autorise son
omission.
Voir aussi
BEGIN(7), COMMIT(7), ROLLBACK(7), ROLLBACK TO SAVEPOINT(7), SAVEPOINT(7)
1089
Nom
RESET reinitialise un paramtre d'excution sa valeur par dfaut
Synopsis
RESET paramtre_configuration
RESET ALL
Description
RESET rinitialise les paramtres d'excution leur valeur par dfaut. RESET est une alternative
SET paramtre_configuration TO DEFAULT
On pourra se rfrer SET(7) pour plus de dtails.
La valeur par dfaut est dfinie comme la valeur qu'aurait la variable si aucune commande SET n'avait modifi sa valeur pour la
session en cours. La source effective de cette valeur peut tre dans les valeurs par dfaut compiles, le fichier de configuration,
les options de la ligne de commande ou les paramtrages spcifiques la base de donnes ou l'utilisateur. Ceci est subtilement
diffrent de le dfinir comme la valeur qu'a le paramtre au lancement de la session parce que, si la valeur provenait du fichier de configuration, elle sera annule par ce qui est spcifi maintenant dans le ficher deconfiguration. Voir Chapitre 18,
Configuration du serveur pour les dtails.
Le comportement transactionnel de RESET est identique celui de la commande SET : son effet sera annule par une annulation de la transaction.
Paramtres
paramtre_configuration
Nom d'un paramtre configurable. Les paramtres disponibles sont documents dans Chapitre 18, Configuration du serveur
et sur la page de rfrence SET(7).
ALL
Rinitialise tous les paramtres configurables l'excution.
Exemples
Pour rinitialiser timezone :
RESET timezone;
Compatibilit
RESET est une extension de PostgreSQL.
Voir aussi
SET(7), SHOW(7)
1090
Nom
REVOKE supprime les droits d'accs
Synopsis
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[, ...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] nom_table [, ...]
| ALL TABLES IN SCHEMA nom_schma [, ...] }
FROM { [ GROUP ] nom_rle | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | REFERENCES } ( colonne [, ...] )
[, ...] | ALL [ PRIVILEGES ] ( colonne [, ...] ) }
ON [ TABLE ] nom_table [, ...]
FROM { [ GROUP ] nom_rle | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { USAGE | SELECT | UPDATE }
[, ...] | ALL [ PRIVILEGES ] }
ON { SEQUENCE nom_squence [, ...]
| ALL SEQUENCES IN SCHEMA nom_schma [, ...] }
FROM { [ GROUP ] nom_rle | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE nom_base [, ...]
FROM { [ GROUP ] nom_rle | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN DATA WRAPPER nom_fdw [, ...]
FROM { [ GROUP ] nom_rle | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN SERVER nom_serveur [, ...]
FROM { [ GROUP ] nom_rle | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ EXECUTE | ALL [ PRIVILEGES ] }
ON { FUNCTION nom_fonction ( [ [ mode_arg ] [ nom_arg ] type_arg [, ...] ] ) [,
...]
| ALL FUNCTIONS IN SCHEMA nom_schma [, ...] }
FROM { [ GROUP ] nom_rle | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ USAGE | ALL [ PRIVILEGES ] }
ON LANGUAGE nom_lang [, ...]
FROM { [ GROUP ] nom_rle | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
ON LARGE OBJECT loid [, ...]
FROM { [ GROUP ] nom_rle | PUBLIC } [, ...]
[ CASCADE | RESTRICT ]
REVOKE [ GRANT OPTION FOR ]
1091
REVOKE
Description
La commande REVOKE retire des droits prcdemment attribus un ou plusieurs rles. Le mot cl PUBLIC fait rfrence au
groupe implicitement dfini de tous les rles.
Voir la description de la commande GRANT(7) pour connatre la signification des types de droits.
Notez qu'un rle possde la somme des droits qui lui ont t donns directement, des droits qui ont t donns un rle dont il est
membre et des droits donns PUBLIC. Du coup, par exemple, retirer les droits de SELECT PUBLIC ne veut pas ncessairement dire que plus aucun rle n'a le droit de faire de SELECT sur l'objet : ceux qui en avaient obtenu le droit directement ou via
un autre rle l'ont toujours. De mme, rvoquer SELECT d'un utilisateur ne l'empchera peut-tre pas d'utiliser SELECT si PUBLIC ou un autre de ses rle a toujours les droits SELECT.
Si GRANT OPTION FOR est prcis, seul l'option de transmission de droit (grant option) est supprime, pas le droit lui mme.
Sinon, le droit et l'option de transmission de droits sont rvoqus.
Si un utilisateur dtient un privilge avec le droit de le transmettre, et qu'il l'a transmis d'autres utilisateurs, alors les droits de
ceux-ci sont appels des droits dpendants. Si les droits ou le droit de transmettre du premier utilisateur sont supprims, et que des
droits dpendants existent, alors ces droits dpendants sont aussi supprims si l'option CASCADE est utilise. Dans le cas
contraire, la suppression de droits est refuse. Cette rvocation rcursive n'affecte que les droits qui avaient t attribus travers
une chane d'utilisateurs traable jusqu' l'utilisateur qui subit la commande REVOKE. Du coup, les utilisateurs affects peuvent finalement garder le droit s'il avait aussi t attribu via d'autres utilisateurs.
En cas de rvocation des droits sur une table, les droits sur les colonnes correspondantes (s'il y en a) sont automatiquement rvoqus pour toutes les colonnes de la table en mme temps.
Lors de la rvocation de l'appartenance d'un rle, GRANT OPTION est appel ADMIN OPTION mais le comportement est similaire. Notez aussi que cette forme de la commande ne permet pas le mot GROUP.
Notes
Utilisez la commande \dp de psql(1) pour afficher les droits donns sur des tables et colonnes. Voir GRANT(7) pour plus
d'informations sur le format. Pour les objets qui ne sont pas des tables, il existe d'autres commandes \d qui peuvent afficher leurs
droits.
Un utilisateur ne peut rvoquer que les droits qu'il a donns directement. Si, par exemple, un utilisateur A a donn un droit et la
possibilit de le transmettre un utilisateur B, et que B son tour l'a donn C, alors A ne peut pas retirer directement le droit de
C. la place, il peut supprimer le droit de transmettre B et utiliser l'option CASCADE pour que le droit soit automatiquement
supprim C. Autre exemple, si A et B ont donn le mme droit C, A peut rvoquer son propre don de droit mais pas celui de B,
donc C dispose toujours de ce droit.
Lorsqu'un utilisateur, non propritaire de l'objet, essaie de rvoquer (REVOKE) des droits sur l'objet, la commande choue si
l'utilisateur n'a aucun droit sur l'objet. Tant que certains droits sont disponibles, la commande s'excute mais ne sont supprims
que les droits dont l'utilisateur a l'option de transmission. La forme REVOKE ALL PRIVILEGES affiche un message
d'avertissement si les options de transmissions pour un des droits nomms spcifiquement dans la commande ne sont pas possds. (En principe, ces instructions s'appliquent aussi au propritaire de l'objet mais comme le propritaire est toujours trait
comme celui dtenant toutes les options de transmission, ces cas n'arrivent jamais.)
Si un superutilisateur choisit d'excuter une commande GRANT ou REVOKE, la commande est excute comme si elle tait lance par le propritaire de l'objet affect. Comme tous les droits proviennent du propritaire d'un objet (directement ou via une
chane de transmissions de droits), un superutilisateur peut supprimer tous les droits sur un objet mais cela peut ncessiter
l'utilisation de CASCADE comme expliqu prcdemment.
REVOKE peut aussi tre effectu par un rle qui n'est pas le propritaire de l'objet affect mais qui est un membre du rle qui
1092
REVOKE
possde l'objet ou qui est un membre d'un rle qui dtient les droits WITH GRANT OPTION sur cet objet. Dans ce cas, la commande est excute comme si elle avait t excute par le rle qui possde rellement l'objet ou dtient les droits WITH GRANT
OPTION. Par exemple, si la table t1 est possde par le rle g1, dont le rle u1 est membre, alors u1 peut supprimer des droits
sur t1 qui sont enregistrs comme donns par g1. Ceci incluera les dons de droits effectus par u1 ainsi que ceux effectus par
les autres membres du rle g1.
Si le rle excutant REVOKE dtient les droits indirectement via plus d'un chemin d'appartenance, le rle indiqu comme ayant
effectu la commande est non dterminable l'avance. Dans de tels cas, il est prfrable d'utiliser SET ROLE pour devenir le rle
que vous souhaitez voir excuter la commande REVOKE. Ne pas faire cela peut avoir comme rsultat de supprimer des droits
autres que ceux que vous vouliez, voire mme de ne rien supprimer du tout.
Exemples
Enlve au groupe public le droit d'insrer des lignes dans la table films :
REVOKE INSERT ON films FROM PUBLIC;
Supprime tous les droits de l'utilisateur manuel sur la vue genres :
REVOKE ALL PRIVILEGES ON genres FROM manuel;
Notez que ceci signifie en fait rvoque tous les droits que j'ai donn .
Supprime l'appartenance de l'utilisateur joe au rle admins :
REVOKE admins FROM joe;
Compatibilit
La note de compatibilit de la commande GRANT(7) s'applique par analogie REVOKE. Les mots cls RESTRICT ou CASCADE sont requis d'aprs le standard, mais PostgreSQL utilise RESTRICT par dfaut.
Voir aussi
GRANT(7)
1093
Nom
ROLLBACK annule la transaction en cours
Synopsis
ROLLBACK [ WORK | TRANSACTION ]
Description
ROLLBACK annule la transaction en cours et toutes les modifications effectues lors de cette transaction.
Paramtres
WORK, TRANSACTION
Mots cls optionnels. Ils sont sans effet.
Notes
L'utilisation de la commande COMMIT(7) permet de terminer une transaction avec succs.
Lancer ROLLBACK en dehors de toute transaction n'a pas d'autre consquence que l'affichage d'un message d'avertissement.
Exemples
Pour annuler toutes les modifications :
ROLLBACK;
Compatibilit
Le standard SQL spcifie seulement les deux formes ROLLBACK et ROLLBACK WORK. part cela, cette commande est totalement compatible.
Voir aussi
BEGIN(7), COMMIT(7), ROLLBACK TO SAVEPOINT(7)
1094
Nom
ROLLBACK PREPARED annule une transaction prcdemment prpare en vue d'une validation en deux phases
Synopsis
ROLLBACK PREPARED id_transaction
Description
ROLLBACK PREPARED annule une transaction prpare.
Paramtres
id_transaction
L'identifiant de la transaction annuler.
Notes
Pour annuler une transaction prpare, il est impratif d'tre soit l'utilisateur qui a initi la transaction, soit un superutilisateur. Il
n'est, en revanche, pas ncessaire d'tre dans la session qui a initi la transaction.
Cette commande ne peut pas tre excute l'intrieur d'un bloc de transaction. La transaction prpare est annule immdiatement.
Toutes les transactions prpares disponibles sont listes dans la vue systme pg_prepared_xacts.
Exemples
Annuler la transaction identifie par foobar :
ROLLBACK PREPARED 'foobar';
Voir aussi
PREPARE TRANSACTION(7), COMMIT PREPARED(7)
1095
Nom
ROLLBACK TO SAVEPOINT annule les instructions jusqu'au point de sauvegarde
Synopsis
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] nom_pointsauvegarde
Description
Annule toutes les commandes qui ont t excutes aprs l'tablissement du point de sauvegarde. Le point de sauvegarde reste
valide. Il est possible d'y d'y revenir encore si cela s'avrait ncessaire.
ROLLBACK TO SAVEPOINT dtruit implicitement tous les points de sauvegarde tablis aprs le point de sauvegarde indiqu.
Paramtres
nom_pointsauvegarde
Le point de sauvegarde o retourner.
Notes
RELEASE SAVEPOINT(7) est utilis pour dtruire un point de sauvegarde sans annuler les effets de commandes excutes
aprs son tablissement.
Spcifier un nom de point de sauvegarde inexistant est une erreur.
Les curseurs ont un comportement quelque peu non transactionnel en ce qui concerne les points de sauvegarde. Tout curseur ouvert l'intrieur d'un point de sauvegarde est ferm lorsque le point de sauvegarde est rejoint. Si un curseur prcdemment ouvert est affect par une commande FETCH ou MOVE l'intrieur d'un point de sauvegarde rejoint par la suite, la position du
curseur reste celle obtenue par FETCH (c'est--dire que le dplacement du curseur d au FETCH n'est pas annul). La fermeture d'un curseur n'est pas non plus remise en cause par une annulation. Nanmoins, certains effets de bord causs par la requte
du curseur (comme les effets de bord des fonctions volatiles appeles par la requte) sont annuls s'ils surviennent lors d'un
point de sauvegarde qui est annul plus tard. Un curseur dont l'excution provoque l'annulation d'une transaction est plac dans
un tat non excutable. De ce fait, alors mme que la transaction peut tre restaure par ROLLBACK TO SAVEPOINT, le
curseur ne peut plus tre utilis.
Exemples
Pour annuler les effets des commandes excutes aprs l'tablissement de mon_pointsauvegarde :
ROLLBACK TO SAVEPOINT mon_pointsauvegarde;
La position d'un curseur n'est pas affecte par l'annulation des points de sauvegarde :
BEGIN;
DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2;
SAVEPOINT foo;
FETCH 1 FROM foo;
?column?
---------1
ROLLBACK TO SAVEPOINT foo;
FETCH 1 FROM foo;
?column?
---------2
COMMIT;
1096
ROLLBACK TO SAVEPOINT
Compatibilit
Le standard SQL spcifie que le mot cl SAVEPOINT est obligatoire mais PostgreSQL et Oracle autorisent son omission.
SQL n'autorise que WORK, pas TRANSACTION, aprs ROLLBACK. De plus, SQL dispose d'une clause optionnelle AND [ NO ]
CHAIN qui n'est actuellement pas supporte par PostgreSQL. Pour le reste, cette commande est conforme au standard SQL.
Voir aussi
BEGIN(7), COMMIT(7), RELEASE SAVEPOINT(7), ROLLBACK(7), SAVEPOINT(7)
1097
Nom
SAVEPOINT dfinit un nouveau point de sauvegarde l'intrieur de la transaction en cours
Synopsis
SAVEPOINT nom_pointsauvegarde
Description
SAVEPOINT tablit un nouveau point de sauvegarde l'intrieur de la transaction en cours.
Un point de sauvegarde est une marque spciale l'intrieur d'une transaction qui autorise l'annulation de toutes les commandes
excutes aprs son tablissement, restaurant la transaction dans l'tat o elle tait au moment de l'tablissement du point de sauvegarde.
Paramtres
nom_pointsauvegarde
Le nom du nouveau point de sauvegarde.
Notes
Utilisez ROLLBACK TO SAVEPOINT(7) pour annuler un point de sauvegarde. Utilisez RELEASE SAVEPOINT(7) pour dtruire un point de sauvegarde, conservant l'effet des commandes excutes aprs son tablissement.
Les points de sauvegarde peuvent seulement tre tablis l'intrieur d'un bloc de transaction. Plusieurs points de sauvegarde
peuvent tre dfinis dans une transaction.
Exemples
Pour tablir un point de sauvegarde et annuler plus tard les effets des commandes excutes aprs son tablissement :
BEGIN;
INSERT INTO table1 VALUES (1);
SAVEPOINT mon_pointsauvegarde;
INSERT INTO table1 VALUES (2);
ROLLBACK TO SAVEPOINT mon_pointsauvegarde;
INSERT INTO table1 VALUES (3);
COMMIT;
La transaction ci-dessus insre les valeurs 1 et 3, mais pas 2.
Pour tablir puis dtruire un point de sauvegarde :
BEGIN;
INSERT INTO table1 VALUES (3);
SAVEPOINT mon_pointsauvegarde;
INSERT INTO table1 VALUES (4);
RELEASE SAVEPOINT mon_pointsauvegarde;
COMMIT;
La transaction ci-dessus insre la fois les valeurs 3 et 4.
Compatibilit
SQL requiert la destruction automatique d'un point de sauvegarde quand un autre point de sauvegarde du mme nom est cr.
Avec PostgreSQL, l'ancien point de sauvegarde est conserv, mais seul le plus rcent est utilis pour une annulation ou une libration. (Librer avec RELEASE SAVEPOINT le point de sauvegarde le plus rcent fait que l'ancien est de nouveau accessible aux commandes ROLLBACK TO SAVEPOINT et RELEASE SAVEPOINT.) Sinon, SAVEPOINT est totalement
conforme SQL.
Voir aussi
BEGIN(7), COMMIT(7), RELEASE SAVEPOINT(7), ROLLBACK(7), ROLLBACK TO SAVEPOINT(7)
1098
Nom
SECURITY LABEL Dfinir ou modifier une label de scurit applique un objet
Synopsis
SECURITY LABEL [ FOR fournisseur ] ON
{
TABLE nom_objet |
COLUMN nom_table.nom_colonne |
AGGREGATE nom_aggrgat (type_aggrgat [, ...] ) |
DOMAIN nom_objet |
FOREIGN TABLE nom_objet
FUNCTION nom_fonction ( [ [ mode_arg ] [ nom_arg ] type_arg [, ...] ] ) |
LARGE OBJECT oid_large_objet |
[ PROCEDURAL ] LANGUAGE nom_objet |
SCHEMA nom_objet |
SEQUENCE nom_objet |
TYPE nom_objet |
VIEW nom_objet
} IS 'label'
Description
SECURITY LABEL applique un label de scurit un objet de la base de donnes. Un nombre arbitraire de labels de scurit,
un par fournisseur d'labels, peut tre associ un objet donn de la base. Les fournisseurs de labels sont des modules dynamiques qui s'enregistrent eux-mmes en utilisant la fonction register_label_provider.
Note
register_label_provider n'est pas une fonction SQL ; elle ne peut tre appele que depuis du code C
charg et excut au sein du serveur.
Le fournisseur de labels dtermine si un label donn est valide, et dans quelle mesure il est permis de l'appliquer un objet donn. Le sens des labels est galement laiss la discrtion du fournisseur d'labels. PostgreSQL n'impose aucune restriction
quant l'interprtation que peut faire un fournisseur d'un label donn, se contentant simplement d'offrir un mcanisme de stockage de ces labels. En pratique, il s'agit de permettre l'intgration de systmes de contrles d'accs obligatoires (en anglais,
mandatory access control ou MAC) tels que SE-Linux. De tels systmes fondent leurs autorisations d'accs sur des labels appliqus aux objets, contrairement aux systmes traditionnels d'autorisations d'accs discrtionnaires (en anglais, discretionary
access control ou DAC) gnralement bass sur des concepts tels que les utilisateurs et les groupes.
Paramtres
nom_objet, nom_table.nom_colonne, nom_aggr, nom_fonction
Le nom de l'objet. Ce sont les noms des tables, aggrgats, domaines, tables distantes, fonctions, squences, types et vues qui
peuvent tre qualifis du nom de schma.
fournisseur
Le nom du fournisseur auquel le label est associ. Le fournisseur dsign doit tre charg et accepter l'opration qui lui est
propose. Si un seul et unique fournisseur est charg, le nom du fournisseur peut tre omis par soucis de concision.
type_arg
Le type de donne en entre sur lequel la fonction d'aggrgation doit oprer. Pour rfrencer une fonction d'aggrgation
sans argument, il convient d'crire * en guise de liste de types de donnes.
mode_arg
Le mode d'un argument de fonction : IN, OUT, INOUT ou VARIADIC. Si le mode est omis, le mode par dfaut IN est alors
appliqu. noter que SECURITY LABEL ON FUNCTION ne porte actuellement pas sur les arguments de mode OUT
dans la mesure o seuls les arguments fournis en entre sont ncessaires l'identification d'une fonction. Il suffit donc de
lister les arguments IN, INOUT, et VARIADIC afin d'identifier sans ambigut une fonction.
nom_arg
Le nom d'un argument de fonction. noter que SECURITY LABEL ON FUNCTION ne porte actuellement pas sur les
1099
SECURITY LABEL
nom des arguments fournis aux fonctions dans la mesure o seul le type des arguments est ncessaire l'identification d'une
fonction.
type_arg
Le ou les types de donnes des arguments des fonctions, si elles en comportent, ventuellement qualifis du nom de schma.
oid_large_objet
L'OID de l'objet large.
PROCEDURAL
Qualificatif optionnel du langage, peut tre omis.
label
Le nom du label affecter, fourni sous la forme d'une chaine littrale ou NULL pour supprimer un label de scurit prcdemment affect.
Exemples
L'exemple suivant montre comment modifier le label de scurit d'une table.
SECURITY LABEL FOR selinux ON TABLE matable IS 'system_u:object_r:sepgsql_table_t:s0';
Compatibilit
La commande SECURITY LABEL n'existe pas dans le standard SQL.
Voir aussi
sepgsql, dummy_seclabel
1100
Nom
SELECT, TABLE, WITH rcupre des lignes d'une table ou d'une vue
Synopsis
[ WITH [ RECURSIVE ] requte_with [, ...] ]
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
* | expression [ [ AS ] nom_d_affichage ] [, ...]
[ FROM lments_from [, ...] ]
[ WHERE condition ]
[ GROUP BY expression [, ...] ]
[ HAVING condition [, ...] ]
[ WINDOW nom_window AS ( dfinition_window ) [, ...] ]
[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
[ ORDER BY expression [ ASC | DESC | USING oprateur ] [ NULLS { FIRST | LAST } ]
[, ...] ]
[ LIMIT { nombre | ALL } ]
[ OFFSET dbut ] [ ROW | ROWS ] ]
[ FETCH { FIRST | NEXT } [ total ] { ROW | ROWS } ONLY ]
[ FOR { UPDATE | SHARE } [ OF nom_table [, ...] ] [ NOWAIT ] [...] ]
avec lments_from qui peut tre :
[ ONLY ] nom_table [ * ] [ [ AS ] alias [ ( alias_colonne [, ...] ) ] ]
( select ) [ AS ] alias [ ( alias_colonne [, ...] ) ]
nom_requte_with [ [ AS ] alias [ ( alias_colonne [, ...] ) ] ]
nom_fonction ( [ argument [, ...] ] ) [ AS ] alias [ ( alias_colonne [, ...] |
dfinition_colonne [, ...] ) ]
nom_fonction ( [ argument [, ...] ] ) AS ( dfinition_colonne [, ...] )
lments_from [ NATURAL ] type_jointure lments_from [ ON condition_jointure |
USING ( colonne_jointure [, ...] ) ]
et requte_with est :
nom_requte_with [ ( nom_colonne [, ...] ) ] AS ( select | insert | update |
delete )
TABLE [ ONLY ] nom_table [ * ]
Description
SELECT rcupre des lignes de zro ou plusieurs tables. Le traitement gnral de SELECT est le suivant :
1. Toutes les requtes dans la liste WITH sont values. Elles jouent le rle de tables temporaires qui peuvent tre rfrences
dans la liste FROM. Une requte WITH qui est rfrence plus d'une fois dans FROM n'est calcule qu'une fois (voir la section
intitule Clause WITH ci-dessous).
2. Tous les lments de la liste FROM sont calculs. (Chaque lment dans la liste FROM est une table relle ou virtuelle.) Si
plus d'un lment sont spcifis dans la liste FROM, ils font l'objet d'une jointure croise (cross-join). (Voir la section intitule
Clause FROM ci-dessous.)
3. Si la clause WHERE est spcifie, toutes les lignes qui ne satisfont pas les conditions sont limines de l'affichage. (Voir la
section intitule Clause WHERE ci-dessous.)
4. Si la clause GROUP BY est spcifie, l'affichage est divis en groupes de lignes qui correspondent une ou plusieurs valeurs.
Si la clause HAVING est prsente, elle limine les groupes qui ne satisfont pas la condition donne. (Voir la section intitule
Clause GROUP BY et la section intitule Clause HAVING ci-dessous.)
5. Les lignes retournes sont traites en utilisant les expressions de sortie de SELECT pour chaque ligne ou groupe de ligne slectionn. (Voir la section intitule Liste SELECT ci-dessous.)
6. SELECT DISTINCT limine du rsultat les lignes en double. SELECT DISTINCT ON limine les lignes qui correspondent sur toute l'expression spcifie. SELECT ALL (l'option par dfaut) retourne toutes les lignes, y compris les doublons. (cf. la section intitule DISTINCT Clause ci-dessous.)
7. En utilisant les oprateurs UNION, INTERSECT et EXCEPT, l'affichage de plusieurs instructions SELECT peut tre combi1101
SELECT
n pour former un ensemble unique de rsultats. L'oprateur UNION renvoie toutes les lignes qui appartiennent, au moins,
l'un des ensembles de rsultats. L'oprateur INTERSECT renvoie toutes les lignes qui sont dans tous les ensembles de rsultats.
L'oprateur EXCEPT renvoie les lignes qui sont prsentes dans le premier ensemble de rsultats mais pas dans le deuxime.
Dans les trois cas, les lignes dupliques sont limines sauf si ALL est spcifi. Le mot-cl supplmentaire DISTINCT peut
tre ajout pour signifier explicitement que les lignes en doublon sont limines. Notez bien que DISTINCT est l le comportement par dfaut, bien que ALL soit le dfaut pour la commande SELECT. (Voir la section intitule Clause UNION , la
section intitule Clause INTERSECT et la section intitule Clause EXCEPT ci-dessous.)
8. Si la clause ORDER BY est spcifie, les lignes renvoyes sont tries dans l'ordre spcifi. Si ORDER BY n'est pas indiqu, les
lignes sont retournes dans l'ordre qui permet la rponse la plus rapide du systme. (Voir la section intitule Clause ORDER
BY ci-dessous.)
9. Si les clauses LIMIT (ou FETCH FIRST) ou OFFSET sont spcifies, l'instruction SELECT ne renvoie qu'un sous-ensemble
de lignes de rsultats. (Voir la section intitule Clause LIMIT ci-dessous.)
10 Si la clause FOR UPDATE ou FOR SHARE est spcifie, l'instruction SELECT verrouille les lignes slectionnes contre les
. mises jour concurrentes. (Voir la section intitule Clause FOR UPDATE/FOR SHARE ci-dessous.)
Le droit SELECT sur chaque colonne utilise dans une commande SELECT est ncessaire pour lire ses valeurs. L'utilisation de
FOR UPDATE ou de FOR SHARE requiert en plus le droit UPDATE (pour au moins une colonne de chaque table slectionne).
Paramtres
Clause WITH
La clause WITH vous permet de spcifier une ou plusieurs sous-requtes qui peuvent tre utilises par leur nom dans la requte
principale. Les sous-requtes se comportent comme des tables temporaires ou des vues pendant la dure d'excution de la requte
principale. Chaque sous-requte peut tre un ordre SELECT, INSERT, UPDATE ou bien DELETE. Lorsque vous crivez un
ordre de modification de donnes (INSERT, UPDATE ou DELETE) dans une clause WITH, il est habituel d'inclure une clause
RETURNING. C'est la sortie de cette clause RETURNING, et non pas la table sous-jacente que l'ordre modifie, qui donne lieu la
table temporaire lue par la requte principale. Si la clause RETURNING est omise, l'ordre est tout de mme excut, mais il ne produit pas de sortie ; il ne peut donc pas tre rfrenc comme une table par la requte principale.
Un nom (sans qualification de schma) doit tre spcifi pour chaque requte WITH. En option, une liste de noms de colonnes
peut tre spcifi ; si elle est omise, les noms de colonnes sont dduites de la sous-requte.
Si RECURSIVE est spcifi, la sous-requte SELECT peut se rfrencer elle mme. Une sous-requte de ce type doit avoir la
forme
terme_non_rcursif UNION [ ALL | DISTINCT ] terme_rcursif
o l'auto-rfrence rcursive doit apparatre dans la partie droite de l'UNION. Seule une auto-rfrence rcursive est autorise par
requte. Les ordres de modification rcursifs ne sont pas supports, mais vous pouvez utiliser le rsultat d'une commande SELECT rcursive dans un ordre de modification. Voir Section 7.8, Requtes WITH (Common Table Expressions) pour un
exemple.
Un autre effet de RECURSIVE est que les requtes WITH n'ont pas besoin d'tre ordonnes : une requte peut en rfrencer une
autre qui se trouve plus loin dans la liste (toutefois, les rfrences circulaires, ou rcursion mutuelle, ne sont pas implmentes).
Sans RECURSIVE, les requtes WITH ne peuvent rfrencer d'autres requtes WITH sours que si elles sont dclares avant dans
la liste WITH.
Une proprit cl des requtes WITH est qu'elles ne sont values qu'une seule fois par excution de la requte principale, mme si
la requte principale les utilise plus d'une fois. En particulier, vous avez la garantie que les traitements de modification de donnes
sont excuts une seule et unique fois, que la requte principale lise tout ou partie de leur sortie.
Tout se passe comme si la requte principale et les requtes WITH taient toutes excutes en mme temps. Ceci a pour consquence que les effets d'un ordre de modification dans une clause WITH ne peuvent pas tre vues des autres parties de la requte,
sauf en lisant la sortie de RETURNING. Si deux de ces ordres de modifications tentent de modifier la mme ligne, les rsultats
sont imprvisibles.
Voir Section 7.8, Requtes WITH (Common Table Expressions) pour plus d'informations.
Clause FROM
La clause FROM spcifie une ou plusieurs tables source pour le SELECT. Si plusieurs sources sont spcifies, le rsultat est un
produit cartsien (jointure croise) de toutes les sources. Mais habituellement, des conditions de qualification sont ajoutes pour
restreindre les lignes renvoyes un petit sous-ensemble du produit cartsien.
1102
SELECT
[ INNER ] JOIN
CROSS JOIN
Pour les types de jointures INNER et OUTER, une condition de jointure doit tre spcifie, choisir parmi NATURAL, ON
condition_jointure ou USING (colonne_jointure [, ...]). Voir ci-dessous pour la signification. Pour
CROSS JOIN, aucune de ces clauses ne doit apparatre.
Une clause JOIN combine deux lments FROM. Les parenthses peuvent tre utilises pour dterminer l'ordre d'imbrication.
En l'absence de parenthses, les JOIN sont imbriqus de gauche droite. Dans tous les cas, JOIN est plus prioritaire que les
virgules sparant les lments FROM.
CROSS JOIN et INNER JOIN produisent un simple produit cartsien. Le rsultat est identique celui obtenu lorsque les
deux lments sont lists au premier niveau du FROM, mais restreint par la condition de jointure (si elle existe). CROSS
JOIN est quivalent INNER JOIN ON (TRUE), c'est--dire qu'aucune ligne n'est supprime par qualification. Ces types
de jointure sont essentiellement une aide la notation car ils ne font rien de plus qu'un simple FROM et WHERE.
LEFT OUTER JOIN renvoie toutes les lignes du produit cartsien qualifi (c'est--dire toutes les lignes combines qui satisfont la condition de jointure), plus une copie de chaque ligne de la table de gauche pour laquelle il n'y a pas de ligne droite
qui satisfasse la condition de jointure. La ligne de gauche est tendue la largeur complte de la table jointe par insertion de
valeurs NULL pour les colonnes de droite. Seule la condition de la clause JOIN est utilise pour dcider des lignes qui correspondent. Les conditions externes sont appliques aprs coup.
l'inverse, RIGHT OUTER JOIN renvoie toutes les lignes jointes plus une ligne pour chaque ligne de droite sans corres1103
SELECT
pondance (complte par des NULL pour le ct gauche). C'est une simple aide la notation car il est aisment convertible en
LEFT en inversant les entres gauche et droite.
FULL OUTER JOIN renvoie toutes les lignes jointes, plus chaque ligne gauche sans correspondance (tendue par des
NULL droite), plus chaque ligne droite sans correspondance (tendue par des NULL gauche).
ON condition_jointure
condition_jointure est une expression qui retourne une valeur de type boolean (comme une clause WHERE) qui spcifie les lignes d'une jointure devant correspondre.
USING (colonne_jointure [, ...])
Une clause de la forme USING ( a, b, ... ) est un raccourci pour ON table_gauche.a = table_droite.a
AND table_gauche.b = table_droite.b .... De plus, USING implique l'affichage d'une seule paire des colonnes correspondantes dans la sortie de la jointure.
NATURAL
NATURAL est un raccourci pour une liste USING qui mentionne toutes les colonnes de mme nom dans les deux tables.
Clause WHERE
La clause WHERE optionnelle a la forme gnrale
WHERE condition
o condition est une expression dont le rsultat est de type boolean. Toute ligne qui ne satisfait pas cette condition est limine
de la sortie. Une ligne satisfait la condition si elle retourne vrai quand les valeurs relles de la ligne sont substitues toute rfrence de variable.
Clause GROUP BY
La clause GROUP BY optionnelle a la forme gnrale
GROUP BY expression [, ...]
GROUP BY condense en une seule ligne toutes les lignes slectionnes qui partagent les mmes valeurs pour les expressions regroupes. expression peut tre le nom d'une colonne en entre, le nom ou le numro d'une colonne en sortie (lment de la
liste SELECT), ou une expression quelconque forme de valeurs de colonnes en entre. En cas d'ambigut, un nom de GROUP
BY est interprt comme un nom de colonne en entre, non en sortie.
Les fonctions d'agrgat, si utilises, sont calcules pour toutes les lignes composant un groupe, produisant une valeur spare pour
chaque groupe (alors que sans GROUP BY, un agrgat produit une valeur unique calcule pour toutes les lignes slectionnes).
Quand GROUP BY est prsent, les expressions du SELECT ne peuvent faire rfrence qu' des colonnes groupes, sauf
l'intrieur de fonctions d'agrgat, ou bien si la colonne non groupe dpend fonctionnellement des colonnes groupes. En effet, s'il
en tait autrement, il y aurait plus d'une valeur possible pour la colonne non groupe. Une dpendance fonctionnelle existe si les
colonnes groupes (ou un sous-ensemble de ces dernires) sont la cl primaire de la table contenant les colonnes non groupes.
Clause HAVING
La clause optionnelle HAVING a la forme gnrale
HAVING condition
o condition est identique celle spcifie pour la clause WHERE.
HAVING limine les lignes groupes qui ne satisfont pas la condition. HAVING est diffrent de WHERE : WHERE filtre les lignes
individuelles avant l'application de GROUP BY alors que HAVING filtre les lignes groupes cres par GROUP BY. Chaque colonne rfrence dans condition doit faire rfrence sans ambigut une colonne groupe, sauf si la rfrence apparat dans
une fonction d'agrgat.
Mme en l'absence de clause GROUP BY, la prsence de HAVING transforme une requte en requte groupe. Cela correspond au
comportement d'une requte contenant des fonctions d'agrgats mais pas de clause GROUP BY. Les lignes slectionnes ne
forment qu'un groupe, la liste du SELECT et la clause HAVING ne peuvent donc faire rfrence qu' des colonnes l'intrieur de
fonctions d'agrgats. Une telle requte ne produira qu'une seule ligne si la condition HAVING est ralise, aucune dans le cas
contraire.
Clause WINDOW
La clause optionnelle WINDOW a la forme gnrale
1104
SELECT
SELECT
soit rfrence quelque part ; si elle n'est pas utilise dans la requte, elle est simplement ignore. Il est possible d'utiliser des fonctions window sans aucune clause WINDOW puisqu'une fonction window peut spcifier sa propre dfinition de window directement
dans sa clause OVER. Toutefois, la clause WINDOW conomise de la saisie quand la mme dfinition window est utilise pour plus
d'une fonction window.
Les fonctions window sont dcrites en dtail dans Section 3.5, Fonctions de fentrage , Section 4.2.8, Appels de fonction de
fentrage et Section 7.2.4, Traitement de fonctions Window .
Liste SELECT
La liste SELECT (entre les mots cls SELECT et FROM) spcifie les expressions qui forment les lignes en sortie de l'instruction
SELECT. Il se peut que les expressions fassent rfrence aux colonnes traites dans la clause FROM. En fait, en gnral, elles le
font.
Comme pour une table, chaque colonne de sortie d'un SELECT a un nom. Dans un SELECT simple, ce nom est juste utilis pour
donner un titre la colonne pour l'affichage, mais quand le SELECT est une sous-requte d'une requte plus grande, le nom est
vu par la grande requte comme le nom de colonne de la table virtuelle produite par la sous-requte. Pour indiquer le nom utiliser pour une colonne de sortie, crivez AS nom_de_sortie aprs l'expression de la colonne. (Vous pouvez omettre AS seulement si le nom de colonne souhait n'est pas un mot cl rserv par PostgreSQL (voir Annexe C, Mots-cl SQL). Pour vous
protger contre l'ajout futur d'un mot cl, il est recommand que vous criviez toujours AS ou que vous mettiez le nom de sortie
entre guillemets. Si vous n'indiquez pas de nom de colonne, un nom est choisi automatiquement par PostgreSQL. Si l'expression
de la colonne est une simple rfrence une colonne alors le nom choisi est le mme que le nom de la colonne ; dans des cas plus
complexes, un nom gnr qui ressemblera ?colonneN? est habituellement choisi.
Un nom de colonne de sortie peut tre utilis pour se rfrer la valeur de la colonne dans les clauses ORDER BY et GROUP BY,
mais pas dans la clauseWHERE ou HAVING ; cet endroit, vous devez crire l'expression.
* peut tre utilis, la place d'une expression, dans la liste de sortie comme raccourci pour toutes les colonnes des lignes slectionnes. De plus, nom_table.* peut tre crit comme raccourci pour toutes les colonnes de cette table. Dans ces cas, il est impossible de spcifier de nouveaux noms avec AS ; les noms des colonnes de sorties seront les mme que ceux de la table.
DISTINCT Clause
Si SELECT DISTINCT est spcifi, toutes les lignes en double sont supprimes de l'ensemble de rsultats (une ligne est conserve pour chaque groupe de doublons). SELECT ALL spcifie le contraire : toutes les lignes sont conserves. C'est l'option par dfaut.
SELECT DISTINCT ON ( expression [, ...] ) conserve seulement la premire ligne de chaque ensemble de lignes
pour lesquelles le rsultat de l'expression est identique. Les expressions DISTINCT ON expressions sont interprtes avec les
mmes rgles que pour ORDER BY (voir ci-dessous). Notez que la premire ligne de chaque ensemble est imprvisible,
moins que la clause ORDER BY ne soit utilise, assurant ainsi que la ligne souhaite apparaisse en premier. Par exemple :
SELECT DISTINCT ON (lieu) lieu, heure, rapport
FROM rapport_mto
ORDER BY lieu, heure DESC;
renvoie le rapport mto le plus rcent de chaque endroit. Mais si nous n'avions pas utilis ORDER BY afin de forcer le tri du
temps dans le sens descendant des temps pour chaque endroit, nous aurions rcupr, pour chaque lieu, n'importe quel bulletin de
ce lieu.
La (ou les ) expression(s) DISTINCT ON doivent correspondre l'expression (ou aux expressions) ORDER BY la(les) plus
gauche. La clause ORDER BY contient habituellement des expressions supplmentaires qui dterminent l'ordre des lignes au sein
de chaque groupe DISTINCT ON.
Clause UNION
La clause UNION a la forme gnrale :
instruction_select UNION [ ALL | DISTINCT ] instruction_select
instruction_select est une instruction SELECT sans clause ORDER BY, LIMIT, FOR SHARE ou FOR UPDATE. (ORDER BY et LIMIT peuvent tre attachs une sous-expression si elle est entoure de parenthses. Sans parenthses, ces clauses
s'appliquent au rsultat de l'UNION, non l'expression sa droite.)
L'oprateur UNION calcule l'union ensembliste des lignes renvoyes par les instructions SELECT impliques. Une ligne est dans
l'union de deux ensembles de rsultats si elle apparat dans au moins un des ensembles. Les deux instructions SELECT qui reprsentent les oprandes directes de l'UNION doivent produire le mme nombre de colonnes et les colonnes correspondantes doivent
tre d'un type de donnes compatible.
1106
SELECT
Sauf lorsque l'option ALL est spcifie, il n'y a pas de doublons dans le rsultat de UNION. ALL empche l'limination des lignes
dupliques. UNION ALL est donc significativement plus rapide qu'UNION, et sera prfr. DISTINCT peut ventuellement tre
ajout pour prciser explicitement le comportement par dfaut : l'limination des lignes en double.
Si une instruction SELECT contient plusieurs oprateurs UNION, ils sont valus de gauche droite, sauf si l'utilisation de parenthses impose un comportement diffrent.
Actuellement, FOR UPDATE et FOR SHARE ne peuvent pas tre spcifis pour un rsultat d'UNION ou pour toute entre d'un
UNION.
Clause INTERSECT
La clause INTERSECT a la forme gnrale :
instruction_select INTERSECT [ ALL | DISTINCT ] instruction_select
instruction_select est une instruction SELECT sans clause ORDER BY, LIMIT, FOR UPDATE ou FOR SHARE.
L'oprateur INTERSECT calcule l'intersection des lignes renvoyes par les instructions SELECT impliques. Une ligne est dans
l'intersection des deux ensembles de rsultats si elle apparat dans chacun des deux ensembles.
Le rsultat d'INTERSECT ne contient aucune ligne duplique sauf si l'option ALL est spcifie. Dans ce cas, une ligne duplique
m fois dans la table gauche et n fois dans la table droite apparat min(m,n) fois dans l'ensemble de rsultats. DISTINCT peut ventuellement tre ajout pour prciser explicitement le comportement par dfaut : l'limination des lignes en double.
Si une instruction SELECT contient plusieurs oprateurs INTERSECT, ils sont valus de gauche droite, sauf si l'utilisation de
parenthses impose un comportement diffrent. INTERSECT a une priorit suprieur celle d'UNION. C'est--dire que A UNION
B INTERSECT C est lu comme A UNION (B INTERSECT C).
Actuellement, FOR UPDATE et FOR SHARE ne peuvent pas tre spcifis pour un rsultat d'INTERSECT ou pour une entre
d'INTERSECT.
Clause EXCEPT
La clause EXCEPT a la forme gnrale :
instruction_select EXCEPT [ ALL | DISTINCT ] instruction_select
instruction_select est une instruction SELECT sans clause ORDER BY, LIMIT, FOR UPDATE ou FOR SHARE.
L'oprateur EXCEPT calcule l'ensemble de lignes qui appartiennent au rsultat de l'instruction SELECT de gauche mais pas celui de droite.
Le rsultat d'EXCEPT ne contient aucune ligne duplique sauf si l'option ALL est spcifie. Dans ce cas, une ligne duplique m
fois dans la table gauche et n fois dans la table droite apparat max(m-n,0) fois dans l'ensemble de rsultats. DISTINCT peut
ventuellement tre ajout pour prciser explicitement le comportement par dfaut : l'limination des lignes en double.
Si une instruction SELECT contient plusieurs oprateurs EXCEPT, ils sont valus de gauche droite, sauf si l'utilisation de parenthses impose un comportement diffrent. EXCEPT a la mme priorit qu'UNION.
Actuellement, FOR UPDATE et FOR SHARE ne peuvent pas tre spcifis dans un rsultat EXCEPT ou pour une entre d'un EXCEPT.
Clause ORDER BY
La clause optionnelle ORDER BY a la forme gnrale :
ORDER BY expression [ ASC | DESC | USING oprateur ] [ NULLS { FIRST | LAST } ] [, ...]
La clause ORDER BY impose le tri des lignes de rsultat suivant les expressions spcifies. Si deux lignes sont identiques suivant
l'expression la plus gauche, elles sont compares avec l'expression suivante et ainsi de suite. Si elles sont identiques pour toutes
les expressions de tri, elles sont renvoyes dans un ordre dpendant de l'implantation.
Chaque expression peut tre le nom ou le numro ordinal d'une colonne en sortie (lment de la liste SELECT). Elle peut
aussi tre une expression arbitraire forme partir de valeurs des colonnes.
Le numro ordinal fait rfrence la position ordinale (de gauche droite) de la colonne de rsultat. Cette fonctionnalit permet
de dfinir un ordre sur la base d'une colonne dont le nom n'est pas unique. Ce n'est pas particulirement ncessaire parce qu'il est
toujours possible d'affecter un nom une colonne de rsultat avec la clause AS.
Il est aussi possible d'utiliser des expressions quelconques dans la clause ORDER BY, ce qui inclut des colonnes qui n'apparaissent
pas dans la liste rsultat du SELECT. Ainsi, l'instruction suivante est valide :
1107
SELECT
Clause LIMIT
La clause LIMIT est constitue de deux sous-clauses indpendantes :
LIMIT { nombre | ALL }
OFFSET dbut
nombre spcifie le nombre maximum de lignes renvoyer alors que dbut spcifie le nombre de lignes passer avant de commencer renvoyer des lignes. Lorsque les deux clauses sont spcifies, dbut lignes sont passes avant de commencer compter
les nombre lignes renvoyer.
Si l'expression de compte est value NULL, il est trait comme LIMIT ALL, c'est--dire sans limite. Si dbut est valu
NULL, il est trait comme OFFSET 0.
SQL:2008 a introduit une sytaxe diffrente pour obtenir le mme rsultat. PostgreSQL supporte aussi cette syntaxe.
OFFSET dbut { ROW | ROWS }
FETCH { FIRST | NEXT } [ compte ] { ROW | ROWS } ONLY
Avec cette syntaxe, pour crire tout sauf une simple constant de type entier pour dbut ou compte, vous devez l'entourer de parenthses. Si compte est omis dans une clause FETCH, il vaut 1 par dfaut. ROW et ROWS ainsi que FIRST et NEXT sont des
mots qui n'influencent pas les effets de ces clauses. D'aprs le standard, la clause OFFSET doit venir avant la clause FETCH si les
deux sont prsentes ; PostgreSQL est plus laxiste et autorise un ordre diffrent.
Avec LIMIT, utiliser la clause ORDER BY permet de contraindre l'ordre des lignes de rsultat. Dans le cas contraire, le sousensemble obtenu n'est pas prvisible -- rien ne permet de savoir quel ordre correspondent les lignes retournes. Celui-ci ne sera
pas connu tant qu'ORDER BY n'aura pas t prcis.
Lors de la gnration d'un plan de requte, le planificateur tient compte de LIMIT. Le risque est donc grand d'obtenir des plans
qui diffrent (ordres des lignes diffrents) suivant les valeurs utilises pour LIMIT et OFFSET. Ainsi, slectionner des sousensembles diffrents d'un rsultat partir de valeurs diffrentes de LIMIT/OFFSET aboutit des rsultats incohrents moins
d'avoir fig l'ordre des lignes l'aide de la clause ORDER BY. Ce n'est pas un bogue, mais une consquence du fait que SQL
n'assure pas l'ordre de prsentation des rsultats sans utilisation d'une clause ORDER BY.
Il est mme possible pour des excutions rptes de la mme requte LIMIT de renvoyer diffrents sous-ensembles des lignes
d'une table s'il n'y a pas de clause ORDER BY pour forcer la slection d'un sous-ensemble dterministe. Encore une fois, ce n'est
pas un bogue ; le dterminisme des rsultats n'est tout simplement pas garanti dans un tel cas.
SELECT
Attention
vitez de verrouiller une ligne puis de la modifier aprs un nouveau point de sauvegarde ou aprs un bloc
d'exception PL/pgSQL. L'annulation suivante pourrait causer la perte du verrou. Par exemple :
BEGIN;
1109
SELECT
Attention
Il est possible qu'une commande SELECT excute au niveau d'isolation READ COMMITTED et utilisant ORDER
BY et FOR UPDATE/SHARE renvoie les lignes dans le dsordre. C'est possible car l' ORDER BY est appliqu en
premier. La commande trie le rsultat, mais peut alors tre bloque le temps d'obtenir un verrou sur une ou plusieurs des lignes. Une fois que le SELECT est dbloqu, des valeurs sur la colonne qui sert ordonner peuvent
avoir t modifies, ce qui entrane ces lignes apparaissant dans le dsordre (bien qu'elles soient dans l'ordre par
rapport aux valeurs d'origine de ces colonnes). Ceci peut tre contourn si besoin en plaant la clause FOR UPDATE/SHARE dans une sous-requte, par exemple
SELECT * FROM (SELECT * FROM matable FOR UPDATE) ss ORDER BY column1;
Notez que cela entrane le verrouillage de toutes les lignes de matable, alors que FOR UPDATE au niveau suprieur
verrouillerait seulement les lignes rellement renvoyes. Cela peut causer une diffrence de performance significative, en particulier si l' ORDER BY est combin avec LIMIT ou d'autres restrictions. Cette technique est donc recommande uniquement si vous vous attendez des mises jour concurrentes sur les colonnes servant
l'ordonnancement et qu'un rsultat strictement ordonn est requis.
Au niveau d'isolation de transactions REPEATABLE READ et SERIALIZABLE, cela causera une erreur de srialisation (avec un SQLSTATE valant '40001'), donc il n'est pas possible de recevoir des lignes non tries avec ces
niveaux d'isolation.
Commande TABLE
La commande
TABLE nom
est compltement quivalente
SELECT * FROM nom
Elle peut tre utilise comme commande principale d'une requte, ou bien comme une variante syntaxique permettant de gagner
de la place dans des parties de requtes complexes.
Exemples
Joindre la table films avec la table distributeurs :
SELECT f.titre, f.did, d.nom, f.date_prod, f.genre
FROM distributeurs d, films f
WHERE f.did = d.did
titre
| did |
nom
| date_prod |
genre
-------------------+-----+--------------+------------+-----------The Third Man
| 101 | British Lion | 1949-12-23 | Drame
The African Queen | 101 | British Lion | 1951-08-11 | Romantique
...
Additionner la colonne longueur de tous les films, grouper les rsultats par genre :
SELECT genre, sum(longueur) AS total FROM films GROUP BY genre;
1110
SELECT
genre
| total
------------+------Action
| 07:34
Comdie
| 02:58
Drame
| 14:28
Musical
| 06:42
Romantique | 04:38
Additionner la colonne longueur de tous les films, grouper les rsultats par genre et afficher les groupes dont les totaux font
moins de cinq heures :
SELECT genre, sum(longueur) AS total
FROM films
GROUP BY genre
HAVING sum(longueur) < interval '5 hours';
genre
| total
------------+------Comedie
| 02:58
Romantique | 04:38
Les deux exemples suivants reprsentent des faons identiques de trier les rsultats individuels en fonction du contenu de la
deuxime colonne (nom) :
SELECT * FROM distributeurs ORDER BY nom;
SELECT * FROM distributeurs ORDER BY 2;
did |
nom
-----+-----------------109 | 20th Century Fox
110 | Bavaria Atelier
101 | British Lion
107 | Columbia
102 | Jean Luc Godard
113 | Luso films
104 | Mosfilm
103 | Paramount
106 | Toho
105 | United Artists
111 | Walt Disney
112 | Warner Bros.
108 | Westward
L'exemple suivant prsente l'union des tables distributeurs et acteurs, restreignant les rsultats ceux de chaque table
dont la premire lettre est un W. Le mot cl ALL est omis, ce qui permet de n'afficher que les lignes distinctes.
distributeurs:
did |
nom
-----+-------------108 | Westward
111 | Walt Disney
112 | Warner Bros.
...
acteurs:
id |
nom
----+---------------1 | Woody Allen
2 | Warren Beatty
3 | Walter Matthau
...
SELECT distributeurs.nom
FROM distributeurs
WHERE distributeurs.nom LIKE 'W%'
UNION
SELECT actors.nom
FROM acteurs
WHERE acteurs.nom LIKE 'W%';
nom
---------------Walt Disney
Walter Matthau
Warner Bros.
Warren Beatty
1111
SELECT
Westward
Woody Allen
L'exemple suivant prsente l'utilisation d'une fonction dans la clause FROM, avec et sans liste de dfinition de colonnes :
CREATE FUNCTION distributeurs(int) RETURNS SETOF distributeurs AS $$
SELECT * FROM distributeurs WHERE did = $1;
$$ LANGUAGE SQL;
SELECT * FROM distributeurs(111);
did |
name
-----+------------111 | Walt Disney
CREATE FUNCTION distributeurs_2(int) RETURNS SETOF record AS $$
SELECT * FROM distributeurs WHERE did = $1;
$$ LANGUAGE SQL;
SELECT * FROM distributeurs_2(111) AS (f1 int, f2 text);
f1 |
f2
-----+------------111 | Walt Disney
Cet exemple montre comment utiliser une clause WITH simple:
WITH t AS (
SELECT random() as x FROM generate_series(1, 3)
)
SELECT * FROM t
UNION ALL
SELECT * FROM t
x
-------------------0.534150459803641
0.520092216785997
0.0735620250925422
0.534150459803641
0.520092216785997
0.0735620250925422
Notez que la requte WITH n'a t value qu'une seule fois, ce qui fait qu'on a deux jeux contenant les mmes trois valeurs.
Cet exemple utilise WITH RECURSIVE pour trouver tous les subordonns (directs ou indirects) de l'employe Marie, et leur niveau de subordination, partir d'une table qui ne donne que les subordonns directs :
WITH RECURSIVE recursion_employes(distance, nom_employe, nom_manager) AS (
SELECT 1, nom_employe, nom_manager
FROM employe
WHERE nom_manager = 'Marie'
UNION ALL
SELECT er.distance + 1, e.nom_employe, e.nom_manager
FROM recursion_employes er, employe e
WHERE er.nom_employe = e.nom_manager
)
SELECT distance, nom_employe FROM recursion_employes;
Notez la forme typique des requtes rcursives : une condition initiale, suivie par UNION, suivis par la partie rcursive de la requte. Assurez-vous que la partie rcursive de la requte finira par ne plus retourner d'enregistrement, sinon la requte bouclera indfiniment (Voir Section 7.8, Requtes WITH (Common Table Expressions) pour plus d'exemples).
Compatibilit
L'instruction SELECT est videmment compatible avec le standard SQL. Mais il y a des extensions et quelques fonctionnalits
manquantes.
SELECT
PostgreSQL autorise l'omission de la clause FROM. Cela permet par exemple de calculer le rsultat d'expressions simples :
SELECT 2+2;
?column?
---------4
D'autres bases de donnes SQL interdisent ce comportement, sauf introduire une table virtuelle d'une seule ligne sur laquelle
excuter la commande SELECT.
S'il n'y a pas de clause FROM, la requte ne peut pas rfrencer les tables de la base de donnes. La requte suivante est, ainsi, invalide :
SELECT distributors.* WHERE distributors.name = 'Westward';
Les versions antrieures PostgreSQL 8.1 acceptaient les requtes de cette forme en ajoutant une entre implicite la clause
FROM pour chaque table rfrence. Ce n'est plus autoris.
Omettre le mot cl AS
Dans le standard SQL, le mot cl AS peut tre omis devant une colonne de sortie partir du moment o le nouveau nom de colonne est un nom valide de colonne (c'est--dire, diffrent d'un mot cl rserv). PostgreSQL est lgrement plus restrictif : AS
est ncessaire si le nouveau nom de colonne est un mot cl quel qu'il soit, rserv ou non. Il est recommand d'utiliser AS ou des
colonnes de sortie entoures de guillemets, pour viter tout risque de conflit en cas d'ajout futur de mot cl.
Dans les lments de FROM, le standard et PostgreSQL permettent que AS soit omis avant un alias qui n'est pas un mot cl rserv. Mais c'est peu pratique pour les noms de colonnes, causes d'ambiguts syntaxiques.
ONLY et l'hritage
Le standard SQL impose des parenthses autour du nom de table aprs la clause ONLY, comme dans SELECT * FROM ONLY
(tab1), ONLY (tab2) WHERE .... PostgreSQL considre les parenthses comme tant optionnelles.
PostgreSQL autorise une * en fin pour indiquer explicitement le comportement oppos de la clause ONLY (donc inclure les
tables filles). Le standard ne le permet pas.
(Ces points s'appliquent de la mme faon toutes les commandes SQL supportant l'option ONLY.)
Dpendances fonctionnelles
PostgreSQL reconnat les dpendances fonctionnelles (qui permettent que les nom des colonnes ne soient pas dans le GROUP
BY) seulement lorsqu'une cl primaire est prsente dans la liste du GROUP BY. Le standard SQL spcifie des configurations supplmentaires qui doivent tre reconnues.
LIMIT et OFFSET
Les clauses LIMIT et OFFSET sont une syntaxe spcifique PostgreSQL, aussi utilise dans MySQL. La norme SQL:2008
a introduit les clauses OFFSET ... FETCH {FIRST|NEXT}... pour la mme fonctionnalit, comme montr plus haut dans
la section intitule Clause LIMIT . Cette syntaxe est aussi utilise par IBM DB2. (Les applications crites pour Oracle
contournent frquemment le problme par l'utilisation de la colonne auto-gnre rownum pour obtenir les effets de ces clauses,
qui n'est pas disponible sous PostgreSQL,)
1113
SELECT
1114
Nom
SELECT INTO dfinit une nouvelle table partir des rsultats d'une requte
Synopsis
[ WITH [ RECURSIVE ] requte_with [, ...] ]
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
* | expression [ [ AS ] nom_en_sortie ] [, ...]
INTO [ TEMPORARY | TEMP | UNLOGGED ] [ TABLE ] nouvelle_table
[ FROM lment_from [, ...] ]
[ WHERE condition ]
[ GROUP BY expression [, ...] ]
[ HAVING condition [, ...] ]
[ WINDOW nom_window AS ( dfinition_window ) [, ...] ]
[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
[ ORDER BY expression [ ASC | DESC | USING oprateur ] [, ...] ]
[ LIMIT { nombre | ALL } ]
[ OFFSET dbut [ ROW | ROWS ] ]
[ FETCH { FIRST | NEXT } [ nombre ] { ROW | ROWS } ONLY ]
[ FOR { UPDATE | SHARE } [ OF nomtable [, ...] ] [ NOWAIT ] [...] ]
Description
SELECT INTO cre une nouvelle table en la remplissant avec des donnes rcupres par une requte. Les donnes ne sont
pas renvoyes au client comme le fait habituellement l'instruction SELECT. Les nouvelles colonnes de la table ont les noms et
les types de donnes associs avec les colonnes en sortie du SELECT.
Paramtres
TEMPORARY ou TEMP
Si spcifi, la table est cre comme une table temporaire. Rfrez-vous CREATE TABLE(7) pour plus de dtails.
UNLOGGED
Si spcifi, la table est cre comme une table non trace dans les journaux de transactions. Voir CREATE TABLE(7) pour
plus de dtails.
new_table
Le nom de la table crer (pouvant tre qualifi par le nom du schma).
Tous les autres paramtres sont dcrits en dtail dans SELECT(7).
Notes
CREATE TABLE AS(7) est fonctionnellement quivalent SELECT INTO. CREATE TABLE AS est la syntaxe recommande car cette forme de SELECT INTO n'est pas disponible dans ECPG ou PL/pgSQL. En effet, ils interprtent la clause INTO
diffremment. De plus, CREATE TABLE AS offre un ensemble de fonctionnalits plus important que celui de SELECT INTO.
Avant PostgreSQL 8.1, la table cre par SELECT INTO incluait des OID par dfaut. Dans PostgreSQL 8.1, ce n'est plus
le cas -- pour inclure des OID dans la nouvelle table, la variable de configuration default_with_oids doit tre active. Autrement,
CREATE TABLE AS peut aussi tre utilis avec la clause WITH OIDS.
Exemples
Cre une nouvelle table films_recent ne contenant que les entres rcentes de la table films:
SELECT * INTO films_recent FROM films WHERE date_prod >= '2002-01-01';
Compatibilit
Le standard SQL utilise SELECT INTO pour reprsenter la slection de valeurs dans des variables scalaires d'un programme
hte plutt que la cration d'une nouvelle table. Ceci est en fait l'utilisation trouve dans ECPG (voir Chapitre 33, ECPG SQL
embarqu en C) et dans PL/pgSQL (voir Chapitre 39, PL/pgSQL - Langage de procdures SQL). L'usage de PostgreSQL de
1115
SELECT INTO
SELECT INTO pour reprsenter une cration de table est historique. Il est prfrable d'utiliser CREATE TABLE AS dans un
nouveau programme.
Voir aussi
CREATE TABLE AS(7)
1116
Nom
SET change un paramtre d'excution
Synopsis
SET [ SESSION | LOCAL ] paramtre_configuration { TO | = } { valeur | 'valeur' |
DEFAULT }
SET [ SESSION | LOCAL ] TIME ZONE { fuseau-horaire | LOCAL | DEFAULT }
Description
La commande SET permet de modifier les paramtres d'excution. Un grand nombre de paramtres d'excution, lists dans
Chapitre 18, Configuration du serveur, peuvent tre modifis la vole avec la commande SET. SET ne modifie que les paramtres utiliss par la session courante.
Certains paramtres ne peuvent tre modifis que par le superutilisateur, d'autres ne peuvent plus tre changs aprs le dmarrage du serveur ou de la session.
Si SET ou SET SESSION sont utiliss dans une transaction abandonne par la suite, les effets de la commande SET disparaissent ds l'annulation de la transaction. Lorsque la transaction englobant la commande est valide, les effets de la commande
persistent jusqu' la fin de la session, moins qu'ils ne soient annuls par une autre commande SET.
Les effets de SET LOCAL ne durent que jusqu' la fin de la transaction en cours, qu'elle soit valide ou non. Dans le cas particulier d'une commande SET suivie par SET LOCAL dans une mme transaction, la valeur de SET LOCAL est utilise jusqu'
la fin de la transaction, et celle de SET prend effet ensuite (si la transaction est valide).
Les effets de SET et SET LOCAL sont aussi annuls par le retour un point de sauvegarde prcdant la commande.
Si SET LOCAL est utilis l'intrieur d'une fonction qui comprend l'option SET pour la mme variable (voir CREATE FUNCTION(7)), les effets de la commande SET LOCAL disparatront la sortie de la fonction ; en fait, la valeur disponible lors de
l'appel de la fonction est restaure de toute faon. Ceci permet l'utilisation de SET LOCAL pour des modifications dynamiques
et rptes d'un paramtre l'intrieur d'une fonction, avec l'intrt d'utiliser l'option SET pour sauvegarder et restaurer la valeur
de l'appelant. Nanmoins, une commande SET standard surcharge toute option SET de la fonction ; son effet persistera sauf en
cas d'annulation.
Note
De PostgreSQL version 8.0 8.2, les effets de SET LOCAL sont annuls suite au relachement d'un point de
sauvegarde prcdent, ou par une sortie avec succs d'un bloc d'exception PL/pgSQL. Ce comportement a t
modifi car il n'tait pas du tout intuitif.
Paramtres
SESSION
Indique que la commande prend effet pour la session courante. C'est la valeur par dfaut lorsque SESSION et LOCAL sont
omis.
LOCAL
Indique que la commande n'est effective que pour la transaction courante. Aprs COMMIT ou ROLLBACK, la valeur de
session redevient effective. Une commande SET LOCAL est sans effet si elle est excute en dehors d'un bloc BEGIN car
la transaction prend immdiatement fin.
paramtre_configuration
Nom d'un paramtre ajustable pendant l'excution. La liste des paramtres disponibles est documente dans Chapitre 18,
Configuration du serveur et ci-dessous.
valeur
Nouvelle valeur du paramtre. Les valeurs peuvent tre indiques sous forme de constantes de chane, d'identifiants, de
nombres ou de listes de ceux-ci, spares par des virgules, de faon appropri pour ce paramtre. DEFAULT peut tre utilis
pour repositionner le paramtre sa valeur par dfaut (c'est--dire quelque soit la valeur qu'il aurait eu si aucun SET n'avait
t excut lors de cette session).
En plus des paramtres de configuration documents dans Chapitre 18, Configuration du serveur, il y en a quelques autres qui ne
1117
SET
peuvent tre initialiss qu'avec la commande SET ou ont une syntaxe spciale.
SCHEMA
SET SCHEMA 'valeur' est un alias pour SET search_path TO valeur. Seul un schma peut tre prcis en utilisant cette syntaxe.
NAMES
SET NAMES valeur est un quivalent de SET client_encoding TO valeur.
SEED
Prcise la valeur interne du gnrateur de nombres alatoires (la fonction random). Les valeurs autorises sont des nombres
virgule flottante entre -1 et 1, qui sont ensuite multiplis par 231-1.
Le gnrateur de nombres alatoires peut aussi tre initialis en appelant la fonction setseed :
SELECT setseed(valeur);
TIME ZONE
SET TIME ZONE valeur est quivalent SET timezone TO valeur. La syntaxe SET TIME ZONE permet
d'utiliser une syntaxe spciale pour indiquer le fuseau horaire. Quelques exemples de valeurs valides :
'PST8PDT'
Le fuseau horaire de Berkeley, Californie.
'Europe/Rome'
Le fuseau horaire de l'Italie.
-7
Le fuseau horaire situ 7 heures l'ouest de l'UTC (quivalent PDT). Les valeurs positives sont l'est de l'UTC.
INTERVAL '-08:00' HOUR TO MINUTE
Le fuseau horaire situ 8 heures l'ouest de l'UTC (quivalent PST).
LOCAL, DEFAULT
Utilise le fuseau horaire local (c'est--dire la valeur timezone par dfaut du serveur ; si cette dernire n'est pas explicitement configure, il utilise la zone par dfaut du systme d'exploitation).
Voir Section 8.5.3, Fuseaux horaires pour de plus amples informations sur les fuseaux horaires.
Notes
La fonction set_config propose des fonctionnalits quivalentes. Voir Section 9.24, Fonctions d'administration systme .
De plus, il est possible de mettre jour (via UPDATE) la vue systme pg_settings pour raliser l'quivalent de SET.
Exemples
Mettre jour le chemin de recherche :
SET search_path TO my_schema, public;
Utiliser le style de date traditionnel POSTGRES avec comme convention de saisie les jours avant les mois :
SET datestyle TO postgres, dmy;
Utiliser le fuseau horaire de Berkeley, Californie :
SET TIME ZONE 'PST8PDT';
Utiliser le fuseau horaire de l'Italie :
SET TIME ZONE 'Europe/Rome';
Compatibilit
SET TIME ZONE tend la syntaxe dfinie dans le standard SQL. Le standard ne permet que des fuseaux horaires numriques
alors que PostgreSQL est plus souple dans les syntaxes acceptes. Toutes les autres fonctionnalits de SET sont des extensions
de PostgreSQL.
Voir aussi
1118
SET
RESET(7), SHOW(7)
1119
Nom
SET CONSTRAINTS initialise le moment de vrification de contrainte de la transaction en cours
Synopsis
SET CONSTRAINTS { ALL | nom [, ...] } { DEFERRED | IMMEDIATE }
Description
SET CONSTRAINTS initialise le comportement de la vrification des contraintes dans la transaction en cours. Les contraintes
IMMEDIATE sont vrifies la fin de chaque instruction. Les contraintes DEFERRED ne sont vrifies qu' la validation de la
transaction. Chaque contrainte a son propre mode IMMEDIATE ou DEFERRED.
la cration, une contrainte se voit donner une des trois caractristiques : DEFERRABLE INITIALLY DEFERRED, DEFERRABLE INITIALLY IMMEDIATE ou NOT DEFERRABLE. La troisime forme est toujours IMMEDIATE et n'est pas affecte par la commande SET CONSTRAINTS. Les deux premires classes commencent chaque transaction dans le mode indiqu
mais leur comportement peut changer l'intrieur d'une transaction par SET CONSTRAINTS.
SET CONSTRAINTS avec une liste de noms de contraintes modifie le mode de ces contraintes (qui doivent toutes tre diffrables). Chaque nom de contrainte peut tre qualifi d'un schma. Le chemin de recherche des schmas est utilis pour trouver le
premier nom correspondant si aucun nom de schma n'a t indiqu. SET CONSTRAINTS ALL modifie le mode de toutes les
contraintes dfrables.
Lorsque SET CONSTRAINTS modifie le mode d'une contrainte de DEFERRED IMMEDIATE, le nouveau mode prend effet
rtroactivement : toute modification de donnes qui aurait t vrifie la fin de la transaction est en fait vrifie lors de
l'excution de la commande SET CONSTRAINTS. Si une contrainte est viole, la commande SET CONSTRAINTS choue
(et ne change pas le mode de contrainte). Du coup, SET CONSTRAINTS peut tre utilise pour forcer la vrification de
contraintes un point spcifique d'une transaction.
Actuellement, seules les contraintes UNIQUE, PRIMARY KEY, REFERENCES (cl trangre) et EXCLUDE sont affectes par
ce paramtre. Les contraintes NOT NULL et CHECK sont toujours vrifies immdiatement quand une ligne est insre ou modifie (pas la fin de l'instruction). Les contraintes uniques et d'exclusion qui n'ont pas t dclares DEFERRABLE sont aussi
vrifies immdiatement.
Le dclenchement des triggers qui sont dclars comme des triggers de contraintes est aussi contrl par ce paramtre -- ils
se dclenchent au mme moment que la contrainte associe devait tre vrifie.
Notes
Comme PostgreSQL ne ncessite pas les noms de contraintes d'tre uniques l'intrieur d'un schma (mais seulement par
tables), il est possible qu'il y ait plus d'une correspondance pour un nom de contrainte spcifi. Dans ce cas, SET
CONSTRAINTS agira sur toutes les correspondances. Pour un nom sans qualification de schma, une fois qu'une ou plusieurs
correspondances ont t trouves dans les schmas du chemin de recherche, les autres schmas du chemin ne sont pas tests.
Cette commande altre seulement le comportement des contraintes l'intrieur de la transaction en cours. Du coup, si vous excutez cette commande en dehors d'un bloc de transaction (pair BEGIN/COMMIT), elle ne semble pas avoir d'effet.
Compatibilit
Cette commande est compatible avec le comportement dfini par le standard SQL en dehors du fait que, dans PostgreSQL, il
ne s'applique pas aux contraintes NOT NULL et CHECK. De plus, PostgreSQL vrifie les contraintes uniques non dferrables
immdiatement, pas la fin de l'instruction comme le standard le suggre.
1120
Nom
SET ROLE initialise l'identifiant utilisateur courant de la session en cours
Synopsis
SET [ SESSION | LOCAL ] ROLE nom_rle
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE
Description
Cette commande positionne l'identifiant utilisateur courant suivant la session SQL en cours nom_rle. Le nom du rle peut
tre un identifiant ou une chane littrale. Aprs SET ROLE, la vrification des droits sur les commandes SQL est identique
ce qu'elle serait si le rle nomm s'tait lui-mme connect.
Il est obligatoire que l'utilisateur de la session courante soit membre du rle nom_rle (si l'utilisateur de la session est superutilisateur, tous les rles sont utilisables).
Les modificateurs SESSION et LOCAL agissent de la mme faon que pour la commande SET(7).
Les formes NONE et RESET rinitialisent l'identifiant de l'utilisateur la valeur de session. Ces formes peuvent tre excutes
par tout utilisateur.
Notes
L'utilisation de cette commande permet d'tendre ou de restreindre les privilges d'un utilisateur. Si le rle de l'utilisateur de la
session comprend l'attribut INHERITS, alors il acquiert automatiquement les droits de chaque rle qu'il peut prendre par la
commande SET ROLE ; dans ce cas, SET ROLE supprime tous les droits affects directement l'utilisateur de la session et les
autres droits des rles dont il est membre, ne lui laissant que les droits disponibles sur le rle nomm. A l'oppos, si le rle session de l'utilisateur dispose de l'attribut NOINHERITS, SET ROLE supprime les droits affects directement l'utilisateur session et les remplace par les privilges du rle nomm.
En particulier, quand un utilisateur choisit un rle autre que superutilisateur via SET ROLE, il perd les droits superutilisateur.
SET ROLE a des effets comparables SET SESSION AUTHORIZATION(7) mais la vrification des droits diffre. De plus,
SET SESSION AUTHORIZATION dtermine les rles autoriss dans les commandes SET ROLE ultrieures alors que SET
ROLE ne modifie pas les rles accessibles par un futur SET ROLE.
SET ROLE ne traite pas les variables de session indiqu par les paramtres du rle (et configurs avec ALTER ROLE(7) ; cela
ne survient qu' la connexion.
SET ROLE ne peut pas tre utilis dans une fonction SECURITY DEFINER.
Exemples
SELECT SESSION_USER, CURRENT_USER;
session_user | current_user
--------------+-------------peter
| peter
SET ROLE 'paul';
SELECT SESSION_USER, CURRENT_USER;
session_user | current_user
--------------+-------------peter
| paul
Compatibilit
PostgreSQL autorise la syntaxe identifiant ("nom_role") alors que le SQL standard impose une chane littrale pour le
nom du rle. SQL n'autorise pas cette commande lors d'une transaction ; PostgreSQL n'est pas aussi restrictif, rien ne justifie
cette interdiction. Les modificateurs SESSION et LOCAL sont des extensions PostgreSQL tout comme la syntaxe RESET.
1121
SET ROLE
Voir aussi
SET SESSION AUTHORIZATION(7)
1122
Nom
SET SESSION AUTHORIZATION Initialise l'identifiant de session de l'utilisateur et l'identifiant de l'utilisateur actuel de la
session en cours
Synopsis
SET [ SESSION | LOCAL ] SESSION AUTHORIZATION nom_utilisateur
SET [ SESSION | LOCAL ] SESSION AUTHORIZATION DEFAULT
RESET SESSION AUTHORIZATION
Description
Cette commande positionne l'identifiant de session de l'utilisateur et celui de l'utilisateur courant pour la session SQL en cours
nom_utilisateur. Le nom de l'utilisateur peut tre un identifiant ou une chane littrale. En utilisant cette commande, il est
possible, par exemple, de devenir temporairement un utilisateur non privilgi et de redevenir plus tard superutilisateur.
L'identifiant de session de l'utilisateur est initialement positionn au nom de l'utilisateur (ventuellement authentifi) fourni par
le client. L'identifiant de l'utilisateur courant est habituellement identique l'identifiant de session de l'utilisateur mais il peut
tre temporairement modifi par le contexte de fonctions SECURITY DEFINER ou de mcanismes similaires ; il peut aussi
tre chang par SET ROLE(7). L'identifiant de l'utilisateur courant est essentiel la vrification des permissions.
L'identifiant de session de l'utilisateur ne peut tre chang que si l'utilisateur de session initial (l'utilisateur authentifi) dispose
des privilges superutilisateur. Dans le cas contraire, la commande n'est accepte que si elle fournit le nom de l'utilisateur authentifi.
Les modificateurs SESSION et LOCAL agissent de la mme faon que la commande standard SET(7).
Les formes DEFAULT et RESET rinitialisent les identifiants courant et de session de l'utilisateur ceux de l'utilisateur originellement authentifi. Tout utilisateur peut les excuter.
Notes
SET SESSION AUTHORIZATION ne peut pas tre utilis dans une fonction SECURITY DEFINER.
Exemples
SELECT SESSION_USER, CURRENT_USER;
session_user | current_user
--------------+-------------peter
| peter
SET SESSION AUTHORIZATION 'paul';
SELECT SESSION_USER, CURRENT_USER;
session_user | current_user
--------------+-------------paul
| paul
Compatibilit
Le standard SQL autorise l'apparition de quelques autres expressions la place de nom_utilisateur. Dans la pratique, ces
expressions ne sont pas importantes. PostgreSQL autorise la syntaxe de l'identifiant ("nom_utilisateur") alors que
SQL ne le permet pas. SQL n'autorise pas l'excution de cette commande au cours d'une transaction ; PostgreSQL n'impose
pas cette restriction parce qu'il n'y a pas lieu de le faire. Les modificateurs SESSION et LOCAL sont des extensions
PostgreSQL tout comme la syntaxe RESET.
Le standard laisse la dfinition des droits ncessaires l'excution de cette commande l'implantation.
Voir aussi
SET ROLE(7)
1123
Nom
SET TRANSACTION initialise les caractristiques de la transaction actuelle
Synopsis
SET TRANSACTION mode_transaction [, ...]
SET SESSION CHARACTERISTICS AS TRANSACTION mode_transaction [, ...]
o mode_transaction fait
partie de :
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ
UNCOMMITTED }
READ WRITE | READ ONLY
[ NOT ] DEFERRABLE
Description
La commande SET TRANSACTION initialise les caractristiques de la transaction courante. Elle est sans effet sur les transactions suivantes. SET SESSION CHARACTERISTICS positionne les caractristiques par dfaut pour toutes les transactions
venir d'une session. Ces valeurs peuvent ensuite tre surcharges par SET TRANSACTION pour une transaction particulire.
Les caractristiques de transaction disponibles sont le niveau d'isolation, le mode d'accs de la transaction (lecture/criture ou
lecture seule) et le mode diffrable.
Le niveau d'isolation dtermine les donnes que la transaction peut voir quand d'autres transactions fonctionnent concurrentiellement :
READ COMMITTED
Une instruction ne peut voir que les lignes valides avant qu'elle ne commence. C'est la valeur par dfaut.
REPEATABLE READ
Toute instruction de la transaction en cours ne peut voir que les lignes valides avant que la premire requte ou instruction
de modification de donnes soit excute dans cette transaction.
SERIALIZABLE
Toutes les requtes de la transaction en cours peuvent seulement voir les lignes valides avant l'excution de la premire requte ou instruction de modification de donnes de cette transaction. Si un ensemble de lectures et critures parmi les transactions srialisables concurrentes crait une situation impossible obtenir avec une excution en srie (une la fois) de ces
transactions, l'une d'entre elles sera annule avec un tat SQLSTATE serialization_failure.
Le standard SQL dfinit un niveau supplmentaire, READ UNCOMMITTED. Dans PostgreSQL, READ UNCOMMITTED est
trait comme READ COMMITTED.
Le niveau d'isolation de la transaction ne peut plus tre modifi aprs l'excution de la premire requte ou instruction de modification de donnes (SELECT, INSERT, DELETE, UPDATE, FETCH ou COPY) d'une transaction. Voir Chapitre 13,
Contrle d'accs simultan pour plus d'informations sur l'isolation et le contrle de concurrence.
La mthode d'accs de la transaction dtermine si elle est en lecture/criture ou en lecture seule. Lecture/criture est la valeur
par dfaut. Quand une transaction est en lecture seule, les commandes SQL suivantes sont interdites : INSERT, UPDATE, DELETE et COPY FROM si la table modifie n'est pas temporaire ; toutes les commandes CREATE, ALTER et DROP ; COMMENT,
GRANT, REVOKE, TRUNCATE ; EXPLAIN ANALYZE et EXECUTE si la commande excute figure parmi celles listes plus
haut. C'est une notion de haut niveau de lecture seule qui n'interdit pas toutes les critures sur disque.
La proprit DEFERRABLE d'une transaction n'a pas d'effet tant que la transaction est aussi SERIALIZABLE et READ ONLY.
Quand toutes ces proprits sont configures pour une transaction, la transaction pourrait bloquer lors de la premire acquisition
de son image de la base, aprs quoi il est possible de fonctionner sans la surcharge normale d'une transaction SERIALIZABLE
et sans risque de contribuer ou d'tre annul par un chec de srialisation. Ce mode convient bien l'excution de longs rapports
ou la cration de sauvegardes.
Notes
Si SET TRANSACTION est excut sans START TRANSACTION ou BEGIN pralable, il est sans effet car la transaction
se termine immdiatement.
Il est possible de se dispenser de SET TRANSACTION en spcifiant le mode_transaction dsir dans BEGIN ou
1124
SET TRANSACTION
START TRANSACTION.
Les modes de transaction par dfaut d'une session peuvent aussi tre configurs en initialisant les paramtres de configuration default_transaction_isolation, default_transaction_read_only et default_transaction_deferrable. (En fait, SET SESSION CHARACTERISTICS est un quivalent verbeux de la configuration de ces variables avec SET.) Les valeurs par dfaut peuvent ainsi tre
initialises dans le fichier de configuration, via ALTER DATABASE, etc. Chapitre 18, Configuration du serveur fournit de plus
amples informations.
Compatibilit
Les deux commandes sont dfinies dans le standard SQL. SERIALIZABLE y est le niveau d'isolation par dfaut de la transaction.
Dans PostgreSQL, la valeur par dfaut est habituellement READ COMMITTED, mais elle peut tre modifie comme cela est
mentionn ci-dessus.
Dans le standard SQL, il existe une autre caractristique de transaction pouvant tre configure avec ces commandes : la taille de
l'aire de diagnostique. Ce concept n'est valable que pour le SQL embarqu et, de fait, n'est pas implant dans le serveur PostgreSQL.
L'option DEFERRABLE de transaction_mode est une extension de PostgreSQL.
Le standard SQL requiert des virgules entre chaque mode_transaction mais, pour des raisons historiques, PostgreSQL autorise l'omission des virgules.
1125
Nom
SHOW affiche la valeur d'un paramtre d'excution
Synopsis
SHOW nom
SHOW ALL
Description
SHOW affiche la configuration courante des paramtres d'excution. Ces variables peuvent tre initialises l'aide de
l'instruction SET, par le fichier de configuration postgresql.conf, par la variable d'environnement PGOPTIONS (lors de
l'utilisation de libpq ou d'une application fonde sur libpq), ou l'aide d'options en ligne de commande lors du dmarrage de
postgres. Voir Chapitre 18, Configuration du serveur pour plus de dtails.
Paramtres
nom
Le nom d'un paramtre d'excution. Les paramtres disponibles sont documents dans Chapitre 18, Configuration du serveur et sur la page de rfrence SET(7). De plus, il existe quelques paramtres qui peuvent tre affichs mais ne sont pas
initialisables :
SERVER_VERSION
Affiche le numro de version du serveur.
SERVER_ENCODING
Affiche l'encodage des caractres ct serveur. ce jour, ce paramtre peut tre affich mais pas initialis parce que
l'encodage est dtermin au moment de la cration de la base de donnes.
LC_COLLATE
Affiche la locale de la base de donnes pour le tri de texte. ce jour, ce paramtre est affichable mais pas initialis parce
que la configuration est dtermine lors de la cration de la base de donnes.
LC_CTYPE
Affiche la locale de la base de donnes pour la classification des caractres. ce jour, ce paramtre peut tre affich mais
pas initialis parce que la configuration est dtermine lors de la cration de la base de donnes.
IS_SUPERUSER
Vrai si le rle courant a des droits de super-utilisateur.
ALL
Affiche les valeurs de tous les paramtres de configuration avec leur description.
Notes
La fonction current_setting affiche les mmes informations. Voir Section 9.24, Fonctions d'administration systme .
De plus, la vue systme pg_settings propose la mme information.
Exemples
Affiche la configuration courante du paramtre datestyle :
SHOW datestyle;
datestyle
----------ISO, MDY
(1 row)
Affiche la configuration courante du paramtre geqo :
SHOW geqo;
geqo
-----on
1126
SHOW
(1 row)
Affiche tous les paramtres :
name
| setting |
description
-------------------------+---------+------------------------------------------------allow_system_table_mods | off
| Allows modifications of the structure of ...
.
.
.
xmloption
| content | Sets whether XML data in implicit parsing ...
zero_damaged_pages
| off
| Continues processing past damaged page headers.
(196 rows)
Compatibilit
La commande SHOW est une extension PostgreSQL.
Voir aussi
SET(7), RESET(7)
1127
Nom
START TRANSACTION dbute un bloc de transaction
Synopsis
START TRANSACTION [ mode_transaction [, ...] ]
o mode_transaction fait
partie de :
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ
UNCOMMITTED }
READ WRITE | READ ONLY
[ NOT ] DEFERRABLE
Description
Cette commande dbute un nouveau bloc de transaction. Si le niveau d'isolation, le mode lecture/criture ou le mode diffrable
est spcifi, la nouvelle transaction adopte ces caractristiques, comme si SET TRANSACTION(7) avait t excut. Cette
commande est identique la commande BEGIN(7).
Paramtres
Pour obtenir la signification des paramtres de cette instruction, on pourra se rfrer SET TRANSACTION(7).
Compatibilit
Le standard SQL n'impose pas de lancer START TRANSACTION pour commencer un bloc de transaction : toute commande
SQL dbute implicitement un bloc. On peut considrer que PostgreSQL excute implicitement un COMMIT aprs chaque
commande non prcde de START TRANSACTION (ou BEGIN). Ce comportement est d'ailleurs souvent appel
autocommit . D'autres systmes de bases de donnes relationnelles offrent une fonctionnalit de validation automatique.
L'option DEFERRABLE de transaction_mode est une extension de PostgreSQL.
Le standard SQL impose des virgules entre les modes_transaction successifs mais, pour des raisons historiques, PostgreSQL autorise l'omission des virgules.
Voir aussi la section de compatibilit de SET TRANSACTION(7).
Voir aussi
BEGIN(7), COMMIT(7), ROLLBACK(7), SAVEPOINT(7), SET TRANSACTION(7)
1128
Nom
TRUNCATE vide une table ou un ensemble de tables
Synopsis
TRUNCATE [ TABLE ] [ ONLY ] nom [ * ] [, ... ]
[ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]
Description
La commande TRUNCATE supprime rapidement toutes les lignes d'un ensemble de tables. Elle a le mme effet qu'un DELETE non qualifi sur chaque table, mais comme elle ne parcourt par la table, elle est plus rapide. De plus, elle rcupre immdiatement l'espace disque, vitant ainsi une opration VACUUM. Cette commande est particulirement utile pour les tables volumineuses.
Paramtres
nom
Le nom d'une table vider (pouvant tre qualifi par le schma). Si la clause ONLY est prcise avant le nom de la table,
seule cette table est tronque. Dans le cas contraire, la table et toutes ses tables filles (si elle en a) sont tronques. En option,
* peut tre ajout aprs le nom de la table pour indiquer explicitement que les tables filles sont inclues.
RESTART IDENTITY
Redmarre les squences intgres aux colonnes des tables tronques.
CONTINUE IDENTITY
Ne change pas la valeur des squences. C'est la valeur par dfaut.
CASCADE
Vide toutes les tables qui ont des rfrences de cls trangres sur une des tables nommes et sur toute table ajoute au
groupe cause du CASCADE.
RESTRICT
Refuse le vidage si une des tables a des rfrences de cls trangres sur une table qui ne sont pas listes dans la commande.
Cette option est active par dfaut.
Notes
Vous devez avoir le droit TRUNCATE sur la table que vous voulez tronquer.
TRUNCATE ncessite un verrou d'accs exclusif (ACCESS EXCLUSIVE) sur chaque table qu'il traite, ce qui bloque toutes les
autres oprations en parallle sur cette table. Quand RESTART IDENTITY est spcifi, toutes les squences qui doivent tre
rinitialises ont un verrou exclusif. Si un accs concurrent est ncessaire, alors la commande DELETE doit tre utilise.
TRUNCATE ne peut pas tre utilis sur une table rfrence par d'autres tables au travers de cls trangres, sauf si ces tables
sont aussi comprises dans la commande. Dans le cas contraire, la vrification ncessiterait des parcours complets de tables, ce
qui n'est pas le but de la commande TRUNCATE. L'option CASCADE est utilisable pour inclure automatiquement toutes les
tables dpendantes -- faites attention lorsque vous utilisez cette option parce que vous pourriez perdre des donnes que vous auriez souhaitez conserver !
TRUNCATE ne dclenchera aucun trigger ON DELETE qui pourrait exister sur les tables. Par contre, il dclenchera les triggers ON TRUNCATE. Si des triggers ON TRUNCATE sont dfinis sur certaines des tables, alors tous les triggers BEFORE
TRUNCATE sont dclenchs avant que le tronquage n'intervienne, et tous les triggers AFTER TRUNCATE sont dclenchs aprs
la ralisation du dernier tronquage et toutes les squences sont rinitialises. Les triggers se dclencheront dans l'ordre de traitement des tables (tout d'abord celles listes dans la commande, puis celles ajoutes cause des cascades).
Quand RESTART IDENTITY est spcifi, les oprations ALTER SEQUENCE RESTART impliques sont aussi ralises de
faon transactionnelles. Autrement dit, elles seront annules si la transaction n'est pas valide. C'est le contraire du comportement normal de ALTER SEQUENCE RESTART. Faites attention au fait que si des oprations supplmentaires sur les squences impliques est faite avant l'annulation de la transaction, les effets de ces oprations sur les squences seront aussi annuls mais pas les effets sur currval() ; autrement dit, aprs la transaction, currval() continuera reflter la dernire valeur
de la squence obtenue au sein de la transaction choue, mme si la squence elle-mme pourrait ne plus tre en adquation
avec cela. C'est similaire au comportement habituel de currval() aprs une transaction choue.
1129
TRUNCATE
TRUNCATE est compatible avec le systme des transactions. Les donnes seront toujours disponibles si la transaction est annule.
Avertissement
Les oprations sur les squences (ALTER SEQUENCE RESTART) ralises en consquence de l'utilisation de
l'option RESTART IDENTITY sont non transactionnelles et ne seront pas annules en cas d'chec. Pour minimiser
les risques, ces oprations sont ralises seulement aprs que tout le reste du travail de TRUNCATE ne soit termin. Nanmoins, il y a toujours un risque si TRUNCATE est excut dans un bloc de transaction qui est annul ultrieurement. Par exemple, avec :
BEGIN;
TRUNCATE TABLE foo RESTART IDENTITY;
COPY foo FROM ...;
COMMIT;
Si le COPY choue, les donnes de la table seront restaures mais les squences seront laisses avec des valeurs
probablement infrieures celles qu'elles avaient avant, ce qui pourrait amener des checs de cls dupliques ou
d'autres problmes dans les transactions suivantes. Si cela peut devenir un problme, il est bien mieux d'viter
d'utiliser RESTART IDENTITY, et d'accepter que le nouveau contenu de la table aura des numros de squence
bien suprieur l'ancien.
Exemples
Vider les tables grossetable et grandetable :
TRUNCATE grossetable, grandetable;
La mme chose, en rinitialisant les gnrateurs des squences associes :
TRUNCATE bigtable, fattable RESTART IDENTITY;
Vide la table uneautretable, et cascade cela toutes les tables qui rfrencent uneautretable via des contraintes de cls
trangres :
TRUNCATE uneautretable CASCADE;
Compatibilit
Le standard SQL:2008 inclut une commande TRUNCATE avec la syntaxe TRUNCATE TABLE nom_table. Les clauses
CONTINUE IDENTITY/RESTART IDENTITY font aussi partie du standard mais ont une signification lgrement diffrente,
quoique en rapport. Certains des comportements de concurrence de cette commande sont laisss au choix de l'implmentation par
le standard, donc les notes ci-dessus doivent tre comprises et compares avec les autres implmentations si ncessaire.
1130
Nom
UNLISTEN arrte l'coute d'une notification
Synopsis
UNLISTEN { canal | * }
Description
UNLISTEN est utilis pour supprimer un abonnement aux vnements NOTIFY. UNLISTEN annule tout abonnement pour la
session PostgreSQL en cours sur le canal de notification nomm canal. Le caractre gnrique * annule tous les abonnements de la session en cours.
NOTIFY(7) contient une discussion plus complte de l'utilisation de LISTEN et de NOTIFY.
Paramtres
canal
Le nom d'un canal de notification (un identificateur quelconque).
*
Tous les abonnements de cette session sont annuls.
Notes
Il est possible de se dsabonner de quelque chose pour lequel il n'y a pas d'abonnement ; aucun message d'avertissement ou
d'erreur n'est alors retourn.
la fin de chaque session, UNLISTEN * est excut automatiquement.
Une transaction qui a excut UNLISTEN ne peut pas tre prpare pour une validation en deux phases.
Exemples
Pour s'abonner :
LISTEN virtual;
NOTIFY virtual;
Asynchronous notification "virtual" received from server process with PID 8448.
Une fois que UNLISTEN a t excut, les messages NOTIFY suivants sont ignors :
UNLISTEN virtual;
NOTIFY virtual;
-- aucun vnement NOTIFY n'est reu
Compatibilit
Il n'y a pas de commande UNLISTEN dans le standard SQL.
Voir aussi
LISTEN(7), NOTIFY(7)
1131
Nom
UPDATE mettre jour les lignes d'une table
Synopsis
[ WITH [ RECURSIVE ] requte_with [, ...] ]
UPDATE [ ONLY ] table [ * ] [ [ AS ] alias ]
SET { colonne = { expression | DEFAULT } |
( colonne [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...]
[ FROM liste_from ]
[ WHERE condition | WHERE CURRENT OF cursor_name ]
[ RETURNING * | expression_sortie [ [ AS ] nom_sortie ] [, ...] ]
Description
UPDATE modifie les valeurs des colonnes spcifies pour toutes les lignes qui satisfont la condition. Seules les colonnes modifier doivent tre mentionnes dans la clause SET ; les autres colonnes conservent leur valeur.
Il existe deux faons de modifier le contenu d'une table partir d'informations contenues dans d'autres tables de la base de donnes : l'aide de sous-requtes ou en spcifiant des tables supplmentaires dans la clause FROM. Le contexte permet de dcider
de la technique la plus approprie.
La clause RETURNING optionnelle fait que UPDATE calcule et renvoie le(s) valeur(s) base(s) sur chaque ligne en cours de
mise jour. Toute expression utilisant les colonnes de la table et/ou les colonnes d'autres tables mentionnes dans FROM peut
tre calcule. La syntaxe de la liste RETURNING est identique celle de la commande SELECT.
L'utilisateur doit possder le droit UPDATE sur la table, ou au moins sur les colonnes listes pour la mise jour. Vous devez
aussi avoir le droit SELECT sur toutes les colonnes dont les valeurs sont lues dans les expressions ou condition.
Paramtres
requte_with
La clause WITH vous permet de spcifier une ou plusieurs sous-requtes qui peuvent tre rfrences par nom dans la requteUPDATE. Voir Section 7.8, Requtes WITH (Common Table Expressions) et SELECT(7) pour les dtails.
table
Le nom de la table mettre jour (ventuellement qualifi du nom du schma). Si ONLY est indiqu avant le nom de la
table, les lignes modifies ne concernent que la table nomme. Si ONLY n'est pas indique, les lignes modifies font partie
de la table nomme et de ses tables filles. En option, * peut tre ajout aprs le nom de la table pour indiquer explicitement
que les tables filles doivent tre inclues.
alias
Un nom de substitution pour la table cible. Quand un alias est fourni, il cache compltement le nom rel de la table. Par
exemple, avec UPDATE foo AS f, le reste de l'instruction UPDATE doit rfrencer la table avec f et non plus foo.
colonne
Le nom d'une colonne dans table. Le nom de la colonne peut tre qualifi avec un nom de sous-champ ou un indice de tableau, si ncessaire. Ne pas inclure le nom de la table dans la spcification d'une colonne cible -- par exemple, UPDATE
tab SET tab.col = 1 est invalide.
expression
Une expression affecter la colonne. L'expression peut utiliser les anciennes valeurs de cette colonne et d'autres colonnes
de la table.
DEFAULT
Rinitialise la colonne sa valeur par dfaut (qui vaut NULL si aucune expression par dfaut ne lui a t affecte).
liste_from
Une liste d'expressions de tables, qui permet aux colonnes des autres tables d'apparatre dans la condition WHERE et dans les
expressions de mise jour. Cela est similaire la liste de tables pouvant tre spcifie dans la section intitule Clause
FROM d'une instruction SELECT. La table cible ne doit pas apparatre dans liste_from, sauf en cas d'auto-jointure
(auquel cas elle doit apparatre avec un alias dans liste_from).
condition
Une expression qui renvoie une valeur de type boolean. Seules les lignes pour lesquelles cette expression renvoie true
1132
UPDATE
Sorties
En cas de succs, une commande UPDATE renvoie un message de la forme
UPDATE total
total est le nombre de lignes mises jour. S'il vaut 0, c'est qu'aucune ligne ne correspondait condition (ce qui n'est pas
considr comme une erreur).
Notes
Lorsqu'une clause FROM est prcise, la table cible est jointe aux tables mentionnes dans liste_from, et chaque ligne en sortie
de la jointure reprsente une opration de mise jour pour la table cible. Lors de l'utilisation de FROM, il faut s'assurer que la jointure produit au plus une ligne en sortie par ligne modifier. En d'autres termes, une ligne cible ne doit pas tre jointe plus d'une
ligne des autres tables. Le cas chant, seule une ligne de jointure est utilise pour mettre jour la ligne cible, mais il n'est pas
possible de prdire laquelle.
cause de ce manque de dterminisme, il est plus sr de ne rfrencer les autres tables qu' l'intrieur de sous-requtes. Mme si
c'est plus difficile lire et souvent plus lent que l'utilisation d'une jointure.
Si la commande UPDATE contient une clause RETURNING, le rsultat sera similaire celui d'une instruction SELECT contenant les colonnes et les valeurs dfinies dans la liste RETURNING, partir de la liste des lignes mises jour par la commande,
comme la possibilit d'utiliser la clause WITH avec la commande UPDATE.
Exemples
Changer le mot Drame en Dramatique dans la colonne genre de la table films :
UPDATE films SET genre = 'Dramatique' WHERE genre = 'Drame';
Ajuster les entres de temprature et rinitialiser la prcipitation sa valeur par dfaut dans une ligne de la table temps :
UPDATE temps SET temp_basse = temp_basse+1, temp_haute = temp_basse+15, prcp = DEFAULT
WHERE ville = 'San Francisco' AND date = '2005-07-03';
Raliser la mme opration et renvoyer les lignes mises jour :
UPDATE temps SET temp_basse = temp_basse+1, temp_haute = temp_basse+15, prcp = DEFAULT
WHERE ville = 'San Francisco' AND date = '2003-07-03'
RETURNING temp_basse, temp_haute, prcp;
Utiliser une autre syntaxe pour faire la mme mise jour :
UPDATE temps SET (temp_basse, temp_haute, prcp) = (temp_basse+1, temp_basse+15,
DEFAULT)
WHERE ville = 'San Francisco' AND date = '2003-07-03';
Incrmenter le total des ventes de la personne qui gre le compte d'Acme Corporation, l'aide de la clause FROM :
UPDATE employes SET total_ventes = total_ventes + 1 FROM comptes
WHERE compte.nom = 'Acme Corporation'
AND employes.id = compte.vendeur;
1133
UPDATE
Compatibilit
Cette commande est conforme au standard SQL, l'exception des clauses FROM et RETURNING qui sont des extensions PostgreSQL.
D'aprs le standard, la syntaxe de la liste de colonnes permet qu'une liste de colonnes soit affecte une expression de ligne
comme une sous-slection :
UPDATE comptes SET (nom_contact, prenom_contact) =
(SELECT nom, prenom FROM commerciaux
WHERE commerciaux.id = comptes.vendeur_id);
Ceci n'est pas encore implment -- la source doit tre une liste d'expressions indpendantes.
D'autres systmes de bases de donnes offrent l'option FROM dans laquelle la table cible est suppose tre nouveau indique dans
le FROM. PostgreSQL n'interprte pas la clause FROM ainsi. Il est important d'en tenir compte lors du portage d'applications qui
utilisent cette extension.
1134
Nom
VACUUM rcupre l'espace inutilis et, optionnellement, analyse une base
Synopsis
VACUUM
...] )
VACUUM
VACUUM
[
]
[
[
Description
VACUUM rcupre l'espace de stockage occup par des lignes mortes. Lors des oprations normales de PostgreSQL, les
lignes supprimes ou rendues obsoltes par une mise jour ne sont pas physiquement supprimes de leur table. Elles restent prsentes jusqu' ce qu'un VACUUM soit lanc. C'est pourquoi, il est ncessaire de faire un VACUUM rgulirement, spcialement sur les tables frquemment mises jour.
Sans paramtre, VACUUM traite toutes les tables de la base de donnes courante pour lequel l'utilisateur connect dispose du
droit d'excution du VACUUM. Avec un paramtre, VACUUM ne traite que cette table.
VACUUM ANALYZE fait un VACUUM, puis un ANALYZE sur chaque table slectionne. C'est une combinaison pratique
pour les scripts de maintenance de routine. Voir ANALYZE(7) pour avoir plus de dtails sur ce qu'il traite.
Le VACUUM standard (sans FULL) rcupre simplement l'espace et le rend disponible pour une rutilisation. Cette forme de la
commande peut oprer en parallle avec les oprations normales de lecture et d'criture de la table, car elle n'utilise pas de verrou exclusif. Nanmoins, l'espace rcupr n'est pas renvoy au systme de fichiers dans la plupart des cas ; il est conserv pour
tre rutilis dans la mme table. VACUUM FULL r-crit le contenu complet de la table dans un nouveau fichier sur disque
sans perte d'espace, permettant l'espace inutilis d'tre retourn au systme d'exploitation. Cette forme est bien plus lente et ncessite un verrou exclusif sur chaque table le temps de son traitement.
Quand la liste d'options est entoure de parenthses, les options peuvent tre crites dans n'importe quel ordre. Sans parenthses,
les options doivent tre crit dans l'ordre exact dcrit ci-dessus. La syntaxe avec parenthse a t ajoute ds la version 9.0 de
PostgreSQL ; la syntaxe sans parenthse est maintenant considre comme obsolte.
Paramtres
FULL
Choisit un vacuum full , qui rcupre plus d'espace, mais est beaucoup plus long et prend un verrou exclusif sur la table.
Cette mthode requiert aussi un espace disque supplmentaire car il crit une nouvelle copie de la table et ne supprime
l'ancienne copie qu' la fin de l'opration. Habituellement, cela doit seulement tre utilis quand une quantit importante
d'espace doit tre rcupre de la table.
FREEZE
Choisit un gel agressif des lignes. Indiquer FREEZE est quivalent raliser un VACUUM avec le paramtre vacuum_freeze_min_age configur zro.
VERBOSE
Affiche un rapport dtaill de l'activit de vacuum sur chaque table.
ANALYZE
Met jour les statistiques utilises par l'optimiseur pour dterminer la mthode la plus efficace pour excuter une requte.
table
Le nom (optionnellement qualifi par le nom d'un schma) d'une table traiter par vacuum. Par dfaut, toutes les tables de
la base de donnes courante sont traites.
colonne
Le nom d'une colonne spcifique analyser. Par dfaut, toutes les colonnes. Si une liste de colonnes est spcifie, ANALYZE en est dduit.
Sorties
Lorsque VERBOSE est prcis, VACUUM indique sa progression par des messages indiquant la table en cours de traitement.
Diffrentes statistiques sur les tables sont aussi affiches.
1135
VACUUM
Notes
Pour excuter un VACUUM sur une table, vous devez habituellement tre le propritaire de la table ou un superutilisateur. Nanmoins, les propritaires de la base de donnes sont autoriss excuter VACUUM sur toutes les tables de leurs bases de donnes,
sauf sur les catalogues partags. Cette restriction signifie qu'un vrai VACUUM sur une base complte ne peut se faire que par un
superutilisateur.) VACUUM ignorera toutes les tables pour lesquelles l'utilisateur n'a pas le droit d'excuter un VACUUM.
VACUUM ne peut pas tre excut l'intrieur d'un bloc de transactions.
Pour les tables ayant des index GIN, VACUUM (sous n'importe quelle forme) termine aussi toutes les insertions d'index en attente, en dplaant les entres d'index aux bons endroits dans la structure d'index GIN principale. Voir Section 54.3.1,
Technique GIN de mise jour rapide pour les dtails.
Nous recommandons que les bases de donnes actives de production soient traites par vacuum frquemment (au moins toutes les
nuits), pour supprimer les lignes mortes. Aprs avoir ajout ou supprim un grand nombre de lignes, il peut tre utile de faire un
VACUUM ANALYZE sur la table affecte. Cela met les catalogues systme jour de tous les changements rcents et permet
l'optimiseur de requtes de PostgreSQL de faire de meilleurs choix lors de l'optimisation des requtes.
L'option FULL n'est pas recommande en usage normal, mais elle peut tre utile dans certains cas. Par exemple, si vous avez supprim ou mis jour l'essentiel des lignes d'une table et si vous voulez que la table diminue physiquement sur le disque pour
n'occuper que l'espace rellement ncessaire et pour que les parcours de table soient plus rapides. Gnralement, VACUUM
FULL rduit plus la table qu'un simple VACUUM.
VACUUM peut engendrer une augmentation substantielle du trafic en entres/sorties pouvant causer des performances diminues
pour les autres sessions actives. Du coup, il est quelque fois conseill d'utiliser la fonctionnalit du dlai du vacuum bas sur le
cot. Voir Chapitre 17, Configuration du serveur et mise en place pour des informations supplmentaires.
PostgreSQL inclut un autovacuum qui peut automatiser la maintenance par VACUUM. Pour plus d'informations sur le VACUUM automatique et manuel, voir Section 23.1, Nettoyages rguliers .
Exemples
Ce qui suit est un exemple de lancement de VACUUM sur une table de la base de donnes regression.
regression=# VACUUM (VERBOSE, ANALYZE) onek;
INFO: vacuuming "public.onek"
INFO: index "onek_unique1" now contains 1000 tuples in 14 pages
DETAIL: 3000 index tuples were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU 0.01s/0.08u sec elapsed 0.18 sec.
INFO: index "onek_unique2" now contains 1000 tuples in 16 pages
DETAIL: 3000 index tuples were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU 0.00s/0.07u sec elapsed 0.23 sec.
INFO: index "onek_hundred" now contains 1000 tuples in 13 pages
DETAIL: 3000 index tuples were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU 0.01s/0.08u sec elapsed 0.17 sec.
INFO: index "onek_stringu1" now contains 1000 tuples in 48 pages
DETAIL: 3000 index tuples were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU 0.01s/0.09u sec elapsed 0.59 sec.
INFO: "onek": removed 3000 tuples in 108 pages
DETAIL: CPU 0.01s/0.06u sec elapsed 0.07 sec.
INFO: "onek": found 3000 removable, 1000 nonremovable tuples in 143 pages
DETAIL: 0 dead tuples cannot be removed yet.
There were 0 unused item pointers.
0 pages are entirely empty.
CPU 0.07s/0.39u sec elapsed 1.56 sec.
INFO: analyzing "public.onek"
INFO: "onek": 36 pages, 1000 rows sampled, 1000 estimated total rows
VACUUM
Compatibilit
Il n'y a pas de commande VACUUM dans le standard SQL.
Voir aussi
1136
VACUUM
vacuumdb(1), Section 18.4.3, Report du VACUUM en fonction de son cot , Section 23.1.5, Le dmon auto-vacuum
1137
Nom
VALUES calcule un ensemble de lignes
Synopsis
VALUES ( expression [, ...] ) [, ...]
[ ORDER BY expression_de_tri [ ASC | DESC | USING operateur ] [, ...] ]
[ LIMIT { nombre | ALL } ]
[ OFFSET debut ] [ ROW | ROWS ] ]
[ FETCH { FIRST | NEXT } [ nombre ] { ROW | ROWS } ONLY ]
Description
VALUES calcule une valeur de ligne ou un ensemble de valeurs de lignes spcifies par des expressions. C'est gnralement
utilis pour gnrer une table statique l'intrieur d'une commande plus large mais elle peut aussi tre utilise sparment.
Quand plus d'une ligne est indique, toutes les lignes doivent avoir le mme nombre d'lments. Les types de donnes des colonnes de la table rsultante sont dtermins en combinant les types explicites et les types infrs des expressions apparaissant
dans cette colonne, en utilisant les mmes rgles que pour l'UNION (voir Section 10.5, Constructions UNION, CASE et
constructions relatives ).
l'intrieur de grosses commandes, VALUES est autoris au niveau de la syntaxe partout o la commande SELECT l'est.
Comme la grammaire traite cette commande comme un SELECT, il est possible d'utiliser les clauses ORDER BY, LIMIT (ou
de faon quivalente FETCH FIRST) et OFFSET avec une commande VALUES.
Paramtres
expression
Une constante ou une expression calculer et insrer l'emplacement indiqu dans la table rsultante (ensemble de
lignes). Dans une liste VALUES apparaissant en haut d'une commande INSERT, une expression peut tre remplace
par DEFAULT pour demander l'insertion de la valeur par dfaut de la colonne de destination. DEFAULT ne peut pas tre utilis quand VALUES apparat dans d'autres contextes.
expression_de_tri
Une expression ou un entier indiquant comment trier les lignes de rsultat. Cette expression peut faire rfrence aux colonnes de VALUES en tant que column1, column2, etc. Pour plus de dtails, voir la section intitule Clause ORDER
BY .
operateur
Un oprateur de tri. Pour plus de dtails, voir la section intitule Clause ORDER BY .
nombre
Le nombre maximum de lignes renvoyer. Pour plus de dtails, voir la section intitule Clause LIMIT .
debut
Le nombre de lignes chapper avant de commencer renvoyer des lignes. Pour plus de dtails, la section intitule
Clause LIMIT .
Notes
vitez les listes VALUES comprenant un trs grand nombre de lignes car vous pourriez rencontrer des problmes comme un
manque de mmoire et/ou des performances pauvres. Un VALUES apparaissant dans un INSERT est un cas spcial (parce que
le type des colonnes est trouv partir de la table cible du INSERT et n'a donc pas besoin d'tre devin en parcourant la liste
VALUES), du coup il peut grer des listes plus importantes que dans d'autres contextes.
Exemples
Une simple commande VALUES :
VALUES (1, 'un'), (2, 'deux'), (3, 'trois');
Ceci renverra une table statique comprenant deux colonnes et trois lignes. En fait, c'est quivalent :
1138
VALUES
Astuce
Pour de simples tests IN, il est prfrable de se baser sur des listes de valeurs pour IN que d'crire une requte VALUES comme indique ci-dessus. La mthode des listes de valeurs simples requiert moins d'criture et est souvent
plus efficace.
Compatibilit
VALUES est conforme au standard SQL. Les clauses LIMIT et OFFSET sont des extensions PostgreSQL ; voir aussi SELECT(7).
Voir aussi
INSERT(7), SELECT(7)
1139
1140
Nom
clusterdb Grouper une base de donnes PostgreSQL
Synopsis
clusterdb [options_connexion...] [[--verbose] | [-v]] [--table | -t table ] [nom_bd]
clusterdb [options_connexion...] [[--verbose] | [-v]] [[--all] | [-a]]
Description
clusterdb est un outil de regroupage de tables au sein d'une base de donnes PostgreSQL. Il trouve les tables prcdemment
groupes et les groupe nouveau sur l'index utilis lors du groupement initial. Les tables qui n'ont jamais t groupes ne sont
pas affectes.
clusterdb est un enrobage de la commande SQL CLUSTER(7). Il n'y a pas de diffrence relle entre le groupage de bases par cet
outil ou par d'autres mthodes d'accs au serveur.
Options
clusterdb accepte les arguments suivants en ligne de commande :
-a, --all
Grouper toutes les bases de donnes.
[-d] nom_bd, [--dbname=]nom_bd
Le nom de la base de donnes grouper. Si ni ce nom, ni l'option -a (ou --all) ne sont prciss, le nom de la base de
donnes est lu partir de la variable d'environnement PGDATABASE. Si cette dernire n'est pas initialise, le nom de
l'utilisateur spcifi pour la connexion est utilis.
-e, --echo
Les commandes engendres par clusterdb et envoyes au serveur sont affiches.
-q, --quiet
Aucun message de progression n'est affich.
-t table, --table=table
Seule la table table est groupe.
-v, --verbose
Affiche des informations dtailles lors du traitement.
-V, --version
Affiche la version de clusterdb puis quitte.
-?, --help
Affiche l'aide sur les arguments en ligne de commande de clusterdb, puis quitte
clusterdb accepte aussi les arguments suivants en ligne de commande pour les paramtres de connexion :
-h hte, --host hte
Le nom de la machine hte sur laquelle le serveur fonctionne. Si la valeur commence par une barre oblique (slash), elle est
utilise comme rpertoire du socket de domaine Unix.
-p port, --port=port
Le port TCP ou l'extension du fichier du socket local de domaine Unix sur lequel le serveur attend les connexions.
-U nomutilisateur, --username=nomutilisateur
Le nom de l'utilisateur utilis pour la connexion.
-w, --no-password
Ne demande jamais un mot de passe. Si le serveur en rclame un pour l'authentification et qu'un mot de passe n'est pas disponible d'une autre faon (par exemple avec le fichier .pgpass), la tentative de connexion chouera. Cette option peut
tre utile pour les scripts o aucun utilisateur n'est prsent pour saisir un mot de passe.
-W, --password
Force clusterdb demander un mot de passe avant la connexion une base de donnes.
1141
clusterdb
Cette option n'est jamais obligatoire car clusterdb demandera automatiquement un mot de passe si le serveur exige une authentification par mot de passe. Nanmoins, clusterdb perdra une tentative de connexion pour trouver que le serveur veut un
mot de passe. Dans certains cas, il est prfrable d'ajouter l'option -W pour viter la tentative de connexion.
Environnement
PGDATABASE, PGHOST, PGPORT, PGUSER
Paramtres de connexion par dfaut.
Cet outil, comme la plupart des autres outils PostgreSQL, utilise aussi les variables d'environnement supportes par la bibliothque libpq (voir Section 31.13, Variables d'environnement ).
Diagnostiques
En cas de difficult, voir CLUSTER(7) et psql(1) qui prsentent les problmes et messages d'erreur ventuels. Le serveur de bases
de donnes doit fonctionner sur l'hte cible. De plus, toutes les configurations de connexion par dfaut et variables
d'environnement utilises par la bibliothque client libpq s'appliquent.
Exemples
Grouper la base de donnes test :
$ clusterdb test
Grouper la seule table foo de la base de donnes nomme xyzzy :
$ clusterdb --table foo xyzzy
Voir aussi
CLUSTER(7)
1142
Nom
createdb Crer une nouvelle base de donnes PostgreSQL
Synopsis
createdb [option_connexion...] [option...] [nombase] [description]
Description
createdb cre une nouvelle base de donnes.
Normalement, l'utilisateur de la base de donnes qui excute cette commande devient le propritaire de la nouvelle base de donnes. Nanmoins, un propritaire diffrent peut tre spcifi via l'option -O, sous rserve que l'utilisateur qui lance la commande
ait les droits appropris.
createdb est un enrobage de la commande SQL CREATE DATABASE(7). Il n'y a pas de relle diffrence entre la cration de
bases de donnes par cet outil ou l'aide d'autres mthodes d'accs au serveur.
Options
createdb accepte les arguments suivants en ligne de commande :
nombase
Le nom de la base de donnes crer. Le nom doit tre unique parmi toutes les bases de donnes PostgreSQL de ce
groupe. La valeur par dfaut est le nom de l'utilisateur courant.
description
Le commentaire associer la base de donnes cre.
-D tablespace, --tablespace=tablespace
Le tablespace par dfaut de la base de donnes.
-e, --echo
Les commandes engendres par createdb et envoyes au serveur sont affiches.
-E locale, --encoding=locale
L'encodage des caractres utiliser dans la base de donnes. Les jeux de caractres supports par le serveur PostgreSQL
sont dcrits dans Section 22.3.1, Jeux de caractres supports .
-l locale, --locale=locale
Indique la locale utiliser dans cette base de donnes. C'est quivalent prciser la fois --lc-collate et -lc-ctype.
--lc-collate=locale
Indique le paramtre LC_COLLATE utilis pour cette base de donnes.
--lc-ctype=locale
Indique le paramtre LC_CTYPE utilis pour cette base de donnes.
-O propritaire, --owner=propritaire
Le propritaire de la base de donnes.
-T modle, --template=modle
La base de donnes modle.
-V, --version
Affiche la version de createdb puis quitte.
-?, --help
Affiche l'aide sur les arguments en ligne de commande de createdb, puis quitte
Les options -D, -l, -E, -O et -T correspondent aux options de la commande SQL sous-jacente CREATE DATABASE(7),
consulter pour plus d'informations sur ces options.
createdb accepte aussi les arguments suivants en ligne de commande, pour les paramtres de connexion :
-h hte, --host=hte
1143
createdb
Le nom de l'hte sur lequel le serveur est en cours d'excution. Si la valeur commence avec un slash (NDT : barre oblique, /),
elle est utilise comme rpertoire du socket de domaine Unix.
-p port, --port=port
Le port TCP ou l'extension du fichier socket de domaine Unix local sur lequel le serveur attend les connexions.
-U nomutilisateur, --username=nomutilisateur
Le nom de l'utilisateur utilis pour la connexion.
-w, --no-password
Ne demande jamais un mot de passe. Si le serveur en rclame un pour l'authentification et qu'un mot de passe n'est pas disponible d'une autre faon (par exemple avec le fichier .pgpass), la tentative de connexion chouera. Cette option peut tre
utile pour les scripts o aucun utilisateur n'est prsent pour saisir un mot de passe.
-W, --password
Force createdb demander un mot de passe avant la connexion une base de donnes.
Cette option n'est jamais obligatoire car createdb demandera automatiquement un mot de passe si le serveur exige une authentification par mot de passe. Nanmoins, createdb perdra une tentative de connexion pour trouver que le serveur veut un mot
de passe. Dans certains cas, il est prfrable d'ajouter l'option -W pour viter la tentative de connexion.
Environnement
PGDATABASE
S'il est configur, prcise le nom de la base de donnes crer. Peut-tre surcharg sur la ligne de commande.
PGHOST, PGPORT, PGUSER
Paramtres de connexion par dfaut. PGUSER dtermine aussi le nom de la base de donnes crer si ce dernier n'est pas spcifi sur la ligne de commande ou par PGDATABASE.
Cet outil, comme la plupart des autres outils PostgreSQL, utilise aussi les variables d'environnement supportes par la bibliothque libpq (voir Section 31.13, Variables d'environnement ).
Diagnostiques
En cas de difficult, on peut se rfrer CREATE DATABASE(7) et psql(1) qui prsentent les problmes ventuels et les messages d'erreurs. Le serveur de bases de donnes doit tre en cours d'excution sur l'hte cible. De plus, tous les paramtres de
connexion et variables d'environnement par dfaut utiliss par la bibliothque d'interface libpq s'appliquent.
Exemples
Crer la base de donnes demo sur le serveur de bases de donnes par dfaut :
$ createdb demo
Crer la base de donnes demo sur le serveur hberg sur l'hte eden, port 5000, en utilisant l'encodage LATIN1 avec affichage
de la commande engendre :
$ createdb -p 5000 -h eden -E LATIN1 -e demo
CREATE DATABASE "demo" ENCODING 'LATIN1'
Voir aussi
dropdb(1), CREATE DATABASE(7)
1144
Nom
createlang Installer un langage procdural sous PostgreSQL
Synopsis
createlang [options_connexion...] nom_langage [nom_bd]
createlang [options_connexion...] [--list] | [-l] nom_bd
Description
createlang permet d'ajouter un langage de programmation une base de donnes PostgreSQL.
createlang n'est qu'un enrobage de la commande SQL CREATE EXTENSION(7).
Attention
createlang est obsolte et pourrait tre supprim dans une version future de PostgreSQL. L'utilisation directe de
la commande CREATE EXTENSION est recommande la place.
Options
createlang accepte les arguments suivants en ligne de commande :
nom_langage
Le nom du langage de programmation procdurale installer.
[-d] nom_nd, [--dbname=]nom_bd
La base de donnes laquelle ajouter le langage. Par dfaut, celle de mme nom que l'utilisateur systme.
-e, --echo
Les commandes SQL excutes sont affiches.
-l, --list
La liste de langages installs sur la base de donnes cible est affiche.
-V, --version
Affiche la version de createlang puis quitte.
-?, --help
Affiche l'aide sur les arguments en ligne de commande de createlang, puis quitte
createlang accepte aussi les arguments suivants en ligne de commande pour les paramtres de connexion :
-h hte, --host=hte
Le nom de l'hte de la machine sur laquelle le serveur fonctionne. Si la valeur commence par un slash (/), elle est utilise
comme rpertoire du socket de domaine Unix.
-p port, --port=port
Le port TCP ou l'extension du fichier du socket local de domaine Unix sur lequel le serveur attend les connexions.
-U nomutilisateur, --username=nomutilisateur
Le nom de l'utilisateur utilis pour la connexion.
-w, --no-password
Ne demande jamais un mot de passe. Si le serveur en rclame un pour l'authentification et qu'un mot de passe n'est pas disponible d'une autre faon (par exemple avec le fichier .pgpass), la tentative de connexion chouera. Cette option peut
tre utile pour les scripts o aucun utilisateur n'est prsent pour saisir un mot de passe.
-W, --password
Force createlang demander un mot de passe avant la connexion une base de donnes.
Cette option n'est jamais obligatoire car createlang demandera automatiquement un mot de passe si le serveur exige une authentification par mot de passe. Nanmoins, createlang perdra une tentative de connexion pour trouver que le serveur veut
un mot de passe. Dans certains cas, il est prfrable d'ajouter l'option -W pour viter la tentative de connexion.
1145
createlang
Environnement
PGDATABASE, PGHOST, PGPORT, PGUSER
Paramtres de connexion par dfaut
Cet outil, comme la plupart des autres outils PostgreSQL, utilise aussi les variables d'environnement supportes par la bibliothque libpq (voir Section 31.13, Variables d'environnement ).
Diagnostiques
La plupart des messages d'erreur s'expliquent d'eux-mmes. Dans le cas contraire, createlang peut tre lance avec l'option -echo afin d'obtenir les commandes SQL examiner. De plus, tout paramtre de connexion par dfaut et toute variable
d'environnement utilis par la bibliothque libpq s'appliqueront.
Notes
droplang(1) est utilis pour supprimer un langage.
Exemples
Installer le langage pltcl dans la base de donnes template1 :
$ createlang pltcl template1
Installer un langage dans template1 l'installe automatiquement dans les bases de donnes cres ultrieurement.
Voir aussi
droplang(1), CREATE EXTENSION(7), CREATE LANGUAGE(7), Variables d'environnement (Section 31.13, Variables
d'environnement )
1146
Nom
createuser Dfinir un nouveau compte utilisateur PostgreSQL
Synopsis
createuser [option_connexion...] [option...] [nom_utilisateur]
Description
createuser cre un nouvel utilisateur PostgreSQL (ou, plus prcisment, un rle). Seuls les superutilisateurs et les utilisateurs
disposant du droit CREATEROLE peuvent crer de nouveaux utilisateurs. createuser ne peut de ce fait tre invoqu que par un
utilisateur pouvant se connecter en superutilisateur ou en utilisateur ayant le droit CREATEROLE.
Pour crer un superutilisateur, il est impratif de se connecter en superutilisateur ; la simple connexion en utilisateur disposant
du droit CREATEROLE n'est pas suffisante. tre superutilisateur implique la capacit d'outrepasser toutes les vrifications de
droits d'accs la base de donnes ; les privilges de superutilisateur ne peuvent pas tre accords la lgre.
createuser est un enrobage de la commande SQL CREATE ROLE(7). Il n'y a pas de diffrence relle entre la cration
d'utilisateurs par cet outil ou au travers d'autres mthodes d'accs au serveur.
Options
createuser accepte les arguments suivant en ligne de commande
nom_utilisateur
Le nom de l'utilisateur crer. Ce nom doit tre diffrent de tout rle de l'instance courante de PostgreSQL.
-c numro, --connection-limit=numro
Configure le nombre maximum de connexions simultanes pour le nouvel utilisateur. Par dfaut, il n'y a pas de limite.
-d, --createdb
Le nouvel utilisateur est autoris crer des bases de donnes.
-D, --no-createdb
Le nouvel utilisateur n'est pas autoris crer des bases de donnes. Cela correspond au comportement par dfaut.
-e, --echo
Les commandes engendree par createuser et envoyes au serveur sont affiches.
-E, --encrypted
Le mot de passe de l'utilisateur est stock chiffr dans la base. Si cette option n'est pas prcise, la gestion par dfaut des
mots de passe est utilise.
-i, --all
Le nouveau rle hrite automatiquement des droits des rles dont il est membre. Comportement par dfaut.
-I, --no-all
Le nouveau rle n'hrite pas automatiquement des droits des rles dont il est membre.
-l, --login
Le nouvel utilisateur est autoris se connecter (son nom peut tre utilis comme identifiant initial de session). Comportement par dfaut.
-L, --no-login
Le nouvel utilisateur n'est pas autoris se connecter. (Un rle sans droit de connexion est toujours utile pour grer les
droits de la base de donnes.)
-N, --unencrypted
Le mot de passe de l'utilisateur n'est pas stock chiffr. Si cette option n'est pas prcise, la gestion par dfaut des mots de
passe est utilise.
-P, --pwprompt
L'utilisation de cette option impose createuser d'afficher une invite pour la saisie du mot de passe du nouvel utilisateur.
Cela n'a pas d'utilit si l'authentification par mot de passe n'est pas envisage.
-r, --createrole
Le nouvel utilisateur est autoris crer de nouveaux rles (il possde le privilge CREATEROLE).
1147
createuser
-R, --no-createrole
Le nouvel utilisateur n'est pas autoris crer de nouveaux rles. Cela correspond au comportement par dfaut.
-s, --superuser
Le nouvel utilisateur a les privilges superutilisateur.
-S, --no-superuser
Le nouvel utilisateur n'a pas les privilges superutilisateur. Cela correspond au comportement par dfaut.
Le nom, ou toute autre information manquante non fournie sur la ligne de commande, est automatiquement demande.
createuser accepte aussi les arguments suivant en ligne de commande pour les paramtres de connexion :
-h hte, --host=hte
Le nom de l'hte sur lequel le serveur est en cours d'excution. Si la valeur commence avec un slash (/), elle est utilise
comme rpertoire du socket de domaine Unix.
-p port, --port=port
Le port TCP ou l'extension du fichier socket de domaine Unix sur lequel le serveur attend des connexions.
-U nomutilisateur, --username=nomutilisateur
Nom de l'utilisateur utilis pour la connexion (pas celui crer).
-w, --no-password
Ne demande jamais un mot de passe. Si le serveur en rclame un pour l'authentification et qu'un mot de passe n'est pas disponible d'une autre faon (par exemple avec le fichier .pgpass), la tentative de connexion chouera. Cette option peut tre
utile pour les scripts o aucun utilisateur n'est prsent pour saisir un mot de passe.
-W, --password
Force createuser demander un mot de passe (pour la connexion au serveur, pas pour le mot de passe du nouvel utilisateur).
Cette option n'est jamais obligatoire car createuser demandera automatiquement un mot de passe si le serveur exige une authentification par mot de passe. Nanmoins, createuser perdra une tentative de connexion pour trouver que le serveur veut un
mot de passe. Dans certains cas, il est prfrable d'ajouter l'option -W pour viter la tentative de connexion.
Environnement
PGHOST, PGPORT, PGUSER
Paramtres de connexion par dfaut
Cet outil, comme la plupart des autres outils PostgreSQL, utilise aussi les variables d'environnement supportes par la bibliothque libpq (voir Section 31.13, Variables d'environnement ).
Diagnostiques
En cas de problmes, on peut consulter CREATE ROLE(7) et psql(1) qui fournissent des informations sur les problmes potentiels et les messages d'erreur. Le serveur de la base de donnes doit tre en cours d'excution sur l'hte cible. De plus, tout paramtrage de connexion par dfaut et toute variable d'environnement utilise par le client de la bibliothque libpq s'applique.
Exemples
Crer un utilisateur joe sur le serveur de bases de donnes par dfaut :
$ createuser joe
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
Crer le mme utilisateur, joe, sur le serveur eden, port 5000, sans interaction, avec affichage de la commande sous-jacente :
$ createuser -h eden -p 5000 -S -D -R -e joe
CREATE ROLE joe NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN;
Crer l'utilisateur joe, superutilisateur, et lui affecter immdiatement un mot de passe :
$ createuser -P -s -e joe
Enter password for new role: xyzzy
1148
createuser
Voir aussi
dropuser(1), CREATE ROLE(7)
1149
Nom
dropdb Supprimer une base de donnes PostgreSQL
Synopsis
dropdb [option_connexion...] [option...] nom_bd
Description
dropdb dtruit une base de donnes PostgreSQL. L'utilisateur qui excute cette commande doit tre superutilisateur ou le propritaire de la base de donnes.
dropdb est un enrobage de la commande SQL DROP DATABASE(7). Il n'y a aucune diffrence relle entre la suppression de
bases de donnes avec cet outil et celles qui utilisent d'autres mthodes d'accs au serveur.
Options
dropdb accepte les arguments suivants en ligne de commande :
nom_bd
Le nom de la base de donnes supprimer.
-e, --echo
Les commandes engendres et envoyes au serveur par dropdb sont affiches.
-i, --interactive
Une confirmation pralable toute destruction est exige.
-V, --version
Affiche la version de dropdb puis quitte.
-?, --help
Affiche l'aide sur les arguments en ligne de commande de dropdb, puis quitte
dropdb accepte aussi les arguments suivants en ligne de commande pour les paramtres de connexion :
-h hte, --host=hte
Le nom d'hte de la machine sur laquelle le serveur fonctionne. Si la valeur dbute par une barre oblique (/ ou slash), elle
est utilise comme rpertoire de la socket de domaine Unix.
-p port, --port=port
Le port TCP ou l'extension du fichier de la socket locale de domaine Unix sur laquelle le serveur attend les connexions.
-U nomutilisateur, --username=nomutilisateur
Le nom de l'utilisateur utilis pour la connexion.
-w, --no-password
Ne demande jamais un mot de passe. Si le serveur en rclame un pour l'authentification et qu'un mot de passe n'est pas disponible d'une autre faon (par exemple avec le fichier .pgpass), la tentative de connexion chouera. Cette option peut
tre utile pour les scripts o aucun utilisateur n'est prsent pour saisir un mot de passe.
-W, --password
Force dropdb demander un mot de passe avant la connexion une base de donnes.
Cette option n'est jamais obligatoire car dropdb demandera automatiquement un mot de passe si le serveur exige une authentification par mot de passe. Nanmoins, dropdb perdra une tentative de connexion pour trouver que le serveur veut un
mot de passe. Dans certains cas, il est prfrable d'ajouter l'option -W pour viter la tentative de connexion.
Environnement
PGHOST, PGPORT, PGUSER
Paramtres de connexion par dfaut
Cet outil, comme la plupart des autres outils PostgreSQL, utilise aussi les variables d'environnement supportes par la biblio1150
dropdb
Diagnostiques
En cas de difficults, il peut tre utile de consulter DROP DATABASE(7) et psql(1), sections prsentant les problmes ventuels
et les messages d'erreur.
Le serveur de base de donnes doit fonctionner sur le serveur cible. Les paramtres de connexion ventuels et les variables
d'environnement utiliss par la bibliothque cliente libpq s'appliquent.
Exemples
Dtruire la base de donnes demo sur le serveur de bases de donnes par dfaut :
$ dropdb demo
Dtruire la base de donnes demo en utilisant le serveur hberg sur l'hte eden, qui coute sur le port 5000, avec demande de
confirmation et affichage de la commande sous-jacente :
$ dropdb -p 5000 -h eden -i -e demo
Database "demo" will be permanently deleted.
Are you sure? (y/n) y
DROP DATABASE demo;
Voir aussi
createdb(1), DROP DATABASE(7)
1151
Nom
droplang Supprimer un langage procdural
Synopsis
droplang [option_connexion...] nom_langage [nom_bd]
droplang [option_connexion...] [--list] | [-l] nom_db
Description
droplang est un outil permettant de supprimer un langage procdural existant partir d'une base de donnes PostgreSQL.
droplang est un script appelant directement la commande SQL DROP EXTENSION(7).
Attention
droplang est obsolte et pourrait tre supprim dans une version future de PostgreSQL. L'utilisation directe de
la commande DROP EXTENSION est recommande la place.
Options
droplang accepte les arguments en ligne de commande :
nom_langage
Le nom du langage de programmation supprimer.
[-d] nom_bd, [--dbname=] nom_bd
La base de donnes qui contient le langage supprimer. Par dfaut, le nom de la base est quivalent celui du nom de
l'utilisateur systme qui lance la commande.
-e, --echo
Les commandes SQL excutes sont affiches.
-l, --list
La liste des langages installs sur la base de donnes cible est affich.
-V, --version
Affiche la version de droplang puis quitte.
-?, --help
Affiche l'aide sur les arguments en ligne de commande de droplang, puis quitte
droplang accepte aussi les arguments suivants sur la ligne de commande pour les paramtres de connexion :
-h hte, --host=hte
Le nom d'hte de la machine sur lequel le serveur fonctionne. Si la valeur commence par une barre oblique (/ ou slash), elle
est utilise comme rpertoire du socket de domaine Unix.
-p port, --port=port
Le port TCP ou l'extension du fichier de la socket de domaine Unix sur lequel le serveur coute les connexions.
-U nomutilisateur, --username=nomutilisateur
Le nom de l'utilisateur utilis pour la connexion.
-w, --no-password
Ne demande jamais un mot de passe. Si le serveur en rclame un pour l'authentification et qu'un mot de passe n'est pas disponible d'une autre faon (par exemple avec le fichier .pgpass), la tentative de connexion chouera. Cette option peut
tre utile pour les scripts o aucun utilisateur n'est prsent pour saisir un mot de passe.
-W, --password
Force droplang demander un mot de passe avant la connexion une base de donnes.
Cette option n'est jamais obligatoire car droplang demandera automatiquement un mot de passe si le serveur exige une authentification par mot de passe. Nanmoins, droplang perdra une tentative de connexion pour trouver que le serveur veut un
1152
droplang
mot de passe. Dans certains cas, il est prfrable d'ajouter l'option -W pour viter la tentative de connexion.
Environnement
PGDATABASE, PGHOST, PGPORT, PGUSER
Paramtres de connexion par dfaut
Cet outil, comme la plupart des autres outils PostgreSQL, utilise aussi les variables d'environnement supportes par la bibliothque libpq (voir Section 31.13, Variables d'environnement ).
Diagnostiques
La plupart des messages d'erreurs sont explicites. Dans le cas contraire, on peut utiliser droplang avec l'option --echo et regarder
la commande SQL correspondante pour obtenir plus de dtails. De plus, tout paramtre de connexion par dfaut et toute variable
d'environnement utilis par la bibliothque libpq s'appliqueront.
Notes
createlang(1) est utilis pour ajouter un langage.
Exemples
Supprimer le langage pltcl :
$ droplang pltcl nomdb
Voir aussi
createlang(1), DROP EXTENSION(7), DROP LANGUAGE(7)
1153
Nom
dropuser Supprimer un compte utilisateur PostgreSQL
Synopsis
dropuser [option_connexion...] [option...] [nomutilisateur]
Description
dropuser supprime un utilisateur. Seuls les superutilisateurs et les utilisateurs disposant du droit CREATEROLE peuvent supprimer des utilisateurs (seul un superutilisateur peut supprimer un superutilisateur).
dropuser est un enrobage de la commande SQL DROP ROLE(7). Il n'y a pas de diffrence relle entre la suppression des utilisateurs l'aide de cet outil ou l'aide d'autres mthodes d'accs au serveur.
Options
dropuser accepte les arguments suivants en ligne de commande :
nomutilisateur
Le nom de l'utilisateur PostgreSQL supprimer. Un nom est demand s'il n'est pas fourni sur la ligne de commande.
-e, --echo
Les commandes engendres et envoyes au serveur par dropuser sont affiches.
-i, --interactive
Une confirmation est demande avant la suppression effective de l'utilisateur.
-V, --version
Affiche la version de dropuser puis quitte.
-?, --help
Affiche l'aide sur les arguments en ligne de commande de dropuser, puis quitte
dropuser accepte aussi les arguments suivants en ligne de commande pour les paramtres de connexion :
-h hte, --host=hte
Le nom d'hte de la machine sur lequel le serveur fonctionne. Si la valeur commence par une barre oblique (/ ou slash), elle
est utilise comme rpertoire du socket de domaine Unix.
-p port, --port=port
Le port TCP ou l'extension du fichier du socket local de domaine Unix sur lequel le serveur attend les connexions.
-U nomutilisateur, --username=nomutilisateur
Le nom de l'utilisateur utilis pour la connexion.
-w, --no-password
Ne demande jamais un mot de passe. Si le serveur en rclame un pour l'authentification et qu'un mot de passe n'est pas disponible d'une autre faon (par exemple avec le fichier .pgpass), la tentative de connexion chouera. Cette option peut
tre utile pour les scripts o aucun utilisateur n'est prsent pour saisir un mot de passe.
-W, --password
Force dropuser demander un mot de passe avant la connexion une base de donnes.
Cette option n'est jamais obligatoire car dropuser demandera automatiquement un mot de passe si le serveur exige une authentification par mot de passe. Nanmoins, dropuser perdra une tentative de connexion pour trouver que le serveur veut un
mot de passe. Dans certains cas, il est prfrable d'ajouter l'option -W pour viter la tentative de connexion.
Environnement
PGDATABASE, PGHOST, PGPORT, PGUSER
Paramtres de connexion par dfaut.
Cet outil, comme la plupart des autres outils PostgreSQL, utilise aussi les variables d'environnement supportes par la biblio1154
dropuser
Diagnostiques
En cas de difficults, il peut tre utile de consulter DROP ROLE(7) et psql(1), sections prsentant les problmes ventuels et les
messages d'erreur.
Le serveur de base de donnes doit fonctionner sur le serveur cible. Les paramtres de connexion ventuels et les variables
d'environnement utiliss par la bibliothque cliente libpq s'appliquent.
Exemples
Supprimer l'utilisateur joe de la base de donnes par dfaut :
$ dropuser joe
Supprimer l'utilisateur joe sur le serveur hberg sur l'hte eden, qui coute sur le port 5000, avec demande de confirmation et
affichage de la commande sous-jacente :
$ dropuser -p 5000 -h eden -i -e joe
Role "joe" will be permanently removed.
Are you sure? (y/n) y
DROP ROLE joe;
Voir aussi
createuser(1), DROP ROLE(7)
1155
Nom
ecpg Prprocesseur C pour le SQL embarqu
Synopsis
ecpg [option...] fichier...
Description
ecpg est le prprocesseur du SQL embarqu pour les programmes crits en C. Il convertit des programmes crits en C contenant
des instructions SQL embarqu en code C normal. Pour se faire, les appels au SQL sont remplacs par des appels spciaux de
fonctions. Les fichiers en sortie peuvent tre traits par n'importe quel compilateur C.
ecpg convertit chaque fichier en entre, donn sur la ligne de commande, en un fichier C correspondant. Les fichiers en entre
ont de prfrence l'extension .pgc, auquel cas l'extension est remplace par .c pour former le nom du fichier de sortie. Si
l'extension du fichier en entre n'est pas .pgc, alors le nom de fichier en sortie est obtenu en ajoutant .c au nom complet du fichier. Le nom de fichier en sortie peut aussi tre surcharg en utilisant l'option -o.
Cette page de rfrence ne dcrit pas le langage SQL embarqu. Voir Chapitre 33, ECPG SQL embarqu en C pour plus
d'informations sur ce thme.
Options
ecpg accepte les arguments suivants en ligne de commande :
-c
Engendre automatiquement du code C partir de code SQL. Actuellement, cela fonctionne pour EXEC SQL TYPE.
-C mode
Initialise un mode de compatibilit. mode peut tre INFORMIX ou INFORMIX_SE.
-D symbol
Dfinit un symbole du prprocesseur C.
-i
Les fichiers d'en-tte du systme sont galement analyss.
-I rpertoire
Spcifie un chemin d'inclusion supplmentaire, utilis pour trouver les fichiers inclus via EXEC SQL INCLUDE. Par dfaut, il s'agit de . (rpertoire courant), /usr/local/include, du rpertoire de fichiers enttes de PostgreSQL dfini
la compilation (par dfaut : /usr/local/pgsql/include), puis de /usr/include, dans cet ordre.
-o nom_fichier
Indique le nom du fichier de sortie, nom_fichier, utilis par ecpg.
-r option
Slectionne un comportement en excution. option peut avoir une des valeurs suivantes :
no_indicator
Ne pas utiliser d'indicateurs mais utiliser la place des valeurs spciales pour reprsenter les valeurs NULL. Historiquement, certaines bases de donnes utilisent cette approche.
prepare
Prparer toutes les instructions avant de les utiliser. Libecpg conservera un cache d'instructions prpares et rutilisera une
instruction si elle est de nouveau excute. Si le cache est plein, libecpg librera l'instruction la moins utilise.
questionmarks
Autoriser les points d'interrogation comme marqueur pour des raisons de compatibilit. C'tait la valeur par dfaut il y a
longtemps.
-t
Active la validation automatique (autocommit) des transactions. Dans ce mode, chaque commande SQL est valide automatiquement, sauf si elle est l'intrieur d'un bloc de transaction explicite. Dans le mode par dfaut, les commandes ne sont
valides qu' l'excution de EXEC SQL COMMIT.
-v
Affiche des informations supplmentaires dont la version et le chemin des enttes.
1156
ecpg
--version
Affiche la version de ecpg et quitte.
--help
Affiche l'aide sur les arguments en ligne de commande de ecpg et quitte.
Notes
Lors de la compilation de fichiers C prtraits, le compilateur a besoin de trouver les fichiers d'en-tte ECPG dans le rpertoire des
enttes de PostgreSQL. De ce fait, il faut gnralement utiliser l'option -I lors de l'appel du compilateur (c'est--dire I/usr/local/pgsql/include).
Les programmes C qui utilisent du SQL embarqu doivent tre lis avec la bibliothque libecpg. Cela peut peut tre effectu,
par exemple, en utilisant les options de l'diteur de liens -L/usr/local/pgsql/lib -lecpg.
La valeur relle des rpertoires, fonction de l'installation, peut tre obtenue par l'utilisation de la commande pg_config(1).
Exemples
Soit un fichier source C contenant du SQL embarqu nomm prog1.pgc. Il peut tre transform en programme excutable
l'aide des commandes suivantes :
ecpg prog1.pgc
cc -I/usr/local/pgsql/include -c prog1.c
cc -o prog1 prog1.o -L/usr/local/pgsql/lib -lecpg
1157
Nom
pg_basebackup ralise une sauvegarde de base d'une instance PostgreSQL
Synopsis
pg_basebackup [option...]
Description
pg_basebackup est utilis pour prendre une sauvegarde de base d'une instance PostgreSQL en cours d'excution. Elles se font
sans affecter les autres clients du serveur de bases de donnes et peuvent tre utilises pour une restauration jusqu' un certain
point dans le temps (voir Section 24.3, Archivage continu et rcupration d'un instantan (PITR) ) ou comme le point de dpart d'un serveur en standby, par exemple avec la rplication en flux (voir Section 25.2, Serveurs de Standby par transfert de
journaux ).
pg_basebackup fait une copie binaire des fichiers de l'instance en s'assurant que le systme est mis automatiquement en mode
sauvegarde puis en est sorti. Les sauvegardes sont toujours faites sur l'ensemble de l'instance, il n'est donc pas possible de sauvegarder une base individuelle ou des objets d'une base. Pour les sauvegardes de ce type, un outil comme pg_dump(1) doit tre utilis.
La sauvegarde se fait via une connexion PostgreSQL standard et utilise le protocole de rplication. La connexion doit se faire
avec un utilisateur dot de l'attribut REPLICATION (voir Section 20.2, Attributs des rles ), et l'utilisateur doit avoir les
droits explicites de connexion dans pg_hba.conf. Le serveur doit aussi tre configur avec un max_wal_senders suffisamment lev pour laisser au moins une connexion disponible pour la sauvegarde.
Plusieurs commandes pg_basebackup peuvent tre excutes en mme temps mais il est prfrable pour les performances de
n'en faire qu'une seule et de copier le rsultat.
Options
Les options suivantes en ligne de commande contrlent l'emplacement et le format de la sortie.
-D rpertoire, --pgdata=rpertoire
Rpertoire o sera crit la sortie.
Quand la sauvegarde est en mode tar et que le rpertoire est spcifi avec un tiret (-), le fichier tar sera crit sur stdout.
Ce paramtre est requis.
-F format, --format=format
Slectionne le format de sortie. format peut valoir :
p, plain
crit des fichiers standards, avec le mme emplacement que le rpertoire des donnes et les tablespaces d'origine. Quand
l'instance n'a pas de tablespace supplmentaire, toute la base de donnes sera place dans le rpertoire cible. Si l'instance
contient des tablespaces supplmentaires, le rpertoire principal des donnes sera plac dans le rpertoire cible mais les
autres tablespaces seront placs dans le mme chemin absolu que celui d'origine.
C'est le format par dfaut.
t, tar
crit des fichiers tar dans le rpertoire cible. Le rpertoire principal de donnes sera crit sous la forme d'un fichier nomm
base.tar et tous les autres tablespaces seront nomms d'aprs l'OID du tablespace.
Si la valeur - (tiret) est indique comme rpertoire cible, le contenu du tar sera crit sur la sortie standard, ce qui est intressant pour une compression directe via un tube. Ceci est seulement possible si l'instance n'a pas de tablespace supplmentaire.
-x, --xlog
Inclut les journaux de transactions requis (fichiers WAL) dans la sauvegarde. Cela incluera toutes les transactions intervenues pendant la sauvegarde. Si cette option est prcise, il est possible de lancer un postmaster directement sur le rpertoire
extrait sans avoir besoin de consulter les archives des journaux, ce qui rend la sauvegarde compltement autonome.
1158
pg_basebackup
Note
Les journaux de transactions sont rcuprs la fin de la sauvegarde. Du coup, il est ncessaire que le paramtre wal_keep_segments soit suffisamment lev pour que les journaux ne soient pas supprims avant la fin
de la sauvegarde. Si le journal a t renomm avant qu'il ne soit transfr, la sauvegarde chouera et sera inutilisable.
-z, --gzip
Active la compression gzip de l'archive tar en sortie, avec le niveau de compression par dfaut. La compression est disponible
seulement lors de l'utilisation du format tar.
-Z niveau, --compress=niveau
Active la compression gzip du fichier tar en sortie, et prcise le niveau de compression (de 1 9, 9 correspondant la
meilleure compression). La compression est seulement disponible lors de l'utilisation du format tar.
Les options suivantes en ligne de commande contrlent la gnration de la sauvegarde et l'excution du programme.
-c fast|spread, --checkpoint=fast|spread
Configure le mode du checkpoint rapide (fast) ou en attente (spread, la valeur par dfaut).
-l label, --label=label
Configure le label de la sauvegarde. Sans indication, une valeur par dfaut, pg_basebackup base backup sera utilise.
-P, --progress
Active l'indicateur de progression. Activer cette option donnera un rapport de progression approximatif lors de la sauvegarde.
Comme la base de donnes peut changer pendant la sauvegarde, ceci est seulement une approximation et pourrait ne pas se
terminer exactement 100%. En particulier, lorsque les journaux de transactions sont inclus dans la sauvegarde, la quantit
totale de donnes ne peut pas tre estime l'avance et, dans ce cas, la taille cible estime va augmenter quand il dpasse
l'estimation totale sans les journaux de transactions.
Quand cette option est active, le serveur commencera par calculer la taille totale des bases de donnes, puis enverra leur
contenu. Du coup, cela peut rendre la sauvegarde plus longue, en particulier plus longue avant l'envoi de la premire donne.
-v, --verbose
Active le mode verbeux, qui affichera les tapes supplmentaires pendant le dmarrage et l'arrt ainsi que le nom de fichier
exact qui est en cours de traitement si le rapport de progression est aussi activ.
Les options suivantes en ligne de commande contrlent les paramtres de connexion la base de donnes.
-h hte, --host=hte
Indique le nom d'hte de la machine sur laquelle le serveur de bases de donnes est excut. Si la valeur commence par une
barre oblique (/), elle est utilise comme rpertoire pour le socket de domaine Unix. La valeur par dfaut est fournie par la variable d'environnement PGHOST, si elle est initialise. Dans le cas contraire, une connexion sur la socket de domaine Unix est
tente.
-p port, --port=port
Indique le port TCP ou l'extension du fichier local de socket de domaine Unix sur lequel le serveur coute les connexions. La
valeur par dfaut est fournie par la variable d'environnement PGPORT, si elle est initialise. Dans le cas contraire, il s'agit de
la valeur fournie la compilation.
-U nomutilisateur, --username=nomutilisateur
Le nom d'utilisateur utilis pour la connexion.
-w, --no-password
Ne demande jamais un mot de passe. Si le serveur en rclame un pour l'authentification et qu'un mot de passe n'est pas disponible d'une autre faon (par exemple avec le fichier .pgpass), la tentative de connexion chouera. Cette option peut tre
utile pour les scripts o aucun utilisateur n'est prsent pour saisir un mot de passe.
-W, --password
Force pg_basebackup demander un mot de passe avant la connexion une base de donnes.
Cette option n'est jamais ncessaire car pg_basebackup demande automatiquement un mot de passe si le serveur exige une authentification par mot de passe. Nanmoins, pg_basebackup perd une tentative de connexion pour tester si le serveur demande
un mot de passe. Dans certains cas, il est prfrable d'ajouter l'option -W pour viter la tentative de connexion.
D'autres paramtres, moins utiliss, sont aussi disponibles :
1159
pg_basebackup
-V, --version
Affiche la version de pg_basebackup puis quitte.
-?, --help
Affiche l'aide sur les arguments en ligne de commande de pg_basebackup, puis quitte
Environnement
Cet outil, comme la plupart des outils PostgreSQL, utilise les variables d'environnement supportes par libpq (voir Section 31.13, Variables d'environnement ).
Notes
La sauvegarde incluera tous les fichiers du rpertoire de donnes et des tablespaces, ceci incluant les fichiers de configuration et
tout fichier supplmentaire plac dans le rpertoire par d'autres personnes. Seuls les fichiers et rpertoires standards sont autoriss
dans le rpertoire des donnes, pas de liens symboliques ou de fichiers priphriques spciaux.
De la faon dont PostgreSQL gre les tablespaces, le chemin de chaque tablespace supplmentaire doit tre identique quand une
sauvegarde est restaure. Nanmoins, le rpertoire principal de donnes est relocalisable.
Exemples
Pour crer une sauvegarde de base du serveur mon_sgbd et l'enregistrer dans le rpertoire local /usr/local/pgsql/data :
$ pg_basebackup -h mon_sgbd -D /usr/local/pgsql/data
Pour crer une sauvegarde du serveur local avec un fichier tar compress pour chaque tablespace, et stocker le tout dans le rpertoire sauvegarde, tout en affichant la progression pendant l'excution :
$ pg_basebackup -D sauvegarde -Ft -z -P
Pour crer une sauvegarde d'une base de donnes locale avec un seul tablespace et la compresser avec bzip2 :
$ pg_basebackup -D - -Ft | bzip2 > backup.tar.bz2
(cette commande chouera s'il existe plusieurs tablespaces pour cette instance)
Voir aussi
pg_dump(1)
1160
Nom
pg_config rcuprer des informations sur la version installe de PostgreSQL
Synopsis
pg_config [option...]
Description
L'outil pg_config affiche les paramtres de configuration de la version installe de PostgreSQL. Il peut, par exemple, d'tre
utilis par des paquets logiciels qui souhaitent s'interfacer avec PostgreSQL pour faciliter la recherche des fichiers d'enttes
requis et des bibliothques.
Options
Pour utiliser pg_config, une ou plusieurs des options suivantes doivent tre fournies :
--bindir
Afficher l'emplacement des excutables utilisateur. Par exemple, pour trouver le programme psql. C'est aussi normalement
l'emplacement du programme pg_config.
--docdir
Afficher l'emplacement des fichiers de documentation.
--htmldir
Affiche l'emplacement des fichiers de documentation HTML.
--includedir
Afficher l'emplacement des fichiers d'enttes C des interfaces clientes.
--pkgincludedir
Afficher l'emplacement des autres fichiers d'entte C.
--includedir-server
Afficher l'emplacement des fichiers d'enttes C pour la programmation du serveur.
--libdir
Afficher l'emplacement des bibliothques.
--pkglibdir
Afficher l'emplacement des modules chargeables dynamiquement ou celui que le serveur peut parcourir pour les trouver.
(D'autres fichiers de donnes dpendant de l'architecture peuvent aussi tre installs dans ce rpertoire.)
--localedir
Afficher l'emplacement des fichiers de support de la locale (c'est une chane vide si le support de la locale n'a pas t configur lors de la construction de PostgreSQL).
--mandir
Afficher l'emplacement des pages de manuel.
--sharedir
Afficher l'emplacement des fichiers de support qui ne dpendent pas de l'architecture.
--sysconfdir
Afficher l'emplacement des fichiers de configuration du systme.
--pgxs
Afficher l'emplacement des fichiers makefile d'extensions.
--configure
Afficher les options passes au script configure lors de la configuration de PostgreSQL en vue de sa construction. Cela peut tre utilis pour reproduire une configuration identique ou pour trouver les options avec lesquelles un paquet binaire
a t construit. (Nanmoins, les paquets binaires contiennent souvent des correctifs personnaliss par le vendeur.) Voir aussi
les exemples ci-dessous.
--cc
Afficher la valeur de la macro CC utilise lors de la construction de PostgreSQL. Cela affiche le compilateur C utilis.
1161
pg_config
--cppflags
Afficher la valeur de la macro CPPFLAGS utilise lors de la construction de PostgreSQL. Cela affiche les options du compilateur C ncessaires pour l'excution du prprocesseur (typiquement, les options -I).
--cflags
Afficher la valeur de la macro CFLAGS utilise lors de la construction de PostgreSQL. Cela affiche les options du compilateur C.
--cflags_sl
Afficher la valeur de la macro CFLAGS_SL utilise lors de la construction de PostgreSQL. Cela affiche les options supplmentaires du compilateur C utilises pour construire les bibliothques partages.
--ldflags
Afficher la valeur de la macro LDFLAGS utilise lors de la construction de PostgreSQL. Cela affiche les options de
l'diteur de liens.
--ldflags_ex
Afficher la valeur de la variable LDFLAGS_EX utilise lors de la construction de PostgreSQL. Cela affiche les options de
l'diteur de liens uniquement pour la construction des excutables.
--ldflags_sl
Afficher la valeur de la macro LDFLAGS_SL utilise lors de la construction de PostgreSQL. Cela affiche les options de
l'diteur de liens utilises pour construire seulement les bibliothques partages.
--libs
Afficher la valeur de la macro LIBS utilise lors de la construction de PostgreSQL. Elle contient habituellement les options
-l pour les bibliothques externes auxquelles PostgreSQL est li.
--version
Afficher la version de PostgreSQL.
Si plusieurs options sont donnes, l'information est affiche dans cet ordre, un lment par ligne. Si aucune option n'est donne,
toutes les informations disponibles sont affiches avec des tiquettes.
Notes
L'option --includedir-server est apparue dans PostgreSQL 7.2. Dans les versions prcdentes, les fichiers d'enttes du
serveur taient installs au mme endroit que les enttes client, qui pouvaient tre rcuprs avec l'option --includedir. Pour
que le paquet gre les deux cas, la nouvelle option est tente en premier, et le code de sortie est test pour savoir si la commande a
russi.
Les options --docdir, --pkgincludedir, --localedir, --mandir, --sharedir, --sysconfdir, --cc, -cppflags, --cflags, --cflags_sl, --ldflags, --ldflags_sl et --libs sont apparues avec PostgreSQL 8.1.
L'option --htmldir n'est disponible qu' partir de PostgreSQL 8.4. The option --ldflags_ex was added in
PostgreSQL 9.0.
Dans les versions antrieures PostgreSQL 7.1, avant que pg_config ne soit disponible, il n'existait aucune mthode de rcupration de ces informations de configuration.
Exemple
Reproduire la configuration de construction de l'installation actuelle de PostgreSQL :
eval ./configure `pg_config --configure`
La sortie de pg_config --configure contient les guillemets du shell de sorte que les arguments contenant des espaces
soient reprsents correctement. Du coup, il est ncessaire d'utiliser eval pour obtenir des rsultats corrects.
1162
Nom
pg_dump sauvegarder une base de donnes PostgreSQL dans un script ou tout autre fichier d'archive
Synopsis
pg_dump [option_connexion...] [option...] [nom_base]
Description
pg_dump est un outil de sauvegarde d'une base de donnes PostgreSQL. Les sauvegardes ralises sont cohrentes, mme
lors d'accs concurrents la base de donnes. pg_dump ne bloque pas l'accs des autres utilisateurs (ni en lecture ni en criture).
Les extractions peuvent tre ralises sous la forme de scripts ou de fichiers d'archive. Les scripts sont au format texte et
contiennent les commandes SQL ncessaires la reconstruction de la base de donnes dans l'tat o elle tait au moment de la
sauvegarde. La restauration s'effectue en chargeant ces scrits avec psql(1). Ces scripts permettent de reconstruire la base de donnes sur d'autres machines et d'autres architectures, et mme, au prix de quelques modifications, sur d'autres bases de donnes
SQL.
La reconstruction de la base de donnes partir d'autres formats de fichiers archive est obtenue avec pg_restore(1). pg_restore
permet, partir de ces formats, de slectionner les lments restaurer, voire de les rordonner avant restauration. Les fichiers
d'archive sont conus pour tre portables au travers d'architectures diffrentes.
Utilis avec un des formats de fichier d'archive et combin avec pg_restore, pg_dump fournit un mcanisme d'archivage et de
transfert flexible. pg_dump peut tre utilis pour sauvegarder une base de donnes dans son intgralit ; pg_restore peut alors
tre utilis pour examiner l'archive et/ou slectionner les parties de la base de donnes restaurer. Le format de fichier de sortie
le plus flexible est le format personnalis (custom en anglais, -Fc). Compress par dfaut, il permet de slectionner et rordonner les lments archivs.
Lors de l'excution de pg_dump, il est utile de surveiller les messages d'avertissement (affichs sur la sortie erreur standard), en
particulier en ce qui concerne les limitations indiques ci-dessous.
Options
Les options suivantes de la ligne de commande contrlent le contenu et le format de la sortie.
nom_base
Le nom de la base de donnes sauvegarder. En l'absence de prcision, la variable d'environnement PGDATABASE est utilise. Si cette variable n'est pas positionne, le nom de l'utilisateur de la connexion est utilis.
-a, --data-only
Seules les donnes sont sauvegardes, pas le schma (dfinition des donnes).
Cette option n'a d'intrt que pour le format texte. Pour les formats archive, l'option peut tre prcise lors de l'appel de
pg_restore.
-b, --blobs
Inclut les objets larges dans la sauvegarde. C'est le comportement par dfaut, sauf si une des options suivantes est ajoute :
--schema, --table ou --schema-only. L'option -b n'est utile que pour ajouter les objets larges aux sauvegardes
slectives.
-c, --clean
Les commandes de nettoyage (suppression) des objets de la base sont crites avant les commandes de cration. (La restauration peut gnrer des erreurs sans gravit.)
Cette option n'a d'intrt que pour le format texte. Pour les formats archive, l'option est prcise l'appel de pg_restore.
-C, --create
La sortie dbute par une commande de cration de la base de donnes et de connexion cette base. Peu importe, dans ce
cas, la base de donnes laquelle la connexion est faite avant la restauration.
Cette option n'a d'intrt que pour le format texte. Pour les formats archive, l'option est prcise l'appel de pg_restore.
-f file, --file=file
La sortie est redirige vers le fichier indiqu. Ce paramtre peut tre omis pour les sorties en mode fichier, dans ce cas la
sortie standard sera utilise. Par contre, il doit tre fourni pour le format 'directory' (rpertoire), o il spcifie le rpertoire
cible plutt qu'un fichier. Dans ce cas, le rpertoire est cr par pg_dump et ne doit pas exister auparavant.
1163
pg_dump
-E codage, --encoding=codage
La sauvegarde est cre dans l'encodage indiqu. Par dfaut, la sauvegarde utilise celui de la base de donnes. Le mme rsultat peut tre obtenu en positionnant la variable d'environnement PGCLIENTENCODING avec le codage dsir pour la sauvegarde.
-F format, --format=format
Le format de la sortie. format correspond un des lments suivants :
p
fichier de scripts SQL en texte simple (dfaut) ;
c
archive personnalise utilisable par pg_restore. Avec le format de sortie rpertoire, c'est le format le plus souple, car il permet
la slection manuelle et le rordonnancement des objets archivs au moment de la restauration. Ce format est aussi compress
par dfaut. default.
d, directory
Produire une archive au format rpertoire utilisable en entre de de pg_restore. Cela crera un rpertoire avec un fichier pour
chaque table et blob export, ainsi qu'un fichier appel Table of Contents (Table des matires) dcrivant les objets exports
dans un format machine que pg_restore peut lire. Une archive au format rpertoire peut tre manipule avec des outils Unix
standard; par exemple, les fichiers d'une archive non-compresse peuvent tre compresss avec l'outil gzip. Ce format est
compress par dfaut.
t
archive tar utilisable par pg_restore. Le format tar est compatible avec le format rpertoire; l'extraction d'une archive au format tar produit une archive au format rpertoire valide. Toutefois, le format tar ne supporte pas la compression et a une limite
de 8Go sur la taille des tables individuelles. Par ailleurs, l'ordre de restauration des donnes des tables ne peut pas tre chang
au moment de la restauration.
-i, --ignore-version
Une option obsolte qui est maintenant ignore.
-n schma, --schema=schma
Sauvegarde uniquement les schmas correspondant schema ; la slection se fait la fois sur le schma et sur les objets
qu'il contient. Quand cette option n'est pas indique, tous les schmas non systme de la base cible sont sauvegards. Plusieurs schmas peuvent tre indiqus en utilisant plusieurs fois l'option -n. De plus, le paramtre schma est interprt
comme un modle selon les rgles utilises par les commandes \d de psql (voir la section intitule motifs ). Du coup, plusieurs schmas peuvent tre slectionns en utilisant des caractres joker dans le modle. Lors de l'utilisation de ces caractres, il faut faire attention placer le modle entre guillemets, si ncessaire, pour empcher le shell de remplacer les jokers;
see la section intitule Exemples .
Note
Quand -n est indiqu, pg_dump ne sauvegarde aucun autre objet de la base que ceux dont les schmas slectionns dpendent. Du coup, il n'est pas garanti que la sauvegarde d'un schma puisse tre restaure avec succs dans une base vide.
Note
Les objets qui ne font pas partie du schma comme les objets larges ne sont pas sauvegards quand -n est prcis. Ils peuvent tre rajouter avec l'option --blobs.
-N schma, --exclude-schema=schma
Ne sauvegarde pas les schmas correspondant au modle schma. Le modle est interprt selon les mme rgles que -n. N peut aussi tre indiqu plus d'une fois pour exclure des schmas correspondant des modles diffrents.
Quand les options -n et -N sont indiques, seuls sont sauvegards les schmas qui correspondent au moins une option -n
et aucune option -N. Si -N apparat sans -n, alors les schmas correspondant -N sont exclus de ce qui est une sauvegarde
normale.
-o, --oids
Les identifiants d'objets (OID) sont sauvegards comme donnes des tables. Cette option est utilise dans le cas d'applications
utilisant des rfrences aux colonnes OID (dans une contrainte de cl trangre, par exemple). Elle ne devrait pas tre utilise
dans les autres cas.
-O, --no-owner
1164
pg_dump
Les commandes d'initialisation des possessions des objets au regard de la base de donnes originale ne sont pas produites. Par
dfaut, pg_dump engendre des instructions ALTER OWNER ou SET SESSION AUTHORIZATION pour fixer ces possessions. Ces instructions chouent lorsque le script n'est pas lanc par un superutilisateur (ou par l'utilisateur qui possde tous
les objets de ce script). L'option -O est utilise pour crer un script qui puisse tre restaur par n'importe quel utilisateur. En
revanche, c'est cet utilisateur qui devient propritaire de tous les objets.
Cette option n'a d'intrt que pour le format texte. Pour les formats archive, l'option est prcise l'appel de pg_restore.
-R, --no-reconnect
Cette option, obsolte, est toujours accepte pour des raisons de compatibilit ascendante.
-s, --schema-only
Seule la dfinition des objets (le schma) est sauvegarde, pas les donnes.
-S nomutilisateur, --superuser=nomutilisateur
Le nom du superutilisateur utiliser lors de la dsactivation des dclencheurs. Cela n'a d'intrt que si l'option -disable-triggers est prcise. (En rgle gnrale, il est prfrable de ne pas utiliser cette option et de lancer le script
produit en tant que superutilisateur.)
-t table, --table=table
Sauvegarde uniquement les tables (ou vues ou squences or tables distantes) correspondant table. Plusieurs tables sont slectionnables en utilisant plusieurs fois l'option -t. De plus, le paramtre table est interprt comme un modle suivant les
rgles utilises par les commandes \d de psql (voir la section intitule motifs ). Du coup, plusieurs tables peuvent tre slectionnes en utilisant des caractres joker dans le modle. Lors de l'utilisation de ces caractres, il faut faire attention placer le modle entre guillemets, si ncessaire, pour empcher le shell de remplacer les jokers; see la section intitule
Exemples .
Les options -n et -N n'ont aucun effet quand l'option -t est utilise car les tables slectionnes par -t sont sauvegardes
quelle que soit la valeur des options relatives aux schmas. Les objets qui ne sont pas des tables ne sont pas sauvegards.
Note
Quand -t est indiqu, pg_dump ne sauvegarde aucun autre objet de la base dont la (ou les) table(s) slectionne(s) pourrai(en)t dpendre. Du coup, il n'est pas garanti que la sauvegarde spcifique d'une table puisse tre
restaure avec succs dans une base vide.
Note
Le comportement de l'option -t n'est pas entirement compatible avec les versions de PostgreSQL antrieures la 8.2. Auparavant, crire -t tab sauvegardait toutes les tables nommes tab, mais maintenant,
seules sont sauvegardes celles qui sont visibles dans le chemin de recherche des objets. Pour retrouver
l'ancien comportement, il faut crire -t '*.tab'. De plus, il faut crire quelque chose comme -t
sch.tab pour slectionner une table dans un schma particulier plutt que l'ancienne syntaxe -n sch -t
tab.
-T table, --exclude-table=table
Ne sauvegarde pas les tables correspondant au modle table. Le modle est interprt selon les mme rgles que -t. -T
peut aussi tre indiqu plusieurs pour exclure des tables correspondant des modles diffrents.
Quand les options -t et -T sont indiques, seules sont sauvegardes les tables qui correspondent au moins une option -t et
aucune option -T. Si -T apparat sans -t, alors les tables correspondant -T sont exclues de ce qui est une sauvegarde
normale.
-v, --verbose
Mode verbeux. pg_dump affiche des commentaires dtaills sur les objets et les heures de dbut et de fin dans le fichier de
sauvegarde. Des messages de progression sont galement affichs sur la sortie d'erreur standard.
-V, --version
Affiche la version de pg_dump puis quitte.
-x, --no-privileges, --no-acl
Les droits d'accs (commandes grant/revoke) ne sont pas sauvegards.
-Z 0..9, --compress=0..9
Indique le niveau de compression utiliser. Zro signifie sans compression. Pour le format d'archive personnalis, cela signifie la compression des segments individuels des donnes des tables. Par dfaut, la compression se fait un niveau modr.
Pour le format texte, indiquer une valeur diffrente de zro implique une compression du fichier complet, comme s'il tait
1165
pg_dump
pass gzip ; mais par dfaut, la sortie n'est pas compresse. Le format d'archive tar ne supporte pas du tout la compression.
--binary-upgrade
Cette option est destine tre utilise pour une mise jour en ligne. Son utilisation dans d'autres buts n'est ni recommande
ni supporte. Le comportement de cette option peut changer dans les futures versions sans avertissement.
--column-inserts, --attribute-inserts
Extraire les donnes en tant que commandes INSERT avec des noms de colonnes explicites (INSERT INTO table
(colonne, ...) VALUES ...). Ceci rendra la restauration trs lente ; c'est surtout utile pour crer des extractions qui
puissent tre charges dans des bases de donnes autres que PostgreSQL.
--disable-dollar-quoting
Cette option dsactive l'utilisation du caractre dollar comme dlimiteur de corps de fonctions, et force leur dlimitation en
tant que chane SQL standard.
--disable-triggers
Cette option ne s'applique que dans le cas d'une extraction de donnes seules. Ceci demande pg_dump d'inclure des commandes pour dsactiver temporairement les triggers sur les tables cibles pendant que les donnes sont recharges. Utilisez ceci si, sur les tables, vous avez des contraintes d'intgrit ou des triggers que vous ne voulez pas invoquer pendant le rechargement.
l'heure actuelle, les commandes mises pour --disable-triggers doivent tre excutes en tant que superutilisateur.
Par consquent, vous devez aussi spcifier un nom de superutilisateur avec -S, ou prfrablement faire attention lancer le
script rsultat en tant que superutilisateur.
Cette option n'a de sens que pour le format texte simple. Pour les formats d'archive, vous pouvez spcifier cette option quand
vous appelez pg_restore.
--inserts
Extraire les donnes en tant que commandes INSERT (plutt que COPY). Ceci rendra la restauration trs lente ; c'est surtout
utile pour crer des extractions qui puissent tre charges dans des bases de donnes autres que PostgreSQL. Notez que la
restauration peut chouer compltement si vous avez chang l'ordre des colonnes. L'option --column-inserts est plus
sre, mais encore plus lente.
--lock-wait-timeout=expiration
Ne pas attendre indfiniment l'acquisition de verrous partags sur table au dmarrage de l'extraction. chouer la place s'il est
impossible de verrouiller une table dans le temps d'expiration indiqu. L'expiration peut tre spcifie dans tous les formats accepts par SET statement_timeout, les valeurs autorises dpendant de la version du serveur sur laquelle vous faites
l'extraction, mais une valeur entire en millisecondes est accepte par toutes les versions depuis la 7.3. Cette option est ignore si vous exportez d'une version antrieure la 7.3.
--no-security-labels
Ne sauvegarde pas les labels de scurit.
--no-tablespaces
Ne pas gnrer de commandes pour crer des tablespace, ni slectionner de tablespace pour les objets. Avec cette option, tous
les objets seront crs dans le tablespace par dfaut durant la restauration.
Cette option n'a de sens que pour le format texte simple. Pour les formats d'archive, vous pouvez spcifier cette option quand
vous appelez pg_restore.
--no-unlogged-table-data
Ne pas exporter le contenu des tables non journalises (unlogged). Cette option n'a aucun effet sur le fait que la dfinition
(schma) des tables soit exporte ou non; seul l'export des donnes de la table est supprim. Les donnes des tables non journalises sont toujours exclues lors d'une sauvegarde partir d'un serveur en standby.
--quote-all-identifiers
Force la mise entre guillemets de tous les identifiants. Ceci peut tre utile si vous exportez votre base en vue d'une migration
dans une nouvelle version qui aurait introduit de nouveaux mots cls.
--serializable-deferrable
Utiliser une transaction srialisable pour l'export, pour garantir que l'instantan utilis est cohrent avec les tats futurs
de la base; mais ceci est effectu par l'attente d'un point dans le flux des transactions auquel aucune anomalie ne puisse tre
prsente, afin qu'il n'y ait aucun risque que l'export choue ou cause l'annulation d'une autre transaction pour erreur de
srialisation. Voyez Chapitre 13, Contrle d'accs simultan pour davantage d'informations sur l'isolation des transactions et le contrle d'accs concurrent.
Cette option est inutile pour un dump qui ne sera utilis qu'en cas de rcupration aprs sinistre. Elle pourrait tre utile pour
un dump utilis pour charger une copie de la base pour du reporting ou toute autre activit en lecture seule tandis que la base
originale continue tre mise jour. Sans cela, le dump serait dans un tat incohrent avec l'excution srielle des transac1166
pg_dump
tions qui auront t finalement valides. Par exemple, si un traitement de type batch est excut, un batch pourrait apparatre
comme termin dans le dump sans que tous les lments du batch n'apparaissent.
Cette option ne fera aucune diffrence si aucune transaction en lecture-criture n'est active au lancement de pg_dupm. Si des
transactions en lecture-criture sont actives, le dmarrage du dump pourrait tre retard pour une dure indtermine. Une fois
qu'il sera dmarr, la performance est identique celle d'un dump sans cette option.
--use-set-session-authorization
mettre des commandes SQL standard SET SESSION AUTHORIZATION la place de commandes ALTER OWNER
pour dterminer l'appartenance d'objet. Ceci rend l'extraction davantage compatible avec les standards, mais, suivant
l'historique des objets de l'extraction, peut ne pas se restaurer correctement. Par ailleurs, une extraction utilisant SET SESSION AUTHORIZATION ncessitera certainement des droits superutilisateur pour se restaurer correctement, alors que ALTER OWNER ncessite des droits moins levs.
-?, --help
Affiche l'aide sur les arguments en ligne de commande de pg_dump, puis quitte
Les options de ligne de commande suivantes grent les paramtres de connexion :
-h hte, --host hte
Le nom d'hte de la machine sur laquelle le serveur de bases de donnes est excut. Si la valeur commence par une barre
oblique (/), elle est utilise comme rpertoire pour le socket de domaine Unix. La valeur par dfaut est fournie par la variable
d'environnement PGHOST, si elle est initialise. Dans le cas contraire, une connexion sur la socket de domaine Unix est tente.
-p port, --port port
Le port TCP ou le fichier local de socket de domaine Unix sur lequel le serveur coute les connexions. La valeur par dfaut
est fournie par la variable d'environnement PGPORT, si elle est initialise. Dans le cas contraire, il s'agit de la valeur fournie
la compilation.
-U nomutilisateur, --username nomutilisateur
Le nom d'utilisateur utilis pour la connexion.
-w, --no-password
Ne demande jamais un mot de passe. Si le serveur en rclame un pour l'authentification et qu'un mot de passe n'est pas disponible d'une autre faon (par exemple avec le fichier .pgpass), la tentative de connexion chouera. Cette option peut tre
utile pour les scripts o aucun utilisateur n'est prsent pour saisir un mot de passe.
-W, --password
Force pg_dump demander un mot de passe avant la connexion une base de donnes.
Cette option n'est jamais ncessaire car pg_dump demande automatiquement un mot de passe si le serveur exige une authentification par mot de passe. Nanmoins, pg_dump perd une tentative de connexion pour tester si le serveur demande un mot de
passe. Dans certains cas, il est prfrable d'ajouter l'option -W pour viter la tentative de connexion.
--role=nomrole
Spcifie un rle utiliser pour crer l'extraction. Avec cette option, pg_dump met une commande SET ROLE nomrole
aprs s'tre connect la base. C'est utile quand l'utilisateur authentifi (indiqu par -U) n'a pas les droits dont pg_dump a besoin, mais peut basculer vers un rle qui les a. Certaines installations ont une politique qui est contre se connecter directement
en tant que superutilisateur, et l'utilisation de cette option permet que les extractions soient faites sans violer cette politique.
Environnement
PGDATABASE, PGHOST, PGOPTIONS, PGPORT, PGUSER
Paramtres de connexion par dfaut.
Cet outil, comme la plupart des autres outils PostgreSQL, utilise les variables d'environnement supportes par la bibliothque
libpq (voir Section 31.13, Variables d'environnement ).
Diagnostiques
pg_dump excute intrinsquement des instructions SELECT. Si des problmes apparaissent l'excution de pg_dump, psql(1)
peut tre utilis pour s'assurer qu'il est possible de slectionner des informations dans la base de donnes. De plus, tout paramtre
de connexion par dfaut et toute variable d'environnement utilis par la bibliothque libpq s'appliquent.
L'activit gnre par pg_dump dans la base de donnes est normalement collecte par le collecteur de statistiques. Si c'est gnant,
1167
pg_dump
vous pouvez positionner le paramtre track_counts false via PGOPTIONS ou la commande ALTER USER.
Notes
Si des ajouts locaux la base template1 ont t effectus, il est impratif de s'assurer que la sortie de pg_dump est effectivement restaure dans une base vide ; dans le cas contraire, il est fort probable que la duplication des dfinitions des objets ajouts
engendre des erreurs. Pour obtenir une base vide de tout ajout local, on utilise template0 la place de template1 comme
modle. Par exemple :
CREATE DATABASE foo WITH TEMPLATE template0;
Quand une sauvegarde des seules donnes est slectionne et que l'option --disable-triggers est utilise, pg_dump engendre des commandes de dsactivation des dclencheurs sur les tables utilisateur avant l'insertion des donnes, puis aprs coup,
des commandes de ractivation aprs l'insertion. Si la restauration est interrompue, il se peut que les catalogues systmes
conservent cette position.
Les fichiers d'une archive tar sont limits une taille infrieure 8 Go. (C'est une limitation inhrente au format des fichiers tar.)
Ce format ne peut donc pas tre utilis si la reprsentation textuelle d'une table dpasse cette taille. La taille totale d'une archive tar
et de tout autre format de sortie n'est pas limite, sauf peut-tre par le systme d'exploitation.
Le fichier de sauvegarde produit par pg_dump ne contient pas les statistiques utilises par l'optimiseur pour la planification des requtes. Il est donc conseill, pour assurer des performances optimales, de lancer ANALYZE aprs la restauration d'une sauvegarde ; voir Section 23.1.3, Maintenir les statistiques du planificateur et Section 23.1.5, Le dmon auto-vacuum pour plus
d'informations. Le fichier de sauvegarde ne contient pas non plus de commandes ALTER DATABASE ... SET ; ces paramtres
sont sauvegards par pg_dumpall(1), avec les utilisateurs et les paramtres globaux l'installation.
Parce que pg_dump est utilis pour transfrer des donnes vers des nouvelles versions de PostgreSQL, la sortie de pg_dump devra pouvoir se charger dans les versions du serveur PostgreSQL plus rcentes que la version de pg_dump. pg_dump peut aussi
extraire des donnes de serveurs PostgreSQL plus anciens que sa propre version. ( l'heure actuelle, les versions de serveurs
supportes vont jusqu' la 7.0.) Toutefois, pg_dump ne peut pas raliser d'extraction de serveurs PostgreSQL plus rcents que sa
propre version majeure ; il refusera mme d'essayer, plutt que de risquer de fournir une extraction invalide. Par ailleurs, il n'est
pas garanti que la sortie de pg_dump puisse tre charge dans un serveur d'une version majeure plus ancienne -- pas mme si
l'extraction a t faite partir d'un serveur dans cette version. Charger un fichier d'extraction dans un serveur de version plus ancienne pourra requrir une dition manuelle du fichier pour supprimer les syntaxe incomprises de l'ancien serveur.
Exemples
Sauvegarder une base appele ma_base dans un script SQL :
$ pg_dump ma_base > base.sql
To dump a database into a directory-format archive:
$ pg_dump -Fd mydb -f dumpdir
Charger ce script dans une base nouvellement cre et nomme nouvelle_base:
$ psql -d nouvelle_base -f base.sql
Sauvegarder une base dans un fichier au format personnalis :
$ pg_dump -Fc ma_base > base.dump
Charger un fichier d'archive dans une nouvelle base nomme nouvelle_base :
$ pg_restore -d nouvelle_base base.dump
Sauvegarder la table nomme mytab :
$ pg_dump -t ma_table ma_base > base.sql
Sauvegarder toutes les tables du schma detroit et dont le nom commence par emp sauf la table nomme
traces_employes :
$ pg_dump -t 'detroit.emp*' -T detroit.traces_employes ma_base > base.sql
Sauvegarder tous les schmas dont le nom commence par est ou ouest et se termine par gsm, en excluant les schmas dont le
1168
pg_dump
Voir aussi
pg_dumpall(1), pg_restore(1), psql(1)
1169
Nom
pg_dumpall extraire une grappe de bases de donnes PostgreSQL dans un fichier de script
Synopsis
pg_dumpall [option_connexion...] [option...]
Description
pg_dumpall est un outil d'extraction ( sauvegarde ) de toutes les bases de donnes PostgreSQL d'une grappe vers un fichier
script. Celui-ci contient les commandes SQL utilisables pour restaurer les bases de donnes avec psql(1). Cela est obtenu en appelant pg_dump(1) pour chaque base de donnes de la grappe. pg_dumpall sauvegarde aussi les objets globaux, communs
toutes les bases de donnes. (pg_dump ne sauvegarde pas ces objets.) Cela inclut aussi les informations concernant les utilisateurs et groupes des bases de donnes, ainsi que les tablespaces et les proprits telles que les droits d'accs s'y appliquant.
Puisque pg_dumpall lit les tables de toutes les bases de donnes, il est prfrable d'avoir les droits de superutilisateur de la base
de donnes pour obtenir une sauvegarde complte. De plus, il faut dtenir des droits superutilisateur pour excuter le script produit, afin de pouvoir crer les utilisateurs, les groupes et les bases de donnes.
Le script SQL est crit sur la sortie standard. Utilisez l'option [-f|fichier] ou les oprateurs shell pour la rediriger vers un fichier.
pg_dumpall se connecte plusieurs fois au serveur PostgreSQL (une fois par base de donnes). Si l'authentification par mot de
passe est utilis, un mot de passe est demand chaque tentative de connexion. Il est intressant de disposer d'un fichier
~/.pgpass dans de tels cas. Voir Section 31.14, Fichier de mots de passe pour plus d'informations.
Options
Les options suivantes, en ligne de commande, contrlent le contenu et le format de la sortie.
-a, --data-only
Seules les donnessont sauvegardes, pas le schma (dfinition des donnes).
-c, --clean
Les commandes SQL de nettoyage (suppression) des bases de donnes avant leur recration sont incluses. Des commandes
DROP sont galement ajoutes pour les rles et les tablespaces.
-f nomfichier, --file=nomfichier
Envoie le rsultat dans le fichier indiqu. Si cette option n'est pas utilise, la sortie standard est utilise.
-g, --globals-only
Seuls les objets globaux sont sauvegards (rles et tablespaces), pas les bases de donnes.
-i, --ignore-version
Une option obsolte qui est maintenant ignore.
pg_dumpall peut grer des bases de donnes de versions prcdentes de PostgreSQL, mais les trs anciennes versions ne
sont plus supportes (avant la 7.0). Cette option peut tre utilise pour surcharger la vrification de la version (si
pg_dumpall choue, il ne faudra pas nier avoir t averti).
-o, --oids
Les identifiants des objets (OID) sont sauvegards comme faisant partie des donnes de chaque table. Cette option est utilise si l'application rfrence les colonnes OID (par exemple, dans une contrainte de cl trangre). Sinon, cette option ne
doit pas tre utilise.
-O, --no-owner
Les commandes permettant de positionner les propritaires des objets ceux de la base de donnes originale. Par dfaut,
pg_dumpall lance les instructions ALTER OWNER ou SET SESSION AUTHORIZATION pour configurer le propritaire des lments crs. Ces instructions chouent lorsque le script est lanc par un utilisateur ne disposant pas des droits de
superutilisateur (ou ne possdant pas les droits du propritaire de tous les objets compris dans ce script). Pour que ce qui devient alors propritaire de tous les objets crs, l'option -O doit tre utilise.
-r, --roles-only
Sauvegarde seulement les rles, pas les bases ni les tablespaces.
-s, --schema-only
Seules les dfinitions des objets (schma), sans les donnes, sont sauvegardes.
1170
pg_dumpall
-S username, --superuser=username
Prcise le nom du superutilisateur utiliser pour la dsactivation des dclencheurs. Cela n'a d'intrt que lorsque -disable-triggers est utilis. (Il est en gnral prfrable de ne pas utiliser cette option et de lancer le script rsultant
en tant que superutilisateur.)
-t, --tablespaces-only
Sauvegarde seulement les tablespaces, pas les bases ni les rles.
-v, --verbose
Indique l'utilisation du mode verbeux. Ainsi pg_dumpall affiche les heures de dmarrage/arrt dans le fichier de sauvegarde et
les messages de progression sur la sortie standard. Il active galement le mode verbeux dans pg_dump.
-V, --version
Affiche la version de pg_dumpall puis quitte.
-x, --no-privileges, --no-acl
Les droits d'accs (commandes grant/revoke) ne sont pas sauvegards.
--binary-upgrade
Cette option est destine tre utilise pour une mise jour en ligne. Son utilisation dans d'autres buts n'est ni recommande
ni supporte. Le comportement de cette option peut changer dans les versions futures sans avertissement.
--column-inserts, --attribute-inserts
Extraire les donnes en tant que commandes INSERT avec des noms de colonnes explicites (INSERT INTO table
(colonne, ...) VALUES ...). Ceci rendra la restauration trs lente ; c'est surtout utile pour crer des extractions qui
puissent tre charges dans des bases de donnes autres que PostgreSQL.
--disable-dollar-quoting
L'utilisation du dollar comme guillemet dans le corps des fonctions est dsactive. Celles-ci sont mises entre guillemets en accord avec la syntaxe du standard SQL.
--disable-triggers
Cette option n'est utile que lors de la cration d'une sauvegarde des seules donnes. pg_dumpall inclut les commandes de
dsactivation temporaire des dclencheurs sur les tables cibles pendant le rechargement des donnes. Cette option est utile
lorsqu'il existe des vrifications d'intgrit rfrentielle ou des dclencheurs sur les tables qu'on ne souhaite pas voir appels
lors du rechargement des donnes.
Actuellement, les commandes mises par --disable-triggers ncessitent d'tre lances par un superutilisateur. Il est
donc impratif de prciser le nom du superutilisateur avec -S ou, prfrentiellement, de lancer le script rsultant en tant que
superutilisateur.
--inserts
Extraire les donnes en tant que commandes INSERT (plutt que COPY). Ceci rendra la restauration trs lente ; c'est surtout
utile pour crer des extractions qui puissent tre charges dans des bases de donnes autres que PostgreSQL. Notez que la
restauration peut chouer compltement si vous avez chang l'ordre des colonnes. L'option --column-inserts est plus
sre, mais encore plus lente.
--lock-wait-timeout=expiration
Ne pas attendre indfiniment l'acquisition de verrous partags sur table au dmarrage de l'extraction. chouer la place s'il est
impossible de verrouiller une table dans le temps d'expiration spcifi. L'expiration peut tre indique dans tous les formats accepts par SET statement_timeout, les valeurs autorises dpendant de la version du serveur sur laquelle vous faites
l'extraction, mais une valeur entire en millisecondes est accepte par toutes les versions depuis la 7.3. Cette option est ignore si vous exportez d'une version antrieure la 7.3.
--no-tablespaces
Ne pas gnrer de commandes pour crer des tablespace, ni slectionner de tablespace pour les objets. Avec cette option, tous
les objets seront crs dans le tablespace par dfaut durant la restauration.
--no-security-labels
Ne sauvegarde pas les labels de scurit.
--no-unlogged-table-data
Ne sauvegarde pas le contenu des tables non traces dans les journaux de transactions. Cette option n'a pas d'effet sur la sauvegarde des dfinitions de table ; il supprime seulement la sauvegarde des donnes des tables.
--quote-all-identifiers
Force la mise entre guillemets de tous les identifiants. Cela peut tre utile lors de la sauvegarde d'une base de donnes pour
migration vers une version future qui pourraient avoir introduit des mots-cls supplmentaires.
--use-set-session-authorization
1171
pg_dumpall
Les commandes SET SESSION AUTHORIZATION du standard SQL sont affiches la place des commandes ALTER
OWNER pour prciser le propritaire de l'objet. Cela amliore la compatibilit de la sauvegarde vis--vis des standard. Toutefois, du fait de l'ordre d'apparition des objets dans la sauvegarde, la restauration peut ne pas tre correcte.
-?, --help
Affiche l'aide sur les arguments en ligne de commande de pg_dumpall, puis quitte
Les options suivantes en ligne de commande contrlent les paramtres de connexion la base de donnes.
-h hte, --host=hte
Prcise le nom d'hte de la machine sur laquelle le serveur de bases de donnes est en cours d'excution. Si la valeur commence avec un slash, elle est utilise comme rpertoire du socket de domaine Unix. La valeur par dfaut est prise partir de la
variable d'environnement PGHOST, si elle est initialise, sinon une connexion socket de domaine Unix est tente.
-l dbname, --database=dbname
Spcifie le nom de la base o se connecter pour la sauvegarde des gobjets globaux et pour dcouvrir les bases qui devraient
tre sauvegardes. Si cette option n'est pas utilise, la base postgres est utilis et, si elle n'est pas, template1 sera utilise.
-p port, --port=port
Prcise le port TCP ou l'extension du fichier socket de domaine Unix local sur lequel le serveur est en coute des connexions.
La valeur par dfaut est la variable d'environnement PGPORT, si elle est initialise, ou la valeur utilise lors de la compilation.
-U nomutilisateur, --username=nomutilisateur
Utilisateur utilis pour initier la connexion.
-w, --no-password
Ne demande jamais un mot de passe. Si le serveur en rclame un pour l'authentification et qu'un mot de passe n'est pas disponible d'une autre faon (par exemple avec le fichier .pgpass), la tentative de connexion chouera. Cette option peut tre
utile pour les scripts o aucun utilisateur n'est prsent pour saisir un mot de passe.
-W, --password
Force pg_dumpall demander un mot de passe avant la connexion une base de donnes.
Cette option n'est jamais obligatoire car pg_dumpall demandera automatiquement un mot de passe si le serveur exige une authentification par mot de passe. Nanmoins, pg_dumpall perdra une tentative de connexion pour trouver que le serveur veut
un mot de passe. Dans certains cas, il est prfrable d'ajouter l'option -W pour viter la tentative de connexion.
Notez que le mot de passe sera demand pour chaque base de donnes sauvegarder. Habituellement, il est prfrable de
configurer un fichier ~/.pgpass pour que de s'en tenir une saisie manuelle du mot de passe.
--role=nomrole
Spcifie un rle utiliser pour crer l'extraction. Avec cette option, pg_dumpall met une commande SET ROLE nomrole
aprs s'tre connect la base. C'est utile quand l'utilisateur authentifi (indiqu par -U) n'a pas les droits dont pg_dumpall a
besoin, mais peut basculer vers un rle qui les a. Certaines installations ont une politique qui est contre se connecter directement en tant que superutilisateur, et l'utilisation de cette option permet que les extractions soient faites sans violer cette politique.
Environnement
PGHOST, PGOPTIONS, PGPORT, PGUSER
Paramtres de connexion par dfaut
Cet outil, comme la plupart des autres outils PostgreSQL, utilise aussi les variables d'environnement supportes par la bibliothque libpq (voir Section 31.13, Variables d'environnement ).
Notes
Comme pg_dumpall appelle pg_dump en interne, certains messages de diagnostique se rfrent en fait pg_dump.
Une fois la restauration effectue, il est conseill de lancer ANALYZE sur chaque base de donnes, de faon ce que l'optimiseur
dispose de statistiques utiles. vacuumdb -a -z peut galement tre utilis pour analyser toutes les bases de donnes.
pg_dumpall requiert que tous les tablespaces ncessaires existent avant la restauration. Dans le cas contraire, la cration de la base
chouera pour une base qui ne se trouve pas dans l'emplacement par dfaut.
1172
pg_dumpall
Exemples
Sauvegarder toutes les bases de donnes :
$ pg_dumpall > db.out
Pour recharger les bases de donnes partir de ce fichier, vous pouvez utiliser :
$ psql -f db.out postgres
(La base de donnes utilise pour la connexion initiale n'a pas d'importance ici car le fichier de script cr par pg_dumpall contient
les commandes ncessaires la cration et la connexion aux bases de donnes sauvegardes.)
Voir aussi
Vrifier pg_dump(1) pour des dtails sur les conditions d'erreur possibles.
1173
Nom
pg_restore restaure une base de donnes PostgreSQL partir d'un fichier d'archive cr par pg_dump
Synopsis
pg_restore [option_connexion...] [option...] [nom_fichier]
Description
pg_restore est un outil pour restaurer une base de donnes PostgreSQL partir d'une archive cre par pg_dump(1) dans un
des formats non textuel. Il lance les commandes ncessaires pour reconstruire la base de donnes dans l'tat o elle tait au moment de sa sauvegarde. Les fichiers d'archive permettent aussi pg_restore d'tre slectif sur ce qui est restaur ou mme de rordonner les lments restaurer. Les fichiers d'archive sont conus pour tre portables entre les architectures.
pg_restore peut oprer dans deux modes. Si un nom de base de donnes est spcifi, pg_restore se connecte cette base de donnes et restaure le contenu de l'archive directement dans la base de donnes. Sinon, un script contenant les commandes SQL ncessaires pour reconstruire la base de donnes est cr et crit dans un fichier ou sur la sortie standard. La sortie du script est
quivalente celles cres par le format en texte plein de pg_dump. Quelques-unes des options contrlant la sortie sont du coup
analogues aux options de pg_dump.
De toute vidence, pg_restore ne peut pas restaurer l'information qui ne se trouve pas dans le fichier d'archive. Par exemple, si
l'archive a t ralise en utilisant l'option donnant les donnes sauvegardes par des commandes INSERT , pg_restore ne
sera pas capable de charger les donnes en utilisant des instructions COPY.
Options
pg_restore accepte les arguments suivants en ligne de commande.
nom_fichier
Spcifie l'emplacement du fichier d'archive (ou du rpertoire pour une archive au format directory ) restaurer. S'il n'est
pas spcifi, l'entre standard est utilise.
-a, --data-only
Restaure seulement les donnes, pas les schmas (dfinitions des donnes).
-c, --clean
Nettoie (supprime) les objets de la base de donnes avant de les crer.
-C, --create
Cre la base de donnes avant de la restaurer. (Quand cette option est utilise, la base de donnes nomme avec -d est utilise seulement pour lancer la commande initiale CREATE DATABASE. Toutes les donnes sont restaures dans le nom de
la base de donnes qui apparat dans l'archive.)
-d nom_base, --dbname=nom_base
Se connecte la base de donnes nom_base et restaure directement dans la base de donnes.
-e, --exit-on-error
Quitte si une erreur est rencontre lors de l'envoi des commandes SQL la base de donnes. La valeur par dfaut est de
continuer et d'afficher le nombre d'erreurs la fin de la restauration.
-f nom_fichier, --file=filename
Spcifie le fichier en sortie pour le script gnr ou pour la liste lorsqu'elle est utilise avec -l. Par dfaut, il s'agit de la
sortie standard.
-F format, --format=format
Spcifie le format de l'archive. Il n'est pas ncessaire de le spcifier car pg_restore dtermine le format automatiquement. Si
spcifi, il peut tre un des suivants :
c, custom
L'archive est dans le format personnalis de pg_dump.
d, directory
L'archive est un rpertoire (directory).
t, tar
L'archive est une archive tar.
1174
pg_restore
-i, --ignore-version
Une option obsolte qui est maintenant ignore.
-I index, --index=index
Restaure uniquement la dfinition des index nomms.
-j nombre-de-jobs, --jobs=nombre-de-jobs
Excute les parties les plus consommatrices en temps de pg_restore -- celles des chargements de donnes, crations d'index et
crations de contraintes -- en utilisant plusieurs jobs concurrents. Cette option peut rduire de beaucoup le temps pour restaurer une grosse base de donnes pour un serveur fonctionnant sur une machine multi-processeus.
Chaque job est un processus ou un thread, suivant le systme d'exploitation, et utilise une connexion spare au serveur.
La valeur optimale pour cette option dpend de la configuration matrielle du serveur, du client et du rseau. Les facteurs incluent le nombre de curs CPU et la configuration disque. Un bon moyen pour commencer est le nombre de curs CPU du
serveur, mais une valeur plus grande que a peut amener des temps de restauration encore meilleurs dans de nombreux cas.
Bien sr, les valeurs trop hautes apporteront des performances en baisse.
Seul le format d'archivage personnalis est support avec cette option. Le fichier en entre doit tre un fichier standard (pas un
tube par exemple). Cette option est ignore lors de la cration d'un script plutt qu'une connexion la base de donnes. De
plus, plusieurs jobs ne peuvent pas tre utiliss ensemble si vous voulez l'option --single-transaction.
-l, --list
Liste le contenu de l'archive. Le rsultat de cette opration peut tre utilis en entre de l'option -L. Notez que, si vous utilisez
des options de filtre telles que -n ou -t avec l'option -l, elles restreignent les lments lists.
-L fichier_liste, --use-list=fichier_liste
Restaure seulement les objets qui sont lists dans le fichier fichier_liste, et les restaure dans l'ordre o elles apparaissent dans le fichier. Notez que, si des options de filtre comme -n et -t sont utilises avec -L, elles ajouteront cette restriction aux lments restaurs.
fichier_liste est normalement cr en ditant la sortie d'une prcdente opration -l. Les lignes peuvent tre dplaces
ou supprimes, et peuvent aussi tre mise en commentaire en ajoutant un point-virgule (;) au dbut de la ligne. Voir cidessous pour des exemples.
-n nom_schema, --schema=nom_schema
Restaure seulement les objets qui sont dans le schma nomm. Elle peut tre combine avec l'option -t pour ne restaurer
qu'une seule table.
-O, --no-owner
Ne pas donner les commandes initialisant les propritaires des objets pour correspondre la base de donnes originale. Par
dfaut, pg_restore lance des instructions ALTER OWNER ou SET SESSION AUTHORIZATION pour configurer le propritaire des lments du schma cr. Ces instructions chouent sauf si la connexion initiale la base de donnes est ralise
par un superutilisateur (ou le mme utilisateur que le propritaire des objets du script). Avec -O, tout nom d'utilisateur peut
tre utilis pour la connexion initiale et cet utilisateur est le propritaire des objets crs.
-P nom_fonction(argtype [, ...]), --function=nom_fonction(argtype [, ...])
Restaure seulement la fonction nomme. Faites attention peler le nom de la fonction et les arguments exactement comme
ils apparaissent dans la table des matires du fichier de sauvegarde.
-r, --no-reconnect
Cette option est obsolte mais est toujours accepte pour des raisons de compatibilit ascendante.
-s, --schema-only
Restaure uniquement le schma (dfinition des donnes), et non pas les donnes elles-mme (contenu de la table). Les valeurs
actuelles des squences ne seront pas restaures. ne pas confondre avec l'option --schema qui utilise le mot schma avec
une autre signification).
-S nom_utilisateur, --superuser=nom_utilisateur
Spcifie le nom d'utilisateur du superutilisateur utiliser pour dsactiver les dclencheurs. Ceci est seulement ncessaire si -disable-triggers est utilis.
-t table, --table=table
Restaure uniquement la dfinition et/ou les donnes de la table nomme. Ceci est combinable avec l'option -n pour spcifier
un schma.
-T trigger, --trigger=trigger
Restaure uniquement le dclencheur nomm.
-v, --verbose
1175
pg_restore
pg_restore
Cette option n'est jamais obligatoire car pg_restore demandera automatiquement un mot de passe si le serveur exige une authentification par mot de passe. Nanmoins, pg_restore perdra une tentative de connexion pour trouver que le serveur veut un
mot de passe. Dans certains cas, il est prfrable d'ajouter l'option -W pour viter la tentative de connexion.
--role=nom_rle
Indique un nom de rle utilis pour la restauration. Cette option fait que pg_restore excute un SET ROLE nom_rle aprs
connexion la base de donnes. C'est utile quand l'utilisateur authentifi (indiqu par l'option -U) n'a pas les droits demands
par pg_restore, mais peut devenir le rle qui a les droits requis. Certains installations ont une politique contre la connexion en
super-utilisateur directement, et utilisent cette option pour permettre aux restaurations de se faire sans violer cette rgle.
Environnement
PGHOST, PGOPTIONS, PGPORT, PGUSER
Paramtres de connexion par dfaut
Cet outil, comme la plupart des autres outils PostgreSQL, utilise aussi les variables d'environnement supportes par la bibliothque libpq (voir Section 31.13, Variables d'environnement ).
Diagnostiques
Quand une connexion directe la base de donnes est spcifie avec l'option -d, pg_restore excute en interne des instructions
SQL. Si vous avez des problmes en excutant pg_restore, assurez-vous d'tre capable de slectionner des informations partir de
la base de donnes en utilisant, par exemple partir de psql(1). De plus, tout paramtre de connexion par dfaut et toute variable
d'environnement utilis par la bibliothque libpq s'appliqueront.
Notes
Si votre installation dispose d'ajouts locaux la base de donnes template1, faites attention charger la sortie de pg_restore
dans une base de donnes rellement vide ; sinon, vous avez des risques d'obtenir des erreurs des aux dfinitions dupliques des
objets ajouts. Pour crer une base de donnes vide sans ajout local, copiez partir de template0, et non pas de template1,
par exemple :
CREATE DATABASE foo WITH TEMPLATE template0;
Les limitations de pg_restore sont dtailles ci-dessous.
Lors de la restauration des donnes dans une table pr-existante et que l'option --disable-triggers est utilise,
pg_restore met des commandes pour dsactiver les dclencheurs sur les tables utilisateur avant d'insrer les donnes, puis
met les commandes pour les ractiver aprs l'insertion des donnes. Si la restauration est stoppe en plein milieu, les catalogues systme pourraient tre abandonns dans le mauvais tat.
pg_restore ne peut pas restaurer les large objects de faon slective, par exemple seulement ceux d'une table prcise. Si
une archive contient des large objects , alors tous les large objects seront restaures (ou aucun s'ils sont exclus avec
l'option -L, l'option -t ou encore d'autres options.
Voir aussi la documentation de pg_dump(1) pour les dtails sur les limitations de pg_dump.
Une fois la restauration termine, il est conseill de lancer ANALYZE sur chaque table restaure de faon ce que l'optimiseur
dispose de statistiques utiles ; voir Section 23.1.3, Maintenir les statistiques du planificateur et Section 23.1.5, Le dmon auto-vacuum pour plus d'informations.
Exemples
Supposons que nous avons sauvegard une base nomme ma_base dans un fichier de sauvegarde au format personnalis :
$ pg_dump -Fc ma_base > ma_base.dump
Pour supprimer la base et la re-crer partir de la sauvegarde :
$ dropdb ma_base
$ pg_restore -C -d postgres ma_base.dump
La base nomme avec l'option -d peut tre toute base de donnes existante dans le cluster ; pg_restore l'utilise seulement pour
1177
pg_restore
excuter la commande CREATE DATABASE pour ma_base. Avec -C, les donnes sont toujours restaures dans le nom de la
base qui apparat dans le fichier de sauvegarde.
Pour charger la sauvegarde dans une nouvelle base nomme nouvelle_base :
$ createdb -T template0 newdb
$ pg_restore -d newdb db.dump
Notez que nous n'utilisons pas -C et que nous nous sommes connects directement sur la base restaurer. De plus, notez que nous
clonons la nouvelle base partir de template0 et non pas de template1, pour s'assurer qu'elle est vide.
Pour rordonner les lments de la base de donnes, il est tout d'abord ncessaire de sauvegarder la table des matires de
l'archive :
$ pg_restore -l ma_base.dump > ma_base.liste
Le fichier de liste consiste en un en-tte et d'une ligne par lment, par exemple :
;
; Archive created at Mon Sep 14 13:55:39 2009
;
dbname: DBDEMOS
;
TOC Entries: 81
;
Compression: 9
;
Dump Version: 1.10-0
;
Format: CUSTOM
;
Integer: 4 bytes
;
Offset: 8 bytes
;
Dumped from database version: 8.3.5
;
Dumped by pg_dump version: 8.3.8
;
;
; Selected TOC Entries:
;
3; 2615 2200 SCHEMA - public pasha
1861; 0 0 COMMENT - SCHEMA public pasha
1862; 0 0 ACL - public pasha
317; 1247 17715 TYPE public composite pasha
319; 1247 25899 DOMAIN public domain0 pasha
Les points virgules commencent un commentaire et les numros au dbut des lignes se rfrent l'ID d'archive interne affecte
chaque lment.
Les lignes dans le fichier peuvent tre commentes, supprimes et rordonnes. Par exemple :
10; 145433 TABLE map_resolutions postgres
;2; 145344 TABLE species postgres
;4; 145359 TABLE nt_header postgres
6; 145402 TABLE species_records postgres
;8; 145416 TABLE ss_old postgres
peut tre utilis en entre de pg_restore et ne restaure que les lments 10 et 6 dans cet ordre :
$ pg_restore -L mabase.liste mabase.fichier
Voir aussi
pg_dump(1), pg_dumpall(1), psql(1)
1178
Nom
psql terminal interactif PostgreSQL
Synopsis
psql [option...] [nombase [nomutilisateur]]
Description
psql est une interface en mode texte pour PostgreSQL. Il vous permet de saisir des requtes de faon interactive, de les excuter sur PostgreSQL et de voir les rsultats de ces requtes. Alternativement, les entres peuvent tres lues partir d'un fichier.
De plus, il fournit un certain nombre de mta-commandes et plusieurs fonctionnalits style shell pour faciliter l'criture des
scripts et automatiser un nombre vari de tches.
Options
-a, --echo-all
Affiche toutes les lignes en entre sur la sortie standard lorsqu'elles sont lues. Ceci est plus utile dans le traitement de scripts
que dans le mode interactif. C'est quivalent initialiser la variable ECHO all.
-A, --no-align
Bascule dans le mode d'affichage non align. (Le mode d'affichage par dfaut est align.)
-c commande, --command=commande
Indique que psql doit excuter une chane de commande, commande, puis s'arrter. Cette option est utile dans les scripts
shell. Les fichiers de dmarrage (psqlrc et ~/.psqlrc) sont ignors avec cette option.
commande doit tre soit une chane de commandes compltement analysable par le serveur (c'est--dire qui ne contient aucune des fonctionnalits spcifiques de psql), soit une seule commande antislash. Du coup, vous ne pouvez pas mixer les
commandes SQL et les mta-commandes psql avec cette option. Pour russir ceci, vous pouvez envoyer la chane dans un
tube vers psql, par exemple : echo "\x \\ SELECT * FROM foo;" | psql. (\\ est la mta-commande sparateur.)
Si la chane de commandes contient plusieurs commandes SQL, elles sont traites dans une seule transaction sauf si des
commandes BEGIN/COMMIT explicites sont inclues dans la chane pour la diviser en plusieurs transactions. Ceci est diffrent du comportement adopt quand la mme chane est envoye dans l'entre standard de psql. De plus, seul le rsultat de
la dernire commande SQL est renvoy.
cause de ces comportements historiques, placer plus d'une commande dans la chane fournie l'option -c a souvent des
rsultats inattendus. Il est prfrable de fournir plusieurs commandes sur l'entre standard de psql, soit en utilisant echo
comme illustr ci-dessus, soit avec un document shell en ligne, par exemple :
psql <<EOF
\x
SELECT * FROM foo;
EOF
-d nombase, --dbname=nombase
Indique le nom de la base de donnes o se connecter. Ceci est quivalent spcifier nombase comme premier argument
de la ligne de commande qui n'est pas une option.
Si ce paramtre contient un signe =, il est trait comme une chane conninfo. Voir Section 31.1, Fonctions de contrle
de connexion la base de donnes pour plus d'informations.
-e, --echo-queries
Copie toutes les commandes qui sont envoyes au serveur sur la sortie standard. Ceci est quivalent initialiser la variable
ECHO queries.
-E, --echo-hidden
Affiche les requtes relles gnres par \d et autres commandes antislash. Vous pouvez utiliser ceci pour tudier les oprations internes de psql. Ceci est quivalent initialiser la variable ECHO_HIDDEN dans psql.
-f nomfichier, --file=nomfichier
Utilise le fichier nomfichier comme source des commandes au lieu de lire les commandes de faon interactive. Une fois
1179
psql
que le fichier est entirement trait, psql se termine. Ceci est globalement quivalent la commande interne \i.
Si nomfichier est un - (tiret), alors l'entre standard est lue.
Utiliser cette option est lgrement diffrent d'crire psql < nomfichier. En gnral, les deux feront ce que vous souhaitez mais utiliser -f active certaines fonctionnalits intressantes comme les messages d'erreur avec les numros de ligne.
Il y a aussi une lgre chance qu'utiliser cette option rduira la surcharge du lancement. D'un autre ct, la variante utilisant la
redirection de l'entre du shell doit (en thorie) pour ramener exactement le mme affichage que celui que vous auriez eu en
saisissant tout manuellement.
-F sparateur, --field-separator=sparateur
Utilisez sparateur comme champ sparateur pour un affichage non align. Ceci est quivalent \pset fieldsep ou \f.
-h nomhte, --host=nomhte
Indique le nom d'hte de la machine sur lequel le serveur est en cours d'excution. Si la valeur commence avec un slash, elle
est utilise comme rpertoire du socket de domaine Unix.
-H, --html
Active l'affichage en tableau HTML. Ceci est quivalent \pset format html ou la commande \H.
-l, --list
Liste toutes les bases de donnes disponibles puis quitte. Les autres option non relatives la connexion sont ignores. Ceci est
similaire la commande interne \list.
-L nomfichier, --log-file=nomfichier
crit tous les rsultats des requtes dans le fichier nomfichier en plus de la destination habituelle.
-n, --no-readline
N'utilise pas readline pour l'dition de ligne et n'utilise pas l'historique. Ceci est utile quand on veut dsactiver la gestion de la
tabulation pour l'action copie/colle.
-o nomfichier, --output=nomfichier
Dirige tous les affichages de requtes dans le fichier nomfichier. Ceci est quivalent la commande \o.
-p port, --port=port
Indique le port TCP ou l'extension du fichier socket de domaine local Unix sur lequel le serveur attend les connexions. Par dfaut, il s'agit de la valeur de la variable d'environnement PGPORT ou, si elle n'est pas initialise, le port spcifi au moment de
la compilation, habituellement 5432.
-P affectation, --pset=affectation
Vous permet de spcifier les options d'affichage dans le style de \pset sur la ligne de commande. Notez que, ici, vous devez
sparer nom et valeur avec un signe gal au lieu d'un espace. Du coup, pour initialiser le format d'affichage en LaTeX, vous
devez crire -P format=latex.
-q, --quiet
Indique que psql doit travailler silencieusement. Par dfaut, il affiche des messages de bienvenue et des informations diverses.
Si cette option est utilise, rien de ceci n'est affich. C'est utile avec l'option -c. l'intrieur de psql, vous pouvez aussi initialiser la variable QUIET pour arriver au mme effet.
-R sparateur, --record-separator=sparateur
Utilisez sparateur comme sparateur d'enregistrement pour un affichage non align. Ceci est quivalent la commande
\pset recordsep.
-s, --single-step
S'excute en mode tape par tape. Ceci signifie qu'une intervention de l'utilisateur est ncessaire avant l'envoi de chaque
commande au serveur, avec une option pour annuler l'excution. Utilisez cette option pour dboguer des scripts.
-S, --single-line
S'excute en mode simple ligne o un retour la ligne termine une commande SQL, de la mme faon qu'un point-virgule.
Note
Ce mode est fourni pour ceux qui insistent pour l'avoir, mais vous n'tes pas ncessairement encourag
l'utiliser. En particulier, si vous mixez SQL et mta-commandes sur une ligne, l'ordre d'excution n'est pas toujours clair pour l'utilisateur non expriment.
-t, --tuples-only
Dsactive l'affichage des noms de colonnes et le pied de page contenant le nombre de rsultats, etc. Ceci est quivalent la
mta-commande \t.
1180
psql
-T options_table, --table-attr=options_table
Permet d'indiquer les options placer l'intrieur d'une balise table en HTML. Voir \pset pour plus de dtails.
-U nomutilisateur, --username=nomutilisateur
Se connecte la base de donnes en tant que l'utilisateur nomutilisateur au lieu de celui par dfaut. (Vous devez aussi
avoir le droit de le faire, bien sr.)
-v affectation, --set=affectation, --variable=affectation
Ralise une affectation de variable comme la commande interne \set. Notez que vous devez sparer nom et valeur par un
signe gal sur la ligne de commande. Pour dsinitialiser une variable, enlevez le signe d'galit. Pour simplement initialiser
une variable sans valeur, utilisez le signe gal sans passer de valeur. Ces affectations sont ralises lors de la toute premire
tape du lancement, du coup les variables rserves des buts internes peuvent tre crases plus tard.
-V, --version
Affiche la version de psql et quitte.
-w, --no-password
Ne demande jamais un mot de passe. Si le serveur en rclame un pour l'authentification et qu'un mot de passe n'est pas disponible d'une autre faon (par exemple avec le fichier .pgpass), la tentative de connexion chouera. Cette option peut tre
utile pour les scripts o aucun utilisateur n'est prsent pour saisir un mot de passe.
Notez que cette option restera positionne pour l'ensemble de la session, et qu'elle affecte aussi l'utilisation de la mtacommande \connect en plus de la tentative de connexion initiale.
-W, --password
Force psql demander un mot de passe avant de se connecter une base de donnes.
Cette option n'est jamais obligatoire car psql demandera automatiquement un mot de passe si le serveur exige une authentification par mot de passe. Nanmoins, psql perdra une tentative de connexion pour trouver que le serveur veut un mot de passe.
Dans certains cas, il est prfrable d'ajouter l'option -W pour viter la tentative de connexion.
Notez que cette option sera conserve pour la session entire, et que du coup elle affecte l'utilisation de la mta-commande
\connect ainsi que la tentative de connexion initiale.
-x, --expanded
Active le mode de formatage de table tendu. Ceci est quivalent la commande \x.
-X,, --no-psqlrc
Ne lit pas le fichier de dmarrage (ni le fichier systme psqlrc ni celui de l'utilisateur ~/.psqlrc).
-1, --single-transaction
Quand psql excute un script avec l'option -f, ajouter cette option englobe le script avec les instructions BEGIN/COMMIT
pour tout faire dans une seule transaction. Ceci nous assure que soit toutes les commandes se terminent avec succs, soit aucune modification n'est enregistre.
Si le script utilise lui-mme BEGIN, COMMIT ou ROLLBACK, cette option n'aura pas les effets dsirs. De plus, si le
script contient toute commande qui ne peut pas tre excute l'intrieur d'un bloc de transaction, indiquer cette option provoquera l'chec de cette commande (et du coup de la transaction entire).
-?, --help
Affiche de l'aide sur les arguments en ligne de commande de psql et quitte.
Code de sortie
psql renvoie 0 au shell s'il se termine normalement, 1 s'il y a eu une erreur fatale de son fait (pas assez de mmoire, fichier introuvable), 2 si la connexion au serveur s'est interrompue ou a t annule, 3 si une erreur est survenue dans un script et si la variable
ON_ERROR_STOP a t initialise.
Usage
Se connecter une base de donnes
psql est une application client PostgreSQL standard. Pour se connecter une base de donnes, vous devez connatre le nom de
votre base de donnes cible, le nom de l'hte et le numro de port du serveur ainsi que le nom de l'utilisateur que vous souhaitez
connecter. psql peut connatre ces paramtres partir d'options en ligne de commande, respectivement -d, -h, -p et -U. Si un argument autre qu'une option est rencontr, il est interprt comme le nom de la base de donnes (ou le nom de l'utilisateur si le nom
de la base de donnes est dj donn). Toutes les options ne sont pas requises, des valeurs par dfaut sont applicables. Si vous
omettez le nom de l'hte, psql se connecte via un socket de domaine Unix un serveur sur l'hte local ou via TCP/IP sur local1181
psql
host pour les machines qui n'ont pas sockets de domaine Unix. Le numro de port par dfaut est dtermin au moment de la
compilation. Comme le serveur de bases de donnes utilise la mme valeur par dfaut, vous n'aurez pas besoin de spcifier le port
dans la plupart des cas. Le nom de l'utilisateur par dfaut est votre nom d'utilisateur Unix, de mme pour le nom de la base de donnes par dfaut. Notez que vous ne pouvez pas simplement vous connecter n'importe quelle base de donnes avec n'importe quel
nom d'utilisateur. Votre administrateur de bases de donnes doit vous avoir inform de vos droits d'accs.
Quand les valeurs par dfaut ne sont pas correctes, vous pouvez vous simplifier la vie en configurant les variables
d'environnement PGDATABASE, PGHOST, PGPORT et/ou PGUSER avec les valeurs appropries (pour les variables
d'environnement supplmentaires, voir Section 31.13, Variables d'environnement ). Il est aussi intressant d'avoir un fichier
~/.pgpass pour viter d'avoir rgulirement saisir des mots de passe. Voir Section 31.14, Fichier de mots de passe pour
plus d'informations.
Une autre faon d'indiquer les paramtres de connexion est dans une chane conninfo qui est utilise la place du nom d'une
base de donnes. Ce mcanisme vous donne un grand contrle sur la connexion. Par exemple :
$ psql "service=monservice sslmode=require"
De cette faon, vous pouvez aussi utiliser LDAP pour la recherche de paramtres de connexion, comme dcrit dans Section 31.16,
Recherches LDAP des paramtres de connexion . Voir Section 31.1, Fonctions de contrle de connexion la base de donnes pour plus d'informations sur toutes les options de connexion disponibles.
Si la connexion ne peut pas se faire, quelle qu'en soit la raison (c'est--dire droits non suffisants, serveur arrt sur l'hte cible,
etc.), psql renvoie une erreur et s'arrte.
Si au moins l'une des entre ou sortie standard correspond un terminal, alors psql fixe le paramtre d'encodage client la valeur
auto , afin de pouvoir dtecter l'encodage appropri d'aprs les paramtres rgionaux (dfinis par la variable systme
LC_CTYPE pour les systmes Unix). Si cette mthode choue, il est possible de forcer l'encodage du client en renseignant la variable d'environnement PGCLIENTENCODING.
Meta-commandes
Tout ce que vous saisissez dans psql qui commence par un antislash non chapp est une mta-commande psql qui est traite par
psql lui-mme. Ces commandes aident rendre psql plus utile pour l'administration ou pour l'criture de scripts. Les mtacommandes sont plus souvent appeles les commandes slash ou antislash.
Le format d'une commande psql est l'antislash suivi immdiatement d'un verbe de commande et de ses arguments. Les arguments
sont spars du verbe de la commande et les uns des autres par un nombre illimit d'espaces blancs.
Pour inclure des espaces blancs dans un argument, vous devez l'envelopper dans des guillemets simples. Pour inclure un guillemet
simple dans un argument, utilisez deux guillemets simples. Tout ce qui est contenu entre des guillemets simples est de plus sujet
des substitutions style C pour \n (nouvelle ligne), \t (tabulation), \chiffres (octal) et \xchiffres (hexadcimal).
Si un argument sans guillemets commence avec un caractre :, il est pris pour une variable psql et la valeur de la variable est utilise la place de l'argument.
Les arguments placs entre guillemets arrires (`) sont pris comme une ligne de commande passe au shell. L'affichage de la commande (sans l'ventuel saut de ligne la fin) est pris comme valeur de l'argument. Cela s'applique aussi aux squences
d'chappement ci-dessus.
Quelques commandes prennent un identifiant SQL (comme un nom de table) en argument. Ces arguments suivent les rgles de la
1182
psql
syntaxe SQL : les lettres sans guillemets sont forces en minuscule alors que les guillemets doubles (") protgent les lettres de la
conversion de casse et autorisent l'incorporation d'espaces blancs dans l'identifiant. l'intrieur des guillemets doubles, les guillemets doubles en paire se rduisent un seul guillemet double dans le nom rsultant. Par exemple, FOO"BAR"BAZ est interprt
comme fooBARbaz et "Un nom ""bizarre" devient Un nom "bizarre.
L'analyse des arguments se termine quand d'autres antislash non entre guillemets surviennent. Ceci est pris pour le dbut d'une
nouvelle mta-commande. La squence spciale \\ (deux antislashes) marque la fin des arguments et continue l'analyse des commandes SQL, si elles existent. De cette faon, les commandes SQL et psql peuvent tre mixes librement sur une ligne. Mais dans
tous les cas, les arguments d'une meta-commande ne peuvent pas continuer aprs la fin de la ligne.
Les meta-commandes suivantes sont dfinies :
\a
Si le format actuel d'affichage d'une table est non align, il est bascul align. S'il n'est pas non align, il devient non align.
Cette commande est conserve pour des raisons de compatibilit. Voir \pset pour une solution plus gnrale.
\c (ou \connect) [ nom_base [ nom_utilisateur ] [ hte ] [ port ] ]
tablie une nouvelle connexion un serveur PostgreSQL. Si la nouvelle connexion est russie, la connexion prcdente est
ferme. Si une option parmi nom_base, nom_utilisateur, hte et port est omise ou vaut -, la valeur de ce mme
paramtre de la connexion prcdente est utilise. S'il ny avait pas encore de connexion, la valeur par dfaut dans libpq est
utilise.
Si la tentative de connexion choue (mauvais nom d'utilisateur, accs refus, etc.), la connexion prcdente est conserve si
psql est en mode interactif. Lors de l'excution d'un script non interactif, le traitement s'arrtera immdiatement avec une erreur. Cette distinction a t choisie pour deux raisons : aider l'utilisateur face aux fautes de frappe et en tant que mesure de
prcaution pour qu'un script n'agisse pas par erreur sur la mauvaise base.
\C [ titre ]
Initialise ou supprime le titre des tables affiches en rsultat d'une requte. Cette commande est quivalente \pset title
titre. (Le nom de cette commande provient de caption , car elle avait prcdemment pour seul but d'initialiser l'en-tte
dans une table HTML.)
\cd [ rpertoire ]
Modifie le rpertoire courant par rpertoire. Sans argument, le rpertoire personnel de l'utilisateur devient le rpertoire
courant.
Astuce
Pour afficher votre rpertoire courant, utilisez \! pwd.
\conninfo
Outputs information about the current database connection.
\copy { table [ ( liste_colonnes ) ] | ( requte ) } { from | to } { nomfichier | stdin
| stdout | pstdin | pstdout } [ with ] [ binary ] [ oids ] [ delimiter [ as ] 'caractre' ] [ null [ as ] 'chane' ] [ csv [ header ] [ quote [ as ] 'caractre' ] [ escape
[ as ] 'caractre' ] [ force quote liste_colonnes ] [ force not null liste_colonnes ] ]
Ralise une opration de copy ct client. C'est une opration qui excute une commande SQL, COPY(7), mais au lieu que le
serveur lise ou crive le fichier spcifi, psql lit ou crit le fichier en faisant le routage des donnes entre le serveur et le systme de fichiers local. Ceci signifie que l'accs et les droits du fichier sont ceux de l'utilisateur local, pas celui du serveur, et
qu'aucun droit de superutilisateur n'est requis.
La syntaxe de la commande est similaire celle de la commande COPY(7) SQL. Notez que, cause de cela, des rgles spciales d'analyse s'appliquent la commande \copy. En particulier, les rgles de substitution de variable et d'chappement antislash ne s'appliquent pas.
\copy ... from stdin | to stdout lit/crit bas sur l'entre standard de la commande ou sa sortie standard respectivement. Toutes les lignes sont lues partir de la mme source qui a lanc la commande, en continuant jusqu' ce que \.
soit lu ou que le flux parvienne EOF. La sortie est envoye au mme endroit que la sortie de la commande. Pour lire/crire
partir de l'entre et de la sortie standard de psql, utilisez pstdin ou pstdout. Cette option est utile pour peupler des tables
en ligne l'intrieur d'un fichier script SQL.
Astuce
Cette opration n'est pas aussi efficace que la commande COPY en SQL parce que toutes les donnes doivent
passer au travers de la connexion client/serveur. Pour les grosses masses de donnes, la commande SQL est
1183
psql
prfrable.
\copyright
Affiche le copyright et les termes de distribution de PostgreSQL.
\d[S+] [ motif ]
Pour chaque relation (table, vue, index, squence ou table distante) ou type composite correspondant au motif, affiche
toutes les colonnes, leur types, le tablespace (s'il ne s'agit pas du tablespace par dfaut) et tout attribut spcial tel que NOT
NULL ou les valeurs par dfaut. Les index, contraintes, rgles et dclencheurs associs sont aussi affichs, ainsi que la dfinition de la vue si la relation est une vue. For foreign tables, the associated foreign server is shown as well. (Ce qui
Correspond au motif est dfini ci-dessous.)
Le forme de la commande \d+ est identique, sauf que des informations plus compltes sont affiches : tout commentaire associ avec les colonnes de la table est affich, ainsi que la prsence d'OID dans la table, la dfinition de la vue (si la relation
cible est une vue), ainsi que les options gnriques si la relation est une table distante.
Par dfaut, seuls les objets crs par les utilisateurs sont affichs ; fournissez un motif ou le modificateur S pour afficher les
objets systmes.
Note
Si \d est utilis sans argument motif, c'est quivalent, en plus commode, \dtvsE qui affiche une liste de
toutes les tables, vues, squences et tables distantes.
\da[S] [ motif ]
Liste toutes les fonctions d'agrgat disponibles, avec lee type de retour et les types de donnes sur lesquels elles oprent. Si
motif est spcifi, seuls les agrgats dont les noms commencent par le motif sont affichs. Par dfaut, seuls les objets crs
par les utilisateurs sont affichs ; fournissez un motif ou le modificateur S pour afficher les objets systmes.
\db[+] [ motif ]
Liste tous les tablespaces disponibles. Si motif est spcifi, seuls les tablespaces dont le nom correspond au motif sont affichs. Si + est ajout la fin de la commande, chaque objet est list avec les droits associs.
\dc[S] [ motif ]
Liste les conversions entre les encodages de jeux de caractres. Si motif est spcifi, seules les conversions dont le nom correspond au motif sont listes. Par dfaut, seuls les objets crs par les utilisateurs sont affichs ; fournissez un motif ou le modificateur S pour afficher les objets systmes.
\dC [ motif ]
Liste les conversions de types. Si motif est indiqu, seules sont affiches les conversions dont le type source ou cible correspond au motif.
\dd[S] [ motif ]
Affiche les descriptions des objets correspondant au motif ou de tous les objets si aucun argument n'est donn. Mais dans
tous les cas, seuls les objets qui ont une description sont lists. Par dfaut, seuls les objets crs par les utilisateurs sont affichs ; fournissez un motif ou le modificateur S pour afficher les objets systmes. Le terme objet couvre les agrgats, les
fonctions, les oprateurs, les types, les relations (tables, vues, index, squences, objets larges), les rgles et les dclencheurs.
Par exemple, :
=> \dd version
Object descriptions
Schema
| Name
| Object |
Description
------------+---------+----------+--------------------------pg_catalog | version | function | PostgreSQL version string
(1 row)
Les descriptions des objets peuvent tre ajoutes avec la commande SQL COMMENT(7).
\ddp [ motif ]
Liste les paramtres par dfaut pour les privilges d'accs. Une entre est affiche pour chaque rle (et schma, si c'est appropri) pour lequel les paramtres par dfaut des privilges ont t modifis par rapport aux paramtres par dfaut intgrs. Si
motif est spcifi, seules les entres dont le nom de rle ou le nom de schma correspond au motif sont listes.
La commande ALTER DEFAULT PRIVILEGES(7) sert positionner les privilges d'accs par dfaut. Le sens de l'affichage
des privilges est expliqu la page de GRANT(7).
\dD[S] [ motif ]
1184
psql
Liste les domaines. Si motif est spcifi, seuls les domaines dont le nom correspond au motif sont affichs. Par dfaut, seuls
les objets crs par les utilisateurs sont affichs ; fournissez un motif ou le modificateur S pour afficher les objets systmes.
\dE[S+] [ motif ], \di[S+] [ motif ], \ds[S+] [ motif ], \dt[S+] [ motif ], \dv[S+] [ motif
]
Dans ce groupe de commandes, les lettres E, i, s, t et v correspondent respectivement table distante, index, squence, table
et vue. Vous pouvez indiquer n'importe quelle combinaison de ces lettres, dans n'importe quel ordre, pour obtenir la liste de
tous les objets de ces types. Par exemple, \dit liste les index et tables. Si + est ajout la fin de la commande, chaque objet
est list avec sa taille physique sur disque et sa description associe s'il y en a une. Si motif est spcifi, seuls les objets dont
les noms correspondent au motif sont lists. Par dfaut, seuls les objets crs par les utilisateurs sont affichs ; fournissez un
motif ou le modificateur S pour afficher les objets systmes.
\det[+] [ motif ]
Liste les tables distantes (mnmotechnique : tables externes ). Si un motif est fourni, seules les entres concernant les
tables ou les schmas en correspondance seront listes. Si vous utilisez la forme \det+, les options gnriques seront galement affiches. Lists foreign tables (mnemonic: external tables ).
\des[+] [ motif ]
Liste les serveurs distants (mnmonique : external servers ). Si motif est spcifi, seuls les serveurs dont le nom correspond au motif sont affichs. Si la forme \des+ est utilise, une description complte de chaque serveur est affiche, incluant
la liste de contrle d'accs du serveur (ACL), type, version et options.
\deu[+] [ motif ]
Liste les correspondances d'utilisateurs (mnmonique : external users ). Si motif est spcifi, seules les correspondances
dont le nom correspond au motif sont affiches. Si la forme \deu+ est utilise, des informations supplmentaires sur chaque
correspondance d'utilisateur sont affiches.
Attention
\deu+ risque aussi d'afficher le nom et le mot de passe de l'utilisateur distant, il est donc important de faire attention ne pas les divulguer.
\dew[+] [ motif ]
Liste les wrappers de donnes distants (mnmonique : external wrappers ). Si motif est spcifi, seuls les wrappers dont
le nom correspond au motif sont affichs. Si la forme \dew+ est utilise, les ACL et options du wrapper sont aussi affiches.
\df[antwS+] [ motif ]
Liste les fonctions, ainsi que leurs arguments, types de retour, et types de fonctions, qui sont classs comme agg (agrgat),
normal , trigger , or window . Afin de n'afficher que les fonctions d'un type spcifi, ajoutez les lettres correspondantes, respectivement a, n, t, or w la commande. Si motif est spcifi, seules les fonctions dont le nom correspond au
motif sont affiches. Si la forme \df+ est utilise, des informations supplmentaires sur chaque fonction, dont la volatibilit,
le langage, le code source et la description, sont proposes. Par dfaut, seuls les objets crs par les utilisateurs sont affichs ;
fournissez un motif ou le modificateur S pour afficher les objets systmes.
Astuce
Pour rechercher des fonctions prenant des arguments ou des valeurs de retour d'un type spcifique, utilisez les
capacits de recherche du paginateur pour parcourir la sortie de \df.
\dF[+] [ motif ]
Liste les configurations de la recherche plein texte. Si motif est spcifi, seules les configurations dont le nom correspond
au motif seront affiches. Si la forme \dF+ est utilise, une description complte de chaque configuration est affiche, ceci
incluant l'analyseur de recherche plein texte et la liste de dictionnaire pour chaque type de jeton de l'analyseur.
\dFd[+] [ motif ]
Liste les dictionnaires de la recherche plein texte. Si motif est spcifi, seuls les dictionnaires dont le nom correspond au
motif seront affichs. Si la forme \dFd+ est utilise, des informations supplmentaires sont affiches pour chaque dictionnaire, ceci incluant le motif de recherche plein texte et les valeurs des options.
\dFp[+] [ motif ]
Liste les analyseurs de la recherche plein texte. Si motif est spcifi, seuls les analyseurs dont le nom correspond au motif
seront affichs. Si la forme \dFp+ est utilise, une description complte de chaque analyseur est affiche, ceci incluant les
fonctions sous-jacentes et les types de jeton reconnu.
\dFt[+] [ motif ]
Liste les motifs de la recherche plein texte. Si motif est spcifi, seuls les motifs dont le nom correspond au motif seront af1185
psql
fichs. Si la forme \dFt+ est utilise, des informations supplmentaires sont affiches pour chaque motif, ceci incluant les
noms des fonctions sous-jacentes.
\dg[+] [ motif ]
Liste les rles des bases de donnes. Si motif est spcifi, seuls les rles dont le nom correspond au motif sont lists. (Cette
commande est maintenant rellement identique \du.) Si la forme \dg+ est utilise, des informations supplmentaires sont
affiches pour chaque rle, par exemple le commentaire.
\dl
Ceci est un alias pour \lo_list, qui affiche une liste des objets larges.
\dL[S+] [ motif ]
Affiche les langages procduraux. Si un motif est spcifi, seuls les langages dont les noms correspondent au motif sont lists. Par dfaut, seuls les langages crs par les utilisateurs sont affichs ; il faut spcifier l'option S pour inclure les objets systmes. Si + est ajout la fin de la commande, chaque langage sera affich avec ses gestionnaire d'appels, validateur, droits
d'accs, et ce mme s'il s'agit d'un objet systme.
\dn[S+] [ motif ]
Liste les schmas. Si motif est spcifi, seuls les schmas dont le nom correspond au motif sont lists. Par dfaut, seuls les
objets crs par les utilisateurs sont affichs ; fournissez un motif ou le modificateur S pour afficher les objets systmes. Si +
est ajout la fin de la commande, chaque objet sera affich avec ses droits et son ventuelle description.
\do[S] [ motif ]
Liste les oprateurs avec leur oprande et type en retour. Si motif est spcifi, seuls les oprateurs dont le nom correspond
au motif sont lists. Par dfaut, seuls les objets crs par les utilisateurs sont affichs ; fournissez un motif ou le modificateur
S pour afficher les objets systmes.
\dO[S+] [ motif ]
Affiche les collationnements. Si motif est spcifi, seuls les collationnements dont le nom correspond au motif sont lists.
Par dfaut, seuls les objets crs par les utilisateurs sont affichs, fournissez un motif ou le modificateur S pour afficher les
objets systmes. Si + est ajout la fin de la commande, chacun des collationnements sera affich avec son ventuelle description. Notez que seuls les collationnements compatibles avec l'encodage de la base de donnes courante sont affichs, les
rsultats peuvent donc varier selon les diffrentes bases d'une mme instance.
\dp [ motif ]
Liste les tables, vues et squences avec leur droits d'accs associs. Si motif est spcifi, seules les tables, vues et squences
dont le nom correspond au motif sont listes.
Les commandes GRANT(7) et REVOKE(7) sont utilises pour configurer les droits d'accs. Les explications sur le sens de
l'affichage des privilges sont sous GRANT(7).
\drds [ role-pattern [ database-pattern ] ]
Liste les paramtres de configuration dfinis. Ces paramtres peuvent tre spcifiques un rle, spcifiques une base, ou les
deux. role-pattern et database-pattern servent choisir sur quels rles spcifiques ou quelles bases de donnes respectivement - les paramtres sont lists. Si ces options sont omises, ou si on spcifie *, tous les paramtres sont lists, y
compris ceux qui ne sont pas spcifiques un rle ou une base, respectivement.
Les commande ALTER ROLE(7) et ALTER DATABASE(7) servent dfinir les paramtres de configuration par rle et par
base de donnes.
\dT[S+] [ motif ]
Liste les types de donnes. Si motif est spcifi, seuls les types dont le nom correspond au motif sont affichs. Si + est ajout la fin de la commande, chaque type est list avec son nom interne et sa taille, ainsi que ses valeurs autorises si c'est un
type enum. Par dfaut, seuls les objets crs par les utilisateurs sont affichs ; fournissez un motif ou le modificateur S pour
afficher les objets systmes.
\du [ motif ]
Liste les rles de la base de donnes. Si motif est spcifi, seuls les rles dont le nom correspond au motif sont affichs. Si
la forme \du+ est utilise, des informations supplmentaires sont affiches pour chaque rle, par exemple le commentaire.
\dx[+] [ motif ]
Affiche les extensions installes. Si motif est spcifi, seules les entensions dont le nom correspond au motif sont affiches.
Avec la forme \dx+, tous les objets dpendants de chacune des extensions correspondantes sont galement lists.
\e (or \edit) [ nomfichier ] [ numero_ligne ]
Si nomfichier est spcifi, le fichier est dit ; en quittant l'diteur, son contenu est recopi dans le tampon de requte. Si
aucun paramtre nomfichier n'est fourni, le tampon de requte courant est copi dans un fichier temporaire et dit
l'identique.
Le nouveau tampon de requte est ensuite r-analys suivant les rgles habituelles de psql, o le tampon complet est trait
1186
psql
comme une seule ligne. (Du coup, vous ne pouvez pas faire de scripts de cette faon. Utilisez \i pour cela.) Ceci signifie que si
la requte se termine avec (ou contient) un point-virgule, elle est immdiatement excute. Dans les autres cas, elle attend
simplement dans le tampon de requte un point-virgule ou un \g pour l'envoyer, ou encore un \r pour annuler.
Si vous indiquez un numro de ligne, psql positionnera le curseur sur cette ligne du fichier ou du tampon de requte. Notez
que si un seul argument comportant uniquement des caractres numriques est fourni la commande, psql considre qu'il
s'agit d'un numro de ligne, et non pas un nom de fichier.
Astuce
Voir dans la section intitule Environnement la faon de configurer et personnaliser votre diteur.
\echo texte [ ... ]
Affiche les arguments sur la sortie standard spars par un espace et suivi par une nouvelle ligne. Ceci peut tre utile pour intgrer des informations sur la sortie des scripts. Par exemple :
=> \echo `date`
Tue Oct 26 21:40:57 CEST 1999
Si le premier argument est -n sans guillemets, alors la fin de ligne n'est pas crite.
Astuce
Si vous utilisez la commande \o pour rediriger la sortie de la requte, vous pourriez souhaiter utiliser \qecho au
lieu de cette commande.
\ef [ description_fonction [ line_number ] ]
Cette commande rcupre et dite la dfinition de la fonction dsigne au moyen d'une commande CREATE OR REPLACE FUNCTION. L'dition est faite de la mme faon que pour \edit. Aprs que l'diteur se soit ferm, la commande
mise jour attend dans le tampon de requte ; tapez ; ou \g pour l'envoyer, ou \r pour l'annuler.
La fonction cible peut tre spcifie par son nom seul, ou par son nom et ses arguments, par exemple foo(integer,
text). Les types d'arguments doivent tre fournis s'il y a plus d'une fonction du mme nom.
Si aucune fonction n'est spcifie, un modle d'ordre CREATE FUNCTION vierge est affich pour dition.
Si vous indiquez un numro de ligne, psql positionnera le curseur sur cette ligne dans le corps de la fonction. (Notez que le
corps de la fonction ne commence pas sur la premire ligne du fichier.)
Astuce
Voir dans la section intitule Environnement la faon de configurer et personnaliser votre diteur.
\encoding [ codage ]
Initialise l'encodage du jeu de caractres du client. Sans argument, cette commande affiche l'encodage actuel.
\f [ chane ]
Initialise le champ sparateur pour la sortie de requte non aligne. La valeur par dfaut est la barre verticale (|). Voir aussi
\pset comme moyen gnrique de configuration des options d'affichage.
\g [ { nomfichier | |commande } ]
Envoie le tampon de requte en entre vers le serveur et stocke en option la sortie de la requte dans nomfichier ou envoie
dans un tube la sortie vers un autre shell Unix excutant commande. Un simple \g est virtuellement quivalent un pointvirgule. Un \g avec argument est une alternative en un coup la commande \o.
\h (ou \help) [ commande ]
Donne la syntaxe sur la commande SQL spcifie. Si commande n'est pas spcifie, alors psql liste toutes les commandes
pour lesquelles une aide en ligne est disponible. Si commande est un astrisque (*), alors l'aide en ligne de toutes les commandes SQL est affiche.
Note
Pour simplifier la saisie, les commandes qui consistent en plusieurs mots n'ont pas besoin d'tre entre guillemets. Du coup, il est correct de saisir \help alter table.
1187
psql
\H
Active le format d'affichage HTML des requtes. Si le format HTML est dj activ, il est bascul au format d'affichage dfaut (texte align). Cette commande est pour la compatibilit mais voir \pset pour configurer les autres options d'affichage.
\i nomfichier
Lit l'entre partir du fichier nomfichier et l'excute comme si elle avait t saisie sur le clavier.
Note
Si vous voulez voir les lignes sur l'cran au moment de leur lecture, vous devez initialiser la variable ECHO
all.
\l (ou \list), \l+ (ou \list+)
Liste les noms, propritaires, encodage de jeux de caractres et droits d'accs de toutes les bases du serveur. Si + est ajout
la fin de la commande, la taille des bases, les tablespaces par dfaut et les descriptions sont aussi affiches. (Les tailles ne sont
disponibles que pour les bases auxquelles l'utilisateur courant a le droit de se connecter.)
\lo_export loid nomfichier
Lit l'objet large d'OID loid partir de la base de donnes et l'crit dans nomfichier. Notez que ceci est subtilement diffrent de la fonction serveur lo_export, qui agit avec les droits de l'utilisateur avec lequel est excut le serveur de base de
donnes et sur le systme de fichiers du serveur.
Astuce
Utilisez \lo_list pour trouver l'OID de l'objet large.
\lo_import nomfichier [ commentaire ]
Stocke le fichier dans un objet large PostgreSQL. En option, il associe le commentaire donn avec l'objet. Exemple :
foo=> \lo_import '/home/peter/pictures/photo.xcf' 'une
photo de moi'
lo_import 152801
La rponse indique que l'objet large a reu l'ID 152801, qui peut tre utilis pour accder de nouveau l'objet cr. Pour une
meilleure lisibilit, il est recommand de toujours associer un commentaire comprhensible par un humain avec chaque objet.
Les OID et les commentaires sont visibles avec la commande \lo_list.
Notez que cette commande est subtilement diffrente de la fonction serveur lo_import car elle agit en tant qu'utilisateur local sur le systme de fichier local plutt qu'en tant qu'utilisateur du serveur et de son systme de fichiers.
\lo_list
Affiche une liste de tous les objets larges PostgreSQL actuellement stocks dans la base de donnes, avec tous les commentaires fournis par eux.
\lo_unlink loid
Supprime l'objet large d'OID loid de la base de donnes.
Astuce
Utilisez \lo_list pour trouver l'OID d'un objet large.
\o [ {nomfichier | |commande} ]
Sauvegarde les rsultats des requtes suivantes dans le fichier nomfichier ou envoie via un tube les rsultats venir dans
un shell Unix spar pour excuter command. Si aucun argument n'est spcifi, l'affichage de la requte est redirig vers la
sortie standard.
Les rsultats de requte incluent toutes les tables, rponses de commande et messages d'avertissement obtenus du serveur
de bases de donnes, ainsi que la sortie de diffrentes commandes antislash qui envoient des requtes la base de donnes
(comme \d), mais sans message d'erreur.
Astuce
Pour intgrer du texte entre les rsultats de requte, utilisez \qecho.
\p
1188
psql
psql
linestyle
Positionne le style des lignes de bordure sur ascii, old-ascii unicode. Les abrviations uniques sont autorises. (Cela
signifie qu'une lettre suffit.) La valeur par dfaut est ascii. Cette option affecte seulement les formats de sortie aligned et
wrapped.
Le style ascii utilise les caractres basiques ASCII . Les retours la ligne dans les donnes sont reprsents par un symbole
+ dans la marge de droite. Si le format wrapped est slectionn, un retour chariot est ajout l'affichage pour les valeurs
dont la taille l'affichage est trop importante pour tenir dans une cellule de la colonne associe. Un point (.) est affich dans
la marge droite de la ligne avant le retour chariot et un autre point est affich dans la marge gauche de la ligne suivante.
Le style old-ascii utilise des caractres basiques ASCII, utilisant le style de formatage utilis dans PostgreSQL 8.4 and
et les versions plus anciennes. Les retours la ligne dans les donnes sont reprsents par un symbole : la place du sparateur de colonnes plac gauche. Quand les donnes sont rparties sur plusieurs lignes sans qu'il y ait de caractre de retour
la ligne dans les donnes, un symbole ; est utilis la place du sparateur de colonne de gauche.
Le style unicode utilise les caractres Unicode de dessin de bote. Les retours la ligne dans les donnes sont reprsents
par un symbole de retour la ligne dans la marge de droite. Lorsque les donnes sont rparties sur plusieurs lignes, sans qu'il
y ait de caractre de retour la ligne dans les donnes, le symbole ellipse est affich dans la marge de droite de la premire
ligne, et galement dans la marge de gauche de la ligne suivante.
Quand le paramtre border vaut plus que zro, cette option dtermine galement les caractres utiliss pour dessiner les
lignes de bordure. Les simples caractres ASCII fonctionnent partout, mais les caractres Unicode sont plus jolis sur les affichages qui les reconnaissent.
null
Positionne la chane de caractres afficher la place d'une valeur null. Par dfaut, rien n'est affich, ce qui peut facilement
tre confondu avec une chane de caractres vide. Par exemple, vous pouvez prfrer afficher \pset null '(null)'.
numericlocale
Si valeur est prcise, elle doit valoir soit on, soit off afin d'activer ou dsactiver l'affichage d'un caractre dpendant de
la locale pour sparer des groupes de chiffres gauche du sparateur dcimal. Si valeur est omise, la commande bascule
entre la sortie numrique classique et celle spcifique la locale.
pager
Contrle l'utilisation d'un paginateur pour les requtes et les affichages de l'aide de psql. Si la variable d'environnement PAGER est configure, la sortie est envoye via un tube dans le programme spcifi. Sinon, une valeur par dfaut dpendant de
la plateforme (comme more) est utilise.
Quand l'option pager vaut off, le paginateur n'est pas utilis. Quand l'option pager vaut on, et que cela est appropri,
c'est dire quand la sortie est dirige vers an terminal, et ne tient pas dans l'cran, le paginateur est utilis. L'option pager
peut galement tre positionne always, ce qui a pour effet d'utiliser le paginateur pour toutes les sorties terminal, que ces
dernires tiennent ou non dans l'cran. \pset pager sans prciser valeur bascule entre les tats "paginateur activ" et
"paginateur dsactiv".
recordsep
Indique le sparateur d'enregistrement (ligne) utiliser dans le mode d'affichage non align. La valeur par dfaut est un caractre de retour chariot.
tableattr (or T)
Prcise les attributs qui seront placs l'intrieur des balises HTML table tag, dans le format de sortie html. Ceci pourrait
tre par exemple cellpadding ou bgcolor. Notez que vous ne voulez probablement pas spcifier border car c'est pris
en compte par \pset border. Si valeur n'est pas prcise, aucun attribut de table n'est positionn.
title [ texte ]
Initialise le titre de la table pour toutes les tables affiches ensuite. Ceci peut tre utilis pour ajouter des balises de description l'affichage. Si aucun valeur n'est donn, le titre n'est pas initialis.
tuples_only (ou t)
Si valeur est spcifie, elle doit valoir soit on, soit off, ce qui va activer ou dsactiver le mode "tuples seulement". Si valeur est omise, la commande bascule entre la sortie normale et la sortie "tuples seulement". La sortie normale comprend des
informations supplmentaires telles que les enttes de colonnes, les titres, et diffrents pieds. Dans le mode "tuples seulement", seules les donnes de la table sont affiches.
Des exemples d'utilisation de ces diffrents formats sont disponibles dans la section la section intitule Exemples .
Astuce
Il existe plusieurs raccourcis de commandes pour \pset. Voir \a, \C, \H, \t, \T et \x.
1190
psql
Note
C'est une erreur d'appeler \pset sans argument. Dans le futur, cet appel pourrait afficher le statut actuel de
toutes les options d'affichage.
\q ou \quit
Quitte le programme psql. Avec un script, seule l'excution du script est termine.
\qecho texte [ ... ]
Cette commande est identique \echo sauf que les affichages sont crits dans le canal d'affichage des requtes, configur par
\o.
\r
Rinitialise (efface) le tampon de requtes.
\s [ nomfichier ]
Affiche ou sauvegarde l'historique des lignes de commandes dans nomfichier. Si nomfichier est omis, l'historique est
crit sur la sortie standard. Cette option est seulement disponible si psql est configur pour utiliser la bibliothque GNU Readline.
\set [ nom [ valeur [ ... ]]]
Initialise la variable interne nom valeur ou, si plus d'une valeur est donne, la concatnation de toutes les valeurs. Si aucun second argument n'est donn, la variable est simplement initialise sans valeur. Pour dsinitialiser une variable, utilisez la
commande \unset.
Les noms de variables valides peuvent contenir des caractres, chiffres et tirets bas. Voir la section la section intitule
Variables ci-dessous pour les dtails. Les noms des variables sont sensibles la casse.
Bien que vous puissiez configurer toute variable comme vous le souhaitez, psql traite certaines variables de faon spciale.
Elles sont documentes dans la section sur les variables.
Note
Cette commande est totalement spare de la commande SQL SET(7).
\sf[+] description_fonction
Cette commande rcupre et affiche la dfinition d'une fonction sous la forme d'une commande CREATE OR REPLACE
FUNCTION. La dfinition est affiche via le canal de sortie courant, tel que dfini par \o.
La fonction cible peut tre spcifie par son seul nom, ou bien par ses nom et arguments, par exemple, foo(integer,
text). Fournir les types des arguments devient obligatoire si plusieurs fonctions portent le mme nom.
Si + est ajout la commande, les numros de lignes sont affichs, la ligne 1 dbutant partir du corps de la fonction.
\t
Bascule l'affichage des en-ttes de nom de colonne en sortie et celle du bas de page indiquant le nombre de lignes. Cette commande est quivalente \pset tuples_only et est fournie pour en faciliter l'accs.
\T options_table
Spcifie les attributs qui seront placs dans le tag table pour le format de sortie HTML. Cette commande est quivalente
\pset tableattr options_table.
\timing [ on | off ]
Sans paramtre, affiche le temps pris par chaque instruction SQL, en millisecondes, ou arrte cet affichage. Avec paramtre,
force la valeur au paramtre.
\w nomfichier, \w |commande
Place le tampon de requte en cours dans le fichier nomfichier ou l'envoie via un tube la commande Unix commande.
\x
Bascule le mode tendu de formatage en table. C'est quivalent \pset expanded.
\z [ motif ]
Liste les tables, vues et squences avec leur droit d'accs associ. Si un motif est spcifi, seules les tables, vues et squences dont le nom correspond au motif sont listes.
Ceci est un alias pour \dp ( affichage des droits ).
\! [ commande ]
1191
psql
Lance un shell Unix spar ou excute la commande Unix commande. Les arguments ne sont pas interprts, le shell les voit
tel quel.
\?
Affiche l'aide sur les commandes antislash.
motifs
Les diffrentes commandes \d acceptent un paramtre motif pour spcifier le(s) nom(s) d'objet afficher. Dans le cas le plus
simple, un motif est seulement le nom exact de l'objet. Les caractres l'intrieur du motif sont normalement mis en minuscule
comme pour les noms SQL ; par exemple, \dt FOO affichera la table nomme foo. Comme pour les noms SQL, placer des
guillemets doubles autour d'un motif empchera la mise en minuscule. Si vous devez inclure un guillemet double dans un motif,
crivez-le en double en accord avec les rgles sur les identifiants SQL. Par exemple, \dt "FOO""BAR" affichera la table nomme FOO"BAR (et non pas foo"bar). Contrairement aux rgles normales pour les noms SQL, vous pouvez placer des guillemets
doubles simplement autour d'une partie d'un motif, par exemple \dt FOO"FOO"BAR affichera la table nomme fooFOObar.
Lorsque le paramtre motif est compltement absent, la commande \d affiche tous les objets visibles dans le chemin de recherche courant -- cela est quivalent l'utilisation du motif *. (Un objet est dit visible si le schma qui le contient est dans le chemin de recherche et qu'aucun objet de mme type et mme nom n'apparat en priorit dans le chemin de recherche. Cela est quivalent dire que l'objet peut tre rfrenc par son nom sans prciser explicitement le schma.) Pour voir tous les objets de la base
quelle que soit leur visibilit, utilisez le motif *.* .
l'intrieur d'un motif, * correspond toute squence de caractres (et aussi aucun) alors que ? ne correspond qu' un seul caractre. (Cette notation est comparable celle des motifs de nom de fichier Unix.) Par exemple, \dt int* affiche les tables dont
le nom commence avec int. Mais l'intrieur de guillemets doubles, * et ? perdent leurs significations spciales et sont donc
traits directement.
Un motif qui contient un point (.) est interprt comme le motif d'un nom de schma suivi par celui d'un nom d'objet. Par
exemple, \dt foo*.*bar* affiche toutes les tables dont le nom inclut bar et qui sont dans des schmas dont le nom commence avec foo. Sans point, le motif correspond seulement avec les objets qui sont visibles dans le chemin de recherche actuel
des schmas. De nouveau, un point dans des guillemets doubles perd sa signification spciale et est trait directement.
Les utilisateurs avancs peuvent utiliser des expressions rationnelles comme par exemple les classes de caractre ([0-9] pour
tout chiffre). Tous les caractres spciaux d'expression rationnelle fonctionnent de la faon indique dans Section 9.7.3,
Expressions rationnelles POSIX , sauf pour le . qui est pris comme sparateur (voir ci-dessus), l'toile (*) qui est transforme
en l'expression rationnelle .* et ? qui est transforme en ., et $ qui est une correspondance littrale. Vous pouvez muler ces caractres si besoin en crivant ? pour ., (R+|) pour R* et (R|) pour R?. $ n'est pas ncessaire en tant que caractre d'une expression rationnelle car le motif doit correspondre au nom complet, contrairement l'interprtation habituelle des expressions rationnelles (en d'autres termes, $ est ajout automatiquement votre motif). crivez * au dbut et/ou la fin si vous ne souhaitez
pas que le motif soit ancr. Notez qu' l'intrieur de guillemets doubles, tous les caractres spciaux des expressions rationnelles
perdent leur signification spciale et sont traits directement. De plus, ces caractres sont traits littralement dans les motifs des
noms d'oprateurs (par exemple pour l'argument de \do).
Fonctionnalits avances
Variables
psql fournit des fonctionnalits de substitution de variable similaire aux shells de commandes Unix. Les variables sont simplement
des paires nom/valeur o la valeur peut tre toute chane, quel que soit sa longueur. Pour initialiser des variables, utilisez la mtacommande psql \set :
basetest=> \set foo bar
initialise la variable foo avec la valeur bar. Pour rcuprer le contenu de la variable, prcdez le nom avec un caractre deuxpoints. Vous pouvez l'utiliser comme argument de toute commande slash :
basetest=> \echo :foo
bar
Note
Les arguments de \set sont sujets aux mme rgles de substitution que les autres commandes. Du coup, vous pouvez construire des rfrences intressantes comme \set :foo 'quelquechose' et obtenir des liens doux
ou des variables de variables comme, respectivement, Perl ou PHP. Malheureusement (ou heureusement ?), on ne peut rien faire d'utile avec ces constructions. D'un autre ct, \set bar :foo est un moyen parfaitement valide de copier une variable.
1192
psql
Si vous appelez \set sans second argument, la variable est initialise avec une chane vide. Pour dsinitialiser (ou supprimer) une
variable, utilisez la commande \unset.
Les noms de variables internes de psql peuvent tre constitus de lettres, nombres et tirets bas dans n'importe quel ordre et autant
de fois que vous le voulez. Un certain nombre de ces variables sont traites spcialement par psql. Elles indiquent certaines options qui peuvent changer au moment de l'excution en modifiant la valeur de la variable ou reprsentent un certain tat de
l'application. Bien que vous puissiez utiliser ces variables dans n'importe quel but, ce n'est pas recommand car le comportement
du programme pourrait devenir trs rapidement vraiment trange. Par convention, toutes les variables traites spcialement sont
uniquement composes de lettres majuscules (et peut-tre aussi de chiffres et de tirets bas). Pour s'assurer d'une compatibilit
maximum dans le futur, vitez l'utilisation de tels noms de variables pour vos propres besoins. Une liste de toutes les variables
traites spcialement suit.
AUTOCOMMIT
Si actif (on, valeur par dfaut), chaque commande SQL est automatiquement valide si elle se termine avec succs. Pour suspendre la validation dans ce mode, vous devez saisir une commande SQL BEGIN ou START TRANSACTION. Lorsqu'elle
est dsactive (off) ou non initialise, les commandes SQL ne sont plus valides tant que vous ne lancez pas explicitement
COMMIT ou END. Le mode sans autocommit fonctionne en lanant implicitement un BEGIN, juste avant toute commande
qui n'est pas dj dans un bloc de transaction et qui n'est pas elle-mme un BEGIN ou une autre commande de contrle de
transaction, ou une commande qui ne peut pas tre excute l'intrieur d'un bloc de transaction (comme VACUUM).
Note
Dans le mode sans autocommit, vous devez annuler explicitement toute transaction choue en saisissant
ABORT ou ROLLBACK. Gardez aussi en tte que si vous sortez d'une session sans validation, votre travail
est perdu.
Note
Le mode auto-commit est le comportement traditionnel de PostgreSQL alors que le mode sans autocommit
est plus proche des spcifications SQL. Si vous prfrez sans autocommit, vous pouvez le configurer dans le
fichier psqlrc global du systme ou dans votre fichier ~/.psqlrc.
DBNAME
Le nom de la base de donnes laquelle vous tes actuellement connect. Ceci est configur chaque fois que vous vous
connectez une base de donnes (ainsi qu'au lancement du programme) mais peut tre dsinitialis.
ECHO
Si cette variable est initialise all, toutes les lignes saisies au clavier ou provenant d'un script sont crites sur la sortie standard avant d'tre analyses ou excutes. Pour slectionner ce comportement au lancement du programme, utilisez l'option
-a. Si ECHO vaut queries, psql affiche simplement toutes les requtes au moment de leur envoi au serveur. L'option pour
ceci est -e.
ECHO_HIDDEN
Quand cette variable est initialise et qu'une commande antislash est envoye la base de donnes, la requte est d'abord affiche. De cette faon, vous pouvez tudier le fonctionnement interne de PostgreSQL et fournir des fonctionnalits similaires
dans vos propres programmes. (Pour slectionner ce comportement au lancement du programme, utilisez l'option -E.) Si vous
configurez la variable avec la valeur noexec, les requtes sont juste affiches mais ne sont pas rellement envoyes au serveur ni excutes.
ENCODING
Le codage courant du jeu de caractres du client.
FETCH_COUNT
Si cette variable est un entier positif, les rsultats de la requte SELECT sont rcuprs et affichs en groupe de ce nombre de
lignes, plutt que par le comportement par dfaut (rcupration de l'ensemble complet des rsultats avant l'affichage). Du
coup, seule une petite quantit de mmoire est utilise, quelle que soit la taille de l'ensemble des rsultats. Une configuration
entre 100 et 1000 est habituellement utilise lors de l'activation de cette fonctionnalit. Gardez en tte que lors de l'utilisation
de cette fonctionnalit, une requte pourrait chouer aprs avoir affich quelques lignes.
Astuce
Bien que vous puissiez utiliser tout format de sortie avec cette fonctionnalit, le format par dfaut, aligned,
rend mal car chaque groupe de FETCH_COUNT lignes sera format sparment, modifiant ainsi les largeurs de
1193
psql
colonnes suivant les lignes du groupe. Les autres formats d'affichage fonctionnent mieux.
HISTCONTROL
Si cette variable est configure ignorespace, les lignes commenant avec un espace n'entrent pas dans la liste de
l'historique. Si elle est initialise avec la valeur ignoredups, les lignes correspondant aux prcdentes lignes de l'historique
n'entrent pas dans la liste. Une valeur de ignoreboth combine les deux options. Si elle n'est pas initialise ou si elle est
configure avec une autre valeur que celles-ci, toutes les lignes lues dans le mode interactif sont sauvegardes dans la liste de
l'historique.
Note
Cette fonctionnalit a t plagie sur Bash.
HISTFILE
Le nom du fichier utilis pour stocker l'historique. La valeur par dfaut est ~/.psql_history. Par exemple, utiliser :
\set HISTFILE ~/.psql_history- :DBNAME
dans ~/.psqlrc fera que psql maintiendra un historique spar pour chaque base de donnes.
Note
Cette fonctionnalit a t plagie sans honte partir de Bash.
HISTSIZE
Le nombre de commandes stocker dans l'historique des commandes. La valeur par dfaut est 500.
Note
Cette fonctionnalit a t plagie sur Bash.
HOST
L'hte du serveur de la base de donnes o vous tes actuellement connect. Ceci est configur chaque fois que vous vous
connectez une base de donnes (ainsi qu'au lancement du programme) mais peut tre dsinitialis.
IGNOREEOF
Si non initialis, envoyer un caractre EOF (habituellement Ctrl+D) dans une session interactive de psql ferme l'application.
Si elle est configure avec une valeur numrique, ce nombre de caractres EOF est ignor avant la fin de l'application. Si la
variable est configure mais n'a pas de valeur numrique, la valeur par dfaut est de 10.
Note
Cette fonctionnalit a t plagie sur Bash.
LASTOID
La valeur du dernier OID affect, renvoye partir d'une commande INSERT ou lo_import. La validit de cette variable est
seulement garantie jusqu' l'affichage du rsultat de la commande SQL suivante.
ON_ERROR_ROLLBACK
Lorsqu'il est actif (on), si une instruction d'un bloc de transaction gnre une erreur, cette dernire est ignore et la transaction
continue. Lorsqu'il vaut interactive, ces erreurs sont seulement ignores lors des sessions interactives, mais ne le sont
pas lors de la lecture de scripts. Lorsqu'il vaut off (valeur par dfaut), une instruction gnrant une erreur dans un bloc de
transaction annule la transaction complte. Le mode on_error_rollback-on fonctionne en excutant un SAVEPOINT implicite pour vous, juste avant chaque commande se trouvant dans un bloc de transaction et annule jusqu'au dernier point de sauvegarde en cas d'erreur.
ON_ERROR_STOP
Par dfaut, le traitement des commandes continue aprs une erreur. Quand cette variable est positionne, le traitement sera
immdiatement arrt ds la premire erreur rencontre. Dans le mode interactif, psql reviendra l'invite de commande. Sinon psql quittera en renvoyant le code d'erreur 3 pour distinguer ce cas des conditions d'erreurs fatales, qui utilisent le code 1.
Dans tous les cas, tout script en cours d'excution (le script de haut niveau et tout autre script qui pourrait avoir t appel) sera termin immdiatement. Si la chane de commande de haut niveau contient plusieurs commandes SQL, le traitement
s'arrtera la commande en cours.
1194
psql
PORT
Le port du serveur de la base de donnes sur lequel vous tes actuellement connect. Ceci est configur chaque fois que
vous vous connectez une base de donnes (ainsi qu'au lancement du programme) mais peut tre dsinitialis.
PROMPT1, PROMPT2, PROMPT3
Ils spcifient quoi doit ressembler l'invite psql. Voir la section intitule Invite ci-dessous.
QUIET
Cette variable est quivalente l'option -q en ligne de commande. Elle n'est probablement pas trs utile en mode interactif.
SINGLELINE
Cette variable est quivalente l'option -S en ligne de commande.
SINGLESTEP
Cette variable est quivalente l'option -s en ligne de commande.
USER
L'utilisateur de la base de donnes o vous tes actuellement connect. Ceci est configur chaque fois que vous vous
connectez une base de donnes (ainsi qu'au lancement du programme) mais peut tre dsinitialis.
VERBOSITY
Cette variable peut tre configure avec les valeurs default, verbose (bavard) ou terse (succinct) pour contrler la
verbosit des rapports d'erreurs.
Interpolation SQL
Une fonctionnalit utile supplmentaire des variables psql est que vous pouvez les substituer ( interpoler ) dans les instructions
SQL standards. psql offre des fonctionalits spciales pour garantir que les valeurs utilises comme chanes SQL litrales ou
comme identifiants sont correctement chappes. La syntaxe pour interpoler une valeur sans chappement spcial est de nouveau
de prcder le nom de la variable avec un caractre deux-points (:) :
basetest=> \set foo 'ma_table'
basetest=> SELECT * FROM :foo;
envoie alors la requte pour la table ma_table. Notez que cela peut tre dangereux ; la valeur de la variable est copie de faon
litrale, elle peut mme contenir des guillemets non ferms, ou bien des commandes backslash. Vous devez vous assurer que cela
a du sens l'endroit o vous les utilisez.
Lorsqu'une valeur doit tre utilise comme une chane SQL litrale ou un identifiant, il est plus sr de s'arranger pour qu'elle soit
chappe. Afin d'chapper la valeur d'une variable en tant que chane SQL litrale, crivez un caractre deux-points, suivi du nom
de la variable entour par des guillemets simples. Pour chapper la valeur en tant qu'identifiant SQL, crivez un caractre deuxpoints suivi du nom de la valeur entour de guillemets doubles. L'exemple prcdent peut s'crire de faon plus sre ainsi :
testdb=> \set foo 'my_table'
testdb=> SELECT * FROM :"foo";
L'interpolation de variable n'est pas effectue dans les entits SQL entoures de guillemets. SQL
Une utilisation possible de ce mcanisme est de copier le contenu d'un fichier dans une colonne d'une table. Tout d'abord, chargez
le fichier dans une variable puis procdez ainsi :
basetest=> \set contenu `cat mon_fichier.txt`
basetest=> INSERT INTO ma_table VALUES (:'contenu');
(Notez que cela ne fonctionnera par si le fichier mon_fichier.txt contient des octets nuls. psql ne gre pas les octets nuls inclus dans les valeurs de variable.)
Comme les caractres deux-points peuvent lgitimement apparatre dans les commandes SQL, une tentative apparente
d'interpolation (comme :nom, :'nom', or :"nom") n'est pas modifie, sauf si la variable nomme est actuellement positionne.
Dans tous les cas, vous pouvez chapper un caractre deux-points avec un backslash pour le protger des substitutions. (La syntaxe deux-points pour les variables est du SQL standard pour les langages de requte embarqus, comme ECPG. La syntaxe avec
les deux-points pour les tranches de tableau et les conversions de types sont des extensions PostgreSQL extensions, d'o le
conflit. La syntaxe avec le caractre deux-points pour chapper la valeur d'une variable en tant que chane SQL litrale ou identifiant est une extension psql .)
Invite
Les invites psql peuvent tre personnalises suivant vos prfrences. Les trois variables PROMPT1, PROMPT2 et PROMPT3
contiennent des chanes et des squences d'chappement spciales dcrivant l'apparence de l'invite. L'invite 1 est l'invite normale
1195
psql
qui est lance quand psql rclame une nouvelle commande. L'invite 2 est lance lorsqu'une saisie supplmentaire est attendue lors
de la saisie de la commande parce que la commande n'a pas t termine avec un point-virgule ou parce qu'un guillemet n'a pas t
ferm. L'invite 3 est lance lorsque vous excutez une commande SQL COPY et que vous devez saisir les valeurs des lignes sur le
terminal.
La valeur de la variable prompt slectionne est affiche littralement sauf si un signe pourcentage (%) est rencontr. Suivant le
prochain caractre, certains autres textes sont substitus. Les substitutions dfinies sont :
%M
Le nom complet de l'hte (avec le nom du domaine) du serveur de la base de donnes ou [local] si la connexion est tablie
via une socket de domaine Unix ou [local:/rpertoire/nom], si la socket de domaine Unix n'est pas dans
l'emplacement par dfaut dfini la compilation.
%m
Le nom de l'hte du serveur de la base de donnes, tronqu au premier point ou [local] si la connexion se fait via une socket de domaine Unix.
%>
Le numro de port sur lequel le serveur de la base de donnes coute.
%n
Le nom d'utilisateur de la session. (L'expansion de cette valeur peut changer pendant une session aprs une commande SET
SESSION AUTHORIZATION.)
%/
Le nom de la base de donnes courante.
%~
Comme %/ mais l'affichage est un ~ (tilde) si la base de donnes est votre base de donnes par dfaut.
%#
Si l'utilisateur de la session est un superutilisateur, alors un # sinon un >. (L'expansion de cette valeur peut changer durant une
session aprs une commande SET SESSION AUTHORIZATION.)
%R
Pour l'invite 1, affiche normalement = mais affiche ^ si on est en mode simple ligne et ! si la session est dconnecte de la
base de donnes (ce qui peut arriver si \connect choue). Pour l'invite 2, la squence est remplace par -, *, un simple guillemet, un double ou un signe dollar, suivant si psql attend une saisie supplmentaire parce que la commande n'est pas termine,
parce que vous tes l'intrieur d'un commentaire /* ... */, ou parce que vous n'avez pas termin un guillemet ou une
chane chappe avec des dollars. Pour l'invite 3, la squence ne produit rien.
%x
tat de la Transaction : une chane vide lorsque vous n'tes pas dans un bloc de transaction ou * si vous vous y trouvez, ou !
si vous tes dans une transaction choue, ou enfin ? lorsque l'tat de la transaction est indtermin (par exemple cause
d'une rupture de la connexion).
%chiffres
Le caractre avec ce code numrique est substitu.
%:nom:
La valeur de la variable nom de psql. Voir la section la section intitule Variables pour les dtails.
%`commande`
la sortie de la commande, similaire la substitution par guillemets inverse classique.
%[ ... %]
Les invites peuvent contenir des caractres de contrle du terminal qui, par exemple, modifient la couleur, le fond ou le style
du texte de l'invite, ou modifient le titre de la fentre du terminal. Pour que les fonctionnalits d'dition de ligne de Readline
fonctionnent correctement, les caractres de contrle non affichables doivent tre indiqus comme invisibles en les entourant
avec %[ et %]. Des pairs multiples de ceux-ci pourraient survenir l'intrieur de l'invite. Par exemple :
basetest=> \set PROMPT1 '%[%033[1;33;40m%]%n@%/%R%[%033[0m%]%# '
a pour rsultat une invite en gras (1;), jaune sur noir (33;40) sur les terminaux compatibles VT100.
Pour insrer un pourcentage dans votre invite, crivez %%. Les invites par dfaut sont '%/%R%# ' pour les invites 1 et 2 et '>>
' pour l'invite 3.
Note
1196
psql
psql supporte la bibliothque Readline pour une dition et une recherche simplifie et conviviale de la ligne de commande.
L'historique des commandes est automatiquement sauvegard lorsque psql quitte et est recharg quand psql est lanc. La compltion par tabulation est aussi supporte bien que la logique de compltion n'ait pas la prtention d'tre un analyseur SQL. Si pour
quelques raisons que ce soit, vous n'aimez pas la compltion par tabulation, vous pouvez la dsactiver en plaant ceci dans un fichier nomm .inputrc de votre rpertoire personnel :
$if psql
set disable-completion on
$endif
(Ceci n'est pas une fonctionnalit psql mais Readline. Lisez sa documentation pour plus de dtails.)
Environnement
COLUMNS
Si \pset columns vaut zro, contrle la largeur pour le format wrapped et la largeur pour dterminer si une sortie large
a besoin du pager.
PAGER
Si les rsultats d'une requte ne tiennent pas sur l'cran, ils sont envoys via un tube sur cette commande. Les valeurs typiques
sont more ou less. La valeur par dfaut dpend de la plateforme. L'utilisation du paginateur peut tre dsactive en utilisant
la commande \pset.
PGDATABASE, PGHOST, PGPORT, PGUSER
Paramtres de connexion par dfaut (voir Section 31.13, Variables d'environnement ).
PSQL_EDITOR, EDITOR, VISUAL
diteur utilis par les commandes \e et \ef. Les variables sont examines dans l'ordre donn ; la premire initialise est utilise.
Les diteurs intgrs par dfaut sont vi sur les systmes Unix et notepad.exe sur les systmes Windows.
PSQL_EDITOR_LINENUMBER_ARG
Lorsque les commandes \e ou \ef sont utilises avec un argument spcifiant le numro de ligne, cette variable doit indiquer
l'argument en ligne de commande fournir l'diteur de texte. Pour les diteurs les plus courants, tels qu'emacs ou vi,
vous pouvez simplement initialiser cette variable avec le signe +. Il faut inclure le caractre d'espacement en fin de la valeur
de la variable si la syntaxe de l'diteur ncessite un espace entre l'option spcifier et le numro de ligne. Par exemple :
PSQL_EDITOR_LINENUMBER_ARG='+'
PSQL_EDITOR_LINENUMBER_ARG='--line '
La valeur par dfaut est + sur les systmes Unix (ce qui correspond la bonne configuration pour l'diteur par dfaut, vi, et
est utilisable gnralement avec la plupart des diteurs courants) ; par contre, il n'y a pas de valeur par dfaut pour les systmes Windows.
SHELL
Commande excute par la commande \!.
TMPDIR
Rpertoire pour stocker des fichiers temporaires. La valeur par dfaut est /tmp.
Cet outil, comme la plupart des autres outils PostgreSQL, utilise aussi les variables d'environnement supportes par la bibliothque libpq (voir Section 31.13, Variables d'environnement ).
Fichiers
Sauf si une option -X ou -c est fournie, psql tente de lire et excuter les commandes provenant du fichier global au systme
psqlrc ou du fichier utilisateur ~/.psqlrc avant de dmarrer. (Sur Windows, le fichier de dmarrage de l'utilisateur est
nomm %APPDATA%\postgresql\psqlrc.conf.) Voir PREFIX/share/psqlrc.sample pour plus
d'informations sur la configuration du fichier global au systme. Il pourrait tre utilis pour configurer le client et le serveur
votre got (en utilisant les commandes \set et SET).
1197
psql
la fois le fichier psqlrc global au systme et le fichier ~/.psqlrc de l'utilisateur peuvent tre crs en tant spcifiques
une version si vous leur ajouter un tiret et le numro de version de ~/.psqlrc-9.1.14. Un fichier correspondant une
version spcifique est prfr un fichier sans indication de version.
Notes
Dans une vie prcdente, psql permettait au premier argument d'une commande antislash une seule lettre de commencer directement aprs la commande, sans espace sparateur. partir de PostgreSQL 8.4, ce n'est plus autoris.
Le fonctionnement de psql n'est garanti qu'avec des serveurs de mme version. Cela ne signifie pas que d'autres combinaisons
vont compltement chouer, mais des problmes subtils, voire moins subtils, pourraient apparatre. Les mta-commandes sont
particulirements fragiles si le serveur est d'une version plus rcente que psql lui-mme. Toutefois, les commandes backslash
de la famille \d devraient fonctionner avec des serveurs 7.4 jusqu' la version courante, mme si pas ncessairement avec des
serveurs plus rcents que psql lui-mme.
Configurez la page code en saisissant cmd.exe /c chcp 1252. (1252 est une page code approprie pour l'Allemagne ;
remplacez-la par votre valeur.) Si vous utilisez Cygwin, vous pouvez placer cette commande dans /etc/profile.
Configurez la police de la console par Lucida Console parce que la police raster ne fonctionne pas avec la page de code
ANSI.
Exemples
Le premier exemple montre comment envoyer une commande sur plusieurs lignes d'entre. Notez le changement de l'invite :
basetest=> CREATE TABLE ma_table (
basetest(> premier integer not NULL default 0,
basetest(> second text)
basetest-> ;
CREATE TABLE
Maintenant, regardons la dfinition de la table :
basetest=> \d ma_table
Table "ma_table"
Attribute | Type
|
Modifier
-----------+---------+-------------------premier
| integer | not null default 0
second
| text
|
Maintenant, changeons l'invite par quelque chose de plus intressant :
basetest=> \set PROMPT1 '%n@%m %~%R%# '
peter@localhost basetest=>
Supposons que nous avons rempli la table de donnes et que nous voulons les regarder :
peter@localhost basetest=> SELECT * FROM ma_table;
premier | second
---------+-------1 | one
2 | two
3 | three
4 | four
(4 rows)
1198
psql
Vous pouvez afficher cette table de faon diffrente en utilisant la commande \pset :
peter@localhost basetest=> \pset border 2
Border style is 2.
peter@localhost basetest=> SELECT * FROM ma_table;
+---------+--------+
| premier | second |
+---------+--------+
|
1 | one
|
|
2 | two
|
|
3 | three |
|
4 | four
|
+---------+--------+
(4 rows)
peter@localhost basetest=> \pset border 0
Border style is 0.
peter@localhost basetest=> SELECT * FROM ma_table;
premier second
------- -----1 one
2 two
3 three
4 four
(4 rows)
peter@localhost basetest=> \pset border 1
Border style is 1.
peter@localhost basetest=> \pset format unaligned
Output format is unaligned.
peter@localhost basetest=> \pset fieldsep ","
Field separator is ",".
peter@localhost basetest=> \pset tuples_only
Showing only tuples.
peter@localhost basetest=> SELECT second, first FROM
ma_table;
one,1
two,2
three,3
four,4
Vous pouvez aussi utiliser les commandes courtes :
peter@localhost basetest=> \a \t \x
Output format is aligned.
Tuples only is off.
Expanded display is on.
peter@localhost basetest=> SELECT * FROM ma_table;
-[ RECORD 1 ]first | 1
second | one
-[ RECORD 2 ]first | 2
second | two
-[ RECORD 3 ]first | 3
second | three
-[ RECORD 4 ]first | 4
second | four
1199
Nom
reindexdb reindexe une base de donnes PostgreSQL
Synopsis
reindexdb [option-connexion...] [--table | -t table ] [--index | -i index ] [nombase]
reindexdb [option-connexion...] [--all | -a]
reindexdb [option-connexion...] [--system | -s] [nombase]
Description
reindexdb permet de reconstruire les index d'une base de donnes PostgreSQL.
reindexdb est un enrobage de la commande REINDEX(7). Il n'y a pas de diffrence entre la rindexation des bases de donnes
par cette mthode et par celles utilisant d'autres mthodes d'accs au serveur.
Options
reindexdb accepte les arguments suivants en ligne de commande :
-a, --all
Rindexe toutes les bases de donnes.
[-d] base, [--dbname=]base
Spcifie le nom de la base rindexer. Si cette option n'est pas prsente et que l'option -a (ou --all) n'est pas utilise, le
nom de la base est lu partir de la variable d'environnement PGDATABASE. Si elle n'est pas configure, le nom de
l'utilisateur pour la connexion est utili.
-e, --echo
Affiche les commandes que reindexdb gnre et envoie au serveur.
-i index, --index=index
Ne recre que l'index index.
-q, --quiet
N'affiche pas la progression.
-s, --system
Rindexe les catalogues systme de la base de donnes.
-t table, --table=table
Ne rindexe que la table table.
-V, --version
Affiche la version de reindexdb, puis quitte.
-?, --help
Affiche l'aide sur les arguments en ligne de commande de reindexdb, puis quitte.
reindexdb accepte aussi les arguments suivants en ligne de commande pour les paramtres de connexion :
-h hte, --host=hte
Prcise le nom d'hte de la machine hbergeant le serveur. Si cette valeur dbute par une barre oblique ('/' ou slash), elle est
utilise comme rpertoire de socket UNIX.
-p port, --port=port
Prcise le port TCP ou le fichier de socket UNIX d'coute.
-U nom_utilisateur, --username=nom_utilisateur
Nom de l'utilisateur utiliser pour la connexion.
-w, --no-password
Ne demande jamais un mot de passe. Si le serveur en rclame un pour l'authentification et qu'un mot de passe n'est pas disponible d'une autre faon (par exemple avec le fichier .pgpass), la tentative de connexion chouera. Cette option peut
tre utile pour les scripts o aucun utilisateur n'est prsent pour saisir un mot de passe.
1200
reindexdb
-W, --password
Force reindexdb demander un mot de passe avant la connexion une base de donnes.
Cette option n'est jamais obligatoire car reindexdb demandera automatiquement un mot de passe si le serveur exige une authentification par mot de passe. Nanmoins, reindexdb perdra une tentative de connexion pour trouver que le serveur veut un
mot de passe. Dans certains cas, il est prfrable d'ajouter l'option -W pour viter la tentative de connexion.
Environnement
PGDATABASE, PGHOST, PGPORT, PGUSER
Paramtres par dfaut pour la connexion
Cet outil, comme la plupart des autres outils PostgreSQL, utilise aussi les variables d'environnement supportes par la bibliothque libpq (voir Section 31.13, Variables d'environnement ).
Diagnostiques
En cas de difficults, il peut tre utile de consulter REINDEX(7) et psql(1), sections prsentant les problmes ventuels et les messages d'erreur.
Le serveur de base de donnes doit fonctionner sur le serveur cible. Les paramtres de connexion ventuels et les variables
d'environnement utiliss par la bibliothque cliente libpq s'appliquent.
Notes
reindexdb peut avoir besoin de se connecter plusieurs fois au serveur PostgreSQL. Afin d'viter de saisir le mot de passe
chaque fois, on peut utiliser un fichier ~/.pgpass. Voir Section 31.14, Fichier de mots de passe pour plus d'informations.
Exemples
Pour rindexer la base de donnes test :
$ reindexdb test
Pour rindexer la table foo et l'index bar dans une base de donnes nomme abcd :
$ reindexdb --table foo --index bar abcd
Voir aussi
REINDEX(7)
1201
Nom
vacuumdb rcupre l'espace inutilis et, optionnellement, analyse une base de donnes PostgreSQL
Synopsis
vacuumdb [option-de-connexion...] [[--full] | [-f]] [[--freeze] | [-F]] [[--verbose] | [-v]] [[--analyze] | [-z]]
[[--analyze-only] | [-Z]] [--table | -t table [( colonne [,...] )] ] [base-de-donnees]
vacuumdb [options-de-connexion...] [[--full] | [-f]] [[--freeze] | [-F]] [[--verbose] | [-v]] [[--analyze] | [-z]]
[[--analyze-only] | [-Z]] [[--all] | [-a]]
Description
vacuumdb est un outil de nettoyage d'une base de donnes. vacuumdb peut galement engendrer des statistiques internes utilises par l'optimiseur de requtes de PostgreSQL.
vacuumdb est une surcouche de la commande VACUUM(7). Il n'y a pas de diffrence relle entre excuter des VACUUM et
des ANALYZE sur les bases de donnes via cet outil et via d'autres mthodes pour accder au serveur.
Options
vacuumdb accepte les arguments suivants sur la ligne de commande :
-a, --all
Nettoie toutes les bases de donnes.
[-d] base-de-donnees, [--dbname=]base-de-donnees
Indique le nom de la base de donnes nettoyer ou analyser. Si aucun nom n'est pas prcis et si -a (ou --all) n'est pas
utilis, le nom de la base de donnes est rcupr dans la variable d'environnement PGDATABASE. Si cette variable n'est
pas initialise, c'est le nom d'utilisateur prcis pour la connexion qui est utilis.
-e, --echo
Affiche les commandes que vacuumdb engendre et envoie au serveur.
-f, --full
Excute un nettoyage complet .
-F, --freeze
Gle agressivement les lignes.
-q, --quiet
N'affiche pas de message de progression.
-t table [ (colonne [,...]) ], --table=table [ (colonne [,...]) ]
Ne nettoie ou n'analyse que la table table. Des noms de colonnes peuvent tre prciss en conjonction avec les options -analyze ou --analyze-only.
Astuce
Lorsque des colonnes sont indiques, il peut tre ncessaire d'chapper les parenthses. (Voir les exemples
plus bas.)
-v, --verbose
Affiche des informations dtailles durant le traitement.
-V, --version
Affiche la version de vacuumdb, puis quitte.
-z, --analyze
Calcule aussi les statistiques utilises par le planificateur.
-Z, --analyze-only
Calcule seulement les statistiques utilises par le planificateur (donc pas de VACUUM).
-?, --help
Affiche l'aide sur les arguments en ligne de commande de vacuumdb, puis quitte.
1202
vacuumdb
Environnement
PGDATABASE, PGHOST, PGPORT, PGUSER
Paramtres de connexion par dfaut.
Cet outil, comme la plupart des autres outils PostgreSQL, utilise aussi les variables d'environnement supportes par la bibliothque libpq (voir Section 31.13, Variables d'environnement ).
Diagnostiques
En cas de difficults, il peut tre utile de consulter VACUUM(7) et psql(1), sections prsentant les problmes ventuels et les messages d'erreur.
Le serveur de base de donnes doit fonctionner sur le serveur cible. Les paramtres de connexion ventuels et les variables
d'environnement utiliss par la bibliothque cliente libpq s'appliquent.
Notes
vacuumdb peut avoir besoin de se connecter plusieurs fois au serveur PostgreSQL. Afin d'viter de saisir le mot de passe
chaque fois, on peut utiliser un fichier ~/.pgpass. Voir Section 31.14, Fichier de mots de passe pour plus d'informations.
Exemples
Pour nettoyer la base de donnes test :
$ vacuumdb test
Pour nettoyer et analyser une base de donnes nomme grossebase :
$ vacuumdb --analyze grossebase
Pour nettoyer la seule table foo dans une base de donnes nomme xyzzy et analyser la seule colonne bar de la table :
$ vacuumdb --analyze --verbose --table 'foo(bar)' xyzzy
Voir aussi
VACUUM(7)
1203
1204
Nom
initdb Crer un nouveau cluster
Synopsis
initdb [option...] [--pgdata] | [-D ]rpertoire
Description
initdb cre une nouvelle grappe de bases de donnes, ou cluster , PostgreSQL. Un cluster est un ensemble de bases de
donnes gres par une mme instance du serveur.
Crer un cluster consiste :
crer les rpertoires dans lesquels sont stockes les donnes de la base ;
crer les tables partages du catalogue (tables partages par tout le cluster) ;
Lors de la cration ultrieure d'une base de donnes, tout ce qui se trouve dans la base template1 est copi. (Ce qui implique
que tout ce qui est install dans template1 est automatiquement copi dans chaque base de donnes cre par la suite.) La
base de donnes postgres est une base de donnes par dfaut destination des utilisateurs, des outils et des applications tiers.
initdb tente de crer le rpertoire de donnes indiqu. Il se peut que la commande n'est pas les droits ncessaires si le rpertoire
parent du rpertoire de donnes indiqu est possd par root. Dans ce cas, pour russir l'initialisation, il faut crer un rpertoire
de donnes vide en tant que root, puis utiliser chown pour en donner la possession au compte utilisateur de la base de donnes.
su peut alors tre utilis pour prendre l'identit de l'utilisateur de la base de donnes et excuter initdb.
initdb doit tre excut par l'utilisateur propritaire du processus serveur parce que le serveur doit avoir accs aux fichiers et rpertoires crs par initdb. Comme le serveur ne peut pas tre excut en tant que root, il est impratif de ne pas lancer initdb en
tant que root. (En fait, initdb refuse de se lancer dans ces conditions.)
initdb initialise la locale et l'encodage de jeu de caractres par dfaut du cluster. L'encodage du jeu de caractres, l'ordre de tri
(LC_COLLATE) et les classes d'ensembles de caractres (LC_CTYPE, c'est--dire majuscule, minuscule, chiffre) peuvent tre
configurs sparment pour chaque base de donnes sa cration. initdb dtermine ces paramtres partir de la base de donnes template1 qui servira de valeur par dfaut pour toutes les autres bases de donnes.
Pour modifier l'ordre de tri ou les classes de jeu de caractres par dfaut, utilisez les options --lc-collate et
--lc-ctype. Les ordres de tri autres que C et POSIX ont aussi un cot en terme de performance. Pour ces raisons, il est important de choisir la bonne locale lors de l'excution d'initdb.
Les catgories de locale restantes peuvent tre modifies plus tard, lors du dmarrage du serveur. Vous pouvez aussi utiliser -locale pour configurer les valeurs par dfaut de toutes les catgories de locale, ceci incluant l'ordre de tri et les classes de
jeu de caractres. Toutes les valeurs de locale ct serveur (lc_*) peuvent tre affiches via la commande SHOW ALL. Il y a
plus d'informations sur ce point sur Section 22.1, Support des locales .
Pour modifier l'encodage par dfaut, utilisez l'option --encoding. Section 22.3, Support des jeux de caractres propose
plus d'options.
Options
-A mthode_auth, --auth=mthode_auth
Prcise la mthode d'authentification utilise dans pg_hba.conf pour les utilisateurs locaux. trust ne doit tre utilis
que lorsque tous les utilisateurs locaux du systme sont dignes de confiance. Pour faciliter l'installation, trust est la valeur par dfaut.
-D rpertoire, --pgdata=rpertoire
Indique le rpertoire de stockage de la grappe de bases de donnes. C'est la seule information requise par initdb. Il est possible d'viter de prciser cette option en configurant la variable d'environnement PGDATA. Cela permet, de plus, au serveur
de bases de donnes (postgres) de trouver le rpertoire par cette mme variable.
-E codage, --encoding=codage
Dfinit l'encodage de la base de donnes modle (template). C'est galement l'encodage par dfaut des bases de donnes
cres ultrieurement. Cette valeur peut toutefois tre surcharge. La valeur par dfaut est dduite de la locale. Dans le cas
1205
initdb
o cela n'est pas possible, SQL_ASCII est utilis. Les jeux de caractres supports par le serveur PostgreSQL sont dcrits
dans Section 22.3.1, Jeux de caractres supports .
--locale=locale
Configure la locale par dfaut pour le cluster. Si cette option n'est pas prcise, la locale est hrite de l'environnement
d'excution d'initdb. Le support des locales est dcrit dans Section 22.1, Support des locales .
--lc-collate=locale, --lc-ctype=locale, --lc-messages=locale, --lc-monetary=locale,
-lc-numeric=locale, --lc-time=locale
Mme principe que --locale, mais seule la locale de la catgorie considre est configure.
--no-locale
quivalent --locale=C.
--pwfile=nomfichier
Incite initdb lire le mot de passe du superutilisateur partir d'un fichier. La premire ligne du fichier est utilise comme mot
de passe.
-U nomutilisateur, --username=nomutilisateur
Prcise le nom de l'utilisateur dfini comme superutilisateur de la base de donnes. Par dfaut, c'est le nom de l'utilisateur qui
lance initdb. Le nom du superutilisateur importe peu, mais postgres peut tre conserv, mme si le nom de l'utilisateur
systme diffre.
-W, --pwprompt
Force initdb demander un mot de passe pour le superutilisateur de la base de donnes. Cela n'a pas d'importance lorsqu'aucune authentification par mot de passe n'est envisage. Dans le cas contraire, l'authentification par mot de passe n'est pas
utilisable tant qu'un mot de passe pour le superutilisateur n'est pas dfini.
-X rpertoire, --xlogdir=rpertoire
Dfinit le rpertoire de stockage des journaux de transaction.
--text-search-config=CFG
Slectionne la configuration par dfaut de la recherche plein texte. Voir default_text_search_config pour plus d'informations.
D'autres paramtres, moins utiliss, sont disponibles :
-d, --debug
Affiche les informations de dbogage du processus amorce et quelques autres messages de moindre intrt pour le grand public. Le processus amorce est le programme qu'initdb lance pour crer les tables catalogues. Cette option engendre une quantit considrable de messages ennuyeux.
-L rpertoire
Indique initdb o trouver les fichiers d'entre ncessaires l'initialisation du cluster. En temps normal, cela n'est pas ncessaire. Un message est affich lorsque leur emplacement doit tre indiqu de manire explicite.
-n, --noclean
Par dfaut, lorsqu'initdb rencontre une erreur qui l'empche de finaliser la cration du cluster, le programme supprime tous
les fichiers crs avant l'erreur. Cette option dsactive le nettoyage. Elle est utile pour le dbogage.
-V, --version
Affiche la version de initdb puis quitte.
-?, --help
Affiche l'aide sur les arguments en ligne de commande de initdb, puis quitte
Environnement
PGDATA
Indique le rpertoire de stockage de la grappe de bases de donnes ; peut tre surcharg avec l'option -D.
Cet outil, comme la plupart des autres outils PostgreSQL, utilise aussi les variables d'environnement supportes par la bibliothque libpq (voir Section 31.13, Variables d'environnement ).
Notes
initdb peut aussi tre appel avec pg_ctl initdb.
1206
initdb
Voir aussi
postgres(1)
1207
Nom
pg_controldata afficher les informations de contrle d'un groupe de bases de donnes PostgreSQL
Synopsis
pg_controldata [option] [rpertoire_donnes]
Description
pg_controldata affiche les informations initialises lors d'initdb, telles que la version du catalogue. Il affiche aussi des informations sur le traitement des WAL et des points de vrification. Cette information, qui porte sur le groupe complet, n'est pas spcifique une base de donnes.
Cet outil ne peut tre lanc que par l'utilisateur qui a initialis le groupe. Il est, en effet, ncessaire d'avoir le droit de lire le rpertoire des donnes. Le rpertoire des donnes peut tre spcicif sur la ligne de commande ou l'aide de la variable
d'environnement PGDATA. Cet outil accepte les options -V et --version, qui affiche la version de pg_controldata puis arrte
l'application. Il accepte aussi les options -? et --help, qui affichent les arguments accepts.
Environnement
PGDATA
Emplacement du rpertoire de donnes par dfaut
1208
Nom
pg_ctl initialiser, dmarrer, arrter ou contrler le serveur PostgreSQL
Synopsis
pg_ctl init[db] [-s] [-D rpertoire_donnes] [-o options-initdb]
pg_ctl start [-w] [-t secondes] [-s] [-D rpertoire_donnes] [-l nomfichier] [-o options] [-p chemin] [-c]
pg_ctl stop [-W] [-t secondes] [-s] [-D rpertoire_donnes] [-m [s[mart]] | [f[ast]] | [i[mmediate]] ]
pg_ctl restart [-w] [-t secondes] [-s] [-D rpertoire_donnes] [-c] [-m [s[mart]] | [f[ast]] | [i[mmediate]] ] [-o options]
pg_ctl reload [-D rpertoire_donnes]
pg_ctl status [-s] [-D rpertoire_donnes]
pg_ctl promote [-s] [-D rpertoire_donnes]
pg_ctl kill nom_signal id_processus
pg_ctl register [-N nom_service] [-U nom_utilisateur] [-P mot_de_passe] [-D rpertoire_donnes] [-S
[a[uto]] | [d[emand]] ] [-w] [-t secondes] [-s] [-o options]
pg_ctl unregister [-N nom_service]
Description
pg_ctl est un outil qui permet d'initialiser une instance, de dmarrer, d'arrter, ou de redmarrer un serveur PostgreSQL
(postgres(1)). Il permet galement d'afficher le statut d'un serveur en cours d'excution.
Bien que le serveur puisse tre dmarr manuellement, pg_ctl encapsule les tches comme la redirection des traces ou le dtachement du terminal et du groupe de processus. Il fournit galement des options intressantes pour contrler l'arrt.
Le mode init ou initdb cre une nouvelle grappe PostgreSQL. Une grappe est un ensemble de bases contrles par une
mme instance du serveur. Ce mode invoque la commande initdb. Voir initdb(1) pour les dtails.
En mode start, un nouveau serveur est dmarr. Le serveur est dmarr en tche de fond et l'entre standard est attache /
dev/null (or nul on Windows). On Unix-like systems, by default, the server's standard output and standard error are send to
pg_ctl's standard output (not standard error). The standard output of pg_ctl should then be redirected to a file or piped to another
process such as a log rotating program like rotatelogs; otherwise postgres will write its output to the controlling terminal (from
the background) and will not leave the shell's process group. On Windows, by default the server's standard output and standard
error are sent to the terminal. These default behaviors can be changed by using -l to append server output to a log file.
L'utilisation de l'option -l ou d'une redirection de la sortie est recommande.
En mode stop, le serveur en cours d'excution dans le rpertoire indiqu est arrt. Trois mthodes diffrentes d'arrt peuvent
tre choisies avec l'option -m : le mode smart (la valeur par dfaut) attend la fin de la sauvegarde en ligne (PITR) et la dconnexion de tous les clients. C'est la valeur par dfaut. Si le serveur est en mode hot standby, la rcupration et la rplication en
continu sont arrtes ds que tous les clients se sont dconnects. Le mode fast n'attend pas la dconnexion des clients et
stoppe la sauvegarde en ligne (PITR). Toutes les transactions actives sont annules et les clients sont dconnects. Le serveur est
ensuite arrt. Le mode immediate tue tous les processus serveur immdiatement, sans leur laisser la possibilit de s'arrter
proprement. Cela conduit une rcupration au redmarrage.
Le mode restart excute un arrt suivi d'un dmarrage. Ceci permet de modifier les options en ligne de commande de
postgres.
Le mode reload envoie simplement au processus postgres un signal SIGHUP. Le processus relit alors ses fichiers de configuration (postgresql.conf, pg_hba.conf, etc.). Cela permet de modifier les options des fichiers de configuration qui ne
requirent pas un redmarrage complet pour tre prises en compte.
Le mode status vrifie si un serveur est toujours en cours d'excution sur le rpertoire de donnes indiqu. Si c'est le cas, le
PID et les options en ligne de commande utilises lors de son dmarrage sont affichs.
Dans le mode promote, le serveur en attente, fonctionnant partir du rpertoire de donnes spcifie, sort de la restauration et
commence oprer en mode lecture/criture.
Le mode kill permet d'envoyer un signal un processus spcifique. Ceci est particulirement utile pour Microsoft
Windows, qui ne possde pas de commande kill. --help permet d'afficher la liste des noms de signaux supports.
1209
pg_ctl
Le mode register permet d'enregistrer un service systme sur Microsoft Windows. L'option -S permet la slection du type
de dmarrage du service, soit auto (lance le service automatiquement lors du dmarrage du serveur) soit demand (lance le
service la demande).
Le mode unregister permet, sur Microsoft Windows, d'annuler un service systme. Ceci annule les effets de la commande
register.
Options
-c
Tente d'autoriser la cration de fichiers core suite un arrt brutal du serveur, sur les plateformes o cette fonctionnalit est
disponible, en augmentant la limite logicielle qui en dpend. C'est utile pour le dboguage et pour diagnostiquer des problmes en permettant la rcupration d'une trace de la pile d'un processus serveur en chec.
-D rpertoire_donnes
Indique l'emplacement des fichiers de la base de donnes sur le systme de fichiers. Si cette option est omise, la variable
d'environnement PGDATA est utilise.
-l nomfichier
Ajoute la sortie des traces du serveur dans nomfichier. Si le fichier n'existe pas, il est cr. L'umask est configur 077,
donc l'accs au journal des traces est, par dfaut, interdit aux autres utilisateurs.
-m mode
Prcise le mode d'arrt. mode peut tre smart, fast ou immediate, ou la premire lettre d'un de ces trois mots. En cas
d'omission, smart est utilis.
-o options
Indique les options passer directement la commande postgres.
Les options doivent habituellement tre entoures de guillemets simples ou doubles pour s'assurer qu'elles soient bien passes
comme un groupe.
-o options-initdb
Spcifie les options passer directement la commande initdb.
Ces options sont habituellement entoures par des guillemets simples ou doubles pour s'assurer qu'elles soient passes groupes.
-p chemin
Indique l'emplacement de l'excutable postgres. Par dfaut, l'excutable postgres est pris partir du mme rpertoire
que pg_ctl ou, si cela choue, partir du rpertoire d'installation cod en dur. Il n'est pas ncessaire d'utiliser cette option sauf
cas inhabituel, comme lorsque des erreurs concernant l'impossibilit de trouver l'excutable postgres apparaissent.
Dans le mode init, cette option indique de manire analogue la localisation de l'excutable initdb.
-s
Affichage des seules erreurs, pas de messages d'information.
-t
Le nombre maximum de secondes attendre pour la fin du lancement ou de l'arrt.
-w
Attendre que le dmarrage ou l'arrt se termine. Attendre est l'option par dfaut pour les arrts, mais pas pour les dmarrages.
Lors d'une attente d'un dmarrage, pg_ctl tente plusieurs fois de se connecter au serveur. Lors d'une attente d'un arrt, pg_ctl
attend que le serveur supprime le fichier PID. pg_ctl renvoie un code d'erreur bas sur le succs du dmarrage ou de l'arrt.
-W
Ne pas attendre la fin du dmarrage ou de l'arrt. C'est la valeur par dfaut pour les dmarrages et redmarrages.
Options Windows
-N nom_service
Nom du service systme enregistrer. Le nom est utilis la fois comme nom de service et comme nom affich.
-P mot_de_passe
Mot de passe de l'utilisateur qui dmarre le service.
-S start-type
1210
pg_ctl
Type de dmarrage du service systme enregistrer. start-type peut valoir auto ou demand ou la premire lettre de ces deux
possibilits. Si ce paramtre est omis, la valeur par dfaut est auto.
-U nom_utilisateur
Nom de l'utilisateur qui dmarre le service. Pour les utilisateurs identifis sur un domaine, on utilise le format DOMAIN\nom_utilisateur.
Environnement
PGDATA
Emplacement par dfaut du rpertoire des donnes.
pg_ctl, comme la plupart des autres outils PostgreSQL, utilise aussi les variables d'environnement supportes par la bibliothque libpq (voir Section 31.13, Variables d'environnement ). Pour des variables serveurs supplmentaires, voir postgres(1).
Fichiers
postmaster.pid
Ce fichier, situ dans le rpertoire des donnes, est utilis pour aider pg_ctl dterminer si le serveur est actuellement en
cours d'excution.
postmaster.opts
Si ce fichier existe dans le rpertoire des donnes, pg_ctl (en mode restart) passe le contenu du fichier comme options de
postgres, sauf en cas de surcharge par l'option -o. Le contenu de ce fichier est aussi affich en mode status.
Exemples
Lancer le serveur
Dmarrer un serveur :
$ pg_ctl start
Dmarrer un serveur, avec blocage tant que le serveur n'est pas compltement dmarr :
$ pg_ctl -w start
Pour excuter le serveur en utilisant le port 5433, et en s'excutant sans fsync :
$ pg_ctl -o "-F -p 5433" start
Arrt du serveur
Pour arrter le serveur, utilisez :
$ pg_ctl stop
L'option -m autorise le contrle sur la faon dont le serveur est arrt :
$ pg_ctl stop -m fast
Redmarrage du serveur
Redmarrer le serveur est pratiquement quivalent l'arrter puis le dmarrer nouveau si ce n'est que pg_ctl sauvegarde et
rutilise les options en ligne de commande qui taient passes l'instance prcdente. Pour redmarrer le serveur de la faon la
plus simple, on utilise :
$ pg_ctl restart
Redmarrer le serveur, en attendant l'arrt et le redmarrage :
$ pg_ctl -w restart
Redmarrer en utilisant le port 5433 et en dsactivant fsync aprs redmarrage :
1211
pg_ctl
Voir aussi
initdb(1), postgres(1)
1212
Nom
pg_resetxlog rinitialiser les WAL et les autres informations de contrle d'une grappe de bases de donnes PostgreSQL
Synopsis
pg_resetxlog [-f] [-n] [-ooid ] [-x xid ] [-e xid_epoch ] [-m mxid ] [-O mxoff ] [-l timelineid,fileid,seg ]
rp_donnes
Description
pg_resetxlog efface les jouranux d'critures anticipes (Write-Ahead Log ou WAL) et rinitialise optionnellement quelques
autres informations de contrle stockes dans le fichier pg_control. Cette fonction est parfois ncessaire si ces fichiers ont
t corrompus. Elle ne doit tre utilise qu'en dernier ressort quand le serveur ne dmarre plus du fait d'une telle corruption.
la suite de cette commande, le serveur doit pouvoir redmarrer. Toutefois, il ne faut pas perdre de vue que la base de donnes
peut contenir des donnes inconsistantes du fait de transactions partiellement valides. Il est alors opportun de sauvegarder les
donnes, lancer initdb et de les recharger. Aprs cela, les inconsistances doivent tre recharches et le cas chant corriges.
Seul l'utilisateur qui a install le serveur peut utiliser cet outil. Il requiert, en effet, un accs en lecture/criture au rpertoire des
donnes. Pour des raisons de scurit, pg_resetxlog n'utilise pas la variable d'environnement PGDATA. Le rpertoire des donnes doit donc tre prcis sur la ligne de commande.
Si pg_resetxlog se plaint de ne pas pouvoir dterminer de donnes valides pour pg_control, vous pouvez malgr tout le forcer continuer en spcifiant l'option -f (force). Dans ce cas, des valeurs probables sont substitues aux donnes manquantes.
La plupart des champs correspondent mais une aide manuelle pourrait tre ncessaire pour le prochain OID, le prochain TID et
sa date, le prochain identifiant multi-transaction et son dcalage, l'adresse de dbut des journaux de transactions. Ces champs
peuvent tre configurs en utilisant les options indiques ci-dessus. Si vous n'tes pas capable de dterminer les bonnes valeurs
pour tous ces champs, -f peut toujours tre utilis mais la base de donnes rcupre doit tre traite avec encore plus de suspicion que d'habitude : une sauvegarde immdiate et un rechargement sont impratifs. Ne pas excuter d'oprations de modifications de donnes dans la base avant de sauvegarder ; ce type d'action risque de faire empirer la corruption.
Les options -o, -x, -e, -m, -O et -l permettent d'initialiser manuellement le prochain OID, le prochain TID et sa date, le prochain ID multitransaction, son dcalage et l'adresse de dbut des WAL. Elles sont seulement ncessaires si pg_resetxlog est incapable de dterminer les valeurs appropries en lisant pg_control. Les valeurs saines pour le prochain ID en transaction
peuvent se dterminer ainsi :
Une bonne valeur du prochain ID de transaction (-x) peut tre dtermine en recherchant le fichier le plus large numriquement dans le rpertoire pg_clog sous le rpertoire des donnes, en ajoutant un et en multipliant par 1048576. Notez que
les noms de fichiers sont en hexadcimal. Il est habituellement plus facile de spcifier la valeur de l'option en hexadcimal
aussi. Par exemple, si 0011 est l'entre la plus large dans pg_clog, -x 0x1200000 fonctionnera (cinq zros la fin
fournissent le bon multiplieur).
Une valeur saine pour le prochain ID multitransaction (-m) peut tre dtermine en recherchant le nom de fichier le plus important numriquement dans le sous-rpertoire pg_multixact/offsets du rpertoire data, en lui ajoutant un, puis en le
multipliant par 65536. Comme ci-dessus, les noms de fichiers sont en hexadcimal, donc la faon la plus simple de le faire
est de spcifier la valeur de l'option en hexadcimal et de lui ajouter quatre zros.
Une valeur saine pour le prochain dcalage multitransaction (-O) peut tre dtermine en recherchant le nom de fichier le
plus important numriquement dans le sous-rpertoire pg_multixact/members du rpertoire data, en lui ajoutant un,
puis en le multipliant par 65536. Comme ci-dessus, les noms de fichiers sont en hexadcimal, donc la faon la plus simple
de le faire est de spcifier la valeur de l'option en hexadcimal et de lui ajouter quatre zros.
L'adresse de dbut des WAL (-l) doit tre plus large que tout nom de fichier de segment WAL dj existant dans le rpertoire pg_xlog sous le rpertoire des donnes. Ces noms sont aussi en hexadcimal et ont trois parties. La premire est le
timeline ID et doit habituellement tre conserve identique. Ne choisissez pas de valeur plus importante que 255 (0xFF)
pour la troisime partie ; la place, incrmentez la deuxime partie et rinitialisez la troisime partie 0. Par exemple, si
00000001000000320000004A est l'entre la plus importante de pg_xlog, -l 0x1,0x32,0x4B fonctionnera ;
mais si l'entre la plus importante est 000000010000003A000000FF, choisissez -l 0x1,0x3B,0x0 ou plus.
Note
pg_resetxlog lui-mme recherche les fichiers dans pg_xlog et choisit un paramtre -l par dfaut au-del
du dernier fichier existant. Du coup, un ajustement manuel de -l sera seulement ncessaire si vous avez
connaissance de fichiers WAL qui ne sont actuellement pas prsents dans le rpertoire pg_xlog, comme des
1213
pg_resetxlog
entres dans une archive hors ligne ou si le contenu de pg_xlog avait compltement disparu.
Il n'y a pas de faon plus simple pour dterminer un OID suivant qui se trouve aprs celui de la base de donnes mais, heureusement, il n'est pas critique d'obtenir le bon OID suivant.
La valeur epoch de l'identifiant de transaction n'est pas rellement stocke dans la base, sauf dans le champ qui est initialis
par pg_resetxlog, donc toute valeur sera correcte en ce qui concerne la base de donnes elle-mme. Vous pourrez avoir besoin
d'ajuster cette valeur pour vous assurer que les systmes de rplication comme Slony-I fonctionnent correctement -- dans ce
cas, une valeur approprie doit tre obtenue partir de l'tat de la base rplique.
L'option -n (sans opration) demande pg_resetxlog d'afficher les valeurs reconstruites partir de pg_control puis quitte
sans rien modifier. C'est principalement un outil de dbogage mais qui peut tre utile pour une vrification avant de permettre
pg_resetxlog de traiter rellement la base.
Les options -V et --version affichent la version de pg_resetxlog puis arrtent l'application. Les options -? et --help affichent les arguments accepts.
Notes
Cette commande ne doit pas tre utilise si le serveur est en cours d'excution. pg_resetxlog refuse de se lancer s'il trouve un fichier de verrouillage du serveur dans le rpertoire des donnes ; Si le serveur s'est arrt brutalement, il peut subsister un tel fichier. Dans ce cas, vous pouvez supprimer le fichier de verrouillage pour permettre pg_resetxlog de se lancer. Mais avant de le
faire, soyez doublement certain qu'il n'y a pas de processus serveur en cours.
1214
Nom
postgres Serveur de bases de donnes PostgreSQL
Synopsis
postgres [option...]
Description
postgres est le serveur de bases de donnes PostgreSQL. Pour qu'une application cliente puisse accder une base de donnes, elle se connecte (soit via le rseau soit localement) un processus postgres en cours d'excution. L'instance postgres dmarre ensuite un processus serveur spar pour grer la connexion.
Une instance postgres gre toujours les donnes d'un seul cluster. Un cluster est un ensemble de bases de donnes stock un
mme emplacement dans le systme de fichiers (le rpertoire des donnes ). Plus d'un processus postgres peut tre en cours
d'excution sur un systme un moment donn, s'ils utilisent des rpertoires diffrents et des ports de communication diffrents
(voir ci-dessous). Quand postgres se lance, il a besoin de connatre l'emplacement du rpertoire des donnes. Cet emplacement
doit tre indique par l'option -D ou par la variable d'environnement PGDATA ; il n'y a pas de valeur par dfaut. Typiquement, D ou PGDATA pointe directement vers le rpertoire des donnes cr par initdb(1). D'autres dispositions de fichiers possibles
sont discuts dans Section 18.2, Emplacement des fichiers . Un rpertoire de donnes est cr avec initdb(1). Un rpertoire de
donnes est cr avec initdb(1).
Par dfaut, postgres s'excute en avant-plan et affiche ses messages dans le flux standard des erreurs. En pratique, postgres devrait tre excut en tant que processus en arrire-plan, par exemple au lancement.
La commande postgres peut aussi tre appel en mode mono-utilisateur. L'utilisation principal de ce mode est lors du
bootstrap utilis par initdb(1). Quelque fois, il est utilis pour du dbogage et de la rcupration suite un problme (mais
noter qu'excuter un serveur en mode mono-utilisateur n'est pas vraiment convenable pour dboguer le serveur car aucune communication inter-processus raliste et aucun verrouillage n'interviennent.) Quand il est appel en mode interactif partir du
shell, l'utilisateur peut saisir des requtes et le rsultat sera affich l'cran mais dans une forme qui est plus utile aux dveloppeurs qu'aux utilisateurs. Dans le mode mono-utilisateur, la session ouverte par l'utilisateur sera configure avec l'utilisateur
d'identifiant 1 et les droits implicites du superutilisateur lui sont donns. Cet utilisateur n'a pas besoin d'exister, donc le mode
mono-utilisateur peut tre utilis pour rcuprer manuellement aprs certains types de dommages accidentels dans les catalogues
systmes.
Options
postgres accepte les arguments suivants en ligne de commande. Pour une discussion dtaille des options, consultez Chapitre 18, Configuration du serveur. Vous pouvez viter de saisir la plupart de ces options en les initialisant dans le fichier de
configuration. Certaines options (sres) peuvent aussi tre configures partir du client en cours de connexion d'une faon dpendante de l'application, configuration qui ne sera applique qu' cette session. Par exemple si la variable d'environnement
PGOPTIONS est configure, alors les clients bass sur libpq passeront cette chane au serveur qui les interprtera comme les options en ligne de commande de postgres.
Gnral
-A 0|1
Active les vrifications d'assertion l'excution, donc une aide au dbogage pour dtecter les erreurs de programmation.
Cette option est seulement disponible si les assertions on t actives lors de la compilation de PostgreSQL. Dans ce cas,
la valeur par dfaut est on .
-B ntampons
Configure le nombre de tampons partags utiliss par les processus serveur. La valeur par dfaut de ce paramtre est choisi
automatiquement par initdb. Indiquer cette option est quivalent configurer le paramtre shared_buffers.
-c nom=valeur
Configure un parammtre d'excution nomm. Les paramtres de configuration supports par PostgreSQL sont dcrits
dans Chapitre 18, Configuration du serveur. La plupart des autres options en ligne de commande sont en fait des formes
courtes d'une affectation de paramres. -c peut apparatre plusieurs fois pour configurer diffrents paramtres.
-d niveau-dbogage
Configure le niveau de dbogage. Plus haute est sa valeur, plus importante seront les traces crites dans les journaux. Les
valeurs vont de 1 5. Il est aussi possible de passer -d 0 pour une session spcifique qui empchera le niveau des traces
serveur du processus postgres parent d'tre propag jusqu' cette session.
1215
postgres
-D repdonnes
Indique le rpertoire des donnes ou des fichier(s) de configuration. Voir Section 18.2, Emplacement des fichiers pour les
dtails.
-e
Configure le style de date par dfaut European , c'est--dire l'ordre DMY pour les champs en entre. Ceci cause aussi
l'affichage de la date avant le mois dans certains formats de sortie de date. Voir Section 8.5, Types date/heure pour plus
d'informations.
-F
Dsactive les appels fsync pour amliorer les performances au risque de corrompre des donnes dans l'ide d'un arrt brutal
du systme. Spcifier cette option est quivalent dsactiver le paramtre de configuration fsync. Lisez la documentation dtaille avant d'utiliser ceci !
-h hte
Indique le nom d'hte ou l'adresse IP sur lequel postgres attend les connexions TCP/IP d'applications clientes. La valeur peut
aussi tre une liste d'adresses spares par des virgules ou * pour indiquer l'attente sur toutes les interfaces disponibles. Une
valeur vide indique qu'il n'attend sur aucune adresse IP, auquel cas seuls les sockets de domaine Unix peuvent tre utiliss
pour se connecter au serveur. Par dfaut, attend les connexions seulement sur localhost. Spcifier cette option est quivalent la configurer dans le paramtre listen_addresses.
-i
Autorise les clients distants se connecter via TCP/IP (domaine Internet). Sans cette option, seules les connexions locales
sont autorises. Cette option est quivalent la configuration du paramtre listen_addresses * dans postgresql.conf ou via -h.
Cette option est obsolte car il ne permet plus l'accs toutes les fonctionnalits de listen_addresses. Il est gnralement
mieux de configurer directement listen_addresses.
-k directory
Indique le rpertoire de la socket de domaine Unix sur laquelle postgres est en attente des connexions des applications
clients. La valeur par dfaut est habituellement /tmp mais cela peut se changer au moment de la construction.
-l
Active les connexions scurises utilisant SSL. PostgreSQL doit avoir t compil avec SSL pour que cette option soit disponible. Pour plus d'informations sur SSL, rfrez-vous Section 17.9, Connexions tcp/ip scurises avec ssl .
-N max-connections
Initialise le nombre maximum de connexions clientes que le serveur acceptera. La valeur par dfaut de ce paramtre est choisi
automatiquement par initdb. Indiquer cette option est quivalent configurer le paramtre max_connections.
-o extra-options
Les options en ligne de commande indiques dans extra-options sont passes tous les processus serveur excuts par
ce processus postgres. Si la chane d'option contient des espaces, la chane entire doit tre entre guillemets.
Cette option est obsolte ; toutes les options en ligne de commande des processus serveur peuvent tre spcifies directement
sur la ligne de commande de postgres.
-p port
Indique le port TCP/IP ou l'extension du fichier socket de domaine Unix sur lequel postgres attend les connexions des applications clientes. Par dfaut, la valeur de la variable d'environnement PGPORT environment ou, si cette variable n'est pas
configurer, la valeur connue la compilation (habituellement 5432). Si vous indiquez un port autre que celui par dfaut, alors
toutes les applications clientes doivent indiquer le mme numro de port soit dans les options en ligne de commande soit avec
PGPORT.
-s
Affiche une information de temps et d'autres statistiques la fin de chaque commande. Ceci est utile pour crer des rapports
de performance ou pour configurer finement le nombre de tampons.
-S work-mem
Indique la quantit de mmoire utiliser par les tris internes et par les hachages avant d'utiliser des fichiers disque temporaires. Voir la description du paramtre work_mem dans Section 18.4.1, Mmoire .
--nom=valeur
Configure un paramtre l'excution ; c'est une version courte de -c.
--describe-config
Cette option affiche les variables de configuration internes du serveur, leurs descriptions et leurs valeurs par dfaut dans un
format COPY dlimit par des tabulations. Elle est conue principalement pour les outils d'administration.
1216
postgres
Options semi-internes
Les options dcrites ici sont utilises principalement dans un but de dbogage et pouvant quelque fois aider la rcupration de
bases de donnes trs endommages/ Il n'y a aucune raison pour les utiliser dans la configuration d'un systme en production.
Elles sont listes ici l'intention des dveloppeurs PostgreSQL. De plus, une de ces options pourrait disparatre ou changer dans
le futur sans avertissement.
-f { s | i | m | n | h }
Interdit l'utilisation de parcours et de mthode de jointure particulires. s and i dsactivent respectivement les parcours squentiels et d'index alors que n, m et h dsactivent respectivement les jointures de boucles imbriques, jointures de fusion et
hash.
Ni les parcours squentiels ni les jointures de boucles imbriques ne peuvent tre dsactivs compltement ; les options -fs
et -fn ne font que dcourager l'optimiseur d'utiliser ce type de plans.
-n
Cette option est prsente pour les problmes de dbogage du genre mort brutal d'un processus serveur. La stratgie habituelle
dans cette situation est de notifier tous les autres processus serveur qu'ils doivent se terminer, puis rinitialiser la mmoire
partage et les smaphores. Tout ceci parce qu'un processus serveur errant peut avoir corrompu certains tats partags avant
de terminer. Cette option spcifie seulement que postgres ne rinitialisera pas les structures de donnes partages. Un dveloppeur systme avec quelques connaissances peut utiliser un dbogueur pour examiner l'tat de la mmoire partage et des
smaphores.
-O
Autorise la modification de la structure des tables systme. C'est utilis par initdb.
-P
Ignore les index systme lors de la lecture des tables systme (mais les met jour lors de la modification des tables). Ceci est
utile lors de la rcupration d'index systme endommags.
-t pa[rser] | pl[anner] | e[xecutor]
Affiche les statistiques en temps pour chaque requte en relation avec un des modules majeurs du systme. Cette option ne
peut pas tre utilise avec l'option -s.
-T
Cette option est prsente pour les problmes de dbogage du genre mort brutal d'un processus serveur. La stratgie habituelle
dans cette situation est de notifier tous les autres processus serveur qu'ils doivent se terminer, puis rinitialiser la mmoire
partage et les smaphores. Tout ceci parce qu'un processus serveur errant peut avoir corrompu certains tats partags avant
de terminer. Cette option spcifie seulement que postgres arrtera tous les autres processus serveur en leur envoyant le signal
SIGSTOP mais ne les arrtera pas. Ceci permet aux dveloppeurs systme de rcuprer manuellement des core dumps de
tous les processus serveur.
-v protocole
Indique le numro de version utilis par le protocole interface/moteur pour une session particulire. Cette option est uniquement utilise en interne.
-W secondes
Un dlai de ce nombre de secondes survient quand un nouveau processus serveur est lanc, une fois la procdure
d'authentification termine. Ceci a pour but de permettre au dveloppeur d'attacher un dbogueur au processus serveur.
postgres
Envoie toute la sortie des traces du serveur dans fichier. Dans le mode normal, cette option est ignore et stderr est utilis par tous les processus.
Environnement
PGCLIENTENCODING
Jeu de caractres utilis par dfaut par tous les clients. (Les clients peuvent surcharger ce paramtre individuellement.) Cette
valeur est aussi configurable dans le fichier de configuration.
PGDATA
Emplacement du rpertoire des donnes par dfaut
PGDATESTYLE
Valeur par dfaut du paramtre en excution datestyle. (Cette variable d'environnement est obsolte.)
PGPORT
Numro de port par dfaut ( configurer de prfrence dans le fichier de configuration)
TZ
Fuseau horaire du serveur
Diagnostiques
Un message d'erreur mentionnant semget ou shmget indique probablement que vous devez configurer votre noyau pour fournir
la mmoire partage et les smaphores adquates. Pour plus de discussion, voir Section 17.4, Grer les ressources du noyau .
Vous pouvez aussi repousser la configuration du noyau en diminuant shared_buffers pour rduire la consommation de la mmoire
partage utilise par PostgreSQL, et/ou en diminuant max_connections pour rduire la consommation de smaphores.
Un message d'erreur suggrant qu'un autre serveur est dj en cours d'excution devra vous demander une vrification attentive,
par exemple en utilisant la commande ps should be checked carefully, for example by using the command
$ ps ax | grep postgres
ou
$ ps -ef | grep postgres
suivant votre systme. Si vous tes certain qu'il n'y a aucun serveur en conflit, vous pouvez supprimer le fichier verrou mentionn
dans le message et tenter de nouveau.
Un message d'erreur indiquant une incapacit se lier un port indique que ce port est dj utilis par des processus autres que
PostgreSQL. Vous pouvez aussi obtenir cette erreur si vous quittez postgres et le relancez immdiatement en utilisant le mme
port ; dans ce cas, vous devez tout simplement attendre quelques secondes pour que le systme d'exploitation ferme bien le port
avant de tenter de nouveau. Enfin, vous pouvez obtenir cette erreur si vous indiquez un numro de port que le systme considre
comme rserv. Par exemple, beaucoup de versions d'Unix considrent les numros de port sous 1024 comme de confiance et
permettent seulement leur accs par le superutilisateur Unix.
Notes
L'outil pg_ctl(1) est utilisable pour lancer et arrter le serveur postgres de faon sre et confortable.
Si possible, ne pas utiliser SIGKILL pour tuer le serveur postgres principal. Le fait empchera postgres de librer les ressources
systme (c'est--dire mmoire partage et smaphores) qu'il dtient avant de s'arrter. Ceci peut poser problmes lors du lancement d'un postgres frais.
Pour terminer le serveur postgres normalement, les signaux SIGTERM, SIGINT ou SIGQUIT peuvent tre utiliss. Le premier
attendra que tous les clients terminent avant de quitter, le second forcera la dconnexion de tous les clients et le troisime quittera
immdiatement sans arrt propre. Ce dernier amnera une rcupration lors du redmarrage.
Le signal SIGHUP rechargera les fichiers de configuration du serveur. Il est aussi possible d'envoyer SIGHUP un processus serveur individuel mais ce n'est pas perceptible.
Pour annuler une requte en cours d'excution, envoyez le signal SIGINT au processus excutant cette commande.
Le serveur postgres utilise SIGTERM pour indiquer aux processus serveur de quitter normalement et SIGQUIT pour terminer
sans le nettoyage habituel. Ces signaux ne devraient pas tre utiliss par les utilisateurs. Il est aussi dconseill d'envoyer SIGKILL un processus serveur -- le serveur postgres principal interprtera ceci comme un arrt brutal et forcera tous les autres processus serveur quitter dans le cas d'une procdure standard de rcupration aprs arrt brutal.
1218
postgres
Bogues
Les options -- ne fonctionneront pas sous FreeBSD et OpenBSD. Utilisez -c la place. C'est un bogue dans les systmes
d'exploitation affects ; une prochaine version de PostgreSQL fournira un contournement si ce n'est pas corrig.
Utilisation
Pour dmarrer un serveur en mode mono-utilisateur, utilisez une commande comme
postgres --single -D /usr/local/pgsql/data autres-options ma_base
Fournissez le bon chemin vers le rpertoire des bases avec l'option -D ou assurez-vous que la variable d'environnement PGDATA
est configure. De plus, spcifiez le nom de la base particulire avec laquelle vous souhaitez travailler.
Habituellement, le serveur en mode mono-utilisateur traite le retour chariot comme le terminateur d'une commande ; il n'y a pas le
concept du point-virgule contraitement psql. Pour saisir une commande sur plusieurs lignes, vous devez saisir un antislash juste
avant un retour chariot, sauf pour le dernier.
Mais si vous utilisez l'option -j, alors le retour chariot ne termine pas une commande. Dans ce cas, le serveur lira l'entre standard jusqu' une marque de fin de fichier (EOF), puis il traitera la saisie comme une seule chane de commande. Les retours chariot avec antislash ne sont pas traits spcialement dans ce cas.
Pour quitter la session, saisissez EOF (habituellement, Control+D). Si vous avez utilis l'option -j, deux EOF conscutifs sont
ncessaires pour quitter.
Notez que le serveur en mode mono-utilisateur ne fournit pas de fonctionnalits avances sur l'dition de lignes (par exemple, pas
d'historique des commandes). De plus, le mode mono-utilisateur ne lance pas de processus en tche de fond, comme par exemple
les checkpoints automatiques.
Exemples
Pour lancer postgres en tche de fond avec les valeurs par dfaut, saisissez :
$ nohup postgres >logfile 2>&1 </dev/null &
Pour lancer postgres avec un port spcifique, e.g. 1234 :
$ postgres -p 1234
Pour se connecter ce serveur avec psql, indiquez le numro de port avec l'option -p :
$ psql -p 1234
ou de configurer la variable d'environnement PGPORT :
$ export PGPORT=1234
$ psql
Les paramtres nomms peuvent tre configurs suivant deux faons :
$ postgres -c work_mem=1234
$ postgres --work-mem=1234
Ces deux formes surchargent le paramtrage qui pourrait exister pour work_mem dans postgresql.conf. Notez que les tirets
bas dans les noms de paramtres sont crits avec soir des tirets bas soit des tirets sur la ligne de commande. Sauf pour les expriences court terme, il est probablement mieux de modifier le paramtrage dans postgresql.conf que de se baser sur une
option en ligne de commande.
Voir aussi
initdb(1), pg_ctl(1)
1219
Nom
postmaster Serveur de bases de donnes PostgreSQL
Synopsis
postmaster [option...]
Description
postmaster est un alias obsolte de postgres.
Voir aussi
postgres(1)
1220
Une connexion au serveur est tablie par une application. Elle transmet une requte et attend le retour des rsultats.
2.
L'tape d'analyse (parser stage) vrifie la syntaxe de la requte et cre un arbre de requte (query tree).
3.
Le systme de rcriture (rewrite system) recherche les rgles (stockes dans les catalogues systme) appliquer l'arbre
de requte. Il excute les transformations indiques dans le corps des rgles (rule bodies).
La ralisation des vues est une application du systme de rcriture. Toute requte utilisateur impliquant une vue
(c'est--dire une table virtuelle), est rcrite en une requte qui accde aux tables de base, en fonction de la dfinition de la
vue.
4.
Le planificateur/optimiseur (planner/optimizer) transforme l'arbre de requte (rcrit) en un plan de requte (query plan)
pass en entre de l'excuteur.
Il cre tout d'abord tous les chemins possibles conduisant au rsultat. Ainsi, s'il existe un index sur une relation parcourir,
il existe deux chemins pour le parcours. Le premier consiste en un simple parcours squentiel, le second utilise l'index. Le
cot d'excution de chaque chemin est estim ; le chemin le moins coteux est alors choisi. Ce dernier est tendu en un
plan complet que l'excuteur peut utiliser.
5.
L'excuteur traverse rcursivement les tapes de l'arbre de planification (plan tree) et retrouve les lignes en fonction de ce
plan. L'excuteur utilise le systme de stockage lors du parcours des relations, excute les tris et jointures, value les qualifications et retourne finalement les lignes concernes.
Les sections suivantes prsentent en dtail les lments brivement dcrits ci-dessus.
1222
l'analyseur, dfini dans gram.y et scan.l, est construit en utilisant les outils Unix bison et flex ;
le processus de transformation fait des modifications et des ajouts aux structures de donnes renvoyes par l'analyseur.
44.3.1. Analyseur
L'analyseur doit vrifier que la syntaxe de la chane de la requte (arrivant comme un texte ASCII) est valide. Si la syntaxe est
correcte, un arbre d'analyse est construit et renvoy, sinon une erreur est retourne. Les analyseur et vrificateur syntaxiques sont
dvelopps l'aide des outils Unix bien connus bison et flex.
L'analyseur lexical, dfini dans le fichier scan.l, est responsable de la reconnaissance des identificateurs, des mots cls SQL,
etc. Pour chaque mot cl ou identificateur trouv, un jeton est engendr et renvoy l'analyseur.
L'analyseur est dfini dans le fichier gram.y et consiste en un ensemble de rgles de grammaire et en des actions excuter lorsqu'une rgle est dcouverte. Le code des actions (qui est en langage C) est utilis pour construire l'arbre d'analyse.
Le fichier scan.l est transform en fichier source C scan.c en utilisant le programme flex et gram.y est transform en
gram.c en utilisant bison. Aprs avoir ralis ces transformations, un compilateur C normal peut tre utilis pour crer
l'analyseur. Il est inutile de modifier les fichiers C engendrs car ils sont crass l'appel suivant de flex ou bison.
Note
Les transformations et compilations mentionnes sont normalement ralises automatiquement en utilisant les makefile distribus avec les sources de PostgreSQL.
La description dtaille de bison ou des rgles de grammaire donnes dans gram.y dpasse le cadre de ce document. Il existe de
nombreux livres et documentations en relation avec flex et bison. Il est prfrable d'tre familier avec bison avant de commencer
tudier la grammaire donne dans gram.y, au risque de ne rien y comprendre.
la premire, qui fonctionnait au niveau des lignes, tait implante profondment dans l'excuteur. Le systme de rgles tait
appel chaque fois qu'il fallait accder une ligne individuelle. Cette implantation a t supprime en 1995 quand la dernire
version officielle du projet Berkeley Postgres a t transforme en Postgres95 ;
la deuxime implantation du systme de rgles est une technique appele rcriture de requtes. Le systme de rcriture est
un module qui existe entre l'tape d'analyse et le planificateur/optimiseur. Cette technique est toujours implante.
1223
44.5. Planificateur/Optimiseur
La tche du planificateur/optimiseur est de crer un plan d'excution optimal. En fait, une requte SQL donne (et donc, l'arbre
d'une requte) peut tre excute de plusieurs faons, chacune arrivant au mme rsultat. Si ce calcul est possible, l'optimiseur de
la requte examinera chacun des plans d'excution possibles pour slectionner le plan d'excution estim comme le plus rapide.
Note
Dans certaines situations, examiner toutes les faons d'excuter une requte prend beaucoup de temps et de mmoire. En particulier, lors de l'excution de requtes impliquant un grand nombre de jointures. Pour dterminer un
plan de requte raisonnable (mais pas forcment optimal) en un temps raisonnable, PostgreSQL utilise un Genetic Query Optimizer (voir Chapitre 51, Optimiseur gntique de requtes (Genetic Query Optimizer)) ds lors que
le nombre de jointures dpasse une certaine limite (voir geqo_threshold).
La procdure de recherche du planificateur fonctionne avec des structures de donnes appels chemins, simples reprsentations
minimales de plans ne contenant que l'information ncessaire au planificateur pour prendre ses dcisions. Une fois le chemin le
moins coteux dtermin, un arbre plan est construit pour tre pass l'excuteur. Celui-ci reprsente le plan d'excution dsir
avec suffisamment de dtails pour que l'excuteur puisse le lancer. Dans le reste de cette section, la distinction entre chemins et
plans est ignore.
jointure de boucle imbrique (nested loop join) : la relation de droite est parcourue une fois pour chaque ligne trouve dans la
relation de gauche. Cette stratgie est facile implanter mais peut tre trs coteuse en temps. (Toutefois, si la relation de
droite peut tre parcourue l'aide d'un index, ceci peut tre une bonne stratgie. Il est possible d'utiliser les valeurs issues de la
ligne courante de la relation de gauche comme cls du parcours d'index droite.)
jointure de fusion (merge join) : chaque relation est trie selon les attributs de la jointure avant que la jointure ne commence.
Puis, les deux relations sont parcourues en parallle et les lignes correspondantes sont combines pour former des lignes
jointes. Ce type de jointure est plus intressant parce que chaque relation n'est parcourue qu'une seule fois. Le tri requis peut
tre ralis soit par une tape explicite de tri soit en parcourant la relation dans le bon ordre en utilisant un index sur la cl de
la jointure ;
jointure de hachage (hash join) : la relation de droite est tout d'abord parcourue et charge dans une table de hachage en utilisant ses attributs de jointure comme cls de hachage. La relation de gauche est ensuite parcourue et les valeurs appropries de
chaque ligne trouve sont utilises comme cls de hachage pour localiser les lignes correspondantes dans la table.
Quand la requte implique plus de deux relations, le rsultat final doit tre construit l'aide d'un arbre d'tapes de jointure, chacune deux entres. Le planificateur examine les squences de jointure possibles pour trouver le moins cher.
Si la requte implique moins de geqo_threshold relations, une recherche quasi-exhaustive est effectue pour trouver la meilleure
squence de jointure. Le planificateur considre prfrentiellement les jointures entre paires de relations pour lesquelles existe une
clause de jointure correspondante dans la qualification WHERE (i.e. pour lesquelles existe une restriction de la forme where
rel1.attr1=rel2.attr2). Les paires jointes pour lesquelles il n'existe pas de clause de jointure ne sont considres que
lorsqu'il n'y a plus d'autre choix, c'est--dire qu'une relation particulire n'a pas de clause de jointure avec une autre relation. Tous
les plans possibles sont crs pour chaque paire jointe considre par le planificateur. C'est alors celle qui est (estime) la moins
1224
44.6. Excuteur
L'excuteur prend le plan cr par le planificateur/optimiseur et l'excute rcursivement pour extraire l'ensemble requis de lignes.
Il s'agit principalement d'un mcanisme de pipeline en demande-envoi. Chaque fois qu'un nud du plan est appel, il doit apporter
une ligne supplmentaire ou indiquer qu'il a fini d'envoyer des lignes.
Pour donner un exemple concret, on peut supposer que le nud suprieur est un nud MergeJoin. Avant de pouvoir faire une
fusion, deux lignes doivent tre rcupres (une pour chaque sous-plan). L'excuteur s'appelle donc rcursivement pour excuter
les sous-plans (en commenant par le sous-plan attach l'arbre gauche). Le nouveau nud suprieur (le nud suprieur du
sous-plan gauche) est, par exemple, un nud Sort (NdT : Tri) et un appel rcursif est une nouvelle fois ncessaire pour obtenir
une ligne en entre. Le nud fils de Sort pourrait tre un nud SeqScan, reprsentant la lecture relle d'une table. L'excution
de ce nud impose l'excuteur de rcuprer une ligne partir de la table et de la retourner au nud appelant. Le nud Sort appelle de faon rpte son fils pour obtenir toutes les lignes trier. Quand l'entre est puise (indiqu par le nud fils renvoyant
un NULL au lieu d'une ligne), le code de Sort est enfin capable de renvoyer sa premire ligne en sortie, c'est--dire le premier
suivant l'ordre de tri. Il conserve les lignes restantes en mmoire de faon les renvoyer dans le bon ordre en rponse des demandes ultrieures.
Le nud MergeJoin demande de la mme faon la premire ligne partir du sous-plan droit. Ensuite, il compare les deux
lignes pour savoir si elles peuvent tre jointes ; si c'est le cas, il renvoie la ligne de jointure son appelant. Au prochain appel, ou
immdiatement, s'il ne peut pas joindre la paire actuelle d'entres, il avance sur la prochaine ligne d'une des deux tables (suivant le
rsultat de la comparaison), et vrifie nouveau la correspondance. ventuellement, un des sous-plans est puis et le nud MergeJoin renvoie NULL pour indiquer qu'il n'y a plus de lignes jointes former.
Les requtes complexes peuvent ncessiter un grand nombre de niveaux de nuds pour les plans, mais l'approche gnrale est la
mme : chaque nud est excut et renvoie sa prochaine ligne en sortie chaque fois qu'il est appel. Chaque nud est responsable aussi de l'application de toute expression de slection ou de projection qui lui a t confie par le planificateur.
Le mcanisme de l'excuteur est utilis pour valuer les quatre types de requtes de base en SQL : SELECT, INSERT, UPDATE
et DELETE. Pour SELECT, le code de l'excuteur de plus haut niveau a uniquement besoin d'envoyer chaque ligne retourne par
l'arbre plan de la requte vers le client. Pour INSERT, chaque ligne renvoye est insre dans la table cible indique par
INSERT. Cela se fait dans un nud spcial haut niveau du plan appel ModifyTable. (Une simple commande INSERT ...
VALUES cre un arbre plan trivial constitu d'un seul nud, Result, calculant une seule ligne de rsultat, et ModifyTable
au-dessus pour raliser l'insertion. Mais INSERT ... SELECT peut demander la pleine puissance du mcanisme de l'excuteur.)
Pour UPDATE, le planificateur s'arrange pour que chaque ligne calcule inclue toutes les valeurs mises jour des colonnes, plus
le TID (tuple ID ou l'identifiant de la ligne) de la ligne de la cible originale ; cette donne est envoye dans un nud ModifyTable, qui utilise l'information pour crer une nouvelle ligne mise jour et marquer l'ancienne ligne comme supprime. Pour
DELETE, la seule colonne renvoye par le plan est le TID, et ModifyTable node utilise simplement le TID pour visiter chaque
ligne cible et la marquer comme supprime.
1225
45.1. Aperu
Tableau 45.1, Catalogues systme liste les catalogues systme. Une documentation plus dtaille des catalogues systme
suit.
La plupart des catalogues systme sont recopis de la base de donnes modle lors de la cration de la base de donnes et deviennent alors spcifiques chaque base de donnes. Un petit nombre de catalogues sont physiquement partags par toutes les
bases de donnes d'une installation de PostgreSQL. Ils sont indiqus dans les descriptions des catalogues.
Tableau 45.1. Catalogues systme
Nom du catalogue
Contenu
pg_aggregate
fonctions d'agrgat
pg_am
pg_amop
pg_amproc
pg_attrdef
pg_attribute
pg_authid
pg_auth_members
pg_cast
pg_class
pg_constraint
pg_collation
pg_conversion
pg_database
pg_db_role_setting
pg_default_acl
pg_depend
pg_description
pg_enum
pg_extension
extensions installes
pg_foreign_data_wrapper
pg_foreign_server
pg_foreign_table
pg_index
pg_inherits
pg_language
pg_largeobject
pg_largeobject_metadata
Catalogues systme
Nom du catalogue
Contenu
pg_namespace
schmas
pg_opclass
pg_operator
oprateurs
pg_opfamily
pg_pltemplate
pg_proc
fonctions et procdures
pg_rewrite
pg_seclabel
pg_shdepend
pg_shdescription
pg_statistic
pg_tablespace
pg_trigger
dclencheurs
pg_ts_config
pg_ts_config_map
pg_ts_dict
pg_ts_parser
pg_ts_template
pg_type
types de donnes
pg_user_mapping
45.2. pg_aggregate
Le catalogue pg_aggregate stocke les informations concernant les fonctions d'agrgat. Une fonction d'agrgat est une fonction qui
opre sur un ensemble de donnes (typiquement une colonne de chaque ligne qui correspond une condition de requte) et retourne une valeur unique calcule partir de toutes ces valeurs. Les fonctions d'agrgat classiques sont sum (somme), count
(compteur) et max (plus grande valeur). Chaque entre de pg_aggregate est une extension d'une entre de pg_proc. L'entre de
pg_proc contient le nom de l'agrgat, les types de donnes d'entre et de sortie, et d'autres informations similaires aux fonctions
ordinaires.
Tableau 45.2. Les colonnes de pg_aggregate
Nom
Type
Rfrences
Description
aggfnoid
regproc
pg_proc.oid
aggtransfn
regproc
pg_proc.oid
Fonction de transition
aggfinalfn
regproc
pg_proc.oid
aggsortop
oid
.oi
pg_operatord
aggtranstype
oid
pg_type.oid
agginitval
text
Les nouvelles fonctions d'agrgat sont enregistres avec la commande CREATE AGGREGATE(7). La Section 35.10, Agrgats
utilisateur fournit de plus amples informations sur l'criture des fonctions d'agrgat et sur la signification des fonctions de transition.
1227
Catalogues systme
45.3. pg_am
Le catalogue pg_am stocke les informations concernant les mthodes d'accs aux index. On trouve une ligne par mthode d'accs
supporte par le systme. Le contenu de ce catalogue est discut en dtails dans Chapitre 52, Dfinition de l'interface des mthodes d'accs aux index.
Tableau 45.3. Colonnes de pg_am
Nom
Type
Rfrences
amname
name
amstrategies
int2
Nombre de stratgies d'oprateur pour cette mthode d'accs, ou zro si la mthode d'accs n'a pas
un ensemble fixe de stratgies oprateurs
amsupport
int2
amcanorder
bool
La mthode d'accs supporte-t-elle les parcours ordonns par la valeur de la colonne indexe ?
amcanorderbyop
bool
La mthode d'accs supporte-t-elle les parcours ordonns par le rsultat d'un oprateur sur une colonne indexe ?
amcanbackward
bool
amcanunique
bool
amcanmulticol
bool
amoptionalkey
bool
amsearchnulls
bool
amstorage
bool
amclusterable
bool
ampredlocks
bool
amkeytype
oid
pg_type.oid
aminsert
regproc
pg_proc.oid
ambeginscan
regproc
pg_proc.oid
amgettuple
regproc
pg_proc.oid
amgetbitmap
regproc
pg_proc.oid
amrescan
regproc
pg_proc.oid
amendscan
regproc
pg_proc.oid
ammarkpos
regproc
pg_proc.oid
amrestrpos
regproc
pg_proc.oid
ambuild
regproc
pg_proc.oid
ambuildempty
regproc
pg_proc.oid
ambulkdelete
regproc
pg_proc.oid
1228
Description
Catalogues systme
Nom
Type
Rfrences
Description
amvacuumcleanup
regproc
pg_proc.oid
amcostestimate
regproc
pg_proc.oid
amoptions
regproc
pg_proc.oid
45.4. pg_amop
Le catalogue pg_amop stocke les informations concernant les oprateurs associs aux familles d'oprateurs des mthodes d'accs
aux index. Il y a une ligne pour chaque oprateur membre d'une famille. Un membre d'une famille peut tre soit un oprateur de
recherche soit un oprateur de tri. Un oprateur peut apparatre dans plus d'une famille, mais ne peut pas apparatre dans plus
d'une position l'intrieur d'une famille.
Tableau 45.4. Colonnes de pg_amop
Nom
Type
Rfrences
Description
amopfamily
oid
.oi
pg_opfamilyd
La famille d'oprateur
amoplefttype
oid
pg_type.oid
amoprighttype
oid
pg_type.oid
amopstrategy
int2
amoppurpose
char
amopopr
oid
.oi
pg_operatord
OID de l'oprateur
amopmethod
oid
pg_am.oid
amopsortfamily
oid
.oi
pg_opfamilyd
La famille d'oprateur B-tree utilise par cette entre pour trier s'il s'agit d'un oprateur de tri ; zro
s'il s'agit d'un oprateur de recherche
Un oprateur de recherche indique qu'un index de cet oprateur peut tre utilis pour rechercher toutes les lignes satisfaisant
une clause WHERE colonne_index oprateur constante. Cet oprateur doit videmment renvoyer un boolen et le
type de l'entre gauche doit correspondre au type de donnes de la colonne de l'index.
Un oprateur de tri indique qu'un index de cette famille d'oprateur peut tre parcouru pour renvoyer les lignes dans l'ordre reprsent par une clause ORDER BY colonne_index oprateur constante. Cet oprateur peut renvoyer tout type de
donnes triable, bien que le type de l'entre gauche doit correspondre au type de donnes de la colonne de l'index. La smantique
exacte de la clause ORDER BY est spcifi par la colonne amopsortfamily qui doit rfrencer une famille d'oprateur B-tree
pour le type de rsultat de l'oprateur.
Note
Actuellement, il est suppos que l'ordre de tri pour un oprateur de tri est celui par dfaut de la famille d'oprateur
rfrence, c'est--dire ASC NULLS LAST. Ceci pourrait changer en ajoutant des colonnes supplmentaires pour
y indiquer explicitement les options de tri.
Une entre dans amopmethod doit correspondre au opfmethod de sa famille d'oprateur parent (l'inclusion de amopmethod
ce niveau est une dnormalisation intentionnelle de la structure du catalogue pour des raisons de performance). De plus, amoplefttype et amoprighttype doivent correspondre aux champs oprleft et oprright de l'entre pg_operator rfrence.
45.5. pg_amproc
1229
Catalogues systme
Le catalogue pg_amproc stocke les informations concernant les procdures de support associes aux familles d'oprateurs de mthodes d'accs. Il y a une ligne pour chaque procdure de support appartenant une famille.
Tableau 45.5. Colonnes de pg_amproc
Nom
Type
Rfrences
Description
amprocfamily
oid
.oi
pg_opfamilyd
La famille d'oprateur
amproclefttype
oid
pg_type.oid
amprocrighttype
oid
pg_type.oid
amprocnum
int2
amproc
regproc
OID de la procdure
On interprte habituellement les champs amproclefttype et amprocrighttype comme identifiant les types de donnes
des cts gauche et droit d'oprateur(s) support(s) par une procdure particulire. Pour certaines mthodes d'accs, ils correspondent aux types de donnes en entre de la procdure elle-mme. Il existe une notion de procdures de support par dfaut
pour un index, procdures pour lesquelles amproclefttype et amprocrighttype sont tous deux quivalents l'opcintype de l'opclass de l'index.
45.6. pg_attrdef
Le catalogue pg_attrdef stocke les valeurs par dfaut des colonnes. Les informations principales des colonnes sont stockes dans
pg_attribute (voir plus loin). Seules les colonnes pour lesquelles une valeur par dfaut est explicitement indique (quand la table
est cre ou quand une colonne est ajoute) ont une entre dans pg_attrdef.
Tableau 45.6. Colonnes de pg_attrdef
Nom
Type
Rfrences
Description
adrelid
oid
pg_class.oid
adnum
int2
pg_attribute.attnum
Numro de la colonne
adbin
pg_node_tree
adsrc
text
Le champ adsrc est historique. Il est prfrable de ne pas l'utiliser parce qu'il ne conserve pas de trace des modifications qui
peuvent affecter la reprsentation de la valeur par dfaut. La compilation inverse du champ adbin (avec pg_get_expr par
exemple) est une meilleure faon d'afficher la valeur par dfaut.
45.7. pg_attribute
Le catalogue pg_attribute stocke les informations concernant les colonnes des tables. Il y a exactement une ligne de pg_attribute
par colonne de table de la base de donnes. (Il y a aussi des attributs pour les index et, en fait, tous les objets qui possdent des entres dans pg_class.)
Le terme attribut, quivalent colonne, est utilis pour des raisons historiques.
Tableau 45.7. Colonnes de pg_attribute
Nom
Type
Rfrences
Description
attrelid
oid
pg_class.oid
attname
name
atttypid
oid
attstattarget
int4
Le nom de la colonne
pg_type.oid
1230
Catalogues systme
Nom
Type
Rfrences
Description
valeur 0 indique qu'aucune statistique ne doit tre
collecte. Une valeur ngative indique d'utiliser
l'objectif de statistiques par dfaut. Le sens exact
d'une valeur positive dpend du type de donnes.
Pour les donnes scalaires, attstattarget est
la fois le nombre de valeurs les plus courantes collecter et le nombre d'histogrammes
crer.
attlen
int2
attnum
int2
Le numro de la colonne. La numrotation des colonnes ordinaires dmarre 1. Les colonnes systme, comme les oid, ont des numros ngatifs
arbitraires.
attndims
int4
attcacheoff
int4
atttypmod
int4
attbyval
bool
attstorage
char
Contient
normalement
une
copie
de
pg_type.typstorage du type de la colonne.
Pour les types de donnes TOASTables, cette valeur peut tre modifie aprs la cration de la colonne pour en contrler les rgles de stockage.
attalign
char
attnotnull
bool
atthasdef
bool
attisdropped
bool
attislocal
bool
attinhcount
int4
Nombre d'anctres directs de la colonne. Une colonne qui a au moins un anctre ne peut tre ni
supprime ni renomme.
1231
Catalogues systme
Nom
Type
Rfrences
Description
attcollation
oid
.o
Le collationnement dfini de la colonne, ou zro si
pg_collationid la colonne n'est pas un type de donnes collationnable.
attacl
aclitem[]
attoptions
text[]
Dans l'entre pg_attribute d'une colonne supprime, atttypid est rinitialise 0 mais attlen et les autres champs copis
partir de pg_type sont toujours valides. Cet arrangement est ncessaire pour s'adapter la situation o le type de donnes de la colonne supprime a t ensuite supprim et qu'il n'existe donc plus de ligne pg_type. attlen et les autres champs peuvent tre utiliss pour interprter le contenu d'une ligne de la table.
45.8. pg_authid
Le catalogue pg_authid contient les informations concernant les identifiants pour les autorisations d'accs aux bases de donnes
(rles). Un rle englobe les concepts d' utilisateur et de groupe . Un utilisateur est essentiellement un rle qui a l'attribut de
connexion (rolcanlogin). Tout rle (avec ou sans rolcanlogin) peut avoir d'autres rles comme membres ; voir
pg_auth_members.
Comme ce catalogue contient les mots de passe, il ne doit pas tre lisible par tout le monde. pg_roles est une vue, lisible par tout le
monde, de pg_authid qui masque le champ du mot de passe.
Chapitre 20, Rles de la base de donnes contient des informations dtailles sur les utilisateurs et sur la gestion des droits.
Comme l'identit des utilisateurs est identique pour tout le cluster de bases de donnes, pg_authid est partag par toutes les bases
du cluster ; il n'existe qu'une seule copie de pg_authid par cluster, non une par base de donnes.
Tableau 45.8. Colonnes de pg_authid
Nom
Type
Description
rolname
name
Nom du rle
rolsuper
bool
rolall
bool
rolcreaterole
bool
rolcreatedb
bool
rolcatupdate
bool
rolcanlogin
bool
rolreplication
bool
rolconnlimit
int4
rolpassword
text
Catalogues systme
Nom
Type
Description
suit pas ce format est suppos non chiffr.
timestamptz
rolvaliduntil
45.9. pg_auth_members
Le catalogue pg_auth_members contient les relations d'appartenance entre les rles. Tout ensemble non circulaire d'appartenances
est autoris.
Parce que les identits de l'utilisateur sont valables sur l'ensemble du cluster, pg_auth_members est partag par toutes les bases de
donnes d'un cluster : il n'existe qu'une seule copie de pg_auth_members par cluster, pas une par base de donnes.
Tableau 45.9. Colonnes de pg_auth_members
Nom
Type
Rfrences
Description
roleid
oid
pg_authid.oid
member
oid
pg_authid.oid
grantor
oid
pg_authid.oid
admin_option
bool
45.10. pg_cast
Le catalogue pg_cast stocke les chemins de conversion de type de donne, qu'il s'agisse de ceux par dfaut ou ceux dfinis avec la
commande CREATE CAST(7).
pg_cast ne reprsente pas toutes les conversions de type que le systme connat, seulement celles qui ne peuvent pas se dduire
partir de rgles gnriques. Par exemple, la conversion entre un domaine et son type de base n'est pas reprsente explicitement
dans pg_cast. Autre exception importante : les conversions automatiques d'entre/sortie , celles ralises en utilisant les propres
fonctions d'entre/sortie du type de donnes pour convertir vers ou partir du text ou des autres types de chanes de caractres, ne
sont pas reprsentes explicitement dans pg_cast.
Tableau 45.10. Colonnes de pg_cast
Nom
Type
Rfrences
Description
castsource
oid
pg_type.oid
casttarget
oid
pg_type.oid
castfunc
oid
pg_proc.oid
castcontext
char
castmethod
char
Indique comment la conversion est effectue. f signifie que la fonction indique dans le champ
castfunc est utilise. i signifie que les fonctions d'entre/sortie sont utilises. b signifie que
les types sont binairement coercibles, et que par
consquent aucune conversion n'est ncessaire.
1233
Catalogues systme
Les fonctions de transtypage listes dans pg_cast doivent toujours prendre le type source de la conversion comme type du premier
argument et renvoyer le type de destination de la conversion comme type de retour. Une fonction de conversion peut avoir jusqu'
trois arguments. Le deuxime argument, s'il est prsent, doit tre de type integer ; il reoit le modificateur de type associ avec le
type de destination ou 1 s'il n'y en a pas. Le troisime argument, s'il est prsent, doit tre de type boolean ; il reoit true si la
conversion est une conversion explicite, false sinon.
Il est possible de crer une entre pg_cast dans laquelle les types source et cible sont identiques si la fonction associe prend plus
d'un argument. De telles entres reprsentent les fonctions de forage de longueur qui forcent la validit des valeurs de ce type
pour une valeur particulire du modificateur de type.
Quand une entre pg_cast possde des types diffrents pour la source et la cible et une fonction qui prend plus d'un argument, le
transtypage et le forage de longueur s'effectuent en une seule tape. Lorsqu'une telle entre n'est pas disponible, le forage vers
un type qui utilise un modificateur de type implique deux tapes, une de transtypage, l'autre pour appliquer le modificateur.
45.11. pg_class
Le catalogue pg_class liste les tables, et peu prs tout ce qui contient des colonnes ou ressemble de prs ou de loin une table.
Cela inclut les index (mais il faut aussi aller voir dans pg_index), les squences, les vues, les types composites et les tables
TOAST ; voir relkind. Par la suite, lorsque l'on parle de relation , on sous-entend tous ces types d'objets. Les colonnes ne
sont pas toutes significatives pour tous les types de relations.
Tableau 45.11. Colonnes de pg_class
Nom
Type
Rfrences
Description
relname
name
relnamespace
oid
pg_namespace.oid
reltype
oid
pg_type.oid
reloftype
oid
pg_type.oid
Pour les tables types, l'OID du type composite sous-jacent. Sinon, 0 dans tous les autres cas.
relowner
oid
pg_authid.oid
Propritaire de la relation.
relam
oid
pg_am.oid
relfilenode
oid
reltablespace
oid
relpages
int4
reltuples
float4
reltoastrelid
oid
pg_class.oid
reltoastidxid
oid
pg_class.oid
relhasindex
bool
Vrai si c'est une table et qu'elle possde (ou possdait encore rcemment) quelque index.
relisshared
bool
1234
Catalogues systme
Nom
Type
Rfrences
Description
donnes du cluster. Seuls certains catalogues systme
(comme pg_database) sont partags.
relpersistence char
p = table permanente, u = table non trace dans les journaux de transactions, t = table temporaire
relkind
char
relnatts
int2
relchecks
int2
relhasoids
bool
relhaspkey
bool
relhasrules
bool
relhastriggers bool
relhassubclass bool
relfrozenxid
xid
Tous les ID de transaction avant celui-ci ont t remplacs par un ID de transaction permanent ( frozen ). Ceci
est utilis pour dterminer si la table doit tre nettoye
(VACUUM) pour viter un bouclage des ID de transaction (ID wraparound) ou pour compacter pg_clog. 0
(InvalidTransactionId) si la relation n'est pas une table.
relacl
aclitem[]
reloptions
text[]
Plusieurs des drapeaux boolens dans pg_class sont maintenus faiblement : la valeur true est garantie s'il s'agit du bon tat, mais
elle pourrait ne pas tre remise false immdiatement quand la condition n'est plus vraie. Par exemple, relhasindex est configure par CREATE INDEX mais n'est jamais remise false par DROP INDEX. C'est VACUUM qui le fera relhasindex s'il
dcouvre que la table n'a pas d'index. Cet arrangement vite des fentres de vulnrabilit et amliore la concurrence.
45.12. pg_constraint
Le catalogue pg_constraint stocke les vrifications, cls primaires, cls uniques, trangres et d'exclusion des tables. (Les
contraintes de colonnes ne sont pas traites de manire particulire. Elles sont quivalentes des contraintes de tables.) Les
contraintes NOT NULL sont reprsentes dans le catalogue pg_attribute, pas ici.
Les triggers de contraintes dfinies par des utilisateurs (crs avec CREATE CONSTRAINT TRIGGER) ont aussi une entre
dans cette table.
Les contraintes de vrification de domaine sont galement stockes dans ce catalogue.
Tableau 45.12. Colonnes de pg_constraint
Nom
Type
conname
name
connamespace
oid
contype
char
Rfrences
Description
Nom de
unique !)
la
contrainte
(pas
ncessairement
.o
OID du namespace qui contient la contrainte.
pg_namespaceid
c = contrainte de vrification, f = contrainte de cl
1235
Catalogues systme
Nom
Type
Rfrences
Description
trangre, p = contrainte de cl primaire, u =
contrainte d'unicit, t = contrainte trigger, x =
contrainte d'exclusion
condeferrable
bool
condeferred
bool
convalidated
bool
conrelid
oid
pg_class.oid
contypid
oid
pg_type.oid
conindid
oid
pg_class.oid
L'index qui force cette contrainte (unique, cl primaire, cl trangre, d'exclusion) ; sinon 0
confrelid
oid
pg_class.oid
confupdtype
char
confdeltype
char
confmatchtype
char
conislocal
bool
Cette contrainte est dfinie localement dans la relation. Notez qu'une contrainte peut tre dfinie localement et hrite simultanment
coninhcount
int4
conkey
int2[]
.a
tt
nu
pg_attributem
confkey
int2[]
.a
tt
nu
pg_attributem
conpfeqop
oid[]
.oi
pg_operatord
conppeqop
oid[]
.oi
pg_operatord
conffeqop
oid[]
.oi
pg_operatord
conexclop
oid[]
.oi
pg_operatord
conbin
pg_node_tree
consrc
text
Catalogues systme
Dans le cas d'une contrainte d'exclusion, conkey est seulement utile pour les lments contraints qui sont de simples rfrences
de colonnes. Dans les autres cas, un zro apparat dans conkey et l'index associ doit tre consult pour dcouvrir l'expression
contrainte. (du coup, conkey a le mme contenu que pg_index.indkey pour l'index.)
Note
consrc n'est pas actualis lors de la modification d'objets rfrencs ; par exemple, il ne piste pas les renommages
de colonnes. Plutt que se fier ce champ, il est prfrable d'utiliser pg_get_constraintdef() pour extraire
la dfinition d'une contrainte de vrification.
Note
pg_class.relchecks doit accepter le mme nombre de contraintes de vrification pour chaque relation.
45.13. pg_collation
Le catalogue pg_collation dcrit les collationnements disponibles, qui sont essentiellement des correspondances entre un nom
SQL et des catgories de locales du systme d'exploitation. Voir Section 22.2, Support des collations pour plus d'informations.
Tableau 45.13. Colonnes de pg_collation
Nom
Type
collname
name
Rfrences
Description
collnamespace
oid
pg_namespace.oid
collowner
oid
pg_authid.oid
Propritaire du collationnement
collencoding
int4
collcollate
name
collctype
name
Nom
du
collationnement
(unique par schma et encodage)
Notez que la cl unique de ce catalogue est (collname, collencoding, collnamespace) et non pas seulement (collname, collnamespace). PostgreSQL ignore habituellement tous les collationnement qui n'ont pas de colonne collencoding gale soit l'encodage de la base de donnes en cours ou -1. La cration de nouvelles entres de mme nom qu'une autre
entre dont collencoding vaut -1 est interdite. Du coup, il suffit d'utiliser un nom SQL qualifi du schma (schma.nom)
pour identifier un collationnement bien que cela ne soit pas unique d'aprs la dfinition du catalogue. Ce catalogue a t dfini ainsi car initdb le remplit au moment de l'initialisation de l'instance avec les entres pour toutes les locales disponibles sur le systme,
donc il doit tre capable de contenir les entres de tous les encodages qui pourraient tre utiliss dans l'instance.
Dans la base de donnes template0, il pourrait tre utile de crer les collationnement dont l'encodage ne correspond pas
l'encodage de la base ded onnes car ils pourraient correspondre aux encodages de bases de donnes cres par la suite partir de
ce modle de base de donnes. Cela doit tre fait manuellement actuellement.
45.14. pg_conversion
Le catalogue pg_conversion dcrit les procdures de conversion de codage. Voir la commande CREATE CONVERSION(7) pour
plus d'informations.
Tableau 45.14. Colonnes de pg_conversion
Nom
Type
conname
name
Rfrences
Description
Nom de la conversion (unique au sein d'un names-
1237
Catalogues systme
Nom
Type
Rfrences
Description
pace)
connamespace
oid
.o
OID du namespace qui contient la conversion.
pg_namespaceid
conowner
oid
pg_authid.oid
conforencoding
int4
ID du codage source
contoencoding
int4
ID du codage de destination
conproc
regproc
condefault
bool
pg_proc.oid
Propritaire de la conversion
Procdure de conversion
Vrai s'il s'agit de la conversion par dfaut
45.15. pg_database
Le catalogue pg_database stocke les informations concernant les bases de donnes disponibles. Celles-ci sont cres avec la commande CREATE DATABASE(7). Consulter le Chapitre 21, Administration des bases de donnes pour les dtails sur la signification de certains paramtres.
Contrairement la plupart des catalogues systme, pg_database est partag par toutes les bases de donnes d'un cluster : il n'y a
qu'une seule copie de pg_database par cluster, pas une par base.
Tableau 45.15. Colonnes de pg_database
Nom
Type
Rfrences
Description
datname
name
datdba
oid
encoding
int4
datcollate
name
datctype
name
datistemplate
bool
datallowconn
bool
datconnlimit
int4
Nombre maximum de connexions concurrentes autorises sur la base de donnes. -1 indique l'absence de limite.
datlastsysoid
oid
datfrozenxid
xid
Tous les ID de transaction avant celui-ci ont t remplacs par un ID de transaction permanent ( frozen ). Ceci
est utilis pour dterminer si la table doit tre nettoye
(VACUUM) pour viter un bouclage des ID de transaction (ID wraparound) ou pour compacter pg_clog.
C'est la valeur minimale des valeurs par table de
pg_class.relfrozenxid.
dattablespace
oid
datacl
aclitem[]
pg_authid.oid
pg_tablespace.oid
1238
Catalogues systme
Nom
Type
Rfrences
Description
dtails.
45.16. pg_db_role_setting
Le catalogue pg_db_role_setting enregistre les valeurs par dfaut qui ont t configures pour les variables de configuration, pour
chaque combinaison de rle et de base.
Contrairement la plupart des catalogues systmes, pg_db_role_setting est partag parmi toutes les bases de donnes de
l'instance : il n'existe qu'une copie de pg_db_role_setting par instance, pas une par base de donnes.
Tableau 45.16. Colonnes de pg_db_role_setting
Nom
Type
Rfrences
Description
setdatabase
oid
pg_database.oid
setrole
oid
pg_authid.oid
setconfig
text[]
45.17. pg_default_acl
Le catalogue pg_default_acl enregistre les droits initiaux affecter aux nouveaux objets crs.
Tableau 45.17. Colonnes de pg_default_acl
Nom
Type
Rfrences
Description
defaclrole
oid
pg_authid.oid
defaclnamespace
oid
pg_namespace.oid
defaclobjtype
char
defaclacl
aclitem[]
Une entre pg_default_acl affiche les droits initiaux affects un objet appartenant l'utilisateur indiqu. Il existe actuellement
deux types d'entres : des entres globales avec defaclnamespace = 0, et des entres par schma qui rfrencent un
schma. Si une entre globale est prsente, alors elle surcharge les droits par dfaut cods en dur pour le type de l'objet. Une entre par schma, si prsente, reprsente les droits ajouter aux droits par dfaut globaux ou aux droits cods en dur.
Notez que quand une entre de droits (ACL) dans un autre catalogue est NULL, cela veut dire que les droits par dfaut cods en
dur sont utiliss pour cet objet, et non pas ce qui pourrait tre dans pg_default_acl ce moment. pg_default_acl est seulement
consult durant la cration de l'objet.
45.18. pg_depend
Le catalogue pg_depend enregistre les relations de dpendances entre les objets de la base de donnes. Cette information permet
la commande DROP de trouver les objets qui doivent tre supprims conjointement par la commande DROP CASCADE ou au
contraire empchent la suppression dans le cas de DROP RESTRICT.
1239
Catalogues systme
Voir aussi pg_shdepend, qui remplit la mme fonction pour les dpendances impliquant des objets partags sur tout le cluster.
Tableau 45.18. Colonnes de pg_depend
Nom
Type
Rfrences
Description
classid
oid
pg_class.oid
objid
oid
objsubid
int4
refclassid
oid
pg_class.oid
refobjid
oid
refobjsubid
int4
Pour une colonne de table, ce champ indique le numro de colonne (les champs refobjid et refclassid font rfrence la table elle mme).
Pour tous les autres types d'objets, cette colonne
est 0.
deptype
char
Pour une colonne de table, ce champ indique le numro de colonne (les champs objid et classid
font rfrence la table elle-mme). Pour tous les
autres types d'objets, cette colonne est 0.
Dans tous les cas, une entre de pg_depend indique que l'objet de rfrence ne peut pas tre supprim sans supprimer aussi l'objet
dpendant. Nanmoins, il y a des nuances, identifies par deptype :
DEPENDENCY_NORMAL (n)
Une relation normale entre des objets crs sparment. L'objet dpendant peut tre supprim sans affecter l'objet rfrenc.
Ce dernier ne peut tre supprim qu'en prcisant l'option CASCADE, auquel cas l'objet dpendant est supprim lui-aussi.
Exemple : une colonne de table a une dpendance normale avec ses types de donnes.
DEPENDENCY_AUTO (a)
L'objet dpendant peut tre supprim sparment de l'objet rfrenc, mais il l'est automatiquement avec la suppression de ce
dernier, quel que soit le mode RESTRICT ou CASCADE. Exemple : une contrainte nomme sur une table est auto-dpendante
de la table, elle est automatiquement supprime avec celle-ci.
DEPENDENCY_INTERNAL (i)
L'objet dpendant est cr conjointement l'objet rfrenc et fait partie intgrante de son implantation interne. Un DROP de
l'objet dpendant est interdit (l'utilisateur est averti qu'il peut effectuer un DROP de l'objet rfrenc la place). La suppression de l'objet rfrenc est propage l'objet dpendant que CASCADE soit prcis ou non. Exemple : un trigger cr pour
vrifier une contrainte de cl trangre est rendu dpendant de l'entre de la contrainte dans pg_constraint.
DEPENDENCY_EXTENSION (e)
L'objet dpendant est un membre de l'extension qui est l'objet rfrenc (voir pg_extension). L'objet dpendant peut tre supprim seulement via l'instruction DROP EXTENSION sur l'objet rfrence. Fonctionnellement, ce type de dpendance agit
de la mme faon qu'une dpendance interne mais il est spar pour des raisons de clart et pour simplifier pg_dump.
DEPENDENCY_PIN (p)
Il n'y a pas d'objet dpendant ; ce type d'entre signale que le systme lui-mme dpend de l'objet rfrenc, et donc que
l'objet ne doit jamais tre supprim. Les entres de ce type sont cres uniquement par initdb. Les colonnes de l'objet dpendant contiennent des zros.
D'autres types de dpendance peuvent apparatre dans le futur.
45.19. pg_description
Le catalogue pg_description stocke les descriptions (commentaires) optionnelles de chaque objet de la base de donnes. Les descriptions sont manipules avec la commande COMMENT(7) et lues avec les commandes \d de psql. pg_description contient les
descriptions prdifinies de nombreux objets internes.
Voir aussi pg_shdescription, qui offre la mme fonction pour les descriptions des objets partags au sein d'un cluster.
1240
Catalogues systme
Nom
Type
Rfrences
Description
objoid
oid
classoid
oid
pg_class.oid
objsubid
int4
description
text
45.20. pg_enum
Le catalogue systme pg_enum contient des entres indiquant les valeurs et labels de chaque type enum. La reprsentation interne
d'une valeur enum donne est en fait l'OID de sa ligne associe dans pg_enum.
Tableau 45.20. Colonnes de pg_enum
Nom
Type
Rfrences
Description
enumtypid
oid
pg_type.oid
enumsortorder
float4
enumlabel
name
Les OID des lignes de pg_enum suivent une rgle spciale : les OID pairs sont garantis tris de la mme faon que l'ordre de tri de
leur type enum. Autrement dit, si deux OID pairs appartiennent au mme type enum, l'OID le plus petit doit avoir la plus petite valeur dans la colonne enumsortorder. Les valeurs d'OID impaires n'ont pas d'ordre de tri. Cette rgle permet que les routines de
comparaison d'enum vitent les recherches dans les catalogues dans la plupart des cas standards. Les routines qui crent et modifient les types enum tentent d'affecter des OID paires aux valeurs enum tant que c'est possible.
Quand un type enum est cr, ses membres sont affects dans l'ordre des positions 1..n. Les membres ajouts par la suite doivent
se voir affecter des valeurs ngatives ou fractionnelles de enumsortorder. Le seul prrequis pour ces valeurs est qu'elles soient
correctement tries et uniques pour chaque type enum.
45.21. pg_extension
Le catalogue pg_extension stocke les informations sur les extensions installes. Voir Section 35.15, Empaqueter des objets dans
une extension pour des dtails sur les extensions.
Tableau 45.21. Colonnes de pg_extension
Nom
Type
Rfrences
Description
extname
name
extowner
oid
pg_authid.oid
Propritaire de l'extension
extnamespace
oid
pg_namespace.oid
extrelocatable
bool
extversion
text
Nom de
l'extension
extconfig
oid[]
Nom de l'extension
pg_class.oid
1241
la
version
de
Catalogues systme
Nom
Type
Rfrences
Description
ration de l'extension, ou NULL
si aucun
extcondition
text[]
Notez que, contrairement aux autres catalogues ayant une colonne de schma , extnamespace n'est pas le schma contenant
l'extension. Les noms des extensions ne sont jamais qualifis d'un schma. En fait, extnamespace indique le schma qui
contient la plupart ou tous les objets de l'extension. Si extrelocatable vaut true, alors ce schma doit en fait contenir tous les
objets de l'extension, dont le nom peut tre qualifi avec le nom du schma.
45.22. pg_foreign_data_wrapper
Le catalogue pg_foreign_data_wrapper stocke les dfinitions des wrappers de donnes distantes. Un wrapper de donnes distantes
est le mcanisme par lequel des donnes externes, stockes sur des serveurs distants, sont accdes.
Tableau 45.22. Colonnes de pg_foreign_data_wrapper
Nom
Type
Rfrences
Description
fdwname
name
fdwowner
oid
pg_authid.oid
Propritaire du wrapper de
donnes distantes
fdwhandler
oid
pg_proc.oid
fdwvalidator
oid
pg_proc.oid
Rfrence le validateur de
fonction qui est responsable de
vrifier la validit des options
passes au wrapper de donnes
distantes, ainsi que les options
des serveurs distants et les correspondances utilisateurs du
wrapper de donnes distantes.
Zro si aucun validateur n'est
fourni.
fdwacl
aclitem[]
Droits
d'accs
;
voir
GRANT(7) et REVOKE(7)
pour plus de dtails
fdwoptions
text[]
45.23. pg_foreign_server
Le catalogue pg_foreign_server stocke les dfinitions de serveurs distants. Un serveur distant dcrit une source de donnes externes, comme un serveur distant. Les serveurs distants sont accds via des wrappers de donnes distantes.
Tableau 45.23. Colonnes pg_foreign_server
1242
Catalogues systme
Nom
Type
Refrence
Description
srvname
name
srvowner
oid
pg_authid.oid
srvfdw
oid
srvtype
text
srvversion
text
srvacl
aclitem[]
Droits
d'accs
;
voir
GRANT(7) et REVOKE(7)
pour les dtails
srvoptions
text[]
45.24. pg_foreign_table
Le catalogue pg_foreign_table contient des informations supplmentaires sur les tables distantes. Une table distante est principalement reprsente par une entre dans le catalogue pg_class, comme toute table ordinaire. Son entre dans pg_foreign_table
contient les informations pertinentes aux seules tables distantes, et pas aux autres types de relation.
Tableau 45.24. Colonnes de pg_foreign_table
Nom
Type
Rfrences
Description
ftrelid
oid
pg_class.oid
ftserver
oid
ftoptions
text[]
45.25. pg_index
Le catalogue pg_index contient une partie des informations concernant les index. Le reste se trouve pour l'essentiel dans pg_class.
Tableau 45.25. Colonnes de pg_index
Nom
Type
Rfrences
Description
indexrelid
oid
pg_class.oid
indrelid
oid
pg_class.oid
indnatts
int2
Nombre
de
colonnes
pg_class.relnatts)
indisunique
bool
indisprimary
bool
Vrai s'il s'agit de l'index de cl primaire de la table (indisunique doit toujours tre vrai quand ce champ
l'est.)
indisexclusion bool
bool
Si vrai, la vrification de l'unicit est force immdiatement lors de l'insertion (inutile si indisunique ne
vaut pas true)
indimmediate
1243
de
l'index
(duplique
Catalogues systme
Nom
Type
Rfrences
Description
indisclustered bool
indisvalid
bool
indcheckxmin
bool
indisready
bool
indkey
int2vector
pg_attribute.attnum
indcollation
oidvector
pg_collation.oid
indclass
oidvector
pg_opclass.oid
indoption
int2vector
indexprs
pg_node_tree
Arbres d'expression (en reprsentation nodeToString()) pour les attributs d'index qui ne sont pas de
simples rfrences de colonnes. Il s'agit d'une liste qui
contient un lment par entre 0 dans indkey. Nul si
tous les attributs d'index sont de simples rfrences.
indpred
pg_node_tree
Arbre d'expression (en reprsentation nodeToString()) pour les prdicats d'index partiels. Nul s'il ne
s'agit pas d'un index partiel.
45.26. pg_inherits
Le catalogue pg_alls enregistre l'information sur la hirarchie d'hritage des tables. Il existe une entre pour chaque table enfant
direct dans la base de donnes. (L'hritage indirect peut tre dtermin en suivant les chanes d'entres.)
Tableau 45.26. Colonnes de pg_alls
Nom
Type
Rfrences
Description
inhrelid
oid
pg_class.oid
inhparent
oid
pg_class.oid
inhseqno
int4
1244
Catalogues systme
45.27. pg_language
Le catalogue pg_language enregistre les langages utilisables pour l'criture de fonctions ou procdures stockes. Voir CREATE
LANGUAGE(7) et dans le Chapitre 38, Langages de procdures pour plus d'information sur les gestionnaires de langages.
Tableau 45.27. Colonnes de pg_language
Nom
Type
Rfrences
Description
lanname
name
lanowner
oid
lanispl
bool
lanpltrusted
bool
lanplcallfoid
oid
pg_proc.oid
laninline
oid
pg_proc.oid
lanvalidator
oid
pg_proc.oid
Ceci rfrence une fonction de validation de langage, en charge de vrifier la syntaxe et la validit
des nouvelles fonctions lors de leur cration. 0 si
aucun validateur n'est fourni.
lanacl
aclitem[]
Nom du langage
pg_authid.oid
Propritaire du langage
45.28. pg_largeobject
Le catalogue pg_largeobject contient les donnes qui dcrivent les objets volumineux (large objects). Un objet volumineux est
identifi par un OID qui lui est affect lors de sa cration. Chaque objet volumineux est coup en segments ou pages suffisamment petits pour tre facilement stocks dans des lignes de pg_largeobject. La taille de donnes par page est dfinie par LOBLKSIZE, qui vaut actuellement BLCKSZ/4, soit habituellement 2 Ko).
Avant PostgreSQL 9.0, il n'existait pas de droits associs aux Large Objects . Du coup, pg_largeobject tait lisible par tout le
monde et pouvait tre utilis pour obtenir les OID (et le contenu) de tous les Large Objects du systme. Ce n'est plus le cas ;
utilisez pg_largeobject_metadata pour obtenir une liste des OID des Large Objects .
Tableau 45.28. Colonnes de pg_largeobject
Nom
Type
References
Description
loid
oid
pg_largeobject_metadata.oid
pageno
int4
data
bytea
Catalogues systme
Nom
Type
References
Description
de LOBLKSIZE mais peut
faire moins.
Chaque ligne de pg_largeobject contient les donnes d'une page de l'objet volumineux, en commenant au dcalage d'octet (pageno * LOBLKSIZE) dans l'objet. Ceci permet un stockage diffus : des pages peuvent manquer, d'autres faire moins de LOBLKSIZE octets mme s'il ne s'agit pas de la dernire de l'objet. Les parties manquantes sont considres comme des suites de zro.
45.29. pg_largeobject_metadata
Le catalogue pg_largeobject_metadata contient des mta-donnes associes aux Larges Objects . Les donnes des Larges Objects sont rellement stockes dans pg_largeobject.
Tableau 45.29. Colonnes de pg_largeobject_metadata
Nom
Type
Description
lomowner
oid
pg_authid.oid
lomacl
aclitem[]
45.30. pg_namespace
Le catalogue pg_namespace stocke les namespace. Un namespace est la structure sous-jacente aux schmas SQL : chaque namespace peut contenir un ensemble spar de relations, types, etc. sans qu'il y ait de conflit de nommage.
Tableau 45.30. Colonnes de pg_namespace
Nom
Type
nspname
name
nspowner
oid
nspacl
aclitem[]
Rfrences
Description
Nom du namespace
pg_authid.oid
Propritaire du namespace
Droits d'accs ; voir GRANT(7) et REVOKE(7)
pour les dtails.
45.31. pg_opclass
Le catalogue pg_opclass dfinit les classes d'oprateurs de mthodes d'accs aux index. Chaque classe d'oprateurs dfinit la smantique pour les colonnes d'index d'un type particulier et d'une mthode d'accs particulire. Une classe d'oprateur dfinit essentiellement qu'une famille d'oprateur particulier est applicable un type de donnes indexable particulier. L'ensemble des oprateurs de la famille actuellement utilisables avec la colonne indexe sont tous ceux qui acceptent le type de donnes de la colonne
en tant qu'entre du ct gauche.
Les classes d'oprateurs sont longuement dcrites dans la Section 35.14, Interfacer des extensions d'index .
Tableau 45.31. Colonnes de pg_opclass
Nom
Type
Rfrences
Description
opcmethod
oid
pg_am.oid
opcname
name
opcnamespace
oid
.o
Namespace de la classe d'oprateurs
pg_namespaceid
opcowner
oid
pg_authid.oid
opcfamily
oid
.oi
pg_opfamilyd
opcintype
oid
pg_type.oid
1246
Catalogues systme
Nom
Type
opcdefault
bool
opckeytype
oid
Rfrences
Description
Vrai si la classe d'oprateurs est la classe par dfaut pour opcintype
pg_type.oid
L'opcmethod d'une classe d'oprateurs doit concider avec l'opfmethod de la famille d'oprateurs qui le contient. Il ne doit pas
non plus y avoir plus d'une ligne pg_opclass pour laquelle opcdefault est vrai, quelque soit la combinaison de opcmethod et opcintype.
45.32. pg_operator
Le catalogue pg_operator stocke les informations concernant les oprateurs. Voir la commande CREATE OPERATOR(7) et la
Section 35.12, Oprateurs dfinis par l'utilisateur pour plus d'informations.
Tableau 45.32. Colonnes de pg_operator
Nom
Type
oprname
name
Rfrences
Description
oprnamespace
oid
.o
OID du namespace qui contient l'oprateur
pg_namespaceid
oprowner
oid
pg_authid.oid
oprkind
char
oprcanmerge
bool
oprcanhash
bool
oprleft
oid
pg_type.oid
oprright
oid
pg_type.oid
oprresult
oid
pg_type.oid
Type du rsultat
oprcom
oid
.oi
pg_operatord
oprnegate
oid
.oi
pg_operatord
oprcode
regproc
pg_proc.oid
oprrest
regproc
pg_proc.oid
oprjoin
regproc
pg_proc.oid
Nom de l'oprateur
Propritaire de l'oprateur
Les colonnes inutilises contiennent des zros. oprleft vaut, par exemple, 0 pour un oprateur prfixe.
45.33. pg_opfamily
Le catalogue pg_opfamily dfinit les familles d'oprateur. Chaque famille d'oprateur est un ensemble d'oprateurs et de routines
de support associes codant les smantiques dfinies pour une mthode d'accs particulire de l'index. De plus, les oprateurs
d'une famille sont tous compatibles , au sens dfini par la mthode d'accs. Le concept de famille d'oprateur autorise
l'utilisation des oprateurs inter-type de donnes avec des index et l'utilisation des smantiques de mthode d'accs.
Les familles d'oprateur sont dcrites dans Section 35.14, Interfacer des extensions d'index .
Tableau 45.33. Colonnes de pg_opfamily
Nom
Type
Rfrences
Description
opfmethod
oid
pg_am.oid
1247
Catalogues systme
Nom
Type
Rfrences
Description
opfname
name
opfnamespace
oid
.o
namespace de la famille d'oprateur
pg_namespaceid
opfowner
oid
pg_authid.oid
La majorit des informations dfinissant une famille d'oprateur n'est pas dans la ligne correspondante de pg_opfamily mais dans
les lignes associes de pg_amop, pg_amproc, et pg_opclass.
45.34. pg_pltemplate
Le catalogue pg_pltemplate stocke les informations squelettes ( template ) des langages procduraux. Un squelette de langage
permet la cration de ce langage dans une base de donnes particulire l'aide d'une simple commande CREATE LANGUAGE,
sans qu'il soit ncessaire de spcifier les dtails de l'implantation.
Contrairement la plupart des catalogues systme, pg_pltemplate est partag par toutes les bases de donnes d'un cluster : il
n'existe qu'une seule copie de pg_pltemplate par cluster, et non une par base de donnes. L'information est de ce fait accessible
toute base de donnes.
Tableau 45.34. Colonnes de pg_pltemplate
Nom
Type
Description
tmplname
name
tmpltrusted
boolean
tmpldbacreate
boolean
tmplhandler
text
tmplinline
text
tmplvalidator
text
tmpllibrary
text
tmplacl
aclitem[]
Il n'existe actuellement aucune commande de manipulation des modles de langages procduraux ; pour modifier l'information intgre, un superutilisateur doit modifier la table en utilisant les commandes INSERT, DELETE ou UPDATE habituelles.
Note
Il est probable que pg_pltemplate sera supprim dans une prochaine version de PostgreSQL, pour conserver cette
information des langages de procdure dans leur scripts d'installation respectifs.
45.35. pg_proc
Le catalogue pg_proc stocke les informations concernant les fonctions (ou procdures). Voir CREATE FUNCTION(7) et Section 35.3, Fonctions utilisateur pour plus d'informations.
Cette table contient des donnes sur les fonctions d'agrgat et les fonctions simples. Si proisagg est vrai, il doit y avoir une
ligne correspondante dans pg_aggregate.
Tableau 45.35. Colonnes de pg_proc
Nom
Type
Rfrences
Description
proname
name
pronamespace
oid
.o
OID du namespace auquel appartient la fonction
pg_namespaceid
proowner
oid
pg_authid.oid
Nom de la fonction
1248
Propritaire de la fonction
Catalogues systme
Nom
Type
Rfrences
Description
prolang
oid
.oi
pg_languaged
procost
float4
prorows
float4
provariadic
oid
proisagg
bool
proiswindow
bool
prosecdef
bool
proisstrict
bool
proretset
bool
provolatile
char
Indique si le rsultat de la fonction dpend uniquement de ses arguments ou s'il est affect par des
facteurs externes. Il vaut i pour les fonctions
immuables , qui, pour un jeu de paramtres
identique en entre, donnent toujours le mme rsultat. Il vaut s pour les fonctions stables , dont
le rsultat (pour les mmes paramtres en entre)
ne change pas au cours du parcours (de table). Il
vaut v pour les fonctions volatiles , dont le rsultat peut varier tout instant. (v est galement
utilis pour les fonctions qui ont des effets de bord,
afin que les appels ces fonctions ne soient pas
optimiss.)
pronargs
int2
pronargdefaults
int2
prorettype
oid
pg_type.oid
proargtypes
oidvector
pg_type.oid
Un tableau contenant les types de donnes des arguments de la fonction. Ceci n'inclut que les arguments en entre (dont les arguments INOUT et
VARIADIC) et reprsente, du coup, la signature
d'appel de la fonction.
proallargtypes
oid[]
pg_type.oid
Un tableau contenant les types de donnes des arguments de la fonction. Ceci inclut tous les arguments (y compris les arguments OUT et INOUT) ;
nanmoins, si tous les arguments sont IN, ce
champ est NULL. L'indice commence 1 alors
que, pour des raisons historiques, proargtypes
commence 0.
proargmodes
char[]
pg_type.oid
Type des donnes des lments du tableau de paramtres variadic, ou zro si la fonction n'a pas de
paramtres variadiques.
Catalogues systme
Nom
Type
Rfrences
Description
largtypes, et non celles de proargtypes.
proargnames
text[]
proargdefaults
pg_node_tree
Arbres d'expression (en reprsentation nodeToString()) pour les valeurs par dfaut. C'est une
liste avec pronargdefaults lments, correspondant aux N derniers arguments d'entre
(c'est--dire, les N dernires positions proargtypes). Si aucun des arguments n'a de valeur par
dfaut, ce champ vaudra null.
prosrc
text
probin
text
proconfig
text[]
proacl
aclitem[]
Pour les fonctions compiles, intgres ou charges dynamiquement, prosrc contient le nom de la fonction en langage C
(symbole de lien). Pour tous les autres types de langages, prosrc contient le code source de la fonction. probin est inutilis,
sauf pour les fonctions C charges dynamiquement, pour lesquelles il donne le nom de fichier de la bibliothque partage qui
contient la fonction.
45.36. pg_rewrite
Le catalogue pg_rewrite stocke les rgles de rcriture pour les tables et les vues.
Tableau 45.36. Colonnes de pg_rewrite
Nom
Type
Rfrences
Description
rulename
name
ev_class
oid
ev_attr
int2
ev_type
char
ev_enabled
char
is_instead
bool
ev_qual
pg_node_tree
Nom de la rgle
pg_class.oid
1250
Catalogues systme
Nom
Type
Rfrences
Description
tation nodeToString()) pour la condition qualifiant la rgle.
ev_action
pg_node_tree
Arbre de requte (sous la forme d'une reprsentation nodeToString()) pour l'action de la rgle.
Note
pg_class.relhasrules doit tre vrai si une table possde une rgle dans ce catalogue.
45.37. pg_seclabel
Le catalogue pg_seclabel stocke les informations sur les labels de scurit des objets de la base de donnes. Les labels de scurit
peuvent tre manipuls avec la commande SECURITY LABEL(7). Pour visualiser plus facilement les labels de scurit, voir Section 45.61, pg_seclabels .
Tableau 45.37. Colonnes de pg_seclabel
Nom
Type
Rfrences
Description
objoid
oid
classoid
oid
pg_class.oid
objsubid
int4
provider
text
label
text
45.38. pg_shdepend
Le catalogue pg_shdepend enregistre les relations de dpendance entre les objets de la base de donnes et les objets partags,
comme les rles. Cette information permet PostgreSQL de s'assurer que tous ces objets sont drfrencs avant toute tentative
de suppression.
Voir aussi pg_depend, qui ralise une fonction similaire pour les dpendances impliquant les objets contenus dans une seule base
de donnes.
Contrairement la plupart des catalogues systme, pg_shdepend est partag par toutes les bases de donnes d'un cluster : il
n'existe qu'une seule copie de pg_shdepend par cluster, pas une par base de donnes.
Tableau 45.38. Colonnes de pg_shdepend
Nom
Type
Rfrences
Description
dbid
oid
.oi
pg_databased
classid
oid
pg_class.oid
objid
oid
1251
Catalogues systme
Nom
Type
Rfrences
Description
objsubid
int4
refclassid
oid
pg_class.oid
refobjid
oid
deptype
char
Pour une colonne de table, c'est le numro de colonne (les objid et classid font rfrence la
table elle-mme). Pour tous les autres types
d'objets, cette colonne vaut zro
Dans tous les cas, une entre pg_shdepend indique que l'objet rfrenc ne peut pas tre supprim sans supprimer aussi l'objet dpendant. Nanmoins, il existe quelques diffrences identifies par le deptype :
SHARED_DEPENDENCY_OWNER (o)
L'objet rfrenc (qui doit tre un rle) est le propritaire de l'objet dpendant.
SHARED_DEPENDENCY_ACL (a)
L'objet rfrenc (qui doit tre un rle) est mentionn dans la liste de contrle des accs (ACL, acronyme de access control
list) de l'objet dpendant. (Une entre SHARED_DEPENDENCY_ACL n'est pas cre pour le propritaire de l'objet car ce
dernier a toujours une entre SHARED_DEPENDENCY_OWNER.)
SHARED_DEPENDENCY_PIN (p)
Il n'existe pas d'objet dpendant ; ce type d'entre est un signal indiquant que le systme lui-mme dpend de l'objet rfrenc
et que, cet objet ne doit donc jamais tre supprim. Les entres de ce type ne sont cres que par initdb. Les colonnes pour
l'objet dpendant contiennent des zros.
D'autres types de dpendances peuvent s'avrer ncessaires dans le futur. La dfinition actuelle ne supporte que les rles comme
objets rfrencs.
45.39. pg_shdescription
Le catalogue pg_shdescription stocke les descriptions optionelles (commentaires) des objets partags de la base. Les descriptions
peuvent tre manipules avec la commande COMMENT(7) et visualises avec les commandes \d de psql.
Voir aussi pg_description, qui assure les mmes fonctions, mais pour les objets d'une seule base.
Contrairement la plupart des catalogues systmes, pg_shdescription est partage par toutes les bases d'un cluster : il n'existe
qu'une seule copie de pg_shdescription par cluster, et non une par base.
Tableau 45.39. Colonnes de pg_shdescription
Nom
Type
Rfrences
Description
objoid
oid
classoid
oid
pg_class.oid
description
text
45.40. pg_statistic
Le catalogue pg_statistic stocke des donnes statistiques sur le contenu de la base de donnes. Les entres sont cres par ANALYZE(7), puis utilises par le planificateur de requtes. Les donnes statistiques sont, par dfinition des approximations, mme si
elles sont jour.
D'habitude, il existe une entre, avec staall = false, pour chaque colonne de table qui a t analyse. Si la table a des enfants,
une seconde entre avec staall = true est aussi cr. Cette ligne reprsente les statistiques de la colonne sur l'arbre d'hritage,
autrement dit les statistiques pour les donnes que vous voyez avec SELECT colonne FROM table*, alors que la ligne
staall = false reprsente le rsultat de SELECT column FROM ONLY table.
1252
Catalogues systme
pg_statistic stocke aussi les donnes statistiques des valeurs des expressions d'index. Elles sont dcrites comme si elles taient de
vraies colonnes ; en particulier, starelid rfrence l'index. Nanmoins, aucune entre n'est effectue pour une colonne d'index
ordinaire sans expression car cela est redondant avec l'entre correspondant la colonne sous-jacente de la table. Actuellement, les
entres pour les expressions d'index ont toujours staall = false.
Comme des statistiques diffrentes peuvent tre appropries pour des types de donnes diffrents, pg_statistic ne fait qu'un minimum de suppositions sur les types de statistiques qu'il stocke. Seules des statistiques extrmement gnrales (comme les valeurs
NULL) ont des colonnes ddies. Tout le reste est stock dans des connecteurs , groupes de colonnes associes dont le contenu
est identifi par un numro de code dans l'une des colonnes du connecteur. Pour plus d'information, voir src/include/catalog/pg_statistic.h.
pg_statistic ne doit pas tre lisible par le public, car mme les donnes statistiques sont sensibles. (Exemple : les valeurs maximales et minimales d'une colonne de salaire peuvent tre intressantes). pg_stats est une vue sur pg_statistic accessible tous, qui
n'expose que les informations sur les tables accessibles l'utilisateur courant.
Tableau 45.40. Colonnes de pg_statistic
Nom
Type
Rfrences
Description
starelid
oid
pg_class.oid
staattnum
int2
.a
tt
nu
pg_attributem
staall
bool
Si vrai, les statistiques incluent les colonnes enfants de l'hritage, pas uniquement les valeurs de la
relation spcifie
stanullfrac
float4
stawidth
int4
stadistinct
float4
stakindN
int2
staopN
oid
stanumbersN
float4[]
stavaluesN
anyarray
.oi
pg_operatord
1253
Oprateur utilis pour driver les statistiques stockes dans le connecteur numro N. Par
exemple, un connecteur d'histogramme montre
l'oprateur <, qui dfinit l'ordre de tri des donnes.
Catalogues systme
45.41. pg_tablespace
Le catalogue pg_tablespace enregistre les informations des tablespaces disponibles. Les tables peuvent tre places dans des tablespaces particuliers pour faciliter l'administration des espaces de stockage.
Contrairement la plupart des catalogues systme, pg_tablespace est partage par toutes les bases de donnes du cluster : il n'y a
donc qu'une copie de pg_tablespace par cluster, et non une par base.
Tableau 45.41. Colonnes de pg_tablespace
Nom
Type
Rfrences
Description
spcname
name
spcowner
oid
spclocation
text
spcacl
aclitem[]
spcoptions
text[]
Nom du tablespace
pg_authid.oid
Propritaire du tablespace,
l'utilisateur qui l'a cr
habituellement
45.42. pg_trigger
Le catalogue pg_trigger stocke les informations concernant les dclencheurs des tables et des vues. Voir la commande CREATE
TRIGGER(7) pour plus d'informations.
Tableau 45.42. Colonnes de pg_trigger
Nom
Type
Rfrences
Description
tgrelid
oid
pg_class.oid
tgname
name
tgfoid
oid
tgtype
int2
tgenabled
char
tgisinternal
bool
tgconstrrelid
oid
pg_class.oid
tgconstrindid
oid
pg_class.oid
tgconstraint
oid
.
L'entre pg_constraint associ au trigger, si elle
o
existe
i
pg_constraintd
tgdeferrable
bool
tginitdeferred
bool
1254
Fonction appeler
Catalogues systme
Nom
Type
Rfrences
Description
tgnargs
int2
tgattr
int2vector
tgargs
bytea
tgqual
pg_node_tree
Actuellement, les triggers spcifiques par colonne sont supports seulement pour les vnements UPDATE et, du coup, tgattr
est valable seulement pour ce type d'vnements. tgtype pourrait contenir des informations pour d'autres types d'vnement
mais ils sont supposs valides pour la table complte, quel que soit le contenu de tgattr.
Note
Quand tgconstraint est diffrent de zro, tgconstrrelid, tgconstrindid, tgdeferrable et tginitdeferred sont grandement redondants avec l'entre pg_constraint rfrence. Nanmoins, il est possible
qu'un trigger non dferrable soit associ une contrainte dferrable : les contraintes de cl trangre peuvent avoir
quelques triggers dferrables et quelques triggers non dferrables.
Note
pg_class.relhastriggers doit valoir true si la relation possde au moins un trigger dans ce catalogue.
45.43. pg_ts_config
Le catalogue pg_ts_config contient des entres reprsentant les configurations de la recherche plein texte. Une configuration spcifie un analyseur et une liste de dictionnaires utiliser pour chacun des types d'lments en sortie de l'analyseur. L'analyseur est
prsent dans l'entre de pg_ts_config mais la correspondance lment/dictionnaire est dfinie par des entres supplmentaires
dans pg_ts_config_map.
Les fonctionnalits de recherche plein texte de PostgreSQL sont expliques en dtail dans Chapitre 12, Recherche plein texte.
Tableau 45.43. Colonnes de pg_ts_config
Nom
Type
Rfrences
Description
cfgname
name
cfgnamespace
oid
.o
OID du namespace qui contient la configuration
pg_namespaceid
cfgowner
oid
pg_authid.oid
cfgparser
oid
.o
OID de l'analyseur pour la configuration
pg_ts_parserid
Nom de la configuration
Propritaire de la configuration
45.44. pg_ts_config_map
Le catalogue pg_ts_config_map contient des entres prsentant les dictionnaires de recherche plein texte consulter et l'ordre de
consultation, pour chaque type de lexme en sortie de chaque analyseur de configuration.
Les fonctionnalits de la recherche plein texte de PostgreSQL sont expliques en dtail dans Chapitre 12, Recherche plein texte.
Tableau 45.44. Colonnes de pg_ts_config_map
1255
Catalogues systme
Nom
Type
Rfrences
Description
mapcfg
oid
.o
OID de l'entre pg_ts_config qui possde l'entre
pg_ts_configid
maptokentype
integer
mapseqno
integer
mapdict
oid
45.45. pg_ts_dict
Le catalogue pg_ts_dict contient des entres dfinissant les dictionnaires de recherche plein texte. Un dictionnaire dpend d'un
modle de recherche plein texte qui spcifie toutes les fonctions d'implantation ncessaires ; le dictionnaire lui-mme fournit des
valeurs pour les paramtres utilisateur supports par le modle. Cette division du travail permet la cration de dictionnaires par des
utilisateurs non privilgis. Les paramtres sont indiqus par une chane, dictinitoption, dont le format et la signification
dpendent du modle.
Les fonctionnalits de la recherche plein texte de PostgreSQL sont expliques en dtail dans Chapitre 12, Recherche plein texte.
Tableau 45.45. Colonnes de pg_ts_dict
Nom
Type
Rfrences
Description
dictname
name
dictnamespace
oid
pg_namespace.oid
dictowner
oid
pg_authid.oid
Propritaire du dictionnaire
dicttemplate
oid
pg_ts_template.oid
dictinitoption
text
45.46. pg_ts_parser
Le catalogue pg_ts_parser contient des entres dfinissant les analyseurs de la recherche plein texte. Un analyseur est responsable
du dcoupage du texte en entre en lexmes et de l'assignation d'un type d'lment chaque lexme. Puisqu'un analyseur doit tre
cod l'aide de fonctions crites en langage C, la cration de nouveaux analyseurs est restreinte aux superutilisateurs des bases de
donnes.
Les fonctionnalits de la recherche plein texte de PostgreSQL sont expliques en dtail dans Chapitre 12, Recherche plein texte.
Tableau 45.46. Colonnes de pg_ts_parser
Nom
Type
prsname
name
Rfrences
Description
prsnamespace
oid
.o
OID du namespace qui contient l'analyseur
pg_namespaceid
prsstart
regproc
pg_proc.oid
prstoken
regproc
pg_proc.oid
prsend
regproc
pg_proc.oid
prsheadline
regproc
pg_proc.oid
prslextype
regproc
pg_proc.oid
45.47. pg_ts_template
1256
Catalogues systme
Le catalogue pg_ts_template contient des entres dfinissant les modles de recherche plein texte. Un modle est le squelette
d'implantation d'une classe de dictionnaires de recherche plein texte. Puisqu'un modle doit tre cod l'aide de fonctions codes
en langage C, la cration de nouveaux modles est restreinte aux superutilisateurs des bases de donnes.
Les fonctionnalits de la recherche plein texte de PostgreSQL sont expliques en dtail dans Chapitre 12, Recherche plein texte.
Tableau 45.47. Colonnes de pg_ts_template
Nom
Type
Rfrences
Description
tmplname
name
tmplnamespace
oid
.o
OID du namespace qui contient le modle
pg_namespaceid
tmplinit
regproc
pg_proc.oid
tmpllexize
regproc
pg_proc.oid
45.48. pg_type
Le catalogue pg_type stocke les informations concernant les types de donnes. Les types basiques et d'numration (types scalaires) sont crs avec la commande CREATE TYPE(7) et les domaines avec CREATE DOMAIN(7). Un type composite est cr
automatiquement pour chaque table de la base pour reprsenter la structure des lignes de la table. Il est aussi possible de crer des
types composites avec CREATE TYPE AS.
Tableau 45.48. Colonnes de pg_type
Nom
Type
Rfrences
Description
typname
name
typnamespace
oid
.o
OID du namespace qui contient le type
pg_namespaceid
typowner
oid
pg_authid.oid
typlen
int2
typbyval
bool
typtype
char
typcategory
char
typispreferred
bool
typisdefined
bool
Nom du type
1257
Propritaire du type
Catalogues systme
Nom
Type
Rfrences
Description
d'un conteneur pour un type qui n'est pas encore
dfini. Lorsque typisdefined est faux, rien,
part le nom du type, le namespace et l'OID, n'est
fiable.
typdelim
char
typrelid
oid
pg_class.oid
typelem
oid
pg_type.oid
typarray
oid
pg_type.oid
Si typarray est diffrent de zro, alors il identifie une autre ligne dans pg_type, qui est le type tableau true disposant de ce type en lment.
typinput
regproc
pg_proc.oid
typoutput
regproc
pg_proc.oid
typreceive
regproc
pg_proc.oid
typsend
regproc
pg_proc.oid
typmodin
regproc
pg_proc.oid
typmodout
regproc
pg_proc.oid
typanalyze
regproc
pg_proc.oid
typalign
char
Catalogues systme
Nom
Type
Rfrences
Description
d = alignement double (huit octets sur la plupart des machines, mais pas sur toutes).
Note
Pour les types utiliss dans les
tables systmes il est indispensable
que les tailles et alignements dfinis
dans pg_type soient en accord avec
la faon dont le compilateur dispose
la colonne dans une structure reprsentant une ligne de table.
typstorage
char
bool
typbasetype
oid
typtypmod
int4
typndims
int4
1259
Catalogues systme
Nom
Type
Rfrences
Description
typcollation
oid
.o
pg_collationid typcollation spcifie le collationnement du
type. Si le type ne supporte pas les collationnemens, cette colonne vaut zro. Un type de base qui
supporte les collationnements aura DEFAULT_COLLATION_OID ici. Un domaine sur
un type collationnable peut avoir un autre OID de
collationnement si ce dernier a t prcis pour le
domaine.
typdefaultbin
pg_node_tree
typdefault
text
Tableau 45.49, Codes typcategory liste les valeurs de typcategory dfinies par le systme. Tout ajout futur la liste
sera aussi une lettre ASCII majuscule. Tous les autres caractres ASCII sont rservs pour les catgories dfinies par l'utilisateur.
Tableau 45.49. Codes typcategory
Code
Catgorie
Types tableaux
Types boolens
Types composites
Types date/time
Types enum
Types gometriques
Types numriques
Pseudo-types
Types chanes
Types Bit-string
Type unknown
45.49. pg_user_mapping
Le catalogue pg_user_mapping stocke les correspondances entre utilisateurs locaux et distants. L'accs ce catalogue est interdite
aux utilisateurs normaux, utilisez la vue pg_user_mappings la place.
Tableau 45.50. Colonnes de pg_user_mapping
1260
Catalogues systme
Nom
Type
Rference
Description
umuser
oid
pg_authid.oid
umserver
oid
umoptions
text[]
Nom de la vue
But
pg_available_extensions
extensions disponibles
pg_available_extension_versions
pg_cursors
curseurs ouverts
pg_group
pg_indexes
index
pg_locks
pg_prepared_statements
instructions prpares
pg_prepared_xacts
transactions prpares
pg_roles
pg_rules
rgles
pg_seclabels
labels de scurit
pg_settings
configuration
pg_shadow
pg_stats
statistiques du planificateur
pg_tables
tables
pg_timezone_abbrevs
pg_timezone_names
pg_user
pg_user_mappings
user mappings
pg_views
vues
1261
Catalogues systme
45.51. pg_available_extensions
La vue pg_available_extensions liste les extensions disponibles pour cette installation. Voir aussi le catalogue pg_extension qui
affiche les extensions actuellement installes.
Tableau 45.52. Colonnes de pg_available_extensions
Nom
Type
Description
name
name
Nom de l'extension
default_version
text
installed_version
text
comment
text
45.52. pg_available_extension_versions
La vue pg_available_extension_versions liste les versions spcifiques des extensions disponibles sur cette installation. Voir aussi
le catalogue pg_extension qui affiche les extensions actuellement installes.
Tableau 45.53. Colonnes de pg_available_extension_versions
Nom
Type
Description
name
name
Nom de l'extension
version
text
Nom de la version
installed
bool
superuser
bool
relocatable
bool
schema
name
requires
name[]
comment
text
45.53. pg_cursors
La vue pg_cursors liste les curseurs actuellement disponibles. Les curseurs peuvent tre dfinis de plusieurs faons :
via le message Bind du protocole frontend/backend, dcrit dans le Section 46.2.3, Requte tendue ;
via l'interface de programmation du serveur (SPI), dcrite dans le Section 43.1, Fonctions d'interface .
La vue pg_cursors affiche les curseurs crs par tout moyen prcdent. Les curseurs n'existent que pour la dure de la transaction
1262
Catalogues systme
qui les dfinit, sauf s'ils ont t dclars avec WITH HOLD. De ce fait, les curseurs volatils (non-holdable) ne sont prsents dans la
vue que jusqu' la fin de la transaction qui les a crs.
Note
Les curseurs sont utiliss en interne pour coder certains composants de PostgreSQL, comme les langages procduraux. La vue pg_cursors peut ainsi inclure des curseurs qui n'ont pas t crs explicitement par l'utilisateur.
Tableau 45.54. Colonnes de pg_cursors
Nom
Type
Description
name
text
Le nom du curseur
statement
text
is_holdable
boolean
is_binary
boolean
is_scrollable
boolean
true si le curseur autorise une rcupration non squentielle des lignes ; false
sinon
creation_time
timestamptz
45.54. pg_group
La vue pg_group existe pour des raisons de compatibilit ascendante : elle mule un catalogue qui a exist avant la version 8.1 de
PostgreSQL. Elle affiche les noms et membres de tous les rles dont l'attribut rolcanlogin est dvalid, ce qui est une approximation des rles utiliss comme groupes.
Tableau 45.55. Colonnes de pg_group
Nom
Type
Rfrences
Description
groname
name
.roln
pg_authidame
Nom du groupe
grosysid
oid
pg_authid.oid
Identifiant du groupe
grolist
oid[]
pg_authid.oid
45.55. pg_indexes
La vue pg_indexes fournit un accs aux informations utiles sur chaque index de la base de donnes.
Tableau 45.56. Colonnes de pg_indexes
Nom
Type
Rfrences
Description
schemaname
name
pg_namespace.nspname
tablename
name
pg_class.relname
indexname
name
pg_class.relname
Nom de l'index
tablespace
name
pg_tablespace.spcname
1263
Catalogues systme
Nom
Type
indexdef
text
Rfrences
Description
Dfinition de l'index (une commande CREATE
INDEX reconstruite)
45.56. pg_locks
La vue pg_locks fournit un accs aux informations concernant les verrous dtenus par les transactions ouvertes sur le serveur de
bases de donnes. Voir le Chapitre 13, Contrle d'accs simultan pour une discussion plus importante sur les verrous.
pg_locks contient une ligne par objet verrouillable actif, type de verrou demand et transaction associe. Un mme objet verrouillable peut apparatre plusieurs fois si plusieurs transactions ont pos ou attendent des verrous sur celui-ci. Toutefois, un objet
qui n'est pas actuellement verrouill n'apparat pas.
Il existe plusieurs types distincts d'objets verrouillables : les relations compltes (tables, par exemple), les pages individuelles de
relations, des tuples individuels de relations, les identifiants de transaction (virtuels et permanents) et les objets gnraux de la
base de donnes (identifis par l'OID de la classe et l'OID de l'objet, de la mme faon que dans pg_description ou pg_depend).
De plus, le droit d'tendre une relation est reprsent comme un objet verrouillable distinct. Et enfin, les verrous informatifs
peuvent tre pris sur les numros qui ont la signification dfinie par l'utilisateur.
Tableau 45.57. Colonnes pg_locks
Nom
Type
Rfrences
Description
locktype
text
database
oid
.oi
pg_databased
relation
oid
pg_class.oid
page
integer
tuple
smallint
virtualxid
text
transactionid
xid
classid
oid
pg_class.oid
objid
oid
objsubid
smallint
Numro de la colonne cible par le verrou (classid et objid font rfrence la table ellemme), ou 0 si la cible est un autre objet de la base
de donnes, ou NULL si l'objet n'est pas un objet
de la base de donnes.
virtualtransaction
text
pid
integer
L'identifiant du processus serveur qui dtient ou attend le verrou. NULL si le verrou est possd par
une transaction prpare.
mode
text
Type de l'objet verrouillable : relation, extend, page, tuple, transactionid, virtualxid, object, userlock ou advisory
1264
Catalogues systme
Nom
Type
Rfrences
Description
veau table et Section 13.2.3, Niveau d'Isolation
Serializable )
granted
boolean
granted est true sur une ligne reprsentant un verrou tenu par la transaction indique. Une valeur false indique que cette
transaction attend l'acquisition du verrou, ce qui implique qu'une autre transaction a choisi un mode de verrouillage conflictuel sur
le mme objet verrouillable. La transaction en attente dort jusqu'au relchement du verrou (ou jusqu' ce qu'une situation de blocage soit dtecte). Une transaction unique peut attendre l'acquisition d'au plus un verrou la fois.
Chaque transaction dtient un verrou exclusif sur son identifiant virtuel de transaction pour toute sa dure. Si un identifiant permanent est affect la transaction (ce qui arrive habituellement si la transaction change l'tat de la base de donnes), il dtient aussi
un verrou exclusif sur son identifiant de transaction permanent jusqu' sa fin. Quand une transaction trouve ncessaire d'attendre
spcifiquement une autre transaction, elle le fait en essayant d'acqurir un verrou partag sur l'identifiant de l'autre transaction
(identifiant virtuel ou permanent selon la situation). Ceci n'est couronn de succs que lorsque l'autre transaction termine et relche son verrou.
Bien que les lignes constituent un type d'objet verrouillable, les informations sur les verrous de niveau ligne sont stockes sur
disque, et non en mmoire. Ainsi, les verrous de niveau ligne n'apparaissent normalement pas dans cette vue. Si une transaction attend un verrou de niveau ligne, elle apparat sur la vue comme en attente de l'identifiant permanent de la transaction actuellement
dtentrice de ce verrou de niveau ligne.
Les verrous consultatifs peuvent tre acquis par des cls constitues soit d'une seule valeur bigint, soit de deux valeurs integer.
Une cl bigint est affiche avec sa moiti haute dans la colonne classid, sa partie basse dans la colonne objid et objsubid
1. Les cls integer sont affiches avec la premire cl dans la colonne classid, la deuxime cl dans la colonne objid et
objsubid 2. La signification relle des cls est laisse l'utilisateur. Les verrous consultatifs sont locaux chaque base, la colonne database a donc un sens dans ce cas.
pg_locks fournit une vue globale de tous les verrous du cluster, pas seulement de ceux de la base en cours d'utilisation. Bien que la
colonne relation puisse tre jointe avec pg_class.oid pour identifier les relations verrouilles, ceci ne fonctionne correctement qu'avec les relations de la base accde (celles pour lesquelles la colonne database est l'OID de la base actuelle ou 0).
La vue pg_locks affiche des donnes provenant du gestionnaire de verrous standards et du gestionnaire de verrous de prdicats,
qui sont des systmes autrement spars. Quand un utilisateur accde cette vue, les structures de donnes internes de chaque gestionnaire de verrous sont temporairement verrouilles, et des copies sont faites que la vue va afficher. Chaque gestionnaire de verrous produira du coup un ensemble cohrent de rsultats mais, comme nous ne verrouillons pas les deux gestionnaires simultanment, il est possible que des verrous soient donns ou relachs aprs avoir interrog le gestionnaire de verrous standard et avant
avoir interrog le gestionnaire de verrous de prdicat. Chaque gestionnaire est verrouill le moins de temps possible pour rduire
l'impact sur les performances mais un impact sur les performances du serveur peut nanmoins tre observ si la vue est utilise
frquemment.
La colonne pid peut tre jointe la colonne procpid de la vue pg_stat_activity pour obtenir plus d'informations sur la session
qui dtient ou attend un verrou, par exemple :
SELECT * FROM pg_locks pl LEFT JOIN pg_stat_activity psa
ON pl.pid = psa.procpid;
. De plus, si des transactions prpares sont utilises, la colonne virtualtransaction peut tre jointe la colonne transaction de la vue pg_prepared_xacts pour obtenir plus d'informations sur les transactions prpares qui dtiennent des verrous.
(Une transaction prpare ne peut jamais tre en attente d'un verrou mais elle continue dtenir les verrous qu'elle a acquis pendant son excution.) Par exemple :
SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx
ON pl.virtualtransaction = '-1/' || ppx.transaction;
45.57. pg_prepared_statements
La vue pg_prepared_statements affiche toutes les instructions prpares disponibles pour la session en cours. Voir PREPARE(7)
pour de plus amples informations sur les instructions prpares.
pg_prepared_statements contient une ligne pour chaque instruction prpare. Les lignes sont ajoutes la vue quand une nouvelle
instruction prpare est cre et supprime quand une instruction prpare est abandonne (par exemple, via la commande DEALLOCATE(7)).
1265
Catalogues systme
Nom
Type
Description
name
text
L'identifiant
prpare
statement
text
prepare_time
timestamptz
L'heure
de
cration
l'instruction prpare
parameter_types
regtype[]
from_sql
boolean
de
l'instruction
de
45.58. pg_prepared_xacts
La vue pg_prepared_xacts affiche les informations concernant les transactions actuellement prpares pour une validation en deux
phases (voir PREPARE TRANSACTION(7) pour les dtails).
pg_prepared_xacts contient une ligne par transaction prpare. L'entre est supprime quand la transaction est valide ou annule.
Tableau 45.59. Colonnes de pg_prepared_xacts
Nom
Type
Rfrences
Description
transaction
xid
gid
text
prepared
timestamp
with time zone
owner
name
pg_authid.rolname
database
name
pg_database.datname
Lors d'un accs la vue pg_prepared_xacts, les structures de donnes du gestionnaire interne des transactions sont momentanment verrouilles et une copie de la vue est faite pour affichage. Ceci assure que la vue produit un ensemble cohrent de rsultats
tout en ne bloquant pas les oprations normales plus longtemps que ncessaire. Nanmoins, si la vue est accde frquemment, les
performances de la base de donnes peuvent tre impactes.
1266
Catalogues systme
45.59. pg_roles
La vue pg_roles fournit un accs aux informations des rles de base de donnes. C'est tout simplement une vue accessible de
pg_authid qui n'affiche pas le champ du mot de passe.
Cette vue expose explicitement la colonne OID de la table sous-jacente car elle est ncessaire pour raliser des jointures avec les
autres catalogues.
Tableau 45.60. Colonnes de pg_roles
Nom
Type
Rfrences
Description
rolname
name
Nom du rle
rolsuper
bool
rolall
bool
rolcreaterole
bool
rolcreatedb
bool
rolcatupdate
bool
rolcanlogin
bool
rolreplication bool
rolconnlimit
int4
rolpassword
text
rolvaliduntil
timestamptz
rolconfig
text[]
oid
oid
Identifiant du rle
pg_authid.oid
45.60. pg_rules
La vue pg_rules fournit un accs des informations utiles sur les rgles de rcriture des requtes.
Tableau 45.61. Colonnes de pg_rules
Nom
Type
Rfrences
Description
schemaname
name
pg_namespace.nspname
tablename
name
pg_class.relname
rulename
name
pg_rewrite.rulename
Nom de la rgle
definition
text
La vue pg_rules exclut les rgles ON SELECT des vues ; elles sont accessibles dans pg_views.
1267
Catalogues systme
45.61. pg_seclabels
La vue pg_seclabels fournit des informations sur les labels de scurit. C'est une version du catalogue pg_seclabel bien plus lisible.
Tableau 45.62. Colonnes de pg_seclabels
Nom
Type
Rfrence
Description
objoid
oid
classoid
oid
pg_class.oid
objsubid
int4
objtype
text
Le
type
d'objet
auquel
s'applique ce label, en texte.
objnamespace
oid
objname
text
provider
text
pg_seclabel.provider
label
text
pg_seclabel.label
pg_namespace.oid
45.62. pg_settings
La vue pg_settings fournit un accs aux paramtres d'excution du serveur. C'est essentiellement une interface alternative aux
commandes SHOW(7) et SET(7). Elle fournit aussi un accs certaines informations des paramtres qui ne sont pas directement
accessibles avec SHOW, telles que les valeurs minimales et maximales.
Tableau 45.63. Colonnes de pg_settings
Nom
Type
Description
name
text
setting
text
unit
text
category
text
short_desc
text
extra_desc
text
context
text
vartype
text
source
text
min_val
text
Valeur minimale autorise du paramtre (NULL pour les valeurs non numriques)
max_val
text
Valeur maximale autorise du paramtre (NULL pour les valeurs non numriques)
1268
Catalogues systme
Nom
Type
Description
enumvals
text[]
Valeurs autorises pour un paramtre enum (NULL pour les valeurs non
enum)
boot_val
text
reset_val
text
sourcefile
text
sourceline
integer
Numro de ligne du fichier de configuration laquelle cette valeur a t positionne (NULL pour des valeurs positionnes ailleurs que dans un fichier de
configuration, ou quand interrog par un non-superutilisateur).
Il existe diffrentes valeurs de context. Les voici, classes dans l'ordre de difficult dcroissante pour la modification d'un paramtre :
internal
Ces paramtres ne peuvent pas tre modifis directement ; ils refltent des valeurs internes. Certaines sont modifiables en
compilant le serveur avec des options diffrentes pour l'tape de configuration, ou en changeant des options lors de l'tape du
initdb.
postmaster
Ces paramtres sont seulement appliqus au dmarrage du serveur, donc toute modification ncessite un redmarrage du serveur. Les valeurs sont typiquement conserves dans le fichier postgresql.conf ou passes sur la ligne de commande
lors du lancement du serveur. Bien sr, tout paramtre dont la colonne context est infrieure peut aussi tre configur au
dmarrage du serveur.
sighup
Les modifications sur ces paramtres peuvent se faire dans le fichier postgresql.conf sans avoir redmarrer le serveur. L'envoi d'un signal SIGHUP au processus pre (historiquement appel postmaster) le forcera relire le fichier postgresql.conf et appliquer les modifications. Ce processus enverra aussi le signal SIGHUP aux processus fils pour qu'ils
tiennent compte des nouvelles valeurs.
backend
Les modifications sur ces paramtres peuvent se faire dans le fichier postgresql.conf sans avoir redmarrer le serveur ; ils peuvent aussi tre configurs pour une session particulire dans le paquet de demande de connexion (par exemple,
via la variable d'environnement PGOPTIONS gre par la bibliothque libpq). Nanmoins, ces modifications ne changent jamais une fois que la session a dmarr. Si vous les changez dans le fichier postgresql.conf, envoyez un signal SIGHUP
postmaster car a le forcera relire le fichier postgresql.conf. Les nouvelles valeurs affecteront seulement les sessions lances aprs la relecture de la configuration.
superuser
Ces paramtres sont configurables partir du fichier postgresql.conf ou l'intrieur d'une session via la commande
SET ; mais seuls les superutilisateurs peuvent les modifier avec SET. Les modifications apportes dans le fichier postgresql.conf affecteront aussi les sessions existantes si aucune valeur locale la session n'a t tablie avec une commande SET.
user
Ces paramtres peuvent tre configurs partir du fichier postgresql.conf ou l'intrieur d'une session via la commande SET. Tout utilisateur est autoris modifier la valeur sur sa session. les modifi Any user is allowed to change his session-local value. Les modifications apportes dans le fichier postgresql.conf affecteront aussi les sessions existantes si
aucune valeur locale la session n'a t tablie avec une commande SET.
Voir Section 18.1, Paramtres de configuration pour plus d'informations sur les diffrentes faons de modifier ces paramtres.
La vue pg_settings n'accepte ni insertion ni suppression mais peut tre actualise. Une requte UPDATE applique une ligne de
pg_settings est quivalente excuter la commande SET(7) sur ce paramtre. Le changement affecte uniquement la valeur utilise
par la session en cours. Si un UPDATE est lanc l'intrieur d'une transaction annule par la suite, les effets de la commande UPDATE disparaissent l'annulation de la transaction. Lorsque la transaction est valide, les effets persistent jusqu' la fin de la session, moins qu'un autre UPDATE ou SET ne modifie la valeur.
1269
Catalogues systme
45.63. pg_shadow
La vue pg_shadow existe pour des raisons de compatibilit ascendante : elle mule un catalogue qui a exist avant la version 8.1
de PostgreSQL. Elle affiche les proprits de tous les rles marqus rolcanlogin dans pg_authid.
Cette table tire son nom de la ncessit de ne pas tre publiquement lisible, car elle contient les mots de passe. pg_user est une vue
sur pg_shadow, publiquement accessible, car elle masque le contenu du champ de mot de passe.
Tableau 45.64. Colonnes de pg_shadow
Nom
Type
Rfrences
Description
usename
name
pg_authid.rolname
Nom de l'utilisateur
usesysid
oid
pg_authid.oid
Identifiant de l'utilisateur
usecreatedb
bool
usesuper
bool
usecatupd
bool
passwd
text
valuntil
abstime
useconfig
text[]
45.64. pg_stats
La vue pg_stats fournit un accs aux informations stockes dans la table systme pg_statistic. Cette vue n'autorise l'accs qu'aux
seules lignes de pg_statistic correspondant aux tables sur lesquelles l'utilisateur a un droit de lecture. Elle peut donc sans risque
tre publiquement accessible en lecture.
pg_stats est aussi conue pour afficher l'information dans un format plus lisible que le catalogue sous-jacent -- au prix de
l'extension du schma lorsque de nouveaux types de connecteurs sont dfinis dans pg_statistic.
Tableau 45.65. Colonnes de pg_stats
Nom
Type
Rfrences
Description
schemaname
name
pg_namespace.nspname
tablename
name
pg_class.relname
Nom de la table
attname
name
pg_attribute.attname
alled
bool
null_frac
real
avg_width
integer
n_distinct
real
Si positif, nombre estim de valeurs distinctes dans la colonne. Si ngatif, nombre de valeurs distinctes divis par
le nombre de lignes, le tout mulipli par -1. (La forme ngative est utilise quand ANALYZE croit que le nombre
de valeurs distinctes a tendance grossir au fur et mesure que la table grossit ; la forme positive est utilise
lorsque la commande semble avoir un nombre fixe de valeurs possibles.) Par exemple, -1 indique une colonne
unique pour laquelle le nombre de valeurs distinctes est
identique au nombre de lignes.
1270
Catalogues systme
Nom
Type
Rfrences
Description
most_common_va anyarray
ls
Liste de valeurs habituelles de la colonne. (NULL si aucune valeur ne semble identique aux autres.) Pour certains types de donnes comme tsvector, c'est une liste
d'lments les plus frquents, plutt que des valeurs du
type lui-mme.
most_common_fr real[]
eqs
Liste de frquences des valeurs ou lments les plus courants, c'est--dire le nombre d'occurrences de chacune divis par le nombre total de lignes. (NULL lorsque
most_common_vals l'est.) Pour certains types de donnes comme tsvector, il peut aussi stocker des informations supplmentaires, le rendant plus long que le tableau
most_common_vals.
histogram_bounds
anyarray
correlation
real
Le nombre maximum d'entres dans most_common_vals et histogram_bounds est configurable colonne par colonne en
utilisant la commande ALTER TABLE SET STATISTICS ou globalement avec le paramtre d'excution default_statistics_target.
45.65. pg_tables
La vue pg_tables fournit un accs aux informations utiles de chaque table de la base de donnes.
Tableau 45.66. Colonnes de pg_tables
Nom
Type
Rfrences
Description
schemaname
name
pg_namespace.nspname
tablename
name
pg_class.relname
Nom de la table
tableowner
name
pg_authid.rolname
tablespace
name
hasindexes
boolean
pg_class.relhasindex
hasrules
boolean
pg_class.relhasrules
hastriggers
boolean
pg_class.reltriggers
45.66. pg_timezone_abbrevs
La vue pg_timezone_abbrevs fournit la liste des abrviations de fuseaux horaires actuellement reconnues par les routines de saisie
date/heure. Le contenu de cette vue change avec la modification du paramtre d'excution timezone_abbreviations.
Tableau 45.67. Colonnes de pg_timezone_abbrevs
1271
Catalogues systme
Nom
Type
Description
abbrev
text
utc_offset
interval
is_dst
boolean
true s'il s'agit d'une abrviation de fuseau horaire soumis aux changements
d'heure hiver/t
45.67. pg_timezone_names
La vue pg_timezone_names fournit la liste des noms de fuseaux horaires reconnus par SET TIMEZONE, avec les abrviations
acceptes, les dcalages UTC, et l'tat du changement d'heure. (Techniquement, PostgreSQL utilise UT1 plutt que UTC car les
secondes intercalaires ne sont pas gres.) Contrairement aux abrviations indiques dans pg_timezone_abbrevs, la majorit des
noms impliquent des rgles concernant les dates de changement d'heure. De ce fait, l'information associe change en fonction des
frontires de changement d'heure locales. L'information affiche est calcule suivant la valeur courante de CURRENT_TIMESTAMP.
Tableau 45.68. Colonnes de pg_timezone_names
Nom
Type
Description
name
text
abbrev
text
utc_offset
interval
is_dst
boolean
45.68. pg_user
La vue pg_user fournit un accs aux informations concernant les utilisateurs de la base de donnes. C'est une simple vue publiquement lisible de pg_shadow qui masque la valeur du champ de mot de passe.
Tableau 45.69. Colonnes de pg_user
Nom
Type
Description
usename
name
Nom de l'utilisateur
usesysid
int4
usecreatedb
bool
usesuper
bool
usecatupd
bool
passwd
text
valuntil
abstime
useconfig
text[]
45.69. pg_user_mappings
La vue pg_user_mappings donne accs aux informations sur les correspondances d'utilisateurs. C'est essentiellement une vue accessible tous sur pg_user_mapping qui cache le champ d'options si l'utilisateur n'a pas le droit de l'utiliser.
1272
Catalogues systme
Nom
Type
Rference
umid
oid
pg_user_mapping.oid
srvid
oid
pg_foreign_server.oid
srvname
text
umuser
oid
usename
name
umoptions
text[]
pg_authid.oid
45.70. pg_views
La vue pg_views donne accs des informations utiles propos de chaque vue de la base.
Tableau 45.71. Colonnes de pg_views
Nom
Type
Rfrences
Description
schemaname
name
pg_namespace.nspname
viewname
name
pg_class.relname
Nom de la vue
viewowner
name
pg_authid.rolname
definition
text
1273
46.1. Aperu
Le protocole utilise des phases distinctes pour le lancement et le fonctionnement habituel. Dans la phase de lancement, le client
ouvre une connexion au serveur et s'authentifie (ce qui peut impliquer un message simple, ou plusieurs messages, en fonction de
la mthode d'authentification utilise). En cas de russite, le serveur envoie une information de statut au client et entre dans le
mode normal de fonctionnement. Exception faite du message initial de demande de lancement, cette partie du protocole est
conduite par le serveur.
En mode de fonctionnement normal, le client envoie requtes et commandes au serveur et celui-ci retourne les rsultats de requtes et autres rponses. Il existe quelques cas (comme notify) pour lesquels le serveur enverra des messages non sollicits.
Mais dans l'ensemble, cette partie de la session est conduite par les requtes du client.
En gnral, c'est le client qui dcide de la clture de la session. Il arrive, cependant, qu'elle soit force par le moteur. Dans tous
les cas, lors de la fermeture de la connexion par le serveur, toute transaction ouverte (non termine) sera annule.
En mode oprationnel normal, les commandes SQL peuvent tre excutes via deux sous-protocoles. Dans le protocole des
requtes simples , le client envoie juste une chane, la requte, qui est analyse et excute immdiatement par le serveur.
Dans le protocole des requtes tendues , le traitement des requtes est dcoup en de nombreuses tapes : l'analyse, le lien
avec les valeurs de paramtres et l'excution. Ceci offre flexibilit et gains en performances au prix d'une complexit supplmentaire.
Le mode oprationnel normal offre des sous-protocoles supplmentaires pour certaines oprations comme copy.
Protocole client/serveur
sont donnes (pour les instructions select, un portail est quivalent un curseur ouvert. il est choisi d'utiliser un terme diffrent car
les curseurs ne grent pas les instructions autres que select)
Le cycle d'excution complet consiste en une tape d'analyse syntaxique, qui cre une instruction prpare partir d'une chane de
requte textuelle ; une tape de liaison, qui cre un portail partir d'une instruction prpare et des valeurs pour les paramtres ncessaires ; et une tape d'excution qui excute une requte du portail. Dans le cas d'une requte qui renvoie des lignes (select,
show, etc), il peut tre signal l'tape d'excution que seul un certain nombre de lignes doivent tre retournes, de sorte que de
multiples tapes d'excution seront ncessaires pour terminer l'opration.
Le serveur peut garder la trace de multiples instructions prpares et portails (qui n'existent qu' l'intrieur d'une session, et ne sont
jamais partags entre les sessions). Les instructions prpares et les portails sont rfrencs par les noms qui leur sont affects la
cration. De plus, il existe une instruction prpare et un portail non nomms . bien qu'ils se comportent comme des objets
nomms, les oprations y sont optimises en vue d'une excution unique de la requte avant son annulation puis est annule. En
revanche, les oprations sur les objets nomms sont optimises pour des utilisations multiples.
46.2.1. Lancement
Pour dbuter une session, un client ouvre une connexion au serveur et envoie un message de dmarrage. Ce message inclut les
noms de l'utilisateur et de la base de donnes laquelle le client souhaite se connecter ; il identifie aussi la version particulire du
protocole utiliser (optionnellement, le message de dmarrage peut inclure des prcisions supplmentaires pour les paramtres
d'excution). Le serveur utilise ces informations et le contenu des fichiers de configuration (tels que pg_hba.conf) pour dterminer si la connexion est acceptable et quelle ventuelle authentification supplmentaire est requise.
Le serveur envoie ensuite le message de demande d'authentification appropri, auquel le client doit rpondre avec le message de
rponse d'authentification adapt (tel un mot de passe). Pour toutes les mthodes d'authentification, sauf GSSAPI et SSPI, il y a au
maximum une requte et une rponse. Avec certaines mthodes, aucune rponse du client n'est ncessaire aucune demande
d'authentification n'est alors effectue. Pour GSSAPI et SSPI, plusieurs changes de paquets peuvent tre ncessaire pour terminer
l'authentification.
Le cycle d'authentification se termine lorsque le serveur rejette la tentative de connexion (ErrorResponse) ou l'accepte
(AuthenticationOk).
Les messages possibles du serveur dans cette phase sont :
errorresponse
La tentative de connexion a t rejete. Le serveur ferme immdiatement la connexion.
authenticationok
L'change d'authentification s'est termin avec succs.
authenticationkerberosv5
1275
Protocole client/serveur
Le client doit alors prendre part un dialogue d'authentification Kerberos V5 (spcification Kerberos, non dcrite ici) avec le
serveur. En cas de succs, le serveur rpond AuthenticationOk, ErrorResponse sinon.
authenticationcleartextpassword
Le client doit alors envoyer un PasswordMessage contenant le mot de passe en clair. Si le mot de passe est correct, le serveur
rpond AuthenticationOk, ErrorResponse sinon.
authenticationmd5password
Le client doit alors envoyer un PasswordMessage contenant le mot de passe chiffr l'aide de MD5, en utilisant le composant
salt de quatre caractres spcifi dans le message AuthenticationMD5Password. Si le mot de passe est correct, le serveur rpond AuthenticationOk, ErrorResponse sinon.
authenticationscmcredential
Cette rponse est possible uniquement pour les connexions locales de domaine Unix sur les plateformes qui supportent les
messages de lgitimation SCM. Le client doit fournir un message de lgitimation SCM, puis envoyer une donne d'un octet.
Le contenu de cet octet importe peu ; il n'est utilis que pour s'assurer que le serveur attend assez longtemps pour recevoir le
message de lgitimation. Si la lgitimation est acceptable, le serveur rpond AuthenticationOk, ErrorResponse sinon. (Ce type
de message n'est envoy que par des serveurs dont la version est antrieure la 9.1. Il pourrait tre supprim de la spcification du protocole.)
AuthenticationGSS
L'interface doit maintenant initier une ngociation GSSAPI. L'interface doit envoyer un PasswordMessage avec la premire
partie du flux de donnes GSSAPI en rponse ceci. Si plus de messages sont ncessaires, le serveur rpondra avec AuthenticationGSSContinue.
AuthenticationSSPI
L'interface doit maintenant initier une ngociation SSPI. L'interface doit envoyer un PasswordMessage avec la premire partie
du flux de donnes SSPI en rponse ceci. Si plus de messages sont ncessaires, le serveur rpondra avec AuthenticationGSSContinue.
AuthenticationGSSContinue
Ce message contient les donnes de la rponse de l'tape prcdente pour la ngociation GSSAPI ou SSPI
(AuthenticationGSS ou un prcdent AuthenticationGSSContinue). Si les donnes GSSAPI dans ce message indique que plus
de donnes sont ncessaire pour terminer l'authentification, l'interface doit envoyer cette donne dans un autre PasswordMessage. Si l'authentification GSSAPI ou SSPI est termine par ce message, le serveur enverra ensuite AuthenticationOk pour indiquer une authentification russie ou ErrorResponse pour indiquer l'chec.
Si le client ne supporte pas la mthode d'authentification demande par le serveur, il doit immdiatement fermer la connexion.
Aprs la rception du message AuthenticationOk, le client attend d'autres messages du serveur. Au cours de cette phase, un processus serveur est lanc et le client est simplement en attente. Il est encore possible que la tentative de lancement choue
(ErrorResponse) mais, dans la plupart des cas, le serveur enverra les messages ParameterStatus, BackendKeyData et enfin ReadyForQuery.
Durant cette phase, le serveur tentera d'appliquer tous les paramtres d'excution supplmentaires qui ont t fournis par le message de lancement. En cas de succs, ces valeurs deviennent les valeurs par dfaut de la session. Une erreur engendre ErrorResponse et dclenche la sortie.
Les messages possibles du serveur dans cette phase sont :
backendkeydata
Ce message fournit une cl secrte que le client doit conserver s'il souhaite envoyer des annulations de requtes par la suite.
Le client ne devrait pas rpondre ce message, mais continuer attendre un message ReadyForQuery.
parameterstatus
Ce message informe le client de la configuration actuelle (initiale) des paramtres du serveur, tels client_encoding ou
datestyle. le client peut ignorer ce message ou enregistrer la configuration pour ses besoins futurs ; voir Section 46.2.6,
Oprations asynchrones pour plus de dtails. le client ne devrait pas rpondre ce message mais continuer attendre un
message ReadyForQuery.
readyforquery
Le lancement est termin. Le client peut ds lors envoyer des commandes.
errorresponse
Le lancement a chou. La connexion est ferme aprs l'envoi de ce message.
noticeresponse
Un message d'avertissement a t envoy. Le client devrait afficher ce message mais continuer attendre un ReadyForQuery
ou un ErrorResponse.
1276
Protocole client/serveur
Le mme message ReadyForQuery est envoy chaque cycle de commande. En fonction des besoins de codage du client, il est
possible de considrer ReadyForQuery comme le dbut d'un cycle de commande, ou de le considrer comme terminant la phase
de lancement et chaque cycle de commande.
Protocole client/serveur
L'instruction prpare non nomme est planifie lors du traitement de Parse si le message Parse ne dfinit aucun paramtre. Mais
s'il existe des paramtres, la planification de la requte est repousse jusqu' ce que le premier message Bind de cette instruction
est reu. Le planificateur considrera les valeurs relles des paramtres fournies dans le message Bind lors de la planification de la
requte.
Note
Les plans de requtes gnrs partir d'une requte avec paramtres pourraient tre moins efficaces que les plans
de requtes gnrs partir d'une requte quivalente dont les valeurs de paramtres relles ont t places. Le planificateur de requtes ne peut pas prendre les dcisions suivant les valeurs relles des paramtres (par exemple, la
slectivit de l'index) lors de la planification d'une requte avec paramtres affecte un objet instruction prpare
nomme. La pnalit possible est vite lors de l'utilisation d'une instruction non nomme car elle n'est pas planifie jusqu' ce que des valeurs relles de paramtres soient disponibles.
Si un autre Bind rfrenant l'objet instruction prpare non nomme est reu, la requte n'est pas de nouveau planifie. Les valeurs de paramtres utilises dans le premier message Bind pourrait produire un plan de requte qui
est seulement efficace pour un sous-ensemble des valeurs de paramtres possibles. Pour forcer une nouvelle planification de la requte pour un ensemble nouveau de paramtres, envoyez un autre message Parse pour remplacer
l'objet instruction prpare non nomme.
Un client doit tre prpar accepter des messages ErrorResponse et NoticeResponse quand bien mme il s'attendrait un autre
type de message. Voir aussi Section 46.2.6, Oprations asynchrones concernant les messages que le client pourrait engendrer
du fait d'vnements extrieurs.
La bonne pratique consiste coder les clients dans un style machine-tat qui acceptera tout type de message tout moment plutt
que de parier sur la squence exacte des messages.
Note
Un type de paramtre peut tre laiss non spcifi en le positionnant O, ou en crant un tableau d'OID de type
plus court que le nombre de paramtres ($n) utiliss dans la chane de requte. Un autre cas spcial est d'utiliser
void comme type de paramtre (c'est dire l'OID du pseudo-type void). Cela permet d'utiliser des paramtres dans
des fonctions en tant qu'argument OUT. Gnralement, il n'y a pas de contexte dans lequel void peut tre utilis,
mais si un tel paramtre apparat dans les arguments d'une fonction, il sera simplement ignor. Par exemple, un appel de fonction comme foo($1,$2,$3,$4) peu correspondre une fonction avec 2 arguments IN et 2 autres
OUT si $3 et $4 sont spcifis avec le type void.
Note
La chane contenue dans un message Parse ne peut pas inclure plus d'une instruction SQL, sinon une erreur de syntaxe est rapporte. Cette restriction n'existe pas dans le protocole de requte simple, mais est prsente dans le protocole tendu. En effet, permettre aux instructions prpares ou aux portails de contenir de multiples commandes
compliquerait inutilement le protocole.
En cas de succs de sa cration, une instruction prpare nomme dure jusqu' la fin de la session courante, sauf si elle est dtruite
explicitement. Une instruction prpare non nomme ne dure que jusqu' la prochaine instruction Parse spcifiant l'instruction non
nomme comme destination. Un simple message Query dtruit galement l'instruction non nomme. Les instructions prpares
nommes doivent tre explicitement closes avant de pouvoir tre redfinies par un message Parse. Ce n'est pas obligatoire pour
une instruction non nomme. Il est galement possible de crer des instructions prpares nommes, et d'y accder, en ligne de
1278
Protocole client/serveur
Note
Le choix entre sortie texte et binaire est dtermin par les codes de format donns dans Bind, quelque soit la commande SQL implique. L'attribut BINARY dans les dclarations du curseur n'est pas pertinent lors de l'utilisation du
protocole de requte tendue.
La planification d'un requte prpare nomme se fait lorsque le message Parse est trait. Si une requte est excute plusieurs
fois, avec diffrents paramtres, il peut tre bnfique d'envoyer un seul message Parse contenant la requte paramtre, suivie de
plusieurs messages Bind et Execute. Cette mthode permet d'viter de replanifier la requte chaque excution.
Une requte prpare non nomme est aussi planifie lors du traitement de Parse si ce dernier ne dfini pas de paramtres. Si des
paramtres sont utiliss, la planification se fera chaque fois que les valeurs des paramtres seront transmis par le message Bind.
Ce comportement permet au planificateur de prendre en compte les valeurs des paramtres du Bind au moment de crer son plan
d'excution plutt que d'utiliser un plan gnrique estim.
Note
Les plans d'excution gnrs pour une requte paramtre peuvent tre moins efficaces que ceux gnrs pour une
requte quivalente avec les paramtres directement substitus. Le planificateur de requte ne peut pas prendre de
dcision se basant sur les valeurs relles des paramtres (par exemple, la slectivit d'un index) lors de la planification d'une requte paramtre nomme. Cette pnalit potentielle peut tre vite en utilisant des requtes prpare
non nommes, puisque'elles ne seront pas planifies avant que les valeurs des paramtres soient disponibles. La
contrepartie est que la planification doit alors tre effectue chaque message Bind, mme si la requte reste la
mme.
En cas de succs de sa cration, un objet portail nomm dure jusqu' la fin de la transaction courante sauf s'il est explicitement dtruit. Un portail non nomm est dtruit la fin de la transaction ou ds la prochaine instruction Bind spcifiant le portail non nomm comme destination. Un simple message Query dtruit galement le portail non nomm. Les portails nomms doivent tre explicitement ferms avant de pouvoir tre redfinis par un message Bind. Cela n'est pas obligatoire pour le portail non nomm. Il
est galement possible de crer des portails nomms, et d'y accder, en ligne de commandes SQL l'aide des instructions declare
cursor et fetch.
Ds lors qu'un portail existe, il peut tre excut l'aide d'un message Execute. Ce message spcifie le nom du portail (une chane
vide dsigne le portail non nomm) et un nombre maximum de lignes de rsultat (zro signifiant la rcupration de toutes les
lignes ). le nombre de lignes de rsultat a seulement un sens pour les portails contenant des commandes qui renvoient des ensembles de lignes ; dans les autres cas, la commande est toujours excute jusqu' la fin et le nombre de lignes est ignor. Les rponses possibles d'Execute sont les mme que celles dcrites ci-dessus pour les requtes lances via le protocole de requte
simple, si ce n'est qu'Execute ne cause pas l'envoi de ReadyForQuery ou de RowDescription.
Si Execute se termine avant la fin de l'excution d'un portail (du fait d'un nombre de lignes de rsultats diffrent de zro), il enverra un message PortalSuspended ; la survenue de ce message indique au client qu'un autre Execute devrait tre lanc sur le mme
portail pour terminer l'opration. Le message CommandComplete indiquant la fin de la commande SQL n'est pas envoy avant
l'excution complte du portail. Une phase Execute est toujours termine par la survenue d'un seul de ces messages : CommandComplete, EmptyQueryResponse (si le portail a t cr partir d'une chane de requte vide), ErrorResponse ou PortalSuspended.
la ralisation complte de chaque srie de messages de requtes tendues, le client doit lancer un message Sync. Ce message
sans paramtre oblige le serveur fermer la transaction courante si elle n'est pas l'intrieur d'un bloc de transaction begin/commit ( fermer signifiant valider en l'absence d'erreur ou annuler sinon). Une rponse ReadyForQuery est alors envoye. Le but
de Sync est de fournir un point de resynchronisation pour les rcuprations d'erreurs. Quand une erreur est dtecte lors du traitement d'un message de requte tendue, le serveur lance ErrorResponse, puis lit et annule les messages jusqu' ce qu'un Sync soit
atteint. Il envoie ensuite ReadyForQuery et retourne au traitement normal des messages. Aucun chappement n'est ralis si une
erreur est dtecte lors du traitement de sync -- l'unicit du ReadyForQuery envoy pour chaque Sync est ainsi assure.
1279
Protocole client/serveur
Note
Sync n'impose pas la fermeture d'un bloc de transactions ouvert avec begin. cette situation est dtectable car le
message ReadyForQuery inclut le statut de la transaction.
En plus de ces oprations fondamentales, requises, il y a plusieurs oprations optionnelles qui peuvent tre utilises avec le protocole de requte tendue.
Le message Describe (variante de portail) spcifie le nom d'un portail existant (ou une chane vide pour le portail non nomm). La
rponse est un message RowDescription dcrivant les lignes qui seront renvoyes par l'excution du portail ; ou un message NoData si le portail ne contient pas de requte renvoyant des lignes ; ou ErrorResponse le portail n'existe pas.
Le message Describe (variante d'instruction) spcifie le nom d'une instruction prpare existante (ou une chane vide pour
l'instruction prpare non nomme). La rponse est un message ParameterDescription dcrivant les paramtres ncessaires
l'instruction, suivi d'un message RowDescription dcrivant les lignes qui seront renvoyes lors de l'ventuelle excution de
l'instruction (ou un message NoData si l'instruction ne renvoie pas de lignes). ErrorResponse est retourn si l'instruction prpare
n'existe pas. Comme Bind n'a pas encore t excut, les formats utiliser pour les lignes retournes ne sont pas encore connues
du serveur ; dans ce cas, les champs du code de format dans le message RowDescription seront composs de zros.
Astuce
Dans la plupart des scnarios, le client devra excuter une des variantes de Describe avant de lancer Execute pour
s'assurer qu'il sait interprter les rsultats reus.
Le message Close ferme une instruction prpare ou un portail et libre les ressources. L'excution de Close sur une instruction ou
un portail inexistant ne constitue pas une erreur. La rponse est en gnral CloseComplete mais peut tre ErrorResponse si une
difficult quelconque est rencontre lors de la libration des ressources. Clore une instruction prpare ferme implicitement tout
autre portail ouvert construit partir de cette instruction.
Le message Flush n'engendre pas de sortie spcifique, mais force le serveur dlivrer toute donne restante dans les tampons de
sortie. Un Flush doit tre envoy aprs toute commande de requte tendue, l'exception de Sync, si le client souhaite examiner le
rsultat de cette commande avant de lancer d'autres commandes. Sans Flush, les messages retourns par le serveur seront combins en un nombre minimum de paquets pour minimiser la charge rseau.
Note
Le message Query simple est approximativement quivalent aux sries Parse, Bind, Describe sur un portail, Execute, Close, Sync utilisant les objets de l'instruction prpare ou du portail, non nomms et sans paramtres. Une
diffrence est l'acceptation de plusieurs instructions SQL dans la chane de requtes, la squence bind/describe/execute tant automatiquement ralise pour chacune, successivement. Il en diffre galement en ne retournant pas les messages ParseComplete, BindComplete, CloseComplete ou NoData.
Note
Le sous-protocole d'appel de fonction est une fonctionnalit qu'il vaudrait probablement mieux viter dans tout
nouveau code. Des rsultats similaires peuvent tre obtenus en initialisant une instruction prpare qui lance select function($1, ...). le cycle de l'appel de fonction peut alors tre remplac par Bind/Execute.
Un cycle d'appel de fonction est initi par le client envoyant un message FunctionCall au serveur. Le serveur envoie alors un ou
plusieurs messages de rponse en fonction des rsultats de l'appel de la fonction et finalement un message de rponse ReadyForQuery. ReadyForQuery informe le client qu'il peut envoyer en toute scurit une nouvelle requte ou un nouvel appel de fonction.
Les messages de rponse possibles du serveur sont :
errorresponse
Une erreur est survenue.
functioncallresponse
1280
Protocole client/serveur
L'appel de la fonction est termin et a retourn le rsultat donn dans le message. Le protocole d'appel de fonction ne peut grer qu'un rsultat scalaire simple, pas un type ligne ou un ensemble de rsultats.
readyforquery
Le traitement de l'appel de fonction est termin. ReadyForQuery sera toujours envoy, que le traitement se termine avec succs ou avec une erreur.
noticeresponse
Un message d'avertissement relatif l'appel de fonction a t retourn. Les avertissements sont complmentaires des autres
rponses, c'est--dire que le serveur continuera traiter la commande.
Protocole client/serveur
fermer la connexion. Les clients devraient toujours tre prts accepter et afficher les messages NoticeResponse, mme si la
connexion est inactive.
Des messages ParameterStatus seront engendrs chaque fois que la valeur active d'un paramtre est modifie, et cela pour tout
paramtre que le serveur pense utile au client. Cela survient plus gnralement en rponse une commande SQL set excute par
le client. ce cas est en fait synchrone -- mais il est possible aussi que le changement de statut d'un paramtre survienne la suite
d'une modification par l'administrateur des fichiers de configuration ; changements suivis de l'envoi du signal sighup au postmaster. de plus, si une commande set est annule, un message ParameterStatus appropri sera engendr pour rapporter la valeur
effective.
ce jour, il existe un certain nombre de paramtres cods en dur pour lesquels des messages ParameterStatus seront engendrs :
on trouve server_version, server_encoding, client_encoding, application_name, is_superuser, session_authorization et session_authorization, DateStyle, IntervalStyle, TimeZone et integer_datetimes (server_encoding, timezone et integer_datetimes n'ont pas t reports par les sorties avant la
8.0 ; standard_conforming_strings n'a pas t report par les sorties avant la 8.1 ; IntervalStyle n'a pas t report
par les sorties avant la 8.4; application_name n'a pas t report par les sorties avant la 9.0.). Notez que server_version, server_encoding et integer_datetimes sont des pseudo-paramtres qui ne peuvent pas changer aprs
le lancement. Cet ensemble pourrait changer dans le futur, voire devenir configurable. De toute faon, un client peut ignorer un
message ParameterStatus pour les paramtres qu'il ne comprend pas ou qui ne le concernent pas.
Si un client lance une commande listen, alors le serveur enverra un message NotificationResponse ( ne pas confondre avec NoticeResponse !) chaque fois qu'une commande notify est excute pour le canal de mme nom.
Note
Actuellement, NotificationResponse ne peut tre envoy qu' l'extrieur d'une transaction. Il ne surviendra donc pas
au milieu d'une rponse une commande, mais il peut survenir juste avant ReadyForQuery. Il est toutefois dconseill de concevoir un client en partant de ce principe. La bonne pratique est d'tre capable d'accepter NotificationResponse tout moment du protocole.
46.2.8. Fin
Lors de la procdure normale de fin le client envoie un message Terminate et ferme immdiatement la connexion. la rception
de ce message, le serveur ferme la connexion et s'arrte.
1282
Protocole client/serveur
Dans de rares cas (tel un arrt de la base de donnes par l'administrateur), le serveur peut se dconnecter sans demande du client.
Dans de tels cas, le serveur tentera d'envoyer un message d'erreur ou d'avertissement en donnant la raison de la dconnexion avant
de fermer la connexion.
D'autres scnarios de fin peuvent tre dus diffrents cas d'checs, tels qu'un core dump ct client ou serveur, la perte du lien
de communications, la perte de synchronisation des limites du message, etc. Que le client ou le serveur s'aperoive d'une fermeture de la connexion, le buffer sera vid et le processus termin. Le client a la possibilit de lancer un nouveau processus serveur
en recontactant le serveur s'il ne souhaite pas se finir. Il peut galement envisager de clore la connexion si un type de message non
reconnu est reu ; en effet, ceci est probablement le rsultat de la perte de synchronisation des limite de messages.
Que la fin soit normale ou non, toute transaction ouverte est annule, non pas valide. Si un client se dconnecte alors qu'une requte autre que select est en cours de traitement, le serveur terminera probablement la requte avant de prendre connaissance de la
dconnexion. Si la requte est en dehors d'un bloc de transaction (squence begin ... commit), il se peut que les rsultats soient valids avant que la connexion ne soit reconnue.
Note
il n'y a aucune limite prdfinie la longueur d'une chane retourne par le serveur. Une bonne stratgie de codage de client consiste utiliser un tampon dont la taille peut crotre pour que tout ce qui tient en mmoire
puisse tre accept. Si cela n'est pas faisable, il faudra lire la chane complte et supprimer les caractres qui ne
tiennent pas dans le tampon de taille fixe.
Byten(c)
Exactement n octets. si la largeur n du champ n'est pas une constante, elle peut toujours tre dtermine partir d'un champ
prcdent du message. Si c est spcifi, c'est la valeur exacte. Par exemple, Byte2, Byte1('\n').
1283
Protocole client/serveur
Protocole client/serveur
Byte8
L'emplacement du dernier octet des journaux de transactions + 1 reu et crit sur le disque du serveur en standby, dans le format XLogRecPtr.
Byte8
L'emplacement du dernier octet des journaux de transactions + 1 pouss sur le disque du serveur en standby, dans le format
XLogRecPtr.
Byte8
L'emplacement du dernier octet des journaux de transactions + 1 appliqu sur le disque du serveur en standby, dans le format
XLogRecPtr.
Byte8
L'horloge systme du serveur au moment de la transmission, au format TimestampTz.
Message de rponse Hot Standby (F)
Byte1('h')
Identifie le message comme un message de rponse Hot Standby.
Byte8
L'horloge systme du serveur au moment de la transmission, au format TimestampTz.
Byte4
Le xmin courant du serveur en standby. Cela peut valoir 0 si le standby envoit des notifications que le retour du Hot Standby
ne va pas renvoyer sur cette connexion. Les messages suivants diffrents de 0 pourraient rinitier le mcanisme de retour
d'informations.
Byte4
Le epoch courant du serveur en standby.
BASE_BACKUP [LABEL 'label'] [PROGRESS] [FAST] [WAL] [NOWAIT]
Demande au serveur de commencer l'envoi d'une sauvegarde de base. Le systme sera mis automatiquement en mode sauvegarde avant que celle-ci ne commence et en sera sorti une fois la sauvegarde termine. Les options suivantes sont acceptes :
LABEL 'label'
Prcise le label de la sauvegarde. Si aucun label n'est indiqu, le label utilis est base backup. Les rgles de mise entre
guillemets du label sont les mmes que pour une chane SQL standard avec standard_conforming_strings activ.
PROGRESS
Demande la gnration d'un rapport de progression. Cela enverra la taille approximative dans l'en-tte de chaque tablespace,
qui peut tre utilis pour calculer ce qu'il reste rcuprer. La taille est calcule en numrant la taille de tous les fichiers
avant de commencer le transfert. Du coup, il est possible que cela ait un impact ngatif sur les performances. En particulier, la
premire donne peut mettre du temps tre envoye. De plus, comme les fichiers de la base de donnes peuvent tre modifis pendant la sauvegarde, la taille est seulement approximative et peut soit grandir, soit diminuer entre le moment de son
calcul initial et le moment o les fichiers sont envoys.
FAST
Demande un checkpoint rapide.
WAL
Inclut les journaux de transactions ncessaires dans la sauvegarde. Cela inclue tous les fichiers entre le dbut et la fin de la
sauvegarde de base dans le rpertoire pg_xlog dans l'archive tar.
NOWAIT
Par dfaut, la sauvegarde attendra que le dernier journal de transactions requis soit archiv ou mettra un message
d'avertissement si l'archivage des journaux de transactions n'est pas activ. Indiquer NOWAIT dsactive les deux (l'attente et le
message), laissant le client responsable de la disponibilit des journaux de transactions requis.
Quand la sauvegarde est lance, le serveur enverra tout d'abord deux ensembles de rsultats standards, suivis par un ou plusieurs rsultats de CopyResponse.
Le premier ensemble de rsultats standard contient la position de dmarrage de la sauvegarde, dans un format XLogRecPtr en
tant que colonne seule sur une seule ligne.
Le deuxime ensemble de rsultats standard contient une ligne pour chaque tablespace. Voici la liste des champs d'une telle
ligne :
spcoid
L'OID du tablespace, ou NULL s'il s'agit du rpertoire de donnes.
1285
Protocole client/serveur
spclocation
Le chemin complet du rpertoire du tablespace, ou NULL s'il s'agit du rpertoire de donnes.
size
La taille approximative du tablespace, si le rapport de progression a t demand. NULL sinon.
Aprs l'envoi du deuxime ensemble standard de rsultats, un ou plusieurs rsultats de type CopyResponse seront envoys, un
pour PGDATA et un pour chaque tablespace supplmentaire, autre que pg_default et pg_global. Les donnes dans les
rsultats de type CopyResponse seront un format tar (en suivant le format d'change ustar spcifi dans le standard POSIX
1003.1-2008) du contenu du tablespace, sauf que les deux blocs de zros la fin indiqus dans le standard sont omis. Aprs
que l'envoi des donnes du tar est termin, un ensemble final de rsultats sera envoy.
L'archive tar du rpertoire des donnes et de chaque tablespace contiendra tous les fichiers du rpertoire, que ce soit des fichiers PostgreSQL ou des fichiers ajouts dans le mme rpertoire. Les seuls fichiers exclus sont :
postmaster.pid
postmaster.opts
pg_xlog, ainsi que les sous-rpertoires. Si la sauvegarde est lance avec ajout des journaux de transactions, une version
synththise de pg_xlog sera inclus mais elle ne contiendra que les fichiers ncessaires au bon fonctionnement de la sauvegarde, et pas le reste de son contenu.
Le propritaire, le groupe et les droits du fichier sont conservs si le systme de fichiers du serveur le permet.
Une fois que tous les tablespaces ont t envoys, un ensemble de rsultats final est envoy. Cet ensemble contient la position
finale de la sauvegarde, dans un format XLogRecPtr sur une seule colonne et une seule ligne.
Protocole client/serveur
Protocole client/serveur
Byte1('B')
Marqueur de commande Bind.
Int32
Taille du message en octets, y compris la taille elle-mme.
String
Nom du portail de destination (une chane vide slectionne le portail non-nomm).
String
Nom de l'instruction source prpare (une chane vide slectionne l'instruction prpare non-nomme).
Int16
Nombre de codes de format de paramtres qui suivent (nots c ci-dessous). peut valoir zro pour indiquer qu'il n'y a aucun
paramtre ou que tous les paramtres utilisent le format par dfaut (texte) ; ou un, auquel cas le code de format spcifi est appliqu tous les paramtres ; il peut aussi tre gal au nombre courant de paramtres.
Int16[c]
Codes de format des paramtres. Tous doivent valoir zro (texte) ou un (binaire).
Int16
Nombre de valeurs de paramtres qui suivent (peut valoir zro). Cela doit correspondre au nombre de paramtres ncessaires
la requte.
Puis, le couple de champs suivant apparat pour chaque paramtre : paramtre :
Int32
Taille de la valeur du paramtre, en octets (ce nombre n'inclut pas la longueur elle-mme). Peut valoir zro. Trait comme un
cas spcial, -1 indique une valeur de paramtre NULL. Aucun octet de valeur ne suit le cas NULL.
Byten
Valeur du paramtre, dans le format indiqu par le code de format associ. n est la longueur ci-dessus.
Aprs le dernier paramtre, les champs suivants apparaissent :
Int16
Nombre de codes de format des colonnes de rsultat qui suivent (not r ci-dessous). peut valoir zro pour indiquer qu'il n'y a
pas de colonnes de rsultat ou que les colonnes de rsultat utilisent le format par dfaut (texte) ; ou une, auquel cas le code de
format spcifi est appliqu toutes les colonnes de rsultat (s'il y en a) ; il peut aussi tre gal au nombre de colonnes de rsultat de la requte.
Int16[r]
Codes de format des colonnes de rsultat. Tous doivent valoir zro (texte) ou un (binaire).
BindComplete (B)
Byte1('2')
Indicateur de Bind complet.
Int32(4)
Taille du message en octets, y compris la taille elle-mme.
CancelRequest (F)
Int32(16)
Taille du message en octets, y compris la taille elle-mme.
Int32(80877102)
Code d'annulation de la requte. La valeur est choisie pour contenir 1234 dans les 16 bits les plus significatifs et 5678 dans
les 16 bits les moins significatifs (pour viter toute confusion, ce code ne doit pas tre le mme qu'un numro de version de
protocole).
Int32
ID du processus du serveur cible.
Int32
Cl secrte du serveur cible.
Close (F)
Byte1('C')
Marqueur de commande Close.
Int32
1288
Protocole client/serveur
Protocole client/serveur
Marqueur de rponse de Start Copy In. Le client doit alors envoyer des donnes de copie (s'il n'est pas cela, il enverra un
message CopyFail).
Int32
Taille du message en octets, y compris la taille elle-mme.
Int8
0 indique que le format de copie complet est textuel (lignes spares par des retours chariot, colonnes spares par des caractres de sparation, etc). 1 indique que le format de copie complet est binaire (similaire au format DataRow). Voir COPY(7)
pour plus d'informations.
Int16
Nombre de colonnes dans les donnes copier (not n ci-dessous).
Int16[n]
Codes de format utiliser pour chaque colonne. Chacun doit valoir zro (texte) ou un (binaire). Tous doivent valoir zro si le
format de copie complet est de type texte.
CopyOutResponse (B)
Byte1('H')
Marqueur de rponse Start Copy Out. Ce message sera suivi de donnes copy-out.
Int32
Taille du message en octets, y compris la taille elle-mme.
Int8
0 indique que le format de copie complet est textuel (lignes spares par des retours chariots, colonnes spares par des caractres sparateur, etc). 1 indique que le format de copie complet est binaire (similaire au format DataRow). Voir COPY(7)
pour plus d'informations.
Int16
Nombre de colonnes de donnes copier (not n ci-dessous).
Int16[n]
Codes de format utiliser pour chaque colonne. Chaque code doit valoir zro (texte) ou un (binaire). Tous doivent valoir zro
si le format de copie complet est de type texte.
CopyBothResponse (B)
Byte1('W')
Identifie le message comme une rponse Start Copy Both. Ce message est seulement utilis pour la rplication en flux.
Int32
Longueur du contenu du message en octets, incluant lui-mme.
Int8
0 indique que le format COPY global est textuel (lignes spares par des retours la ligne, colonnes spars par des caractres sparateurs, etc). 1 indique que le format de copie global est binaire (similaire au format DataRow). Voir COPY(7) pour
plus d'informations.
Int16
Le nombre de colonnes dans les donnes copier (dnot N ci-dessous).
Int16[N]
Les codes de format utiliss pour chaque colonne. Chacune doit actuellement valoir 0 (texte) ou 1 (binaire). Tous doivent valoir 0 si le format de copy global est texte.
DataRow (B)
Byte1('D')
Marqueur de ligne de donnes.
Int32
Taille du message en octets, y compris la taille elle-mme.
Int16
Nombre de valeurs de colonnes qui suivent (peut valoir zro).
Apparat ensuite le couple de champs suivant, pour chaque colonne :
Int32
Longueur de la valeur de la colonne, en octets (ce nombre n'inclut pas la longueur elle-mme). Peut valoir zro. Trait comme
1290
Protocole client/serveur
un cas spcial, -1 indique une valeur NULL de colonne. Aucun octet de valeur ne suit le cas NULL.
Byten
Valeur de la colonne dans le format indiqu par le code de format associ. n est la longueur ci-dessus.
Describe (F)
Byte1('D')
Marqueur de commande Describe.
Int32
Taille du message en octets, y compris la taille elle-mme.
Byte1
's' pour dcrire une instruction prpare ; ou 'p' pour dcrire un portail.
String
Nom de l'instruction prpare ou du portail dcrire (une chane vide slectionne l'instruction prpare ou le portail nonnomm(e)).
EmptyQueryResponse (B)
Byte1('I')
Marqueur de rponse une chane de requte vide (c'est un substitut de CommandComplete).
Int32(4)
Taille du message en octets, y compris la taille elle-mme.
ErrorResponse (B)
Byte1('E')
Marqueur d'erreur.
Int32
Taille du message en octets, y compris la taille elle-mme.
Le corps du message est constitu d'un ou plusieurs champs identifi(s), suivi(s) d'un octet nul comme dlimiteur de fin.
L'ordre des champs n'est pas fix. Pour chaque champ, on trouve les informations suivantes :
Byte1
Code identifiant le type de champ ; s'il vaut zro, c'est la fin du message et aucune chane ne suit. Les types de champs dfinis
sont lists dans Section 46.6, Champs des messages d'erreur et d'avertissement . de nouveaux types de champs pourraient
tre ajouts dans le futur, les clients doivent donc ignorer silencieusement les types non reconnus.
String
Valeur du champ.
Execute (F)
Byte1('E')
Marqueur de commande Execute.
Int32
Taille du message en octets, y compris la taille elle-mme.
String
Nom du portail excuter (une chane vide slectionne le portail non-nomm).
Int32
Nombre maximum de lignes retourner si le portail contient une requte retournant des lignes (ignor sinon). Zro signifie
aucune limite .
Flush (F)
Byte1('H')
Marqueur de commande Flush.
Int32(4)
Taille du message en octets, y compris la taille elle-mme.
FunctionCall (F)
Byte1('F')
Marqueur d'appel de fonction.
1291
Protocole client/serveur
Int32
Taille du message en octets, y compris la taille elle-mme.
Int32
Spcifie l'ID de l'objet reprsentant la fonction appeler.
Int16
Nombre de codes de format de l'argument qui suivent (not c ci-dessous). cela peut tre zro pour indiquer qu'il n'y a pas
d'arguments ou que tous les arguments utilisent le format par dfaut (texte) ; un, auquel cas le code de format est appliqu
tous les arguments ; il peut aussi tre gal au nombre rel d'arguments.
Int16[c]
Les codes de format d'argument. Chacun doit valoir zro (texte) ou un (binaire).
Int16
Nombre d'arguments fournis la fonction.
Apparat ensuite, pour chaque argument, le couple de champs suivant :
Int32
Longueur de la valeur de l'argument, en octets (ce nombre n'inclut pas la longueur elle-mme). Peut valoir zro. Trait comme
un cas spcial, -1 indique une valeur NULL de l'argument. Aucun octet de valeur ne suit le cas NULL.
Byten
Valeur de l'argument dans le format indiqu par le code de format associ. n est la longueur ci-dessus.
Aprs le dernier argument, le champ suivant apparat :
Int16
Code du format du rsultat de la fonction. Doit valoir zro (texte) ou un (binaire).
FunctionCallResponse (B)
Byte1('V')
Marqueur de rsultat d'un appel de fonction.
Int32
Taille du message en octets, y compris la taille elle-mme.
Int32
Longueur de la valeur du rsultat de la fonction, en octets (ce nombre n'inclut pas la longueur elle-mme). Peut valoir zro.
Trait comme un cas spcial, -1 indique un rsultat de fonction NULL. Aucun octet de valeur ne suit le cas NULL.
Byten
Valeur du rsultat de la fonction, dans le format indiqu par le code de format associ. n est la longueur ci-dessus.
NoData (B)
Byte1('n')
Indicateur d'absence de donnes.
Int32(4)
Taille du message en octets, y compris la taille elle-mme.
NoticeResponse (B)
Byte1('N')
Marqueur d'avertissement.
Int32
Taille du message en octets, y compris la taille elle-mme.
Le corps du message est constitu d'un ou plusieurs champs identifi(s), suivi(s) d'un octet zro comme dlimiteur de fin.
L'ordre des champs n'est pas fix. Pour chaque champ, on trouve les informations suivantes :
Byte1
Code identifiant le type de champ ; s'il vaut zro, c'est la fin du message et aucune chane ne suit. Les types de champs dj
dfinis sont lists dans Section 46.6, Champs des messages d'erreur et d'avertissement . de nouveaux types de champs
pourraient tre ajouts dans le futur, les clients doivent donc ignorer silencieusement les champs de type non reconnu.
String
Valeur du champ.
NotificationResponse (B)
1292
Protocole client/serveur
Byte1('A')
Marqueur de rponse de notification.
Int32
Taille du message en octets, y compris la taille elle-mme.
Int32
ID du processus serveur ayant procd la notification.
String
Nom du canal l'origine de la notification.
String
La chane embarque passe lors de la notification
ParameterDescription (B)
Byte1('t')
Marqueur de description de paramtre.
Int32
Taille du message en octets, y compris la taille elle-mme.
Int16
Nombre de paramtres utilis par l'instruction (peut valoir zro).
Pour chaque paramtre, suivent :
Int32
ID de l'objet du type de donnes du paramtre.
ParameterStatus (B)
Byte1('S')
Marqueur de rapport d'tat de paramtre d'excution.
Int32
Taille du message en octets, y compris la taille elle-mme.
String
Nom du paramtre d'excution dont le rapport est en cours.
String
Valeur actuelle du paramtre.
Parse (F)
Byte1('P')
Marqueur de commande Parse.
Int32
Taille du message en octets, y compris la taille elle-mme.
String
Nom de l'instruction prpare de destination (une chane vide slectionne l'instruction prpare non-nomme).
String
Chane de requte analyser.
Int16
Nombre de types de donnes de paramtre spcifis (peut valoir zro). Ce n'est pas une indication du nombre de paramtres
pouvant apparatre dans la chane de requte, mais simplement le nombre de paramtres pour lesquels le client veut prspcifier les types.
Pour chaque paramtre, on trouve ensuite :
Int32
ID de l'objet du type de donnes du paramtre. la valeur zro quivaut ne pas spcifier le type.
ParseComplete (B)
Byte1('1')
Indicateur de fin de Parse.
Int32(4)
1293
Protocole client/serveur
Protocole client/serveur
Int32
Modificateur de type (voir pg_attribute.atttypmod). La signification du modificateur est spcifique au type.
Int16
Code de format utilis pour le champ. Zro (texte) ou un (binaire), l'heure actuelle. Dans un RowDescription retourn par la
variante de l'instruction de Describe, le code du format n'est pas encore connu et vaudra toujours zro.
SSLRequest (F)
Int32(8)
Taille du message en octets, y compris la taille elle-mme.
Int32(80877103)
Code de requte ssl. la valeur est choisie pour contenir 1234 dans les 16 bits les plus significatifs, et 5679 dans les 16 bits
les moins significatifs (pour viter toute confusion, ce code ne doit pas tre le mme que celui d'un numro de version de protocole).
StartupMessage (F)
Int32
Taille du message en octets, y compris la taille elle-mme.
Int32(196608)
Numro de version du protocole. Les 16 bits les plus significatifs reprsentent le numro de version majeure (3 pour le protocole dcrit ici). Les 16 bits les moins significatifs reprsentent le numro de version mineure (0 pour le protocole dcrit ici).
Le numro de version du protocole est suivi par un ou plusieurs couple(s) nom de paramtre et chane de valeur. Un octet zro
est requis comme dlimiteur de fin aprs le dernier couple nom/valeur. L'ordre des paramtres n'est pas fix. Le paramtre
user est requis, les autres sont optionnels. Chaque paramtre est spcifi de la faon suivante :
String
Nom du paramtre. Les noms actuellement reconnus sont :
user
Nom de l'utilisateur de base de donnes sous lequel se connecter. Requis ; il n'y a pas de valeur par dfaut.
database
Base de donnes laquelle se connecter. Par dfaut le nom de l'utilisateur.
options
Arguments en ligne de commande pour le serveur (rendu obsolte par l'utilisation de paramtres individuels d'excution).
En plus de ce qui prcde, tout paramtre d'excution pouvant tre initialis au dmarrage du serveur peut tre list. Ces paramtres seront appliqus au dmarrage du serveur (aprs analyse des options en ligne de commande, s'il y en a). Leurs valeurs
agiront comme valeurs de session par dfaut.
String
Valeur du paramtre.
Sync (F)
Byte1('S')
Marqueur de commande Sync.
Int32(4)
Taille du message en octets, y compris la taille elle-mme.
Terminate (F)
Byte1('X')
Marqueur de fin.
Int32(4)
Taille du message en octets, y compris la taille elle-mme.
Protocole client/serveur
, debug, info ou log dans un message d'avertissement, ou la traduction rgionale de l'un d'eux. Toujours prsent.
c
Code : code SQLSTATE de l'erreur (voir Annexe A, Codes d'erreurs de PostgreSQL). non internationalisable. Toujours
prsent.
m
Message : premier message d'erreur, en clair. Doit tre court et prcis (typiquement une ligne). Toujours prsent.
d
Dtail : deuxime message d'erreur, optionnel, apportant des informations supplmentaires sur le problme. Peut tre sur plusieurs lignes.
h
Astuce (Hint) : suggestion optionnelle de rsolution du problme. Diffrent de Dtail parce qu'il offre un conseil
(potentiellement inappropri) plutt que des faits rels. Peut tre sur plusieurs lignes.
p
Position : valeur du champ, entier dcimal ASCII indiquant un curseur sur la position de l'erreur dans la chane de requte originale. Le premier caractre a l'index 1. Les positions sont mesures en caractres, non pas en octets.
p
Position interne : ceci est dfini de la mme faon que le champ p mais c'est utilis quand la position du curseur se rfre
une commande gnre en interne plutt qu'une soumise par le client. Le champ q apparatra toujours quand ce champ apparat.
q
Requte interne : le texte d'une commande gnre en interne et qui a chou. Ceci pourrait tre, par exemple, une requte
SQL lance par une fonction PL/pgSQL.
w
O (Where) : indication du contexte dans lequel l'erreur est survenue. Inclut, actuellement, une trace de la pile des appels des
fonctions PL actives. Cette trace comprend une entre par ligne, la plus rcente en premier.
f
Fichier (File) : nom du fichier de code source comportant l'erreur.
l
Ligne (Line) : numro de ligne dans le fichier de code source comportant l'erreur.
r
Routine : nom de la routine dans le code source comportant l'erreur.
Le client est responsable du formatage adapt ses besoins des informations affiches ; en particulier par l'ajout de retours chariots sur les lignes longues, si cela s'avrait ncessaire. Les caractres de retour chariot apparaissant dans les champs de messages
d'erreur devraient tre traits comme des changements de paragraphes, non comme des changements de lignes.
1296
Protocole client/serveur
Il existe un nouveau sous-protocole pour les requtes tendues qui ajoute les types de messages client Parse, Bind, Execute,
Describe, Close, Flush et Sync et les types de messages serveur ParseComplete, BindComplete, PortalSuspended, ParameterDescription, NoData et CloseComplete. Les clients existants ne sont pas directement concerns par ce sous-protocole, mais son utilisation apportera des amliorations en terme de performances et de fonctionnalits.
Les donnes de copy sont dsormais encapsules dans des messages CopyData et CopyDone. Il y a une faon bien dfinie de rparer les erreurs lors du copy. la dernire ligne spciale \. n'est plus ncessaire et n'est pas envoye lors de copy out (elle est
toujours reconnue comme un indicateur de fin lors du copy in mais son utilisation est obsolte. Elle sera ventuellement supprime). Le copy binaire est support. les messages copyinresponse et CopyOutResponse incluent les champs indiquant le nombre de
colonnes et le format de chaque colonne.
La disposition des messages FunctionCall et FunctionCallResponse a chang. FunctionCall supporte prsent le passage aux
fonctions d'arguments NULL. Il peut aussi grer le passage de paramtres et la rcupration de rsultats aux formats texte et binaire. Il n'y a plus aucune raison de considrer FunctionCall comme une faille potentielle de scurit car il n'offre plus d'accs direct aux reprsentations internes des donnes du serveur.
Le serveur envoie des messages ParameterStatus ('s') lors de l'initialisation de la connexion pour tous les paramtres qu'il considre intressants pour la bibliothque client. En consquence, un message ParameterStatus est envoy chaque fois que la valeur
active d'un de ces paramtres change.
Le message RowDescription ('t') contient les nouveaux champs oid de table et de numro de colonne pour chaque colonne de la
ligne dcrite. Il affiche aussi le code de format pour chaque colonne.
Le message CursorResponse ('p') n'est plus engendr par le serveur.
Le message NotificationResponse ('a') a un champ de type chane supplmentaire qui peu embarquer une chane passe par
l'metteur de l'vnement notify.
Le message EmptyQueryResponse ('i') ncessitait un paramtre chane vide ; ce n'est plus le cas.
1297
ereport(ERROR,
(errcode(ERRCODE_DIVISION_BY_ZERO),
errmsg("division by zero")));
Le niveau de svrit de l'erreur est ainsi positionn ERROR (une erreur banale). L'appel errcode prcise l'erreur SQLSTATE en utilisant une macro dfinie dans src/include/utils/errcodes.h. L'appel errmsg fournit le message texte
primaire. L'ensemble supplmentaire de parenthses entourant les appels aux fonctions auxiliaires est ennuyeux mais syntaxiquement ncessaire.
Exemple plus complexe :
ereport(ERROR,
(errcode(ERRCODE_AMBIGUOUS_FUNCTION),
errmsg("function %s is not unique",
func_signature_string(funcname, nargs,
NIL, actual_arg_types)),
errhint("Unable to choose a best candidate function. "
"You might need to add explicit typecasts.")));
Cela illustre l'utilisation des codes de formatage pour intgrer des valeurs d'excution dans un message texte. Un message
conseil , optionnel, est galement fourni.
Les routines auxiliaires disponibles pour ereport sont :
errcode(sqlerrcode) prcise le code SQLSTATE de l'identifiant erreur pour la condition. Si cette routine n'est pas appele, l'identifiant l'erreur est, par dfaut, ERRCODE_INTERNAL_ERROR quand le niveau de svrit de l'erreur est ERROR
ou plus haut, ERRCODE_WARNING quand le niveau d'erreur est WARNING et ERRCODE_SUCCESSFUL_COMPLETION pour
NOTICE et infrieur. Bien que ces valeurs par dfaut soient souvent commodes, il faut se demander si elles sont appropries
avant d'omettre l'appel errcode().
errmsg(const char *msg, ...) indique le message texte primaire de l'erreur et les possibles valeurs d'excutions y
insrer. Les insertions sont prcises par les codes de formatage dans le style sprintf. En plus des codes de formatage standard accepts par sprintf, le code %m peut tre utilis pour insrer le message d'erreur retourn par strerror pour la valeur courante de errno. 1 %m ne ncessite aucune entre correspondante dans la liste de paramtres pour errmsg. Notez que
la chane de caractres du message sera passe travers gettext pour une possible adaptation linguistique avant que les
codes de formatage ne soient excuts.
errmsg_internal(const char *msg, ...) fait la mme chose que errmsg l'exception que la chane de caractres du message ne sera ni traduite ni incluse dans le dictionnaire de messages d'internationalisation. Cela devrait tre utilis
pour les cas qui ne peuvent pas arriver et pour lesquels il n'est probablement pas intressant de dployer un effort de traduction.
errdetail(const char *msg, ...) fournit un message dtail optionnel ; cela est utilis quand il y a des informations supplmentaires qu'il semble inadquat de mettre dans le message primaire. La chane de caractres du message est
traite de la mme manire que celle de errmsg.
errdetail_internal(const char *msg, ...) est identique errdetail, sauf que le message ne sera ni traduit ni inclut dans le dictionnaire des messages traduire. Elle doit tre utilise pour les messages de niveau dtail pour lequel
un effort de traduction est inutile, par exemple parce qu'ils sont trop techniques pour que cela soit utile la majorit des utilisateurs.
errdetail_log(const char *msg, ...) est identique errdetail sauf que cette chane ne va que dans les
traces du serveur. Elle n'est jamais envoye au client. Si errdetail (ou un de ses quivalents ci-dessus) et errdetail_log sont utilises ensemble, alors une chane est envoys au client et l'autre dans les traces du serveur. C'est utile pour
les dtails d'erreur qui concernent la scurit ou qui sont trop techniques pour tre inclus dans le rapport envoy au client.
errhint(const char *msg, ...) fournit un message conseil optionnel ; cela est utilis pour offrir des suggestions sur la faon de rgler un problme, par opposition aux dtails effectifs au sujet de ce qui a mal tourn. La chane de ca1
ractres
du qui
message
estquand
traite
la mme
que celled'errno
de errmsg.
C'est--dire
la valeur
tait courante
l'appelde
ereport
a t manire
atteinte ; les changements
dans les routines auxiliaires de rapports ne l'affecteront pas. Cela ne sera pas vrai si vous devez
crire explicitement strerror(errno) dans la liste de paramtres de errmsg ; en consquence ne faites pas comme a.
1299
errcontext(const char *msg, ...) n'est normalement pas appele directement depuis un site de message de
ereport mais plutt elle est utilise dans les fonctions de rappels error_context_stack pour fournir des informations
propos du contexte dans lequel une erreur s'est produite, comme les endroits courants dans la fonction PL. La chane de caractres du message est traite de la mme manire que celle de errmsg. l'inverse des autres fonctions auxiliaires, celle-ci
peut tre appele plus d'une fois dans un appel de ereport ; les chanes successives ainsi fournies sont concatnes et spares pas des caractres d'interlignes (NL).
errposition(int cursorpos) spcifie l'endroit textuel d'une erreur dans la chane de caractres de la requte. Actuellement, c'est seulement utile pour les erreurs dtectes dans les phases d'analyses lexicales et syntaxiques du traitement de la
requte.
errcode_for_file_access() est une fonction commode qui slectionne l'identifiant d'erreur SQLSTATE appropri
pour une dfaillance dans l'appel systme relatif l'accs d'un fichier. Elle utilise le errno sauvegard pour dterminer quel
code d'erreur gnrer. Habituellement cela devrait tre utilis en combinaison avec %m dans le texte du message d'erreur primaire.
errcode_for_socket_access() est une fonction commode qui slectionne l'identifiant d'erreur SQLSTATE appropri
pour une dfaillance dans l'appel systme relatif une socket.
errhidestmt(bool hide_stmt) peut tre appel pour indiquer la suppression de la portion STATEMENT: d'un message dans le journal applicatif de postmaster. Habituellement, c'est appropri si le texte du message contient dj l'instruction
en cours.
Il y a une plus ancienne fonction nomme elog, qui est toujours largement utilise. Un appel elog :
elog(niveau, "chaine format", ...);
est strictement quivalent :
ereport(level, (errmsg_internal("chaine format", ...)));
Le code d'erreur SQLSTATE est toujours celui par dfaut, la chane de caractres du message n'est pas sujette traduction. Par
consquent, elog ne devrait tre utilis que pour les erreurs internes et l'enregistrement de trace de dbogage de bas niveau.
N'importe quel message susceptible d'intresser les utilisateurs ordinaires devrait passer par ereport. Nanmoins, il y a suffisamment de contrles des erreurs internes qui ne peuvent pas arriver dans le systme, pour que elog soit toujours largement
utilise ; elle est prfre pour ces messages du fait de sa simplicit d'criture.
Des conseils sur l'criture de bons messages d'erreurs peuvent tre trouvs dans la Section 47.3, Guide de style des messages
d'erreurs .
Ce qui va o
Le message primaire devrait tre court, factuel et viter les rfrences aux dtails d'excution comme le nom de fonction spcifique. Court veut dire devrait tenir sur une ligne dans des conditions normales . Utilisez un message dtail si ncessaire
pour garder le message primaire court ou si vous sentez le besoin de mentionner les dtails de l'implmentation comme un appel
systme particulier qui choue. Les messages primaires et dtails doivent tre factuels. Utilisez un message conseil pour les suggestions propos de quoi faire pour fixer le problme, spcialement si la suggestion ne pourrait pas toujours tre applicable.
Par exemple, au lieu de :
IpcMemoryCreate: shmget(cl=%d, taille=%u, 0%o) a chou : %m
(plus un long supplment qui est basiquement un conseil)
crivez :
Primaire:
Dtail:
Astuce:
Raisonnement : garder le message primaire court aide le garder au point et laisse les clients prsenter un espace l'cran sur la
supposition qu'une ligne est suffisante pour les messages d'erreurs. Les messages dtails et conseils peuvent tre relgus un
mode verbeux ou peut-tre dans une fentre pop-up dtaillant l'erreur. De plus, les dtails et les conseils devront normalement tre
supprims des traces du serveur pour gagner de l'espace. La rfrence aux dtails d'implmentation est viter puisque les utilisateurs n'en connaissent de toute faon pas les dtails.
1300
Formatage
N'mettez pas d'hypothses spcifiques propos du formatage dans les messages textes. Attendez-vous ce que les clients et les
traces du serveur enveloppent les lignes pour correspondre leurs propres besoins. Dans les messages longs, les caractres
d'interlignes (\n) peuvent tre utiliss pour indiquer les coupures suggres d'un paragraphe. Ne terminez pas un message avec un
caractre d'interlignes. N'utilisez pas des tabulations ou d'autres caractres de formatage (dans les affichages des contextes
d'erreurs, les caractres d'interlignes sont automatiquement ajouts pour sparer les niveaux d'un contexte comme dans les appels
aux fonctions).
Raisonnement : les messages ne sont pas ncessairement affichs dans un affichage de type terminal. Dans les interfaces graphiques ou les navigateurs, ces instructions de formatage sont, au mieux, ignores.
Guillemets
Les textes en anglais devraient utiliser des guillemets doubles quand la mise entre guillemets est approprie. Les textes dans les
autres langues devraient uniformment employer un genre de guillemets qui est conforme aux coutumes de publication et la sortie visuelle des autres programmes.
Raisonnement : le choix des guillemets doubles sur celui des guillemets simples est quelque peu arbitraire mais tend tre
l'utilisation prfre. Certains ont suggr de choisir le type de guillemets en fonction du type d'objets des conventions SQL
(notamment, les chanes de caractres entre guillemets simples, les identifiants entre guillemets doubles). Mais ceci est un point
technique l'intrieur du langage avec lequel beaucoup d'utilisateurs ne sont pas familiers ; les conventions SQL ne prennent pas
en compte les autres genres de termes entre guillemets, ne sont pas traduites dans d'autres langues et manquent un peu de sens aussi.
Grammaire et ponctuation
Les rgles sont diffrentes pour les messages d'erreurs primaires et pour les messages dtails/conseils :
Messages d'erreurs primaires : ne mettez pas en majuscule la premire lettre. Ne terminez pas un message avec un point. Ne pensez mme pas finir un message avec un point d'exclamation.
Messages dtails et conseils : utilisez des phrases compltes et toutes termines par des points. Mettez en majuscule le premier
mot des phrases. Placez deux espaces aprs le point si une autre phrase suit (pour un texte en anglais... cela pourrait tre diffrent
dans une autre langue).
Chanes de contexte d'erreur: Ne mettez pas en majuscule la premire lettre et ne terminer pas la chane avec un point. Les chanes
de contexte ne sont normalement pas des phrases compltes.
Raisonnement : viter la ponctuation rend plus facile, pour les applications clientes, l'intgration du message dans des contextes
grammaticaux varis. Souvent, les messages primaires ne sont de toute faon pas des phrases compltes (et s'ils sont assez longs
pour tre sur plusieurs phrases, ils devraient tre diviss en une partie primaire et une partie dtail). Cependant, les messages dtails et conseils sont longs et peuvent avoir besoin d'inclure de nombreuses phrases. Pour la cohrence, ils devraient suivre le style
des phrases compltes mme s'il y a seulement une phrase.
Utilisez la voix active. Utilisez des phrases compltes quand il y a un sujet ( A ne peut pas faire B ). Utilisez le style tlgramme, sans sujet, si le sujet est le programme lui-mme ; n'utilisez pas Je pour le programme.
Raisonnement : le programme n'est pas humain. Ne prtendez pas autre chose.
Type de l'objet
En citant le nom d'un objet, spcifiez quel genre d'objet c'est.
Raisonnement : sinon personne ne saura ce qu'est foo.bar.baz .
Crochets
Les crochets sont uniquement utiliss (1) dans les synopsis des commandes pour indiquer des arguments optionnels ou (2) pour indiquer l'indice infrieur d'un tableau.
Raisonnement : rien de ce qui ne correspond pas l'utilisation habituelle, largement connue troublera les gens.
Orthographe approprie
Orthographiez les mots en entier. Par exemple, vitez :
Adaptation linguistique
Gardez l'esprit que les textes des messages d'erreurs ont besoin d'tre traduit en d'autres langues. Suivez les directives dans la
Section 48.2.2, Guide d'criture des messages pour viter de rendre la vie difficile aux traducteurs.
1303
48.1.1. Prrequis
Les comptences dans sa langue d'un traducteur ne seront pas juges -- cette section concerne uniquement les outils logiciels.
Thoriquement, seul un diteur de texte est ncessaire. Mais ceci n'est vrai que dans le cas trs improbable o un traducteur ne
souhaiterait pas tester ses traductions des messages. Lors de la configuration des sources, il faudra s'assurer d'utiliser l'option -enable-nls. Ceci assurera galement la prsence de la bibliothque libintl et du programme msgfmt dont tous les utilisateurs finaux ont indniablement besoin. Pour tester son travail, il sera utile de suivre les parties pertinentes des instructions
d'installation.
Pour commencer un nouvel effort de traduction ou pour faire un assemblage de catalogues de messages (dcrit ci-aprs), il faudra installer respectivement les programmes xgettext et msgmerge dans une implmentation compatible GNU. Il est prvu
dans le futur que xgettext ne soit plus ncessaire lorsqu'une distribution empaquete des sources est utilise (en travaillant
partir du Git, il sera toujours utile). GNU Gettext 0.10.36 ou ultrieure est actuellement recommand.
Toute implmentation locale de gettext devrait tre disponible avec sa propre documentation. Une partie en est certainement duplique dans ce qui suit mais des dtails complmentaires y sont certainement disponibles.
48.1.2. Concepts
Les couples de messages originaux (anglais) et de leurs (possibles) traductions sont conservs dans les catalogues de messages,
un pour chaque programme (bien que des programmes lis puissent partager un catalogue de messages) et pour chaque langue
cible. Il existe deux formats de fichiers pour les catalogues de messages : le premier est le fichier PO (pour "Portable Object"
ou Objet Portable), qui est un fichier texte muni d'une syntaxe spciale et que les traducteurs ditent. Le second est un fichier
MO (pour "Machine Object" ou Objet Machine), qui est un fichier binaire engendr partir du fichier PO respectif et qui est
utilis lorsque le programme internationalis est excut. Les traducteurs ne s'occupent pas des fichiers MO ; en fait, quasiment
personne ne s'en occupe.
L'extension du fichier de catalogue de messages est, sans surprise, soit .po, soit .mo. Le nom de base est soit le nom du programme qu'il accompagne soit la langue utilise dans le fichier, suivant la situation. Ceci peut s'avrer tre une source de confusion. Des exemples sont psql.po (fichier PO pour psql) ou fr.mo (fichier MO en franais).
Le format du fichier PO est illustr ici :
# commentaire
msgid "chane originale"
msgstr "chane traduite"
msgid "encore une originale"
msgstr "encore une de traduite"
"les chanes peuvent tre sur plusieurs lignes, comme ceci"
...
Les chanes msgid sont extraites des sources du programme. (Elles n'ont pas besoin de l'tre mais c'est le moyen le plus commun). Les lignes msgstr sont initialement vides puis compltes avec les chanes traduites. Les chanes peuvent contenir des caractres d'chappement de style C et peuvent tre sur plusieurs lignes comme le montre l'exemple ci-dessus (la ligne suivante
doit dmarrer au dbut de la ligne).
Le caractre # introduit un commentaire. Si une espace fine suit immdiatement le caractre #, c'est qu'il s'agit l d'un commentaire maintenu par le traducteur. On trouve aussi des commentaires automatiques qui n'ont pas d'espace fine suivant immdiatement le caractre #. Ils sont maintenus par les diffrents outils qui oprent sur les fichiers PO et ont pour but d'aider le traducteur.
1304
#. commentaire automatique
#: fichier.c:1023
#, drapeau, drapeau
Les commentaires du style #. sont extraits du fichier source o le message est utilis. Il est possible que le dveloppeur ait ajout
des informations pour le traducteur, telles que l'alignement attendu. Le commentaire #: indique l'emplacement exact o le message
est utilis dans le source. Le traducteur n'a pas besoin de regarder le source du programme, mais il peut le faire s'il subsiste un
doute sur l'exactitude d'une traduction. Le commentaire #, contient des drapeaux dcrivant le message d'une certaine faon. Il
existe actuellement deux drapeaux : fuzzy est positionn si le message risque d'tre rendu obsolte par des changements dans les
sources. Le traducteur peut alors vrifier ceci et supprimer ce drapeau. Notez que les messages fuzzy ne sont pas accessibles
l'utilisateur final. L'autre drapeau est c-format indiquant que le message utilise le format de la fonction C printf. Ceci signifie que la traduction devrait aussi tre de ce format avec le mme nombre et le mme type de paramtres fictifs. Il existe des outils
qui vrifient que le message est une chane au format printf et valident le drapeau c-format en consquence.
S'assurer que si la chane originale se termine par un retour chariot, la traduction le fasse bien aussi. De mme pour les tabulations, etc.
Si la chane originale est une chane au format printf, la traduction doit l'tre aussi. La traduction doit galement avoir les
mme spcificateurs de format et dans le mme ordre. Quelques fois, les rgles naturelles de la langue rendent cela impossible
ou tout au moins difficile. Dans ce cas, il est possible de modifier les spcificateurs de format de la faon suivante :
1305
Si la chane originale contient une erreur linguistique, on pourra la rapporter (ou la corriger soi-mme dans le source du programme) et la traduire normalement. La chane corrige peut tre fusionne lorsque les programmes sources auront t mis
jour. Si la chane originale contient une erreur factuelle, on la rapportera (ou la corrigera soi-mme) mais on ne la traduira pas.
la place, on marquera la chane avec un commentaire dans le fichier PO.
Maintenir le style et le ton de la chane originale. En particulier, les messages qui ne sont pas des phrases (cannot open
file %s, soit ne peut pas ouvrir le fichier %s) ne devraient probablement pas commencer avec une lettre
capitale (si votre langue distingue la casse des lettres) ou finir avec un point (si votre langue utilise des marques de ponctuation). Lire Section 47.3, Guide de style des messages d'erreurs peut aider.
Lorsque la signification d'un message n'est pas connue ou s'il est ambig, on pourra demander sa signification sur la liste de
diffusion des dveloppeurs. Il est possible qu'un anglophone puisse aussi ne pas le comprendre ou le trouver ambig. Il est
alors prfrable d'amliorer le message.
1.
2.
Partout o un message candidat la traduction est trouv, un appel gettext() doit tre insr. Par exemple :
fprintf(stderr, "panic level %d\n", lvl);
devra tre chang avec :
fprintf(stderr, gettext("panic level %d\n"), lvl);
(gettext est dfini comme une opration nulle si NLS n'est pas configur).
Cela peut engendrer du fouillis. Un raccourci habituel consiste utiliser :
#define _(x) gettext(x)
Une autre solution est envisageable si le programme effectue la plupart de ses communications via une fonction ou un
nombre restreint de fonctions, telle ereport() pour le moteur. Le fonctionnement interne de cette fonction peut alors tre
modifie pour qu'elle appelle gettext pour toutes les chanes en entre.
3.
Un fichier nls.mk est ajout dans le rpertoire des sources du programme. Ce fichier sera lu comme un makefile. Les affectations des variables suivantes doivent tre ralises ici :
CATALOG_NAME
Le nom du programme tel que fourni lors de l'appel textdomain().
1306
AVAIL_LANGUAGES
Liste des traductions fournies -- initialement vide.
GETTEXT_FILES
Liste des fichiers contenant les chanes traduisibles, c'est--dire celles marques avec gettext ou avec une solution alternative. Il se peut que cette liste inclut pratiquement tous les fichiers sources du programme. Si cette liste est trop longue, le premier fichier peut tre remplac par un + et le deuxime mot reprsenter un fichier contenant un nom de fichier par ligne.
GETTEXT_TRIGGERS
Les outils qui engendrent des catalogues de messages pour les traducteurs ont besoin de connatre les appels de fonction
contenant des chanes traduire. Par dfaut, seuls les appels gettext() sont reconnus. Si _ ou d'autres identifiants sont
utiliss, il est ncessaire de les lister ici. Si la chane traduisible n'est pas le premier argument, l'lment a besoin d'tre de la
forme func:2 (pour le second argument). Si vous avez une fonction qui supporte les messages au format pluriel, l'lment
ressemblera func:1,2 (identifiant les arguments singulier et pluriel du message).
Lorsque quelque chose doit tre communiqu au traducteur, telle que la faon dont un message doit tre align avec quelque
1307
autre sortie, on pourra faire prcder l'occurrence de la chane d'un commentaire commenant par translator, par
exemple :
/* translator: This message is not what it seems to be. */
Ces commentaires sont copis dans les catalogues de messages de faon ce que les traducteurs les voient.
1308
"postgres.h"
"executor/spi.h"
"commands/trigger.h"
"fmgr.h"
"access/heapam.h"
"utils/syscache.h"
"catalog/pg_proc.h"
"catalog/pg_type.h"
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
PG_FUNCTION_INFO_V1(plsample_call_handler);
Datum
plsample_call_handler(PG_FUNCTION_ARGS)
{
1309
Datum
retval;
if (CALLED_AS_TRIGGER(fcinfo))
{
/*
* Appel comme procdure de dclencheur
*/
TriggerData
*trigdata = (TriggerData *) fcinfo->context;
retval = ...
}
else
{
/*
* Appel en tant que fonction
*/
retval = ...
}
return retval;
}
Il suffit de remplacer les points de suspension par quelques milliers de lignes de codes pour complter ce modle.
Lorsque la fonction du gestionnaire est compile dans un module chargeable (voir Section 35.9.6, Compiler et lier des fonctions
charges dynamiquement ), les commandes suivantes enregistrent le langage procdural dfini dans l'exemple :
CREATE FUNCTION plsample_call_handler() RETURNS language_handler
AS 'nomfichier'
LANGUAGE C;
CREATE LANGUAGE plsample
HANDLER plsample_call_handler;
Bien que fournir un gestionnaire d'appels est suffisant pour crer un langage de procdures minimal, il existe deux autres fonctions
qui peuvent tre fournies pour faciliter l'utilisation du langage. Ce sont les fonctions de validation (validator) et de traitement en
ligne (inline handler). Une fonction de validation peut tre fournie pour activer une vrification spcifique au langage lors du
CREATE FUNCTION(7). Une fonction de traitement en ligne sera utilis pour supporter les blocs de code anonymes excuts via
la commande DO(7).
Si une fonction de validation est fournie par un langage de procdures, elle doit tre dclare comme une fonction prenant un seul
paramtre, de type oid. Le rsultat de la validation est ignor, donc elle peut renvoyer le type void. La fonction de validation sera
appele la fin de la commande CREATE FUNCTION qui a cr ou mis jour une fonction crite dans ce langage. L'OID pass
en argument est l'OID de la fonction, disponible dans le catalogue pg_proc. La fonction de validation doit rcuprer cette ligne
de la faon habituelle et raliser les vrifications appropries. Tout d'abord, elle appelle CheckFunctionValidatorAccess() pour diagnostiquer les appels explicites au validateur que l'utilisateur ne peut pas raliser via CREATE FUNCTION.
Les vrifications typiques incluent la vrification du support des types en arguments et en sortie, ainsi que la vrification syntaxique du corps de la requte pour ce langage. Si la fonction de validation est satisfait par la fonction, elle quitte sans erreur. Si,
par contre, elle trouve une erreur, elle doit rapporter cette erreur au travers du mcanisme ereport() standard. Renvoyer une
erreur forcera une annulation de la transaction et empchera du mme coup l'enregistrement de la fonction dont la dfinition est
errone.
Les fonctions de validation devraient typiquement accepter le paramtre check_function_bodies : s'il est dsactiv, alors tout vrification coteuse ou spcifique au contexte devrait tre abandonne. Si le langage permet l'excution de code la compilation, le
validateur doit supprimer les vrifications qui impliquerait une telle excution. En particulier, ce paramtre est dsactiv par
pg_dump, pour qu'il puisse charger le langage de procdures sans avoir s'inquiter des effets de bord et des dpendances possibles dans le corps des procdures stockes avec d'autres objets de la base de donnes. ( cause de cela, le gestionnaire d'appels
doit viter de supposer que la fonction de validation a vrifi compltement la fonction. Le but d'avoir une fonction de validation
n'est pas d'viter au gestionnaire d'appels de faire des vrifications, mais plutt de notifier immdiatement l'utilisateur si des erreurs videntes apparaissent dans la commande CREATE FUNCTION.) Bien que le choix de ce qui est vrifier est laiss la
discrtion de la fonction de validation, il faut noter que le code de CREATE FUNCTION excute seulement les clauses SET attaches la fonction quand le paramtre check_function_bodies est activ. Du coup, les vrifications dont les rsultats
pourraient tre affects par les paramtres en question doivent tre ignores quand check_function_bodies est dsactiv
pour viter de checs errons lors du chargement d'une sauvegarde.
Si une fonction de traitement en ligne est fournie au langage de procdures, elle doit tre dclare comme une fonction acceptant
un seul paramtre de type internal. Le rsultat de la fonction de traitement en ligne est ignor, donc elle peut renvoyer le type void.
Elle sera appele quand une instruction DO est excute pour ce langage. Le paramtre qui lui est fourni est un pointeur vers une
1310
structure InlineCodeBlock, structure contenant des informations sur les paramtres de l'instruction DO, en particulier le texte du
bloc de code anonyme excuter. La fonction doit excuter ce code.
It est recommand de placer toutes les dclarations de fonctions ainsi que la commande CREATE LANGUAGE dans une extension pour qu'une simple commande CREATE EXTENSION suffise installer le langage. Voir Section 35.15, Empaqueter des
objets dans une extension pour plus d'informations sur l'criture d'extensions.
Les langages procduraux inclus dans la distribution standard sont de bons points de dpart l'criture de son propre gestionnaire
de langage. Les sources se trouvent dans le rpertoire src/pl. La page de rfrence de CREATE LANGUAGE(7) contient aussi
certains dtails utiles.
1311
Note
Le standard SQL spcifie une interface pour l'criture des wrappers de donnes distantes. Nanmoins, PostgreSQL n'implmente pas cette API car l'effort ncessaire pour cela serait trop important. De toute faon, l'API standard n'est pas encore trs adopte.
nombre de lignes que le FDW s'attend renvoyer lors du parcours, aprs avoir pris en compte le filtrage ralis par les qualificatifs
de restriction. La valeur initiale de baserel->rows est simplement une estimation constante par dfaut, devant tre remplace
si c'est possible. La fonction peut aussi choisir de mettre jour baserel->width s'il peut calculer une meilleure estimation de
la largeur moyenne d'une ligne de rsultat.
void
ExplainForeignScan (ForeignScanState *node,
ExplainState *es);
Affiche une sortie EXPLAIN supplmentaire pour un parcours de table distante. Elle peut ne rien renvoyer si ce n'est pas ncessaire. Sinon, elle doit appeler ExplainPropertyText et les fonctions relatives pour ajouter des champs la sortie du EXPLAIN. Les champs drapeaux dans es peuvent tre utiliss pour dterminer ce qui doit tre affich et l'tat du nud ForeignScanState peut tre inspect pour fournir des statistiques l'excution dans le cas d'un EXPLAIN ANALYZE.
void
BeginForeignScan (ForeignScanState *node,
int eflags);
Commence l'excution d'un parcours distant. L'appel se fait lors du dmarrage de l'excuteur. Cette fonction doit raliser toutes les
initialisation ncessaires avant le dmarrage du parcours, mais ne doit pas commencer excuter le vrai parcours (cela se fera lors
du premier appel IterateForeignScan). Le nud ForeignScanState est dj cr mais son champ fdw_state vaut toujours NULL. Les informations sur la table parcourir sont accessibles via le nud ForeignScanState (en particulier partir du
nud sous-jacent ForeignScan qui contient un pointeur vers la structure FdwPlan renvoye par PlanForeignScan).
Notez que quand (eflags & EXEC_FLAG_EXPLAIN_ONLY) est vraie, cette fonction ne doit pas raliser d'actions visibles
en externe. Elle doit seulement faire le minimum requis pour que l'tat du nud soit valide pour ExplainForeignScan et
EndForeignScan.
TupleTableSlot *
IterateForeignScan (ForeignScanState *node);
Rcupre une ligne de la source distante, la renvoyant dans un emplacement de ligne de table (le champ ScanTupleSlot du
nud doit tre utilis dans ce but). Renvoie NULL s'il n'y a plus de lignes disponibles. L'infrastructure d'emplacement de ligne de
table permet qu'une ligne physique ou virtuelle soit renvoye. Dans la plupart des cas, la deuxime possibilit (virtuelle), est prfrable d'un point de vue des performances. Notez que cette fonction est appele dans un contexte mmoire dont la dure de vie est
trs courte et qui sera rinitialis entre chaque appel. Crez un contexte mmoire dans BeginForeignScan si vous avez besoin
d'un stockage qui tient plus longtemps ou utilisez le champ es_query_cxt de EState.
Les lignes renvoyes doivent correspondre la signature de la colonne de la table distante parcourue. Si vous prfrez optimiser la
rcupration des colonnes inutiles, vous devez insrer des NULL dans les positions de ces colonnes
Notez que l'excuteur de PostgreSQL ne se proccupe pas de savoir si les lignes renvoyes violent les contraintes NOT NULL
dfinies sur les colonnes de la table distante. Le planificateur s'en proccupe et pourrait mal optimiser les requtes si des valeurs
NULL sont prsentes dans une colonne dclare ne pas en contenir. Si une valeur NULL est dcouverte alors que l'utilisateur a dclar qu'aucune valeur NULL ne devrait tre prsente, il pourrait tre appropri de lever une erreur (exactement comme vous le feriez en cas d'un type de donnes inappropri).
void
ReScanForeignScan (ForeignScanState *node);
Recommence le parcours depuis le dbut. Notez que les paramtres dont dpent le parcours peuvent avoir changs de valeur, donc
le nouveau parcours ne va pas forcment renvoyer les mmes lignes.
void
EndForeignScan (ForeignScanState *node);
Termine le parcours et relche les ressources. Il n'est habituellement pas ncessaire de relcher la mmoire alloue via palloc. Par
contre, les fichiers ouverts et les connexions aux serveurs distants doivent tre nettoys.
Les types de structure FdwRoutine et FdwPlan sont dclars dans src/include/foreign/fdwapi.h, qui est lire pour des
dtails supplmentaires.
1313
P(t)
P''(t)
+=========================================+
|>>>>>>>>>>> Algorithme GA <<<<<<<<<<<<<<|
+=========================================+
| INITIALISE t := 0
|
+=========================================+
| INITIALISE P(t)
|
1314
l'utilisation d'un algorithme gntique monostable (ou tat stable) (remplacement des individus les moins cibls au lieu d'un
remplacement global de gnration) permet une convergence rapide vers des plans de requtes amliors ; c'est indispensable
au traitement des requtes dans un temps raisonnable ;
l'utilisation de croisements (recombinaisons) aux limites est particulirement adapt pour la restriction des pertes aux limites
lors de la rsolution du problme du voyageur de commerce par un algorithme gntique ;
la mutation en tant qu'oprateur gntique est rendue obsolte afin d'viter la ncessit de mcanismes de rparation lors de la
gnration de tournes valides du problme du voyageur de commerce.
Dans l'implantation courante, l'adaptation de chaque squence de jointure candidate est estime par l'excution ab-initio du code
standard de slection de jointure et d'estimation de cot utilis par le planificateur. Avec l'hypothse que diffrents candidats utilisent des sous-squences de jointure similaires, une grande partie du travail est rpte. Ce processus peut tre grandement acclr en retenant les estimations de cot des sous-jointures. Le problme consiste viter d'tendre inutilement la mmoire en mmorisant ces tats.
un niveau plus basique, il n'est pas certain qu'optimiser une requte avec un algorithme gntique conu pour le problme du
voyageur de commerce soit appropri. Dans le cas du voyageur de commerce, le cot associ une sous-chane quelconque (tour
partiel) est indpendant du reste du tour, mais cela n'est certainement plus vrai dans le cas de l'optimisation de requtes. Du coup,
la question reste pose quant au fait que la recombinaison soit la procdure de mutation la plus efficace.
Evolutionary Computation and its application to art and design, par Craig Reynolds ;
elma04
fong
1316
void
amrescan (IndexScanDesc scan,
ScanKey keys,
int nkeys,
ScanKey orderbys,
int norderbys);
Dmarre ou relance un parcours d'index, possiblement avec des nouvelles cls d'index. (Pour relancer en utilisant des cls dj
passes, NULL est pass pour keys et/ou orderbys.) Notez qu'il n'est pas autoris que le nombre de cls ou d'oprateurs de tri
soit plus grande que celui pass la fonction ambeginscan. En pratique, la fonctionnalit de relancement est utilise quand une
nouvelle ligne externe est slectionne par une jointure de boucle imbrique, et donc une nouvelle valeur de comparaison de cl
est requise, mais la structure de cl de parcours reste la mme.
boolean
amgettuple (IndexScanDesc scan,
ScanDirection direction);
Rcuprer la prochaine ligne d'un parcours donn, dans la direction donne (vers l'avant ou l'arrire de l'index). Renvoie TRUE si
une ligne a t obtenue, FALSE s'il ne reste aucune ligne. Dans le cas TRUE, le TID de la ligne est stock dans la structure scan.
success signifie uniquement que l'index contient une entre qui correspond aux cls de parcours, pas que la ligne existe toujours dans la pile ou qu'elle peut russir le test d'instantan de l'appelant. En cas de succs, amgettuple doit aussi configur
scan->xs_recheck TRUE ou FALSE. FALSE signifie qu'il est certain que l'entre de l'index correspond aux cls de parcours. TRUE signifie que ce n'est pas certain et que les conditions reprsentes par les cls de parcours doivent tre de nouveau
vrifies sur la ligne de la table aprs l'avoir rcupr. Cette diffrence permet de supporter les oprateurs d'index perte . Notez que la nouvelle vrification s'tendra seulement aux conditions de parcours ; un prdicat partiel d'index n'est jamais vrifi par
les appelants amgettuple.
La fonction amgettuple a seulement besoin d'exister si la mthode d'accs supporte les parcours d'index standards. Si ce n'est
pas le cas, le champ amgettuple de la ligne de pg_am doit valoir zro.
int64
amgetbitmap (IndexScanDesc scan,
TIDBitmap *tbm);
Rcupre toutes les lignes du parcours slectionn et les ajoute au TIDBitmap fournit par l'appelant (c'est--dire un OU de
l'ensemble des identifiants de ligne dans l'ensemble o se trouve dj le bitmap). Le nombre de lignes rcupres est renvoy (cela
peut n'tre qu'une estimation car certaines mthodes d'accs ne dtectent pas les duplicats). Lors de l'insertion d'identifiants de
ligne dans le bitmap, amgetbitmap peut indiquer que la vrification des conditions du parcours est requis pour des identifiants
prcis de transactions. C'est identique au paramtre de sortie xs_recheck de amgettuple. Note : dans l'implantation actuelle,
le support de cette fonctionnalit peut beaucoup ressembler au support du stockage perte du bitmap lui-mme, et du coup les appelants vrifient les conditions du parcours et le prdicat de l'index partiel (si disponible) pour les lignes vrifiables nouveau. Cela pourrait ne pas toujours tre vrai. amgetbitmap et amgettuple ne peuvent pas tre utiliss dans le mme parcours
d'index ; il existe d'autres restrictions lors de l'utilisation de amgetbitmap, comme expliques dans Section 52.3, Parcours
d'index .
La fonction amgetbitmap doit seulement exister si la mthode d'accs supporte les parcours d'index bitmap . Dans le cas
contraire, le champ amgetbitmap de la ligne correspondante dans pg_am doit tre zro.
void
amendscan (IndexScanDesc scan);
Terminer un parcours et librer les ressources. La structure scan elle-mme ne doit pas tre libre, mais tout verrou pris en interne par la mthode d'accs doit tre libr.
void
ammarkpos (IndexScanDesc scan);
Marquer la position courante du parcours. La mthode d'accs ne mmorise qu'une seule position par parcours.
void
amrestrpos (IndexScanDesc scan);
Restaurer le parcours sa plus rcente position marque.
Par convention, l'entre pg_proc de toute fonction de mthode d'accs aux index affiche le bon nombre d'arguments, mais les
1320
Les mthodes d'accs qui renvoient toujours les entres dans l'ordre naturel (comme les B-tree) doivent configurer pg_am.amcanorder true. Actuellement, ces mthodes d'accs doivent utiliser des nombres de stratgie compatibles avec les B-tree
pour les oprateurs d'galit et de tri.
Les mthodes d'accs qui supportent les oprateurs de tri doivent configurer pg_am.amcanorderbyop true. Ceci indique
que l'index est capable de renvoyer les entres dans un ordre satisfaisant ORDER BY cl_index oprateur
constante. Les modificateurs de parcours de cette forme peuvent tre passs amrescan comme dcrits prcdemment
previously.
La fonction amgettuple dispose d'un argument direction, qui peut tre soit ForwardScanDirection (le cas normal)
soit BackwardScanDirection. Si le premier appel aprs amrescan prcise BackwardScanDirection, alors
l'ensemble des entres d'index correspondantes est parcourir de l'arrire vers l'avant plutt que dans la direction normale (d'avant
en arrire). amgettuple doit donc renvoyer la dernire ligne correspondante dans l'index, plutt que la premire, comme cela se
fait normalement. (Cela ne survient que pour les mthodes d'accs qui initialise amcanorder true.) Aprs le premier appel,
amgettuple doit tre prpar pour continuer le parcours dans la direction adapte partir de l'entre la plus rcemment renvoye. (Mais si pg_am.amcanbackward vaut false, tous les appels suivants auront la mme direction que le premier.)
Les mthodes d'accs qui supportent les parcours ordonns doivent supporter le marquage d'une position dans un parcours
pour retourner plus tard la position marque. La mme position pourrait tre restaure plusieurs fois. Nanmoins, seule une position par parcours a besoin d'tre conserve en mmoire ; un nouvel appel ammarkpos surcharge la position anciennement marque. Une mthode d'accs qui ne supporte pas les parcours ordonns doit quand mme fournir les fonctions de marquage et de
restauration dans pg_am, mais il est suffisant de leur faire renvoyer des erreurs si les fonctions sont appeles.
Les positions du parcours et du marquage doivent tre conserves de faon cohrente dans le cas d'insertions et de suppressions
concurrentes dans l'index. Il est tout fait correct qu'une entre tout juste insre ne soit pas retourne par un parcours, qui si
l'entre avait exist au dmarrage du parcours, aurait t retourne. De mme est-il correct qu'un parcours retourne une telle entre
lors d'un re-parcours ou d'un retour arrire, alors mme qu'il ne l'a pas retourn lors du parcours initial. l'identique, une suppression concurrente peut tre, ou non, visible dans les rsultats d'un parcours. Il est primordial qu'insertions et suppressions ne
conduisent pas le parcours oublier ou dupliquer des entres qui ne sont pas elles-mme insres ou supprimes.
amgetbitmap peut tre utilis la place de amgettuple pour un parcours d'index. Cela permet de rcuprer toutes les lignes
en un appel. Cette mthode peut s'avrer notablement plus efficace que amgettuple parce qu'elle permet d'viter les cycles de
verrouillage/dverrouillage l'intrieur de la mthode d'accs. En principe, amgetbitmap a les mmes effets que des appels r1321
une nouvelle entre dans l'en-tte est effectue avant son entre dans l'index. (Un parcours d'index concurrent peut alors ne pas
voir l'entre dans l'en-tte. Ce n'est pas gnant dans la mesure o un lecteur de l'index ne s'intresse pas une ligne non valide. Voir Section 52.5, Vrification de l'unicit de l'index );
Lorsqu'entre de l'en-tte va tre supprime (par VACUUM), toutes les entres de l'index doivent d'abord tre supprimes ;
un parcours d'index doit maintenir un lien sur la page d'index contenant le dernier lment renvoy par amgettuple, et ambulkdelete ne peut pas supprimer des entres de pages lies d'autres processus. La raison de cette rgle est explique
plus bas.
Sans la troisime rgle, il est possible qu'un lecteur d'index voit une entre dans l'index juste avant qu'elle ne soit supprime par un
VACUUM, et arrive l'entre correspondante de l'en-tte aprs sa suppression par le VACUUM. Cela ne pose aucun problme
srieux si ce numro d'lment est toujours inutilis quand le lecteur l'atteint, car tout emplacement d'lment vide est ignor par
heap_fetch(). Mais que se passe-t-il si un troisime moteur a dj r-utilis l'emplacement de l'lment pour quelque chose
d'autre ? Lors de l'utilisation d'un instantan compatible MVCC, il n'y a pas de problme car le nouvel occupant de l'emplacement
est certain d'tre trop rcent pour russir le test de l'insstantan. En revanche, avec un instantan non-compatible MVCC (tel que
SnapshotNow), une ligne qui ne correspond pas aux cls de parcours peut tre accepte ou retourne. Ce scnario peut tre vit
en imposant que les cls de parcours soient re-confrontes la ligne d'en-tte dans tous les cas, mais cela est trop coteux. la
place, un lien sur une page d'index est utilis comme proxy pour indiquer que le lecteur peut tre en parcours entre l'entre de
l'index et l'entre de l'en-tte correspondante. Bloquer ambulkdelete sur un tel lien assure que VACUUM ne peut pas supprimer l'entre de l'en-tte avant que le lecteur n'en ait termin avec elle. Cette solution est peu coteuse en temps d'excution, et
n'ajoute de surcharge du fait du blocage que dans de rares cas rellement un conflictuels.
Cette solution requiert que les parcours d'index soient synchrones : chaque ligne d'en-tte doit tre rcupre immdiatement
aprs le parcours de l'entre d'index correspondante. C'est coteux pour plusieurs raisons. Un parcours asynchrone dans lequel
de nombreux TID sont rcuprs de l'index, et pour lequel les en-ttes de lignes ne sont visits que plus tard, requiert moins de
surcharge de verrouillage d'index et autorise un modle d'accs l'en-tte plus efficace. D'aprs l'analyse ci-dessus, l'approche
synchronise doit tre utilise pour les instantans non compatibles avec MVCC, mais un parcours asynchrone est possible pour
une requte utilisant une instantan MVCC.
Dans un parcours d'index amgetbitmap, la mthode d'accs ne conserve pas de lien l'index sur quelque ligne renvoye. C'est
pourquoi, il est prfrable d'utiliser de tels parcours avec les instantans compatibles MVCC.
Quand le drapeau ampredlocks n'est pas configur, tout parcours utilisant cette mthode d'accs de l'index dans une transaction
srialisable acqurera un verrou prdicat non bloquant sur l'index complet. Ceci gnrera un conflit en lecture/criture avec
l'insertion d'une ligne dans cet index par une transaction srialisable concurrente. Si certains motifs de conflit en lecture/criture
sont dtects parmi un ensemble de transactions srialisables concurrentes, une de ces transactions pourrait tre annule pour protger l'intgrit des donnes. Quand le drapeau est configur, cela indique que la mthode d'accs de l'index implmente un verrou
prdicat plus fin, qui tend rduire la frquence d'annulations de telles requtes.
1322
si une ligne valide conflictuelle a t supprime par la transaction courante, pas de problme. (En particulier, comme un UPDATE supprime toujours l'ancienne version de la ligne avant d'insrer la nouvelle version, cela permet un UPDATE sur une
ligne sans changer la cl) ;
si une ligne conflictuelle a t insre par une transaction non encore valide, l'insreur potentiel doit attendre de voir si la
transaction est valide. Si la transaction est annule, alors il n'y a pas de conflit. Si la transaction est valide sans que la ligne
conflictuelle soit supprime, il y a violation de la contrainte d'unicit. (En pratique, on attend que l'autre transaction finisse et
le contrle de visibilit est effectu nouveau dans son intgralit) ;
de faon similaire, si une ligne valide conflictuelle est supprime par une transaction non encore valide, l'inserant potentiel
doit attendre la validation ou l'annulation de cette transaction et recommencer le test.
De plus, immdiatement avant de lever une violation d'unicit en fonction des rgles ci-dessus, la mthode d'accs doit revrifier
l'tat de la ligne en cours d'insertion. Si elle est valide tout en tant morte, alors aucune erreur ne survient. (Ce cas ne peut pas
survenir lors du scnario ordinaire d'insertion d'une ligne tout juste cre par la transaction en cours. Cela peut nanmoins arriver
lors d'un CREATE UNIQUE INDEX CONCURRENTLY.)
La mthode d'accs l'index doit appliquer elle-mme ces tests, ce qui signifie qu'elle doit accder l'en-tte pour vrifier le statut
de validation de toute ligne prsente avec une cl duplique au regard du contenu de l'index. C'est sans aucun doute moche et non
modulaire, mais cela permet d'viter un travail redondant : si un test spar est effectu, alors la recherche d'une ligne conflictuelle
dans l'index est en grande partie rpte lors de la recherche d'une place pour insrer l'entre d'index de la nouvelle ligne. Qui plus,
est, il n'y a pas de faon triviale d'viter les conflits, sauf si la recherche de conflit est partie intgrante de l'insertion de la nouvelle
entre d'index.
Si la contrainte unique est dferrable, il y a une complication supplmentaire : nous devons tre capable d'insrer une entre
d'index pour une nouvelle ligne mais de dferrer toute erreur de violation de l'unicit jusqu' la fin de l'instruction, voire mme
aprs. Pour viter des recherches rptes et inutiles de l'index, la mthode d'accs de l'index doit faire une vrification prliminaire d'unicit lors de l'insertion initiale. Si cela montre qu'il n'y a pas de conflit avec une ligne visible, nous avons termin. Sinon,
nous devons planifier une nouvelle vrification quand il sera temps de forcer la contrainte. Si, au moment de la nouvelle vrification, la ligne insre et d'autres lignes de la mme cl sont vivantes, alors l'erreur doit tre reporte. (Notez que, dans ce contexte,
vivant signifie rellement toute ligne dans la chaine HOT de l'entre de l'index est vivante .) Pour implanter ceci, la fonction aminsert reoit un paramtre checkUnique qui peut avoir une des valeurs suivantes :
UNIQUE_CHECK_NO indicates that no uniqueness checking should be done (this is not a unique index).
UNIQUE_CHECK_YES indique qu'il s'agit d'un index unique non dferrable et la vrification de l'unicit doit se faire immdiatement, comme dcrit ci-dessus.
UNIQUE_CHECK_PARTIAL indique que la contrainte unique est dferrable. PostgreSQL utilisera ce mode pour insrer
l'entre d'index de chaque ligne. La mthode d'accs doit autoriser les entres dupliques dans l'index et rapporter tout dupliquat potentiel en renvoyant FALSE partir de aminsert. Pour chaque ligne pour laquelle FALSE est renvoy, une revrification dferre sera planifie.
La mthode d'accs doit identifier toute ligne qui pourrait violer la contrainte unique, mais rapporter des faux positifs n'est pas
une erreur. Cela permet de faire la vrification sans attendre la fin des autres transactions ; les conflits rapports ici ne sont pas
traits comme des erreurs, et seront revrifis plus tard, un moment o ils ne seront peut-tre plus en conflit.
UNIQUE_CHECK_EXISTING indique que c'est une revrification dferre d'une ligne qui a t rapporte comme en violation
potentielle d'unicit. Bien que cela soit implant par un appel aminsert, la mthode d'accs ne doit pas insrer une nouvelle entre d'index dans ce cas. L'entre d'index est dj prsente. la place, la mthode d'accs doit vrifier s'il existe une
autre entre d'index vivante. Si c'est le cas et que la ligne cible est toujours vivante, elle doit rapporter une erreur.
Il est recommend que, dans un appel UNIQUE_CHECK_EXISTING, la mthode d'accs vrifie en plus que la ligne cible
ait rellement une entre existante dans l'index et de rapporter une erreur si ce n'est pas le cas. C'est une bonne ide car les valeurs de la ligne d'index passes aminsert auront t recalcules. Si la dfinition de l'index implique des fonctions qui ne
sont pas vraiment immutables, nous pourrions vrifier la mauvaise aire de l'index. Vrifier que la ligne cible est trouve dans
1323
cots
d'accs
aux
index
doivent
tre
calculs
1324
en
utilisant
les
paramtres
utiliss
par
src/ba-
Estime et renvoie la fraction des lignes de la table parent visites d'aprs les conditions de qualification donnes. En l'absence
de toute connaissance spcifique sur le type de l'index, on utilise la fonction de l'optimiseur standard clauselist_selectivity():
*indexSelectivity = clauselist_selectivity(root, indexQuals,
index->rel->relid,
JOIN_INNER, NULL);
2.
Estime le nombre de lignes d'index visites lors du parcours. Pour de nombreux types d'index, il s'agit de indexSelectivity multipli par le nombre de lignes dans l'index, mais cela peut valoir plus (la taille de l'index en pages et lignes est disponible partir de la structure IndexOptInfo).
3.
Estime le nombre de pages d'index rcupres pendant le parcours. Ceci peutt tre simplement indexSelectivity multipli par la taille de l'index en pages.
4.
5.
Estime la corrlation de l'index. Pour un index ordonn sur un seul champ, cela peut s'extraire de pg_statistic. Si la corrlation est inconnue, l'estimation conservative est zro (pas de corrlation).
1325
53.2. Extensibilit
L'implantation d'une nouvelle mthode d'accs un index a toujours t un travail complexe. Il est, en effet, ncessaire de comprendre le fonctionnement interne de la base de donnes, tel que le gestionnaire de verrous ou le WAL.
L'interface GiST dispose d'un haut niveau d'abstraction, ce qui autorise le codeur de la mthode d'accs ne coder que la smantique du type de donnes accd. La couche GiST se charge elle-mme de la gestion des accs concurrents, des traces et de la
recherche dans la structure en arbre.
Cette extensibilit n'est pas comparable celle des autres arbres de recherche standard en termes de donnes gres. Par
exemple, PostgreSQL supporte les B-trees et les index de hachage extensibles. Cela signifie qu'il est possible d'utiliser PostgreSQL pour construire un B-tree ou un hachage sur tout type de donnes. Mais, les B-trees ne supportent que les prdicats
d'chelle (<, =, >), les index de hachage que les requtes d'galit.
Donc, lors de l'indexation d'une collection d'images, par exemple, avec un B-tree PostgreSQL, seules peuvent tre lances des
requtes de type est-ce que imagex est gale imagey , est-ce que imagex est plus petite que imagey et est-ce que imagex est plus grande que imagey . En fonction de la dfinition donne gale , infrieure ou suprieure , cela
peut avoir une utilit. Nanmoins, l'utilisation d'un index bas sur GiST permet de crer de nombreuses possibilits de poser des
questions spcifiques au domaine, telles que trouver toutes les images de chevaux ou trouver toutes les images surexposes .
Pour obtenir une mthode d'accs GiST fonctionnelle, il suffit de coder plusieurs mthodes utilisateur dfinissant le comportement des cls dans l'arbre. Ces mthodes doivent tre suffisamment labores pour supporter des requtes avances, mais pour
toutes les requtes standard (B-trees, R-trees, etc.) elles sont relativement simples. En bref, GiST combine extensibilit, gnralit, r-utilisation de code et interface claire.
53.3. Implantation
Une classe d'oprateur d'index GiST doit fournir sept mthodes, et une huitime optionnelle. La prcision de l'index est assure
par l'implantation des mthodes same, consistent et union alors que l'efficacit (taille et rapidit) de l'index dpendra des
mthodes penalty et picksplit. Les deux fonctions restantes sont compress et decompress, qui permettent un index d'avoir des donnes internes de l'arbre d'un type diffrent de ceux des donnes qu'il indexe. Les feuilles doivent tre du type
des donnes indexes alors que les autres nuds peuvent tre de n'importe quelle structure C (mais vous devez toujours suivre
les rgles des types de donnes de PostgreSQL dans ce cas, voir ce qui concerne varlena pour les donnes de taille variable). Si le type de donnes interne de l'arbre existe au niveau SQL, l'option STORAGE de la commande CREATE OPERATOR CLASS peut tre utilise. La huitime mthode, optionnelle, est distance, qui est ncessaire si la classe d'oprateur
souhaite supporter les parcours ordonnes (intressant dans le cadre des recherches du voisin-le-plus-proche, nearest-neighbor).
consistent
tant donn une entre d'index p et une valeur de requte q, cette fonction dtermine si l'entre de l'index est cohrente
( consistent en anglais) avec la requte ; c'est--dire, est-ce que le prdicat colonne_indexe oprateur_indexable q soit vrai pour toute ligne reprsente par l'entre de l'index ? Pour une entre de l'index de type
feuille, c'est l'quivalent pour tester la condition indexable, alors que pour un nud interne de l'arbre, ceci dtermine s'il est
ncessaire de parcourir le sous-arbre de l'index reprsent par le nud. Quand le rsultat est true, un drapeau recheck
doit aussi tre renvoy. Ceci indique si le prdicat est vrai coup sr ou seulement peut-tre vrai. Si recheck = false,
alors l'index a test exactement la condition du prdicat, alors que si recheck = true, la ligne est seulement un correspondance de candidat. Dans ce cas, le systme valuera automatiquement l'oprateur_indexable avec la valeur ac1326
Index GiST
tuelle de la ligne pour voir s'il s'agit rellement d'une correspondance. Cette convention permet GiST de supporter la fois
les structures sans pertes et celles avec perte de l'index.
La dclaration SQL de la fonction doit ressembler ceci :
CREATE OR REPLACE FUNCTION my_consistent(internal, data_type, smallint, oid,
internal)
RETURNS bool
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT;
Et le code correspondant dans le module C peut alors suivre ce squelette :
Datum
my_consistent(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(my_consistent);
Datum
my_consistent(PG_FUNCTION_ARGS)
{
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
data_type *query = PG_GETARG_DATA_TYPE_P(1);
StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
/* Oid subtype = PG_GETARG_OID(3); */
bool
*recheck = (bool *) PG_GETARG_POINTER(4);
data_type *key = DatumGetDataType(entry->key);
bool
retval;
/*
* determine return value as a function of strategy, key and query.
*
* Use GIST_LEAF(entry) to know where you're called in the index tree,
* which comes handy when supporting the = operator for example (you could
* check for non empty union() in non-leaf nodes and equality in leaf
* nodes).
*/
*recheck = true;
PG_RETURN_BOOL(retval);
}
Ici, key est un lment dans l'index et query la valeur la recherche dans l'index. Le paramtre StrategyNumber indique l'oprateur appliqu de votre classe d'oprateur. Il correspond un des nombres d'oprateurs dans la commande
CREATE OPERATOR CLASS. Suivant les oprateurs que vous avez inclus dans la classe, le type de donnes de query
pourrait varier avec l'oprateur, mais le squelette ci-dessus suppose que ce n'est pas le cas.
union
Cette mthode consolide l'information dans l'arbre. Suivant un ensemble d'entres, cette fonction gnre une nouvelle entre
d'index qui reprsente toutes les entres donnes.
La dclaration SQL de la fonction doit ressembler ceci :
CREATE OR REPLACE FUNCTION my_union(internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT;
Et le code correspondant dans le module C peut alors suivre ce squelette :
Datum
my_union(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(my_union);
Datum
my_union(PG_FUNCTION_ARGS)
{
GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
GISTENTRY *ent = entryvec->vector;
data_type *out,
1327
Index GiST
int
*tmp,
*old;
numranges,
i = 0;
numranges = entryvec->n;
tmp = DatumGetDataType(ent[0].key);
out = tmp;
if (numranges == 1)
{
out = data_type_deep_copy(tmp);
PG_RETURN_DATA_TYPE_P(out);
}
for (i = 1; i < numranges; i++)
{
old = out;
tmp = DatumGetDataType(ent[i].key);
out = my_union_implementation(out, tmp);
}
PG_RETURN_DATA_TYPE_P(out);
}
Comme vous pouvez le voir dans ce quelette, nous grons un type de donnes o union(X, Y, Z) =
union(union(X, Y), Z). C'est assez simple pour supporter les types de donnes o ce n'est pas le cas, en implantant
un autre algorithme d'union dans cette mthode de support GiST.
La fonction d'implantation de union doit renvoyer un pointeur vers la mmoire qui vient d'tre alloue via la fonction palloc(). Vous ne pouvez pas tout simplement renvoyer l'entre.
compress
Convertit l'lment de donnes dans un format compatible avec le stockage physique dans une page d'index.
La dclaration SQL de la fonction doit ressembler ceci :
CREATE OR REPLACE FUNCTION my_compress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT;
Et le code correspondant dans le module C peut alors suivre ce squelette :
Datum
my_compress(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(my_compress);
Datum
my_compress(PG_FUNCTION_ARGS)
{
GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
GISTENTRY *retval;
if (entry->leafkey)
{
/* replace entry->key with a compressed version */
compressed_data_type *compressed_data =
palloc(sizeof(compressed_data_type));
/* fill *compressed_data from entry->key ... */
retval = palloc(sizeof(GISTENTRY));
gistentryinit(*retval, PointerGetDatum(compressed_data),
entry->rel, entry->page, entry->offset, FALSE);
}
else
{
/* typically we needn't do anything with non-leaf entries */
1328
Index GiST
retval = entry;
}
PG_RETURN_POINTER(retval);
}
Vous devez adapter compressed_data_type au type spcifique que vous essayez d'obtenir pour compresser les nuds
finaux.
Vous pourriez aussi avoir besoin de faire attention la compression des valeurs NULL, en enregistrant par exemple (Datum)
0 comme le fait gist_circle_compress.
decompress
L'inverse de la fonction compress. Convertit la reprsentation de l'lment de donne en un format manipulable par la base
de donnes.
La dclaration SQL de la fonction doit ressembler ceci :
CREATE OR REPLACE FUNCTION my_decompress(internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT;
Et le code correspondant dans le module C peut alors suivre ce squelette :
Datum
my_decompress(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(my_decompress);
Datum
my_decompress(PG_FUNCTION_ARGS)
{
PG_RETURN_POINTER(PG_GETARG_POINTER(0));
}
Le squelette ci-dessus est convenable dans le cas i aucune dcompression n'est ncessaire.
penalty
Renvoie une valeur indiquant le cot d'insertion d'une nouvelle entre dans une branche particulire de l'arbre. Les lments seront insrs dans l'ordre des pnalits moindres (penalty) de l'arbre. Les valeurs renvoyes par penalty doivent
tre positives ou nulles. Si une valeur ngative est renvoye, elle sera traite comme valant zro.
La dclaration SQL de la fonction doit ressembler ceci :
CREATE OR REPLACE FUNCTION my_penalty(internal, internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT; -- in some cases penalty functions need not be strict
Et le code correspondant dans le module C peut alors suivre ce squelette :
Datum
my_penalty(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(my_penalty);
Datum
my_penalty(PG_FUNCTION_ARGS)
{
GISTENTRY *origentry = (GISTENTRY *) PG_GETARG_POINTER(0);
GISTENTRY *newentry = (GISTENTRY *) PG_GETARG_POINTER(1);
float
*penalty = (float *) PG_GETARG_POINTER(2);
data_type *orig = DatumGetDataType(origentry->key);
data_type *new = DatumGetDataType(newentry->key);
*penalty = my_penalty_implementation(orig, new);
PG_RETURN_POINTER(penalty);
}
La fonction penalty est crucial pour de bonnes performances de l'index. Elle sera utilise lors de l'insertion pour dterminer
la branche suivre pour savoir o ajoter la nouvelle entre dans l'arbre. Lors de l'excution de la requte, plus l'arbre sera bien
1329
Index GiST
Index GiST
unionL = tmp_union;
else
unionL = my_union_implementation(unionL, tmp_union);
*left = real_index;
++left;
++(v->spl_nleft);
}
else
{
/*
* Same on the right
*/
}
}
v->spl_ldatum = DataTypeGetDatum(unionL);
v->spl_rdatum = DataTypeGetDatum(unionR);
PG_RETURN_POINTER(v);
}
Comme penalty, la fonction picksplit est cruciale pour de bonnes performances de l'index. Concevoir des implantations convenables des fonctions penalty et picksplit est le challenge d'un index GiST performant.
same
Renvoit true si les deux entres de l'index sont identiques, faux sinon.
La dclaration SQL de la fonction ressemble ceci :
CREATE OR REPLACE FUNCTION my_same(internal, internal, internal)
RETURNS internal
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT;
Et le code correspondant dans le module C peut alors suivre ce squelette :
Datum
my_same(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(my_same);
Datum
my_same(PG_FUNCTION_ARGS)
{
prefix_range *v1 = PG_GETARG_PREFIX_RANGE_P(0);
prefix_range *v2 = PG_GETARG_PREFIX_RANGE_P(1);
bool
*result = (bool *) PG_GETARG_POINTER(2);
*result = my_eq(v1, v2);
PG_RETURN_POINTER(result);
}
Pour des raisons historiques, la fonction same ne renvoie pas seulement un rsultat boolen ; la place, il doit enregistrer le
drapeau l'emplacement indiqu par le troisime argument.
distance
partir d'une entre d'index p et une valeur recherche q, cette fonction dtermine la distance entre l'entre de l'index et
la valeur recherche. Cette fonction doit tre fournie si la classe d'oprateur contient des oprateurs de tri. Une requte utilisant l'oprateur de tri sera implmente en renvoyant les entres d'index dont les valeurs de distance sont les plus petites,
donc les rsultats doivent tre cohrents avec la smantique de l'oprateur. Pour une entre d'index de type feuille, le rsultat
reprsente seulement la distance vers l'entre d'index. Pour un nud de l'arbre interne, le rsultat doit tre la plus petite distance que toute entre enfant reprsente.
La dclaration SQL de la fonction doit ressembler ceci :
CREATE OR REPLACE FUNCTION my_distance(internal, data_type, smallint, oid)
RETURNS float8
AS 'MODULE_PATHNAME'
LANGUAGE C STRICT;
1331
Index GiST
53.4. Exemples
La distribution source de PostgreSQL inclut plusieurs exemples de mthodes d'indexation implantes selon GiST. Le systme
principal fournit des fonctionnalits de recherche plein texte (indexation des tsvector et tsquery) ainsi que des fonctionnalits quivalentes aux R-Tree pour certains types de donnes gomtriques (voir src/backend/access/gist/gistproc.c). Les
modules contrib suivants contiennent aussi des classes d'oprateur GiST :
btree_gist
Fonctionnalits quivalentes aux B-Tree pour plusieurs types de donnes
cube
Indexation de cubes multi-dimensionnels
hstore
Module pour le stockage des paires (cl, valeur)
intarray
RD-Tree pour tableaux uni-dimensionnels de valeurs int4
ltree
Indexation des structures de type arbre
pg_trgm
Similarit textuelle par correspondance de trigrammes
seg
Indexation pour les nombres flottants
1332
54.2. Extensibilit
L'interface GIN a un haut niveau d'abstraction. De ce fait, la personne qui code la mthode d'accs n'a besoin d'implanter que les
smantiques du type de donnes accd. La couche GIN prend en charge la gestion de la concurrence, des traces et des recherches dans la structure de l'arbre.
Pour obtenir une mthode d'accs GIN fonctionnelle, il suffit d'implanter quatre (ou cinq) mthodes utilisateur. Celles-ci dfinissent le comportement des cls dans l'arbre et les relations entre cls, valeurs indexes et requtes indexables. En rsum, GIN
combine extensibilit, gnralisation, r-utilisation du code une interface claire.
Les quatre mthodes qu'une classe d'oprateur GIN doit fournir sont :
int compare(Datum a, Datum b)
Compare deux cls (et non deux valeurs indexes !) et renvoie un entier ngatif, zro ou un entier positif, qui indique si la
premire cl est infrieure, gale ou suprieure la seconde. Null keys are never passed to this function.
Datum *extractValue(Datum inputValue, int32 *nkeys, bool **nullFlags)
Retourne un tableau de cls allou par palloc en fonction d'un item indexer. Le nombre de cls retournes doit tre stoc
dans *nkeys. Si une des cls peut tre nulle, allouez aussi par palloc un tableau de *nkeys boolens, stockez son adresse
dans *nullFlags, et positionnez les drapeaux null o ils doivent l'tre. *nullFlags eut tre lais NULL (sa valeur
initiale) si toutes les cls sont non-nulles. La valeur retourne peut tre NULL si l'item ne contient aucune cl.
Datum *extractQuery(Datum query, int32 *nkeys, StrategyNumber n, bool **pmatch, Pointer **extra_data, bool **nullFlags, int32 *searchMode)
Renvoie un tableau de cls en fonction de la valeur requter ; c'est--dire que query est la valeur du ct droit d'un oprateur indexable dont le ct gauche est la colonne indexe. n est le numro de stratgie de l'oprateur dans la classe
d'oprateur (voir Section 35.14.2, Stratgies des mthode d'indexation ). Souvent, extractQuery doit consulter n
pour dterminer le type de donnes de query et la mthode utiliser pour extraire les valeurs des cls. Le nombre de cls
renvoyes doit tre stock dans *nkeys. Si une des cls peut tre nulle, allouez aussi par palloc un tableau de *nkeys
boolens, stockez son address *nullFlags, et positionnez les drapeaux null o_ils doivent l'tre. *nullFlags peut
tre laiss NULL (sa valeur initiale) si toutes les cls sont non-nulles. La valeur de retour peut tre NULL si query ne
contient aucune cl.
searchMode est un argument de sortie qui permet extractQuery de spcifier des dtails sur comment la recherche
sera effectue. Si *searchMode est positionn GIN_SEARCH_MODE_DEFAULT (qui est la valeur laquelle il est initialis avant l'appel), seuls les items qui correspondent au moins une des cls retournes sont considres comme des candidats correspondance. Si *searchMode est positionn GIN_SEARCH_MODE_INCLUDE_EMPTY, alors en plus des
1333
Index GIN
items qui contiennent au moins une cl correspondant, les items qui ne contiennent aucune cl sont aussi considres comme
des candidats correspondance. (Ce mode est utile pour implmenter un oprateur est sous-ensemble de, par exemple.) Si
*searchMode est positionn GIN_SEARCH_MODE_ALL, alors tous les items non nuls de l'index sont candidats correspondance, qu'ils aient une cl qui corresponde celles retournes ou non. (Ce mode est beaucoup plus lent que les deux
autres, mais il peut tre ncessaire pour implmenter des cas exceptionnels correctement. Un oprateur qui a besoin de ce
mode dans la plupart des cas n'est probablement pas un bon candidat pour une classe d'oprateur GIN.) Les symboles utiliser pour positionner ce mode sont dfinis dans access/gin.h.
pmatch est un paramtre de sortie utiliser quand une correspondance partielle est permise. Pour l'utiliser, extractQuery doit allouer un tableau de boolens *nkeys et stocker son adresse dans *pmatch. Chaque lment du tableau devrait
tre positionn TRUE si la cl correspondante a besoin d'une correspondance partielle, FALSE sinon. Si *pmatch est positionn NULL alors GIN suppose qu'une mise en correspondance partielle n'est pas ncessaire. La variable est initialise
NULL avant l'appel, et peut donc tre simplement ignore par les classes d'oprateurs qui ne supportent pas les correspondances partielles.
extra_data est un paramtre de sortie qui autorise extractQuery passer des donnes supplmentaires aux mthodes
consistent et comparePartial. Pour l'utiliser, extractQuery doit allouer un tableau de pointeurs *nkeys et stocker son adresse *extra_data, puis stocker ce qu'il souhaite dans les pointeurs individuels. La variable est initialise
NULL avant l'appel, afin que ce paramtre soit simplement ignor par une classe d'oprateurs qui n'a pas besoin de donnes
supplmentaires. Si *extra_data est positionn, le tableau dans son ensemble est pass la mthode consistent method, et l'lment appropri la mthode comparePartial.
bool consistent(bool check[], StrategyNumber n, Datum query, int32 nkeys, Pointer extra_data[], bool *recheck, Datum queryKeys[], bool nullFlags[])
Retourne TRUE si un item index rpond l'oprateur de requte possdant le numro de stratgie n (ou pourrait le satisfaire,
si l'indication recheck est retourne). Cette fonction n'a pas d'accs direct aux valeurs des items indexs. Au lieu de cela, ce
qui est disponible, c'est la connaissance de quelles valeurs de cls extraites de la requte apparaissent dans un item index
donn. Le tableau check a une longueur de nkeys, qui est la mme que le nombre de cls retourn prcdemment par extractQuery pour ce datum query. Chaque lment du tableau check est TRUE si l'item index contient la cl de requte correspondante, c'est dire, si (check[i] == TRUE) la i-me cl du tableau rsultat de extractQuery est prsente
dans l'item index. Le datum query original est pass au cas o la mthode contains aurait besoin de le consulter, de
mme que les tableaux queryKeys[] et nullFlags[] retourne prcdemment par extractQuery, ou NULL si aucun.
Quand extractQuery retourne une cl nulle dans queryKeys[], l'lment correpondant de check[] est TRUE si
l'item index contient une cl nulle; c'est dire que la smantique de check[] est comme celle de IS NOT DISTINCT
FROM. La fonction consistent peut examiner l'lment correspondant de nullFlags[] si elle a besoin de faire la diffrence entre une correspondance de valeur normale et une correspondance nulle.
En cas de russite, *recheck devrait tre positionn TRUE si les enregistrements de la table doivent tre revrifies par
rapport l'oprateur de la requte, ou FALSE si le test d'index est exact. Autrement dit, une valeur de retour FALSE garantit
que l'enregistrement de la table ne correspond pas; une valeur de retour TRUE avec *recheck FALSE garantit que
l'enregistrement de la table correspond la requte; et une valeur de retour TRUE avec *recheck TRUE signifie que
l'enregistrement de la table pourrait correspondre la requte, et qu'il doit tre rcupr et re-vrifi en valuant l'oprateur de
la requte directement sur l'item initialement index.
En option, une classe d'oprateurs pour GIN peut fournir une cinquime mthode :
int comparePartial(Datum partial_key, Datum key, StrategyNumber n, Pointer extra_data)
Compare une requte de correspondance partielle une cl d'index. Renvoie un entier dont le signe indique le rsultat : infrieur zro signifie que la cl d'index ne correspond pas la requte mais que le parcours d'index va continuer ; zro signifie
que la cl d'index ne correspond pas la requte ; suprieur zro indique que le parcours d'index doit s'arrter car il n'existe
pas d'autres correspondances. Le numro de stratgie n de l'oprateur qui a gnr la requte de correspondance partielle est
fourni au cas o sa smantique est ncessaire pour dterminer la fin du parcours. De plus, extra_data est l'lment correspondant du tableau extra-data fait par extractQuery, ou NULL sinon. Null keys are never passed to this function.
Pour supporter des requtes correspondance partielle , une classe d'oprateur doit fournir la mthode comparePartial, et
sa mthode extractQuery doit positionner le paramtre pmatch quand une requte correspondance partielle est rencontre.
Voir Section 54.3.2, Algorithme de mise en correspondance partielle pour les dtails.
Le type de donnes rel des diffrentes valeurs Datum mentionnes ci-dessus varien en fonction de la classe d'oprateurs. Les valeurs d'item passe extractValue sont toujours du type d'entre de la classe d'oprateur, et toutes les valeurs cl doivent tre
du type de STORAGE de la classe. Le type de l'argument query pass extractQuery et consistent est ce qui est spcifi comme type de droite de l'oprateur du membre de classe identifi par le numro de stratgie. Ce n'est pas ncessairement le
mme que le type de l'item, tant que des valeurs de cls d'un type correct peuvent en tre extraites.
1334
Index GIN
54.3. Implantation
En interne, un index GIN contient un index B-tree construit sur des cls, chaque cl est un lment d'un ou plusieurs items index
(un membre d'un tableau, par exemple) et o chaque enregistrement d'une page feuille contient soit un pointeur vers un B-tree de
pointeurs vers la table (un posting tree ), ou une liste simple de pointeurs vers enregistrement (un posting list ) quand la liste
est suffisamment courte pour tenir dans un seul enregistrement d'index avec la valeur de la cl.
partir de PostgreSQL 9.1, des valeurs de cl NULL peuvent tre incluses dans l'index. Par ailleurs, des NULLs fictifs sont inclus dans l'index pour des objets indexs qui sont NULL ou ne contiennent aucune cl d'aprs extractValue. Cela permet des
recherches retournant des lments vides.
Les index multi-colonnes GIN sont implments en construisant un seul B-tree sur des valeurs composites (numro de colonne,
valeur de cl). Les valeurs de cls pour les diffrentes colonnes peuvent tre de types diffrents.
Index GIN
en avant-plan peuvent tre vites en augmentant work_mem ou en rendant autovacuum plus aggressif. Toutefois, augmenter
work_mem implique que si un nettoyage en avant-plan se produit, il prendra encore plus longtemps.
gin_fuzzy_search_limit
La raison principale qui a pouss le dveloppement des index GIN a t la volont de supporter les recherches plein texte dans
PostgreSQL et il arrive frquemment qu'une recherche renvoie un ensemble volumineux de rsultats. Cela arrive d'autant
plus frquemment que la requte contient des mots trs frquents, auquel cas l'ensemble de rsultats n'est mme pas utile.
Puisque la lecture des lignes sur disque et leur tri prend beaucoup de temps, cette situation est inacceptable en production. (La
recherche dans l'index est, elle, trs rapide.)
Pour faciliter l'excution contrle de telles requtes, GIN dispose d'une limite suprieure souple configurable du nombre de
lignes renvoyes, le paramtre de configuration gin_fuzzy_search_limit. Par dfaut, il est positionn 0 (c'est--dire
sans limite). Si une limite diffrente de 0 est choisie, alors l'ensemble renvoy est un sous-ensemble du rsultat complet, choisi alatoirement.
Souple signifie que le nombre rel de rsultats renvoys peut diffrer lgrement de la limite indique, en fonction de la
requte et de la qualit du gnrateur de nombres alatoires du systme.
D'exprience, des valeurs de l'ordre de quelques milliers ( 5000 -- 20000) fonctionnent bien.
54.5. Limitations
GIN part de l'hypothse que les oprateurs indexables sont stricts. Cela signifie que extractValue ne sera pas appel du tout
sur une valeur d'item NULL ( la place, une entre d'enregistrement factice sera cre automatiquement), et extractQuery ne
sera pas appel non plus pour une valeur de query NULL ( la place, la requte est considre comme impossible satisfaire). Notez toutefois qu'une valeur de cl NULL contenue dans un item composite ou une valeur de requte sont supportes.
54.6. Exemples
Les sources de PostgreSQL incluent des classes d'oprateur GIN pour tsvector et pour les tableaux unidimensionnels de tous les
types internes. La recherche de prfixe dans tsvector est implmente en utilisant les correspondances partielles de GIN. Les modules contrib suivants contiennent aussi des classes d'oprateurs GIN :
btree-gin
Fonctionnalit quivalente B-tree pour plusieurs types de donnes
hstore
Module pour le stockage des paires (cl, valeur)
intarray
Support amlior pour le type int[]
pg_trgm
Similarit de texte par correspondance de trigramme
1336
lment
Description
PG_VERSION
base
global
pg_clog
pg_multixact
Sous-rpertoire contenant des donnes sur l'tat des multi-transactions (utilis pour les verrous
de lignes partages)
pg_notify
pg_serial
pg_stat_tmp
pg_subtrans
pg_tblspc
pg_twophase
pg_xlog
postmaster.opts
Un fichier enregistrant les options en ligne de commande avec lesquelles le serveur a t lanc
la dernire fois
postmaster.pid
Pour chaque base de donnes dans le groupe, il existe un sous-rpertoire dans PGDATA/base, nomm d'aprs l'OID de la base
de donnes dans pg_database. Ce sous-rpertoire est l'emplacement par dfaut pour les fichiers de la base de donnes; en particulier, ses catalogues systme sont stocks ici.
Chaque table et index est stock dans un fichier spar. Pour les relations ordinaires, ces fichiers sont nomms d'aprs le numro
filenode de la table ou de l'index. Ce numro est stock dans pg_class.relfilenode. Pour les relations temporaires, le nom
du fichier est de la forme tBBB_FFF, o BBB est l'identifiant du processus serveur qui a cr le fichier, et FFF et le numro filenode. Dans tous les cas, en plus du fichier principal (aussi appel main fork), chaque table et index a une carte des espaces
libres (voir Section 55.3, Carte des espaces libres ), qui enregistre des informations sur l'espace libre disponible dans la relation. La carte des espaces libres est stocke dans un fichier dont le nom est le numro filenode suivi du suffixe _fsm. Les tables
ont aussi une carte des visibilits, stocke dans un fichier de suffixe _vm, pour tracer les pages connues comme n'ayant pas de
lignes mortes. La carte des visibilits est dcrite dans Section 55.4, Carte de visibilit . Les tables non traces et les index dis1337
posent d'un troisime fichier, connu sous le nom de fichier d'initialisation. Son nom a pour suffixe _init (voir Section 55.5,
The Initialization Fork ).
Attention
Notez que, bien que le filenode de la table correspond souvent son OID, cela n'est pas ncessairement le cas; certaines oprations, comme TRUNCATE, REINDEX, CLUSTER et quelques formes d'ALTER TABLE, peuvent
modifier le filenode tout en prservant l'OID. vitez de supposer que filenode et OID sont identiques. De plus, pour
certains catalogues systme incluant pg_class lui-mme, pg_class.relfilenode contient zro. Le numro filenode en cours est stock dans une structure de donnes de bas niveau, et peut tre obtenu avec la fonction
pg_relation_filenode().
Quand une table ou un index dpasse 1 Go, il est divis en segments d'un Go. Le nom du fichier du premier segment est identique
au filenode ; les segments suivants sont nomms filenode.1, filenode.2, etc. Cette disposition vite des problmes sur les plateformes qui ont des limitations sur les tailles des fichiers. (Actuellement, 1 Go est la taille du segment par dfaut. Cette taille est
ajustable en utilisant l'option --with-segsize pour configure avant de construire PostgreSQL.) En principe, les fichiers de
la carte des espaces libres et de la carte de visibilit pourraient aussi ncessiter plusieurs segments, bien qu'il y a peu de chance
que cela arrive rellement.
Une table contenant des colonnes avec des entres potentiellement volumineuses aura une table TOAST associe, qui est utilise
pour le stockage de valeurs de champs trop importantes pour conserver des lignes adquates. pg_class.reltoastrelid tablit
un lien entre une table et sa table TOAST, si elle existe. Voir Section 55.2, TOAST pour plus d'informations.
Le contenu des tables et des index est discut plus en dtails dans Section 55.6, Emplacement des pages de la base de donnes .
Les tablespaces rendent ce scnario plus compliqus. Chaque espace logique dfini par l'utilisateur contient un lien symbolique
dans le rpertoire PGDATA/pg_tblspc, pointant vers le rpertoire physique du tablespace (celui spcifi dans la commande
CREATE TABLESPACE). Ce lien symbolique est nomm d'aprs l'OID du tablespace. l'intrieur du rpertoire du tablespace,
il existe un sous-rpertoire avec un nom qui dpend de la version du serveur PostgreSQL, comme par exemple
PG_9.0_201008051. (La raison de l'utilisation de ce sous-rpertoire est que des versions successives de la base de donnes
puissent utiliser le mme emplacement indiqu par CREATE TABLESPACE sans que cela provoque des conflits.) l'intrieur
de ce rpertoire spcifique la version, il existe un sous-rpertoire pour chacune des bases de donnes contenant des lments
dans ce tablespace. Ce sous-rpertoire est nomm d'aprs l'OID de la base. Les tables et les index sont enregistrs dans ce rpertoire et suivent le schma de nommage des filenodes. Le tablespace pg_default n'est pas accd via pg_tblspc mais correspond PGDATA/base. De faon similaire, le tablespace pg_global n'est pas accd via pg_tblspc mais correspond PGDATA/global.
La fonction pg_relation_filepath() affiche le chemin entier (relatif PGDATA) de toute relation. Il est souvent utile pour
ne pas avoir se rappeler toutes les diffrentes rgles ci-dessus. Gardez nanmoins en tte que cette fonction donne seulement le
nom du premier segment du fichier principal de la relation -- vous pourriez avoir besoin d'ajouter le numro de segment et/ou les
extensions _fsm ou _vm pour trouver tous les fichiers associs avec la relation.
Les fichiers temporaires (pour des oprations comme le tri de plus de donnes que ce que la mmoire peut contenir) sont crs
l'intrieur de PGDATA/base/pgsql_tmp, ou dans un sous-rpertoire pgsql_tmp du rpertoire du tablespace si un tablespace
autre que pg_default est indiqu pour eux. Le nom du fichier temporaire est de la forme pgsql_tmpPPP.NNN, o PPP est
le PID du serveur propritaire et NNN distingue les diffrents fichiers temporaires de ce serveur.
55.2. TOAST
Cette section fournit un aperu de TOAST (The Oversized-Attribute Storage Technique, la technique de stockage des attributs trop
grands).
Puisque PostgreSQL utilise une taille de page fixe (habituellement 8 Ko) et n'autorise pas qu'une ligne s'tende sur plusieurs
pages. Du coup, il n'est pas possible de stocker de grandes valeurs directement dans les champs. Pour dpasser cette limitation, les
valeurs de champ volumineuses sont compresses et/ou divises en plusieurs lignes physiques. Ceci survient de faon transparente
pour l'utilisateur, avec seulement un petit impact sur le code du serveur. Cette technique est connu sous l'acronyme affectueux de
TOAST (ou the best thing since sliced bread ).
Seuls certains types de donnes supportent TOAST -- il n'est pas ncessaire d'imposer cette surcharge sur les types de donnes qui
ne produisent pas de gros volumes. Pour supporter TOAST, un type de donnes doit avoir une reprsentation (varlena) longueur
variable, dans laquelle les 32 premiers bits contiennent la longueur totale de la valeur en octets (ceci incluant la longueur ellemme). TOAST n'a aucune contrainte supplmentaire sur la reprsentation. Toutes les fonctions niveau C qui grent un type donnes supportant TOAST doivent faire attention grer les valeurs en entre TOASTes. (Ceci se fait normalement en appelant
PG_DETOAST_DATUM avant de faire quoi que ce soit avec une valeur en entre; mais dans certains cas, des approches plus efficaces sont possibles.)
1338
TOAST rcupre deux bits du mot contenant la longueur d'un varlena (ceux de poids fort sur les machines big-endian, ceux de
poids faible sur les machines little-endian), limitant du coup la taille logique de toute valeur d'un type de donnes TOAST 1 Go
(230 - 1 octets). Quand les deux bits sont zro, la valeur est une valeur non TOAST du type de donnes et les bits restants dans
le mot contenant la longueur indiquent la taille total du datum (incluant ce mot) en octets. Quand le bit de poids fort (ou de poids
faible) est un, la valeur a un en-tte de seulement un octet alors qu'un en-tte normal en fait quatre. Les bits restants donnent la
taille total du datum (incluant ce mot) en octets. Il reste un cas spcial : si les bits restants sont tous zro (ce qui est impossible
tant donn que le mot indiquant la longueur est inclus dans la taille), la valeur est un pointeur vers une donne stocke dans une
table TOAST spare (la taille d'un pointeur TOAST est indique dans le second octet du datum). Les valeurs dont l'en-tte fait un
seul octet ne sont pas alignes sur une limite particulire. Enfin, quand le bit de poids fort (ou de poids faible) est supprim mais
que le bit adjacent vaut un, le contenu du datum est compress et doit tre dcompress avant utilisation. Dans ce cas, les bits restants du mot contenant la longueur indiquent la taille totale du datum compress, pas celles des donnes au dpart. Notez que la
compression est aussi possible pour les donnes de la table TOAST mais l'en-tte varlena n'indique pas si c'est le cas -- le contenu
du pointeur TOAST le prcise.
Si une des colonnes d'une table est TOAST-able, la table disposera d'une table TOAST associ, dont l'OID est stocke dans
l'entre pg_class.reltoastrelid de la table. Les valeurs TOASTes hors-ligne sont conserves dans la table TOAST comme
dcrit avec plus de dtails ci-dessous.
La technique de compression utilise est un simple et rapide membre de la famille des techniques de compression LZ. Voir src/
backend/utils/adt/pg_lzcompress.c pour les dtails.
Les valeurs hors-ligne sont divises (aprs compression si ncessaire) en morceaux d'au plus TOAST_MAX_CHUNK_SIZE octets
(par dfaut, cette valeur est choisie pour que quatre morceaux de ligne tiennent sur une page, d'o les 2000 octets). Chaque morceau est stock comme une ligne spare dans la table TOAST de la table propritaire. Chaque table TOAST contient les colonnes
chunk_id (un OID identifiant la valeur TOASTe particulire), chunk_seq (un numro de squence pour le morceau de la valeur) et chunk_data (la donne relle du morceau). Un index unique sur chunk_id et chunk_seq offre une rcupration rapide des valeurs. Un pointeur datum reprsentant une valeur TOASTe hors-ligne a par consquent besoin de stocker l'OID de la
table TOAST dans laquelle chercher et l'OID de la valeur spcifique (son chunk_id). Par commodit, les pointeurs datums
stockent aussi la taille logique du datum (taille de la donne originale non compresse) et la taille stocke relle (diffrente si la
compression a t applique). partir des octets d'en-tte varlena, la taille totale d'un pointeur datum TOAST est par consquent
de 18 octets quelque soit la taille relle de la valeur reprsente.
Le code TOAST est dclench seulement quand une valeur de ligne stocker dans une table est plus grande que
TOAST_TUPLE_THRESHOLD octets (habituellement 2 Ko). Le code TOAST compressera et/ou dplacera les valeurs de champ
hors la ligne jusqu' ce que la valeur de la ligne soit plus petite que TOAST_TUPLE_TARGET octets (habituellement l-aussi
2 Ko) ou que plus aucun gain ne puisse tre ralis. Lors d'une opration UPDATE, les valeurs des champs non modifies sont habituellement prserves telles quelles ; donc un UPDATE sur une ligne avec des valeurs hors ligne n'induit pas de cots cause de
TOAST si aucune des valeurs hors-ligne n'est modifie.
Le code TOAST connat quatre stratgies diffrentes pour stocker les colonnes TOAST-ables :
PLAIN empche soit la compression soit le stockage hors-ligne ; de plus, il dsactive l'utilisation d'en-tte sur un octet pour les
types varlena. Ceci est la seule stratgie possible pour les colonnes des types de donnes non TOAST-ables.
EXTENDED permet la fois la compression et le stockage hors-ligne. Ceci est la valeur par dfaut de la plupart des types de
donnes TOAST-ables. La compression sera tente en premier, ensuite le stockage hors-ligne si la ligne est toujours trop
grande.
EXTERNAL autorise le stockage hors-ligne mais pas la compression. L'utilisation d'EXTERNAL rendra plus rapides les oprations sur des sous-chanes d'importantes colonnes de type text et bytea (au dpens d'un espace de stockage accrus) car ces oprations sont optimises pour rcuprer seulement les parties requises de la valeur hors-ligne lorsqu'elle n'est pas compresse.
MAIN autorise la compression mais pas le stockage hors-ligne. (En ralit le stockage hors-ligne sera toujours ralis pour de
telles colonnes mais seulement en dernier ressort s'il n'existe aucune autre solution pour diminuer suffisamment la taille de la
ligne pour qu'elle tienne sur une page.)
Chaque type de donnes TOAST-able spcifie une stratgie par dfaut pour les colonnes de ce type de donne, mais la stratgie
pour une colonne d'une table donne peut tre modifie avec ALTER TABLE SET STORAGE.
Cette combinaison a de nombreux avantages compars une approche plus directe comme autoriser le stockage des valeurs de
lignes sur plusieurs pages. En supposant que les requtes sont habituellement qualifies par comparaison avec des valeurs de cl
relativement petites, la grosse partie du travail de l'excuteur sera ralise en utilisant l'entre principale de la ligne. Les grandes
valeurs des attributs TOASTs seront seulement rcupres (si elles sont slectionnes) au moment o l'ensemble de rsultats est
envoy au client. Ainsi, la table principale est bien plus petite et un plus grand nombre de ses lignes tiennent dans le cache du tampon partag, ce qui ne serait pas le cas sans aucun stockage hors-ligne. Le tri l'utilise aussi, et les tris seront plus souvent raliss
entirement en mmoire. Un petit test a montr qu'une table contenant des pages HTML typiques ainsi que leurs URL taient stockes en peu prs la moiti de la taille des donnes brutes en incluant la table TOAST et que la table principale contenait moins
1339
de 10 % de la totalit des donnes (les URL et quelques petites pages HTML). Il n'y avait pas de diffrence l'excution en comparaison avec une table non TOASTe, dans laquelle toutes les pages HTLM avaient t coupes 7 Ko pour tenir.
lment
Description
PageHeaderData
Longueur de 24 octets. Contient des informations gnrales sur la page y compris des pointeurs
sur les espaces libres.
En ralit, les mthodes d'accs par index n'ont pas besoin d'utiliser ce format de page. Toutes les mthodes d'indexage existantes utilisent ce format de base mais les donnes conserves dans les mtapages des index ne suivent habituellement pas les rgles d'emplacement des lments.
1340
lment
Description
ItemIdData
Tableau de paires (dcalage,longueur) pointant sur les lments rels. Quatre octets par lment.
Free space
L'espace non allou. Les pointeurs de nouveaux lments sont allous partir du dbut de cette
rgion, les nouveaux lments partir de la fin.
Items
Special space
Donnes spcifiques des mthodes d'accs aux index. Diffrentes mthodes stockent diffrentes
donnes. Vide pour les tables ordinaires.
Les 24 premiers octets de chaque page consistent en un en-tte de page (PageHeaderData). Son format est dtaill dans Tableau 55.3, Disposition de PageHeaderData . Les deux premiers champs traquent l'entre WAL la plus rcente relative cette
page. Ensuite se trouve un champ de deux octets contenant des drapeaux. Ils sont suivis par trois champs d'entiers sur deux octets
(pd_lower, pd_upper et pd_special). Ils contiennent des dcalages d'octets partir du dbut de la page jusqu'au dbut de
l'espace non allou, jusqu' la fin de l'espace non allou, et jusqu'au dbut de l'espace spcial. Les deux octets suivants de l'en-tte
de page, pd_pagesize_version, stockent la fois la taille de la page et un indicateur de versoin. partir de la version 8.3 de
PostgreSQL, le numro de version est 4 ; PostgreSQL 8.1 et 8.2 ont utilis le numro de version 3 ; PostgreSQL 8.0 a utilis le numro de version 2 ; PostgreSQL 7.3 et 7.4 ont utilis le numro de version 1 ; les versions prcdentes utilisaient le numro de version 0. (La disposition fondamentale de la page et le format de l'en-tte n'ont pas chang dans la plupart de ces versions mais la disposition de l'en-tte des lignes de tte a chang.) La taille de la page est seulement prsente comme vrification
croise ; il n'existe pas de support pour avoir plus d'une taille de page dans une installation. Le dernier champ est une aide indiquant si traiter la page serait profitable : il garde l'information sur le plus vieux XMAX non trait de la page.
Tableau 55.3. Disposition de PageHeaderData
Champ
Type
Longueur
Description
pd_lsn
XLogRecPtr
8 octets
pd_tli
uint16
2 octets
pd_flags
uint16
2 octets
Bits d'tat
pd_lower
LocationIndex 2 octets
pd_upper
LocationIndex 2 octets
pd_special
LocationIndex 2 octets
pd_pagesize_version
uint16
pd_prune_xid
TransactionId 4 bytes
2 octets
commencent u dcalage indiqu par t_hoff, qui doit toujours tre un multiple de la distance MAXALIGN pour la plateforme.
Le bitmap NULL est seulement prsent si le bit HEAP_HASNULL est initialis dans t_infomask. S'il est prsent, il commence
juste aprs l'en-tte fixe et occupe suffisamment d'octets pour avoir un bit par colonne de donnes (c'est--dire t_natts bits ensemble). Dans cette liste de bits, un bit 1 indique une valeur non NULL, un bit 0 une valeur NULL. Quand le bitmap n'est pas prsent, toutes les colonnes sont supposes non NULL. L'ID de l'objet est seulement prsent si le bit HEAP_HASOID est initialis
dans t_infomask. S'il est prsent, il apparat juste avant la limite t_hoff. Tout ajout ncessaire pour faire de t_hoff un
multiple de MAXALIGN apparatra entre le bitmap NULL et l'ID de l'objet. (Ceci nous assure en retour que l'ID de l'objet est
convenablement align.)
Tableau 55.4. Disposition de HeapTupleHeaderData
Champ
Type
Longueur
t_xmin
TransactionId 4 octets
XID d'insertion
t_xmax
TransactionId 4 octets
XID de suppression
t_cid
CommandId
t_xvac
TransactionId 4 octets
t_ctid
ItemPointerData
6 octets
TID en cours pour cette version de ligne ou pour une version plus rcente
t_infomask2
int16
2 octets
t_infomask
uint16
2 octets
t_hoff
uint8
1 octet
4 octets
Description
1342
Cre un index nomm nomindex, d'OID indexoid, sur la table nomme nomtable en utilisant la mthode d'accs nomme nomam. Les champs indexer sont appels nom1, nom2 etc., et les classes d'oprateur utiliser sont respectivement
classeop1, classeop2 etc. Le fichier index est cr et les entres appropries du catalogue sont ajoutes pour lui, mais
le contenu de l'index n'est pas initialis par cette commande.
declare toast toasttableoid toastindexoid on nomtable
Cre une table TOAST pour la table nomme nomtable. La table TOAST se voit affecter l'OID toasttableoid et son
index l'OID toastindexoid. Comme avec declare index, le remplissage de l'index est report.
build indices
Remplit les index prcdemment dclars.
56.4. Exemple
La squence de commandes suivante cre la table test_table avec l'OID 420, deux colonnes cola et colb de types respectifs int4 et text et insre deux lignes dans la table :
create test_table 420 (cola = int4, colb = text)
open test_table
insert OID=421 ( 1 "value1" )
insert OID=422 ( 2 _null_ )
close test_table
1344
1346
= 10000 * 0.307669
= 3077 (rounding off)
Dans cet exemple particulier, la correction partir de la liste MCV est trs petit car la distribution de la colonne est rellement assez plat (les statistiques affichant ces valeurs particulires comme tant plus communes que les autres sont principalement des
une erreur d'chantillonage). Dans un cas plus typique o certaines valeurs sont significativement plus communes que les autres,
ce processus compliqu donne une amlioration utile dans la prcision car la slectivit pour les valeurs les plus communes est
trouve exactement.
Maintenant, considrons un cas avec plus d'une condition dans la clause WHERE :
EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 1000 AND stringu1 = 'xxx';
QUERY PLAN
-------------------------------------------------------------------------------Bitmap Heap Scan on tenk1 (cost=23.80..396.91 rows=1 width=244)
Recheck Cond: (unique1 < 1000)
1347
Le planificateur suppose que les deux conditions sont indpendantes, pour que les slectivits individuelles des clauses puissent
tre multiplies ensemble :
selectivity = selectivity(unique1 < 1000) * selectivity(stringu1 = 'xxx')
= 0.100697 * 0.0014559
= 0.0001466
rows
= 10000 * 0.0001466
= 1 (rounding off)
Notez que le nombre de lignes estim tre renvoyes partir bitmap index scan reflte seulement la condition utilise avec
l'index ; c'est important car cela affecte l'estimation du cot pour les rcuprations suivantes sur la table.
Enfin, nous examinerons une requte qui implique une jointure :
EXPLAIN SELECT * FROM tenk1 t1, tenk2 t2
WHERE t1.unique1 < 50 AND t1.unique2 = t2.unique2;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------Nested Loop (cost=4.64..456.23 rows=50 width=488)
-> Bitmap Heap Scan on tenk1 t1 (cost=4.64..142.17 rows=50 width=244)
Recheck Cond: (unique1 < 50)
-> Bitmap Index Scan on tenk1_unique1 (cost=0.00..4.63 rows=50 width=0)
Index Cond: (unique1 < 50)
-> Index Scan using tenk2_unique2 on tenk2 t2 (cost=0.00..6.27 rows=1 width=244)
Index Cond: (unique2 = t1.unique2)
La restriction sur tenk1, unique1 < 50, est value avant la jointure de boucle imbrique. Ceci est gr de faon analogue
l'exemple prcdent. Cette fois, la valeur 50 est dans la premire partie de l'histogramme unique1 :
selectivity = (0 + (50 - bucket[1].min)/(bucket[1].max - bucket[1].min))/num_buckets
= (0 + (50 - 0)/(993 - 0))/10
= 0.005035
rows
= 10000 * 0.005035
= 50 (rounding off)
La restriction pour la jointure est t2.unique2 = t1.unique2. L'oprateur est tout simplement le =, nanmoins la fonction
de slectivit est obtenue partir de la colonne oprjoin de pg_operator, et est eqjoinsel. eqjoinsel recherche
l'information statistique de tenk2 et tenk1 :
SELECT tablename, null_frac,n_distinct, most_common_vals FROM pg_stats
WHERE tablename IN ('tenk1', 'tenk2') AND attname='unique2';
tablename | null_frac | n_distinct | most_common_vals
-----------+-----------+------------+-----------------tenk1
|
0 |
-1 |
tenk2
|
0 |
-1 |
Dans ce cas, il n'y a pas d'information MCV pour unique2 parce que toutes les valeurs semblent tre unique, donc nous utilisons
un algorithme qui relie seulement le nombre de valeurs distinctes pour les deux relations ensembles avec leur fractions NULL :
selectivity = (1 - null_frac1) * (1 - null_frac2) * min(1/num_distinct1,
1/num_distinct2)
= (1 - 0) * (1 - 0) / max(10000, 10000)
= 0.0001
C'est--dire, soustraire la fraction NULL pour chacune des relations, et divisez par le maximum of the numbers of distinct values.
Le nombre de lignes que la jointure pourrait mettre est calcul comme la cardinalit du produit cartsien de deux inputs, multipli
par la slectivit :
rows = (outer_cardinality * inner_cardinality) * selectivity
= (50 * 10000) * 0.0001
1348
1349
Code erreur
Nom de condition
successful_completion
Class 01 -- Avertissement
01000
warning
0100C
dynamic_result_sets_returned
01008
implicit_zero_bit_padding
01003
null_value_eliminated_in_set_function
01007
privilege_not_granted
01006
privilege_not_revoked
01004
string_data_right_truncation
01P01
deprecated_feature
Class 02 -- Pas de donnes (galement une classe d'avertissement selon le standard SQL)
02000
no_data
02001
no_additional_dynamic_result_sets_returned
sql_statement_not_yet_complete
connection_exception
08003
connection_does_not_exist
08006
connection_failure
08001
sqlclient_unable_to_establish_sqlconnection
08004
sqlserver_rejected_establishment_of_sqlconnection
08007
transaction_resolution_unknown
08P01
protocol_violation
triggered_action_exception
1351
Code erreur
Nom de condition
feature_not_supported
invalid_transaction_initiation
locator_exception
0F001
invalid_locator_specification
invalid_grantor
0LP01
invalid_grant_operation
invalid_role_specification
case_not_found
cardinality_violation
data_exception
2202E
array_subscript_error
22021
character_not_in_repertoire
22008
datetime_field_overflow
22012
division_by_zero
22005
error_in_assignment
2200B
escape_character_conflict
22022
indicator_overflow
22015
interval_field_overflow
2201E
invalid_argument_for_logarithm
22014
invalid_argument_for_ntile_function
22016
invalid_argument_for_nth_value_function
2201F
invalid_argument_for_power_function
2201G
invalid_argument_for_width_bucket_function
22018
invalid_character_value_for_cast
22007
invalid_datetime_format
22019
invalid_escape_character
2200D
invalid_escape_octet
22025
invalid_escape_sequence
22P06
nonstandard_use_of_escape_character
22010
invalid_indicator_parameter_value
22023
invalid_parameter_value
2201B
invalid_regular_expression
2201W
invalid_row_count_in_limit_clause
2201X
invalid_row_count_in_result_offset_clause
22009
invalid_time_zone_displacement_value
2200C
invalid_use_of_escape_character
1352
Code erreur
Nom de condition
2200G
most_specific_type_mismatch
22004
null_value_not_allowed
22002
null_value_no_indicator_parameter
22003
numeric_value_out_of_range
22026
string_data_length_mismatch
22001
string_data_right_truncation
22011
substring_error
22027
trim_error
22024
unterminated_c_string
2200F
zero_length_character_string
22P01
floating_point_exception
22P02
invalid_text_representation
22P03
invalid_binary_representation
22P04
bad_copy_file_format
22P05
untranslatable_character
2200L
not_an_xml_document
2200M
invalid_xml_document
2200N
invalid_xml_content
2200S
invalid_xml_comment
2200T
invalid_xml_processing_instruction
integrity_constraint_violation
23001
restrict_violation
23502
not_null_violation
23503
foreign_key_violation
23505
unique_violation
23514
check_violation
23P01
exclusion_violation
invalid_cursor_state
invalid_transaction_state
25001
active_sql_transaction
25002
branch_transaction_already_active
25008
held_cursor_requires_same_isolation_level
25003
inappropriate_access_mode_for_branch_transaction
25004
inappropriate_isolation_level_for_branch_transaction
25005
no_active_sql_transaction_for_branch_transaction
25006
read_only_sql_transaction
25007
schema_and_data_statement_mixing_not_supported
25P01
no_active_sql_transaction
25P02
in_failed_sql_transaction
invalid_sql_statement_name
1353
Code erreur
Nom de condition
triggered_data_change_violation
invalid_authorization_specification
28P01
invalid_password
dependent_privilege_descriptors_still_exist
2BP01
dependent_objects_still_exist
invalid_transaction_termination
sql_routine_exception
2F005
function_executed_no_return_statement
2F002
modifying_sql_data_not_permitted
2F003
prohibited_sql_statement_attempted
2F004
reading_sql_data_not_permitted
invalid_cursor_name
external_routine_exception
38001
containing_sql_not_permitted
38002
modifying_sql_data_not_permitted
38003
prohibited_sql_statement_attempted
38004
reading_sql_data_not_permitted
external_routine_invocation_exception
39001
invalid_sqlstate_returned
39004
null_value_not_allowed
39P01
trigger_protocol_violated
39P02
srf_protocol_violated
savepoint_exception
3B001
invalid_savepoint_specification
invalid_catalog_name
invalid_schema_name
transaction_rollback
40002
transaction_integrity_constraint_violation
40001
serialization_failure
40003
statement_completion_unknown
40P01
deadlock_detected
Code erreur
Nom de condition
42000
syntax_error_or_access_rule_violation
42601
syntax_error
42501
insufficient_privilege
42846
cannot_coerce
42803
grouping_error
42P20
windowing_error
42P19
invalid_recursion
42830
invalid_foreign_key
42602
invalid_name
42622
name_too_long
42939
reserved_name
42804
datatype_mismatch
42P18
indeterminate_datatype
42P21
collation_mismatch
42P22
indeterminate_collation
42809
wrong_object_type
42703
undefined_column
42883
undefined_function
42P01
undefined_table
42P02
undefined_parameter
42704
undefined_object
42701
duplicate_column
42P03
duplicate_cursor
42P04
duplicate_database
42723
duplicate_function
42P05
duplicate_prepared_statement
42P06
duplicate_schema
42P07
duplicate_table
42712
duplicate_alias
42710
duplicate_object
42702
ambiguous_column
42725
ambiguous_function
42P08
ambiguous_parameter
42P09
ambiguous_alias
42P10
invalid_column_reference
42611
invalid_column_definition
42P11
invalid_cursor_definition
42P12
invalid_database_definition
42P13
invalid_function_definition
42P14
invalid_prepared_statement_definition
42P15
invalid_schema_definition
42P16
invalid_table_definition
42P17
invalid_object_definition
Code erreur
Nom de condition
44000
with_check_option_violation
insufficient_resources
53100
disk_full
53200
out_of_memory
53300
too_many_connections
program_limit_exceeded
54001
statement_too_complex
54011
too_many_columns
54023
too_many_arguments
object_not_in_prerequisite_state
55006
object_in_use
55P02
cant_change_runtime_param
55P03
lock_not_available
operator_intervention
57014
query_canceled
57P01
admin_shutdown
57P02
crash_shutdown
57P03
cannot_connect_now
57P04
database_dropped
io_error
58P01
undefined_file
58P02
duplicate_file
config_file_error
F0001
lock_file_exists
fdw_error
HV005
fdw_column_name_not_found
HV002
fdw_dynamic_parameter_value_needed
HV010
fdw_function_sequence_error
HV021
fdw_inconsistent_descriptor_information
HV024
fdw_invalid_attribute_value
HV007
fdw_invalid_column_name
HV008
fdw_invalid_column_number
HV004
fdw_invalid_data_type
HV006
fdw_invalid_data_type_descriptors
HV091
fdw_invalid_descriptor_field_identifier
HV00B
fdw_invalid_handle
HV00C
fdw_invalid_option_index
1356
Code erreur
Nom de condition
HV00D
fdw_invalid_option_name
HV090
fdw_invalid_string_length_or_buffer_length
HV00A
fdw_invalid_string_format
HV009
fdw_invalid_use_of_null_pointer
HV014
fdw_too_many_handles
HV001
fdw_out_of_memory
HV00P
fdw_no_schemas
HV00J
fdw_option_name_not_found
HV00K
fdw_reply_handle
HV00Q
fdw_schema_not_found
HV00R
fdw_table_not_found
HV00L
fdw_unable_to_create_execution
HV00M
fdw_unable_to_create_reply
HV00N
fdw_unable_to_establish_connection
plpgsql_error
P0001
raise_exception
P0002
no_data_found
P0003
too_many_rows
internal_error
XX001
data_corrupted
XX002
index_corrupted
1357
2.
3.
Diviser la chane saisie en lexmes et catgoriser les lexmes en chanes, heures, fuseaux horaires et nombres.
a.
Si le lexme numrique contient un double-point (:), c'est une chane de type heure. On inclut tous les chiffres et
double-points qui suivent.
b.
Si le lexme numrique contient un tiret (-), une barre oblique (/) ou au moins deux points (.), c'est une chane de type
date qui contient peut-tre un mois sous forme textuelle. Si un lexme de date a dj t reconnu, il est alors interprt
comme un nom de fuseau horaire (par exemple America/New_York).
c.
Si le lexme n'est que numrique alors il s'agit soit d'un champ simple soit d'une date concatne ISO 8601 (19990113
pour le 13 janvier 1999, par exemple) ou d'une heure concatne ISO 8601 (141516 pour 14:15:16, par exemple).
d.
Si le lexme dbute par le signe plus (+) ou le signe moins (-), alors il s'agit soit d'un fuseau horaire numrique, soit
d'un champ spcial.
Si le lexme est une chane texte, le comparer avec les diffrentes chanes possibles :
a.
Faire une recherche binaire dans la table pour vrifier si le lexme est une abrviation de fuseau horaire.
b.
S'il n'est pas trouv, une recherche binaire est effectue dans la table pour vrifier si le lexme est une chane spciale
(today, par exemple), un jour (Thursday, par exemple), un mois (January, par exemple), ou du bruit (at, on, par
exemple).
c.
S'il y a huit ou six chiffres, et qu'aucun autre champ date n'a t lu, alors il est interprt comme une date concatne
(19990118 ou 990118, par exemple). L'interprtation est AAAAMMJJ ou AAMMJJ.
b.
Si le lexme est compos de trois chiffres et qu'une anne est dj lue, alors il est interprt comme un jour de l'anne.
c.
Si quatre ou six chiffres et une anne sont dj lus, alors il est interprt comme une heure (HHMM ou HHMMSS).
d.
Si le lexme est compos de trois chiffres ou plus et qu'aucun champ date n'a t trouv, il est interprt comme une anne (cela impose l'ordre aa-mm-jj des champs dates restants).
e.
Dans tous les autres cas, le champ date est suppos suivre l'ordre impos par le paramtre datestyle : mm-jj-aa, jjmm-aa, ou aa-mm-jj. Si un champ jour ou mois est en dehors des limites, une erreur est leve.
4.
Si BC est indiqu, le signe de l'anne est invers et un est ajout pour le stockage interne. (Il n'y a pas d'anne zro dans le calendrier Grgorien, alors numriquement 1 BC devient l'anne zro.)
5.
Si BC n'est pas indiqu et que le champ anne est compos de deux chiffres, alors l'anne est ajuste quatre chiffres. Si le
champ vaut moins que 70, alors on ajoute 2000, sinon 1900.
Astuce
Les annes du calendrier Grgorien AD 1-99 peuvent tre saisie avec 4 chiffres, deux zros en tte (0099
1358
Support de date/heure
Mois
Abrviations
January (Janvier)
Jan
February (Fvrier)
Feb
March (Mars)
Mar
April (Avril)
Apr
May (Mai)
June (Juin)
Jun
July (Juillet)
Jul
August (Aot)
Aug
September (Septembre)
Sep, Sept
October (Octobre)
Oct
November (Novembre)
Nov
December (Dcembre)
Dec
Tableau B.2, Noms des jours de la semaine prsente les lexmes reconnus comme des noms de jours de la semaine.
Tableau B.2. Noms des jours de la semaine
Jour
Abrviation
Sunday (Dimanche)
Sun
Monday (Lundi)
Mon
Tuesday (Mardi)
Tue, Tues
Wednesday (Mercredi)
Wed, Weds
Thursday (Jeudi)
Friday (Vendredi)
Fri
Saturday (Samedi)
Sat
Tableau B.3, Modificateurs de Champs Date/Heure prsente les lexmes utiliss par divers modificateurs.
Tableau B.3. Modificateurs de Champs Date/Heure
Identifiant
Description
AM
AT
Ignor
JULIAN, JD, J
ON
Ignor
PM
1359
Support de date/heure
Note
Si une erreur survient lors de la lecture des jeux de donnes de fuseaux horaires, aucune nouvelle valeur n'est accepte mais les anciennes sont conserves. Si l'erreur survient au dmarrage de la base, celui-ci choue.
Attention
Les abrviations de fuseau horaire dfinies dans le fichier de configuration surchargent les informations sans fuseau
dfinies nativement dans PostgreSQL. Par exemple, le fichier de configuration Australia dfinit SAT (South
Australian Standard Time, soit l'heure standard pour l'Australie du sud). Si ce fichier est actif, SAT n'est plus reconnu comme abrviation de samedi (Saturday).
Attention
Si les fichiers de .../share/timezonesets/ sont modifis, il revient l'utilisateur de procder leur sauvegarde -- une sauvegarde normale de base n'inclut pas ce rpertoire.
Support de date/heure
1582, date laquelle des pays ont commenc se convertir au calendrier Grgorien. Dans le calendrier Julien, l'anne tropicale est
arrondie 365 jours 1/4, soit 365,25 jours. Cela conduit une erreur de l'ordre d'un jour tous les 128 ans.
L'erreur grandissante du calendrier poussa le Pape Gregoire XIII a rform le calendrier en accord avec les instructions du Concile
de Trent. Dans le calendrier Grgorien, l'anne tropicale est arrondie 365 + 97/400 jours, soit 365,2425 jours. Il faut donc peu
prs 3300 ans pour que l'anne tropicale subissent un dcalage d'un an dans le calendrier Grgorien.
L'arrondi 365+97/400 est obtenu l'aide de 97 annes bissextiles tous les 400 ans. Les rgles suivantes sont utilises :
toute anne divisible par 4 est bissextile ;
cependant, toute anne divisible par 100 n'est pas bissextile ;
cependant, toute annes divisible par 400 est bissextile.
1700, 1800, 1900, 2100 et 2200 ne sont donc pas des annes bissextiles. 1600, 2000 et 2400 si. Par opposition, dans l'ancien calendrier Julien, toutes les annes divisibles par 4 sont bissextiles.
En fvrier 1582, le pape dcrta que 10 jours devaient tre supprims du mois d'octobre 1582, le 15 octobre devant ainsi arriver
aprs le 4 octobre. Cela a t appliqu en Italie, Pologne, Portugal et Espagne. Les autres pays catholiques ont suivi peu aprs,
mais les pays protestants ont t plus rtifs et les contres orthodoxes grques n'ont pas effctu le changement avant le dbut du
20me sicle. La rforme a t applique par la Grande Bretagne et ses colonies (y compris les actuels Etats-Unis) en 1752. Donc
le 2 septembre 1752 a t suivi du 14 septembre 1752. C'est pour cela que la commande cal produit la sortie suivante :
$ cal 9 1752
septembre 1752
di lu ma me je ve
1 2 14 15
17 18 19 20 21 22
24 25 26 27 28 29
sa
16
23
30
Le standard SQL stipule que dans la dfinition d'un libell date/heure (datetime literal), les valeurs date/heure sont
contraintes par les rgles naturelles des dates et heures imposes par le calendrier Grgorien . Les dates comprises entre le 5 octobre 1582 et le 14 octobre 1582, bien qu'limines dans plusieurs pays par ordre du Pape, sont conformes aux rgles naturelles et sont donc des dates valables. PostgreSQL suit le standard SQL en comptant les dates exclusivement dans le calendrier grgorien, mme pour les annes o ce calendrier n'existait pas encore.
Divers calendriers ont t develops dans diffrentes parties du monde, la plupart prcde le systme Grgorien. Par exemple, les
dbuts du calendrier chinois peuvent tre valus aux alentours du 14me sicle avant J.-C. La lgende veut que l'empereur
Huangdi inventa le calendrier en 2637 avant J-C. La Rpublique de Chine utilise le calendrier Grgorien pour les besoins civils.
Le calendrier chinois est utilis pour dterminer les festivals.
La date Julien n'a pas de relation avec le calendrier Julien . Le systme de date Julien a t invent par le prcepteur
franais Joseph Justus Scaliger (1540-1609) et tient probablement son nom du pre de Scaliger, le prcepteur italien Julius Caesar
Scaliger (1484-1558). Dans le systme de date Julien, chaque jour est un nombre squentiel, commenant partir de JD 0, appel
quelque fois la date Julien. JD 0 correspond au 1er janvier 4713 avant JC dans le calendrier Julien, ou au 24 novembre 4714 avant
JC dans le calendrier grgorien. Le comptage de la date Julien est le plus souvent utilis par les astronomes pour donner un nom
leurs observations, et du coup une date part de midi UTC jusqu'au prochain midi UTC, plutt que de minuit minuit : JD 0 dsigne les 24 heures de midi UTC le 1er janvier 4713 avant JC jusqu'au midi UTC du 2 janvier 4713 avant JC.
Bien que PostgreSQL accepte la saisie et l'affichage des dates en notation de date Julien (et les utilise aussi pour quelques calculs internes de date et heure), il n'utilise pas le coup des dates de midi midi. PostgreSQL traite une date Julien comme allant
de minuit minuit.
1361
Mot-cl
PostgreSQL
SQL:2008
SQL:2003
non rserv
non rserv
ABS
rserv
rserv
non rserv
ABSENT
non rserv
non rserv
rserv
rserv
non rserv
non rserv
rserv
rserv
non rserv
non rserv
non rserv
non rserv
rserv
A
ABORT
non rserv
ACCESS
non rserv
non rserv
ACCORDING
non rserv
non rserv
ADA
ADD
non rserv
non rserv
non rserv
rserv
ADMIN
non rserv
non rserv
non rserv
rserv
AFTER
non rserv
non rserv
non rserv
rserv
AGGREGATE
non rserv
rserv
ALIAS
ALL
SQL-92
non rserv
ABSOLUTE
ACTION
SQL:1999
rserv
rserv
ALLOCATE
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
ALSO
non rserv
ALTER
non rserv
rserv
rserv
ALWAYS
non rserv
non rserv
non rserv
ANALYSE
rserv
1362
Mots-cl SQL
Mot-cl
PostgreSQL
SQL:2008
SQL:2003
SQL:1999
SQL-92
ANALYZE
rserv
AND
rserv
rserv
rserv
rserv
rserv
ANY
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
ARE
ARRAY
rserv
ARRAY_AGG
rserv
AS
rserv
rserv
rserv
rserv
rserv
ASC
rserv
non rserv
non rserv
rserv
rserv
rserv
rserv
non rserv
ASENSITIVE
ASSERTION
non rserv
non rserv
non rserv
rserv
ASSIGNMENT
non rserv
non rserv
non rserv
non rserv
ASYMMETRIC
rserv
rserv
rserv
non rserv
AT
non rserv
rserv
rserv
rserv
rserv
rserv
non rserv
non rserv
non rserv
non rserv
non rserv
ATOMIC
ATTRIBUTE
non rserv
ATTRIBUTES
AUTHORIZATION
rserv
rserv
rserv
rserv
rserv
rserv
non rserv
rserv
non rserv
non rserv
AVG
BACKWARD
rserv
non rserv
BASE64
BEFORE
non rserv
non rserv
non rserv
rserv
BEGIN
non rserv
rserv
rserv
rserv
rserv
non rserv
non rserv
non rserv
rserv
BERNOULLI
BETWEEN
rserv
BIGINT
rserv
BINARY
rserv
BIT
rserv
rserv
BITVAR
rserv
non rserv
BIT_LENGTH
non rserv
BLOB
rserv
rserv
BLOCKED
non rserv
non rserv
BOM
non rserv
rserv
rserv
BOOLEAN
rserv
rserv
BOTH
rserv
rserv
rserv
rserv
non rserv
non rserv
rserv
rserv
rserv
rserv
rserv
non rserv
non rserv
non rserv
non rserv
BREADTH
BY
non rserv
C
1363
rserv
Mots-cl SQL
Mot-cl
PostgreSQL
CACHE
non rserv
CALL
CALLED
non rserv
CARDINALITY
SQL:2008
SQL:2003
SQL:1999
rserv
rserv
rserv
rserv
rserv
non rserv
rserv
rserv
non rserv
SQL-92
CASCADE
non rserv
non rserv
non rserv
rserv
rserv
CASCADED
non rserv
rserv
rserv
rserv
rserv
CASE
rserv
rserv
rserv
rserv
rserv
CAST
rserv
rserv
rserv
rserv
rserv
CATALOG
non rserv
non rserv
non rserv
rserv
rserv
CATALOG_NAME
non rserv
non rserv
non rserv
non rserv
CEIL
rserv
rserv
CEILING
rserv
rserv
non rserv
CHAIN
non rserv
non rserv
non rserv
CHAR
rserv
rserv
rserv
CHARACTER
rserv
rserv
rserv
CHARACTERISTICS
non rserv
non rserv
non rserv
CHARACTERS
non rserv
non rserv
CHARACTER_LENGTH
rserv
rserv
non rserv
rserv
CHARACTER_SET_CATALOG
non rserv
non rserv
non rserv
non rserv
CHARACTER_SET_NAME
non rserv
non rserv
non rserv
non rserv
CHARACTER_SET_SCHEMA
non rserv
non rserv
non rserv
non rserv
CHAR_LENGTH
rserv
rserv
non rserv
rserv
rserv
rserv
rserv
rserv
CHECK
rserv
CHECKED
non rserv
CHECKPOINT
non rserv
CLASS
non rserv
rserv
CLASS_ORIGIN
non rserv
non rserv
non rserv
CLOB
rserv
rserv
rserv
non rserv
CLOSE
non rserv
rserv
rserv
rserv
rserv
CLUSTER
non rserv
COALESCE
rserv
non rserv
rserv
COBOL
non rserv
non rserv
non rserv
non rserv
COLLATE
rserv
rserv
rserv
rserv
rserv
COLLATION
non rserv
non rserv
non rserv
rserv
rserv
COLLATION_CATALOG
non rserv
non rserv
non rserv
non rserv
COLLATION_NAME
non rserv
non rserv
non rserv
non rserv
COLLATION_SCHEMA
non rserv
non rserv
non rserv
non rserv
COLLECT
rserv
rserv
rserv
rserv
rserv
rserv
COLUMN
rserv
COLUMNS
non rserv
1364
Mots-cl SQL
Mot-cl
PostgreSQL
SQL:2008
SQL:2003
SQL:1999
SQL-92
COLUMN_NAME
non rserv
non rserv
non rserv
non rserv
COMMAND_FUNCTION
non rserv
non rserv
non rserv
non rserv
non rserv
non rserv
non rserv
COMMAND_FUNCTION_CODE
COMMENT
non rserv
COMMENTS
non rserv
COMMIT
non rserv
rserv
rserv
rserv
rserv
COMMITTED
non rserv
non rserv
non rserv
non rserv
non rserv
COMPLETION
CONCURRENTLY
rserv
non rserv (peut tre
une fonction ou un
type)
CONDITION
CONDITION_NUMBER
CONFIGURATION
rserv
non rserv
non rserv
non rserv
non rserv
rserv
rserv
rserv
rserv
non rserv
non rserv
rserv
rserv
non rserv
non rserv
non rserv
non rserv
non rserv
CONNECT
CONNECTION
rserv
non rserv
CONNECTION_NAME
CONSTRAINT
rserv
rserv
rserv
rserv
rserv
CONSTRAINTS
non rserv
non rserv
non rserv
rserv
rserv
CONSTRAINT_CATALOG
non rserv
non rserv
non rserv
non rserv
CONSTRAINT_NAME
non rserv
non rserv
non rserv
non rserv
CONSTRAINT_SCHEMA
non rserv
non rserv
non rserv
non rserv
CONSTRUCTOR
non rserv
non rserv
rserv
CONTAINS
non rserv
non rserv
non rserv
CONTENT
non rserv
non rserv
non rserv
CONTINUE
non rserv
non rserv
non rserv
non rserv
non rserv
rserv
rserv
CORR
rserv
rserv
CORRESPONDING
rserv
COUNT
COVAR_POP
COVAR_SAMP
CONTROL
CONVERSION
COST
rserv
non rserv
rserv
rserv
rserv
rserv
rserv
rserv
non rserv
rserv
rserv
rserv
rserv
rserv
non rserv
CONVERT
COPY
rserv
non rserv
non rserv
CREATE
rserv
rserv
rserv
rserv
rserv
CROSS
rserv
rserv
rserv
CSV
non rserv
rserv
CUBE
rserv
rserv
CUME_DIST
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
CURRENT
non rserv
rserv
CURRENT_CATALOG
rserv
rserv
CURRENT_DATE
rserv
rserv
1365
Mots-cl SQL
Mot-cl
PostgreSQL
SQL:2008
SQL:2003
SQL:1999
CURRENT_DEFAULT_TRANSFORM_GROUP
rserv
rserv
CURRENT_PATH
rserv
rserv
rserv
rserv
rserv
rserv
SQL-92
CURRENT_ROLE
rserv
CURRENT_SCHEMA
CURRENT_TIME
rserv
rserv
rserv
rserv
rserv
CURRENT_TIMESTAMP
rserv
rserv
rserv
rserv
rserv
rserv
rserv
CURRENT_TRANSFORM_GROUP_FOR_TYPE
CURRENT_USER
rserv
rserv
rserv
rserv
rserv
CURSOR
non rserv
rserv
rserv
rserv
rserv
non rserv
non rserv
non rserv
non rserv
CURSOR_NAME
CYCLE
non rserv
rserv
rserv
rserv
DATA
non rserv
non rserv
non rserv
rserv
non rserv
DATABASE
non rserv
DATALINK
rserv
rserv
DATE
rserv
rserv
rserv
rserv
DATETIME_INTERVAL_CODE
non rserv
non rserv
non rserv
non rserv
DATETIME_INTERVAL_PRECISION
non rserv
non rserv
non rserv
non rserv
rserv
rserv
rserv
rserv
non rserv
non rserv
DAY
non rserv
DB
DEALLOCATE
non rserv
rserv
rserv
rserv
rserv
DEC
rserv
rserv
rserv
DECIMAL
rserv
rserv
rserv
DECLARE
non rserv
rserv
rserv
rserv
rserv
DEFAULT
rserv
rserv
rserv
rserv
rserv
DEFAULTS
non rserv
non rserv
non rserv
DEFERRABLE
rserv
non rserv
non rserv
rserv
rserv
DEFERRED
non rserv
non rserv
non rserv
rserv
rserv
non rserv
non rserv
non rserv
non rserv
non rserv
non rserv
non rserv
non rserv
rserv
rserv
DENSE_RANK
rserv
rserv
DEPTH
non rserv
non rserv
rserv
DEREF
rserv
rserv
rserv
DERIVED
non rserv
non rserv
non rserv
non rserv
rserv
rserv
rserv
rserv
rserv
rserv
DEFINED
DEFINER
non rserv
DEGREE
DELETE
non rserv
DELIMITER
non rserv
DELIMITERS
non rserv
DESC
rserv
DESCRIBE
1366
rserv
rserv
Mots-cl SQL
Mot-cl
PostgreSQL
DESCRIPTOR
SQL:2008
SQL:2003
SQL:1999
SQL-92
non rserv
non rserv
rserv
rserv
DESTROY
rserv
DESTRUCTOR
rserv
DETERMINISTIC
rserv
rserv
rserv
DIAGNOSTICS
non rserv
non rserv
rserv
DICTIONARY
non rserv
DISABLE
non rserv
DISCARD
non rserv
rserv
rserv
DISCONNECT
rserv
rserv
rserv
DISPATCH
non rserv
non rserv
non rserv
rserv
rserv
rserv
rserv
DLNEWCOPY
rserv
rserv
DLPREVIOUSCOPY
rserv
rserv
DLURLCOMPLETE
rserv
rserv
DLURLCOMPLETEONLY
rserv
rserv
DLURLCOMPLETEWRITE
rserv
rserv
DLURLPATH
rserv
rserv
DLURLPATHONLY
rserv
rserv
DLURLPATHWRITE
rserv
rserv
DLURLSCHEME
rserv
rserv
DLURLSERVER
rserv
rserv
DLVALUE
rserv
rserv
DISTINCT
rserv
rserv
DO
rserv
DOCUMENT
non rserv
non rserv
non rserv
DOMAIN
non rserv
non rserv
non rserv
rserv
rserv
DOUBLE
non rserv
rserv
rserv
rserv
rserv
DROP
non rserv
rserv
rserv
rserv
rserv
DYNAMIC
rserv
rserv
rserv
DYNAMIC_FUNCTION
non rserv
non rserv
non rserv
DYNAMIC_FUNCTION_CODE
non rserv
non rserv
non rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
non rserv
non rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
EACH
non rserv
ELEMENT
ELSE
rserv
EMPTY
non rserv
ENABLE
non rserv
ENCODING
non rserv
ENCRYPTED
non rserv
END
rserv
non rserv
END-EXEC
ENUM
non rserv
EQUALS
ESCAPE
non rserv
EVERY
EXCEPT
non rserv
rserv
1367
rserv
rserv
Mots-cl SQL
Mot-cl
PostgreSQL
SQL:2008
EXCEPTION
SQL:2003
SQL:1999
SQL-92
non rserv
rserv
rserv
EXCLUDE
non rserv
non rserv
non rserv
EXCLUDING
non rserv
non rserv
non rserv
EXCLUSIVE
non rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
EXEC
EXECUTE
non rserv
EXISTING
EXISTS
non rserv
non rserv (ne peut rserv
pas tre une fonction
ou un type)
rserv
rserv
rserv
EXP
non rserv
rserv
EXPLAIN
non rserv
EXTENSION
non rserv
EXTERNAL
non rserv
rserv
rserv
rserv
rserv
EXTRACT
rserv
non rserv
rserv
FALSE
rserv
rserv
rserv
rserv
rserv
FAMILY
non rserv
FETCH
rserv
rserv
rserv
rserv
rserv
FILE
non rserv
non rserv
FILTER
rserv
rserv
non rserv
non rserv
non rserv
non rserv
non rserv
rserv
rserv
rserv
rserv
FINAL
FIRST
non rserv
FIRST_VALUE
rserv
FLAG
non rserv
FLOAT
rserv
FLOOR
rserv
rserv
FOLLOWING
non rserv
non rserv
non rserv
FOR
rserv
rserv
rserv
rserv
rserv
FORCE
non rserv
FOREIGN
rserv
rserv
rserv
rserv
rserv
non rserv
non rserv
non rserv
non rserv
non rserv
non rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
non rserv
non rserv
rserv
FORTRAN
FORWARD
non rserv
FOUND
FREE
FREEZE
FROM
rserv
FS
FULL
rserv
rserv
FUNCTION
non rserv
rserv
rserv
rserv
FUNCTIONS
non rserv
rserv
rserv
FUSION
1368
Mots-cl SQL
Mot-cl
SQL:2008
SQL:2003
SQL:1999
non rserv
non rserv
non rserv
GENERAL
non rserv
non rserv
rserv
GENERATED
non rserv
non rserv
non rserv
GET
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
GO
non rserv
non rserv
rserv
rserv
GOTO
non rserv
non rserv
rserv
rserv
rserv
GLOBAL
PostgreSQL
non rserv
GRANT
rserv
rserv
rserv
rserv
GRANTED
non rserv
non rserv
non rserv
non rserv
GREATEST
GROUP
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
HEX
non rserv
non rserv
HIERARCHY
non rserv
non rserv
non rserv
rserv
rserv
non rserv
GROUPING
HANDLER
non rserv
HAVING
rserv
HEADER
non rserv
HOLD
non rserv
HOST
HOUR
non rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
non rserv
IDENTITY
non rserv
IF
non rserv
rserv
IGNORE
non rserv
ILIKE
IMMEDIATE
non rserv
IMMUTABLE
non rserv
IMPLEMENTATION
rserv
non rserv
non rserv
rserv
non rserv
non rserv
non rserv
rserv
rserv
rserv
non rserv
IMPORT
IN
rserv
rserv
rserv
INCLUDING
non rserv
non rserv
non rserv
INCREMENT
non rserv
non rserv
non rserv
INDENT
rserv
rserv
rserv
rserv
non rserv
INDEX
non rserv
INDEXES
non rserv
INDICATOR
rserv
rserv
INFIX
non rserv
INHERIT
non rserv
INHERITS
non rserv
INITIALIZE
INITIALLY
rserv
rserv
ID
IMPLICIT
SQL-92
rserv
rserv
non rserv
1369
non rserv
rserv
rserv
Mots-cl SQL
Mot-cl
PostgreSQL
INLINE
non rserv
INNER
SQL:2008
SQL:2003
SQL:1999
SQL-92
rserv
rserv
rserv
INOUT
rserv
rserv
INPUT
non rserv
non rserv
non rserv
rserv
rserv
INSENSITIVE
non rserv
rserv
rserv
non rserv
rserv
INSERT
non rserv
rserv
rserv
rserv
rserv
INSTANCE
non rserv
non rserv
non rserv
INSTANTIABLE
non rserv
non rserv
non rserv
INSTEAD
non rserv
INT
non rserv
rserv
rserv
rserv
INTEGER
rserv
rserv
rserv
rserv
rserv
INTEGRITY
non rserv
non rserv
rserv
rserv
rserv
rserv
INTERVAL
rserv
rserv
rserv
INTO
rserv
rserv
rserv
rserv
rserv
INVOKER
non rserv
non rserv
non rserv
non rserv
IS
rserv
rserv
rserv
ISNULL
ISOLATION
non rserv
non rserv
rserv
rserv
INTERSECT
rserv
INTERSECTION
non rserv
ITERATE
JOIN
rserv
rserv (peut tre une rserv
fonction ou un type)
K
KEY
rserv
non rserv
non rserv
non rserv
non rserv
non rserv
rserv
KEY_MEMBER
non rserv
non rserv
non rserv
KEY_TYPE
non rserv
non rserv
non rserv
LABEL
non rserv
rserv
rserv
rserv
non rserv
LAG
rserv
LANGUAGE
non rserv
rserv
rserv
rserv
LARGE
non rserv
rserv
rserv
rserv
LAST
non rserv
non rserv
non rserv
rserv
rserv
rserv
LAST_VALUE
rserv
LATERAL
rserv
LC_COLLATE
non rserv
LC_CTYPE
non rserv
LEAD
rserv
1370
rserv
rserv
Mots-cl SQL
Mot-cl
PostgreSQL
SQL:2008
SQL:2003
SQL:1999
SQL-92
LEADING
rserv
rserv
rserv
rserv
rserv
LEAST
LEFT
rserv
rserv
rserv
non rserv
non rserv
non rserv
LENGTH
non rserv
LESS
LEVEL
rserv
non rserv
LIBRARY
LIKE
rserv
rserv
non rserv
non rserv
rserv
rserv
rserv
non rserv
non rserv
rserv
non rserv
non rserv
rserv
rserv
rserv
rserv
LINK
LISTEN
non rserv
LIKE_REGEX
LIMIT
non rserv
non rserv
LN
LOAD
non rserv
LOCAL
non rserv
rserv
rserv
rserv
LOCALTIME
rserv
rserv
rserv
rserv
LOCALTIMESTAMP
rserv
rserv
rserv
rserv
LOCATION
non rserv
non rserv
non rserv
non rserv
rserv
LOWER
rserv
rserv
non rserv
non rserv
non rserv
non rserv
MAP
non rserv
non rserv
rserv
LOCATOR
LOCK
non rserv
MAPPING
non rserv
non rserv
non rserv
MATCH
non rserv
rserv
rserv
MATCHED
non rserv
non rserv
MAX
rserv
rserv
non rserv
non rserv
MAXVALUE
rserv
non rserv
rserv
rserv
rserv
non rserv
rserv
MAX_CARDINALITY
rserv
MEMBER
rserv
rserv
MERGE
rserv
rserv
MESSAGE_LENGTH
non rserv
non rserv
non rserv
non rserv
MESSAGE_OCTET_LENGTH
non rserv
non rserv
non rserv
non rserv
MESSAGE_TEXT
non rserv
non rserv
non rserv
non rserv
METHOD
rserv
rserv
non rserv
MIN
rserv
rserv
non rserv
rserv
rserv
rserv
MINUTE
non rserv
rserv
rserv
MINVALUE
non rserv
non rserv
non rserv
rserv
rserv
non rserv
rserv
rserv
rserv
MOD
MODE
non rserv
MODIFIES
MODIFY
rserv
1371
Mots-cl SQL
Mot-cl
PostgreSQL
SQL:2008
SQL:2003
SQL:1999
SQL-92
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
non rserv
non rserv
non rserv
non rserv
MULTISET
rserv
rserv
MUMPS
non rserv
non rserv
non rserv
non rserv
MODULE
MONTH
non rserv
MORE
MOVE
non rserv
NAME
non rserv
non rserv
non rserv
non rserv
non rserv
NAMES
non rserv
non rserv
non rserv
rserv
rserv
NAMESPACE
non rserv
NATIONAL
rserv
rserv
rserv
NATURAL
rserv
rserv
rserv
NCHAR
rserv
rserv
rserv
NCLOB
rserv
rserv
rserv
NESTING
non rserv
non rserv
NEW
rserv
rserv
rserv
non rserv
non rserv
rserv
rserv
rserv
NEXT
non rserv
NFC
non rserv
NFD
non rserv
NFKC
non rserv
NFKD
non rserv
NIL
non rserv
NO
non rserv
rserv
rserv
rserv
NONE
rserv
rserv
rserv
rserv
non rserv
non rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
non rserv
non rserv
non rserv
non rserv
non rserv
rserv
non rserv
non rserv
NORMALIZE
NORMALIZED
NOT
rserv
NOTHING
non rserv
NOTIFY
non rserv
NOTNULL
NOWAIT
non rserv
NTH_VALUE
rserv
NTILE
rserv
NULL
rserv
NULLABLE
NULLIF
rserv
NULLS
non rserv
non rserv
non rserv
non rserv
non rserv
NUMBER
1372
Mots-cl SQL
Mot-cl
PostgreSQL
NUMERIC
OBJECT
SQL:2008
SQL:2003
SQL:1999
SQL-92
rserv
rserv
rserv
non rserv
non rserv
rserv
non rserv
OCCURRENCES_REGEX
rserv
OCTETS
non rserv
non rserv
OCTET_LENGTH
rserv
rserv
non rserv
rserv
OF
non rserv
rserv
rserv
rserv
rserv
OFF
non rserv
non rserv
non rserv
rserv
OFFSET
rserv
rserv
OIDS
non rserv
rserv
rserv
rserv
OLD
ON
rserv
rserv
rserv
rserv
rserv
ONLY
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
OPEN
OPERATION
rserv
OPERATOR
non rserv
OPTION
non rserv
non rserv
non rserv
rserv
OPTIONS
non rserv
non rserv
non rserv
non rserv
OR
rserv
rserv
rserv
rserv
rserv
ORDER
rserv
rserv
rserv
rserv
rserv
ORDERING
non rserv
non rserv
ORDINALITY
non rserv
non rserv
OTHERS
non rserv
non rserv
rserv
rserv
OUT
rserv
rserv
OUTER
rserv
rserv
rserv
non rserv
rserv
rserv
rserv
OUTPUT
non rserv
OVER
rserv
OVERLAPS
rserv
non rserv
OVERLAY
rserv
non rserv
non rserv
non rserv
OVERRIDING
non rserv
OWNED
non rserv
OWNER
non rserv
non rserv
PAD
non rserv
non rserv
rserv
PARAMETER
rserv
rserv
rserv
PARAMETERS
rserv
PARAMETER_MODE
non rserv
non rserv
non rserv
PARAMETER_NAME
non rserv
non rserv
non rserv
PARAMETER_ORDINAL_POSITION
non rserv
non rserv
non rserv
1373
rserv
Mots-cl SQL
Mot-cl
PostgreSQL
SQL:2008
SQL:2003
SQL:1999
PARAMETER_SPECIFIC_CATALOG
non rserv
non rserv
non rserv
PARAMETER_SPECIFIC_NAME
non rserv
non rserv
non rserv
non rserv
non rserv
non rserv
rserv
rserv
non rserv
non rserv
PARAMETER_SPECIFIC_SCHEMA
PARSER
non rserv
PARTIAL
non rserv
non rserv
non rserv
PARTITION
non rserv
rserv
rserv
non rserv
non rserv
PASCAL
PASSING
non rserv
SQL-92
non rserv
PASSTHROUGH
non rserv
non rserv
PATH
non rserv
non rserv
PERCENTILE_CONT
rserv
rserv
PERCENTILE_DISC
rserv
rserv
PERCENT_RANK
rserv
rserv
PERMISSION
non rserv
non rserv
non rserv
non rserv
non rserv
non rserv
non rserv
non rserv
rserv
non rserv
rserv
PASSWORD
non rserv
PLACING
rserv
PLANS
non rserv
PLI
POSITION
POSITION_REGEX
rserv
rserv
POSTFIX
rserv
POWER
rserv
rserv
non rserv
non rserv
PRECEDING
non rserv
PRECISION
rserv
rserv
PREFIX
rserv
PREORDER
rserv
PREPARE
non rserv
PREPARED
non rserv
PRESERVE
PRIMARY
rserv
rserv
rserv
rserv
rserv
non rserv
non rserv
non rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
PRIOR
non rserv
non rserv
non rserv
rserv
rserv
PRIVILEGES
non rserv
non rserv
non rserv
rserv
rserv
PROCEDURAL
non rserv
PROCEDURE
non rserv
rserv
rserv
rserv
rserv
non rserv
non rserv
rserv
rserv
rserv
rserv
rserv
rserv
non rserv
non rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
PUBLIC
QUOTE
non rserv
RANGE
non rserv
RANK
READ
non rserv
READS
REAL
1374
rserv
Mots-cl SQL
Mot-cl
PostgreSQL
SQL:2008
SQL:2003
non rserv
non rserv
SQL:1999
SQL-92
ou un type)
REASSIGN
non rserv
RECHECK
non rserv
RECOVERY
RECURSIVE
non rserv
rserv
rserv
rserv
REF
non rserv
rserv
rserv
rserv
REFERENCES
rserv
rserv
rserv
rserv
REFERENCING
rserv
rserv
rserv
REGR_AVGX
rserv
rserv
REGR_AVGY
rserv
rserv
REGR_COUNT
rserv
rserv
REGR_INTERCEPT
rserv
rserv
REGR_R2
rserv
rserv
REGR_SLOPE
rserv
rserv
REGR_SXX
rserv
rserv
REGR_SXY
rserv
rserv
REGR_SYY
rserv
rserv
REINDEX
non rserv
RELATIVE
non rserv
non rserv
non rserv
RELEASE
non rserv
rserv
rserv
RENAME
non rserv
REPEATABLE
non rserv
non rserv
non rserv
REPLACE
non rserv
REPLICA
non rserv
non rserv
non rserv
REQUIRING
RESET
rserv
rserv
non rserv
non rserv
rserv
non rserv
RESPECT
RESTART
rserv
non rserv
non rserv
non rserv
non rserv
non rserv
non rserv
non rserv
non rserv
rserv
RESULT
rserv
rserv
rserv
RETURN
rserv
rserv
rserv
RETURNED_CARDINALITY
non rserv
non rserv
RETURNED_LENGTH
non rserv
non rserv
non rserv
non rserv
RETURNED_OCTET_LENGTH
non rserv
non rserv
non rserv
non rserv
RETURNED_SQLSTATE
non rserv
non rserv
non rserv
non rserv
RESTORE
RESTRICT
non rserv
RETURNING
rserv
non rserv
RETURNS
non rserv
rserv
rserv
rserv
REVOKE
non rserv
rserv
rserv
rserv
rserv
RIGHT
rserv
rserv
rserv
ROLE
non rserv
non rserv
non rserv
rserv
ROLLBACK
non rserv
rserv
rserv
rserv
ROLLUP
rserv
rserv
rserv
ROUTINE
non rserv
non rserv
rserv
1375
rserv
Mots-cl SQL
Mot-cl
PostgreSQL
SQL:2008
SQL:2003
SQL:1999
ROUTINE_CATALOG
non rserv
non rserv
non rserv
ROUTINE_NAME
non rserv
non rserv
non rserv
non rserv
ROUTINE_SCHEMA
non rserv
non rserv
ROW
rserv
rserv
ROWS
non rserv
SQL-92
rserv
rserv
rserv
rserv
ROW_COUNT
non rserv
non rserv
non rserv
non rserv
ROW_NUMBER
rserv
rserv
rserv
rserv
rserv
non rserv
non rserv
non rserv
non rserv
RULE
non rserv
SAVEPOINT
non rserv
SCALE
SCHEMA
non rserv
non rserv
rserv
rserv
SCHEMA_NAME
non rserv
non rserv
non rserv
non rserv
non rserv
SCOPE
rserv
rserv
rserv
SCOPE_CATALOG
non rserv
non rserv
SCOPE_NAME
non rserv
non rserv
SCOPE_SCHEMA
non rserv
non rserv
SCROLL
non rserv
rserv
rserv
rserv
SEARCH
non rserv
rserv
rserv
rserv
SECOND
non rserv
rserv
rserv
rserv
rserv
non rserv
non rserv
rserv
rserv
SECTION
rserv
SECURITY
non rserv
non rserv
non rserv
non rserv
SELECT
rserv
rserv
rserv
rserv
SELECTIVE
non rserv
non rserv
SELF
non rserv
non rserv
non rserv
SENSITIVE
rserv
rserv
non rserv
non rserv
non rserv
rserv
non rserv
non rserv
rserv
SEQUENCE
non rserv
SEQUENCES
non rserv
SERIALIZABLE
non rserv
non rserv
non rserv
SERVER
non rserv
non rserv
non rserv
non rserv
non rserv
non rserv
non rserv
SERVER_NAME
SESSION
non rserv
non rserv
non rserv
rserv
rserv
SESSION_USER
rserv
rserv
rserv
rserv
rserv
SET
non rserv
rserv
rserv
rserv
rserv
SETOF
non rserv
rserv
SETS
SHARE
non rserv
SHOW
non rserv
SIMILAR
rserv
non rserv
SIMPLE
non rserv
non rserv
non rserv
non rserv
non rserv
non rserv
rserv
rserv
rserv
rserv
rserv
SIZE
SMALLINT
Mots-cl SQL
Mot-cl
PostgreSQL
SQL:2008
SQL:2003
SQL:1999
SQL-92
rserv
rserv
rserv
rserv
SOURCE
non rserv
non rserv
non rserv
SPACE
non rserv
non rserv
rserv
SPECIFIC
rserv
rserv
rserv
SPECIFICTYPE
rserv
rserv
rserv
SPECIFIC_NAME
non rserv
non rserv
non rserv
SQL
rserv
rserv
rserv
rserv
rserv
rserv
SQLCODE
rserv
SQLERROR
rserv
SQLEXCEPTION
rserv
rserv
rserv
SQLSTATE
rserv
rserv
rserv
SQLWARNING
rserv
rserv
rserv
SQRT
rserv
rserv
STABLE
non rserv
STANDALONE
non rserv
non rserv
non rserv
START
non rserv
rserv
rserv
rserv
non rserv
non rserv
rserv
non rserv
non rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
STATE
STATEMENT
non rserv
STATIC
STATISTICS
non rserv
STDDEV_POP
STDDEV_SAMP
STDIN
non rserv
STDOUT
non rserv
STORAGE
non rserv
STRICT
non rserv
STRIP
non rserv
non rserv
non rserv
STRUCTURE
non rserv
non rserv
rserv
STYLE
non rserv
non rserv
non rserv
SUBCLASS_ORIGIN
non rserv
non rserv
non rserv
SUBLIST
rserv
rserv
rserv
non rserv
rserv
rserv
rserv
non rserv
rserv
rserv
rserv
non rserv
rserv
rserv
non rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
SUBSTRING_REGEX
rserv
SUM
SYMMETRIC
rserv
SYSID
non rserv
SYSTEM
non rserv
SYSTEM_USER
T
TABLE
non rserv
non rserv
SUBMULTISET
SUBSTRING
rserv
non rserv
rserv
rserv
1377
Mots-cl SQL
Mot-cl
PostgreSQL
TABLES
non rserv
TABLESAMPLE
TABLESPACE
SQL:2008
SQL:2003
SQL:1999
SQL-92
rserv
rserv
non rserv
non rserv
non rserv
non rserv
non rserv
non rserv
rserv
rserv
non rserv
TABLE_NAME
TEMP
non rserv
TEMPLATE
non rserv
TEMPORARY
non rserv
TERMINATE
TEXT
rserv
non rserv
THAN
THEN
rserv
rserv
TIES
rserv
rserv
non rserv
non rserv
rserv
rserv
TIME
rserv
rserv
rserv
TIMESTAMP
rserv
rserv
rserv
TIMEZONE_HOUR
rserv
rserv
rserv
rserv
TIMEZONE_MINUTE
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
non rserv
non rserv
TO
rserv
TOKEN
TOP_LEVEL_COUNT
non rserv
non rserv
TRAILING
rserv
rserv
rserv
rserv
rserv
TRANSACTION
non rserv
non rserv
non rserv
rserv
rserv
TRANSACTIONS_COMMITTED
non rserv
non rserv
non rserv
TRANSACTIONS_ROLLED_BACK
non rserv
non rserv
non rserv
TRANSACTION_ACTIVE
non rserv
non rserv
non rserv
TRANSFORM
non rserv
non rserv
non rserv
TRANSFORMS
non rserv
non rserv
non rserv
TRANSLATE
rserv
rserv
non rserv
rserv
TRANSLATE_REGEX
rserv
rserv
TRANSLATION
rserv
rserv
rserv
TREAT
rserv
rserv
TRIGGER
non rserv
rserv
rserv
rserv
TRIGGER_CATALOG
non rserv
non rserv
non rserv
TRIGGER_NAME
non rserv
non rserv
non rserv
TRIGGER_SCHEMA
non rserv
non rserv
non rserv
rserv
non rserv
rserv
rserv
rserv
rserv
TRIM
TRIM_ARRAY
rserv
TRUE
rserv
rserv
TRUNCATE
non rserv
rserv
TRUSTED
non rserv
1378
Mots-cl SQL
Mot-cl
PostgreSQL
SQL:2008
SQL:2003
SQL:1999
SQL-92
TYPE
non rserv
non rserv
non rserv
non rserv
non rserv
rserv
rserv
non rserv
UESCAPE
UNBOUNDED
non rserv
non rserv
non rserv
UNCOMMITTED
non rserv
non rserv
non rserv
non rserv
non rserv
non rserv
rserv
UNDER
UNENCRYPTED
non rserv
UNION
rserv
rserv
rserv
rserv
rserv
UNIQUE
rserv
rserv
rserv
rserv
rserv
UNKNOWN
non rserv
rserv
rserv
rserv
rserv
non rserv
non rserv
UNNAMED
non rserv
non rserv
non rserv
non rserv
UNNEST
rserv
rserv
rserv
rserv
rserv
rserv
rserv
UPPER
rserv
rserv
non rserv
rserv
URI
non rserv
USAGE
non rserv
non rserv
rserv
rserv
rserv
rserv
rserv
rserv
USER_DEFINED_TYPE_CATALOG
non rserv
non rserv
non rserv
USER_DEFINED_TYPE_CODE
non rserv
non rserv
USER_DEFINED_TYPE_NAME
non rserv
non rserv
non rserv
USER_DEFINED_TYPE_SCHEMA
non rserv
non rserv
non rserv
rserv
rserv
rserv
rserv
UNLINK
UNLISTEN
non rserv
UNLOGGED
non rserv
UNTIL
non rserv
UNTYPED
UPDATE
USER
non rserv
non rserv
rserv
USING
rserv
VACUUM
non rserv
VALID
non rserv
VALIDATE
non rserv
VALIDATOR
non rserv
VALUE
non rserv
rserv
rserv
rserv
rserv
VALUES
rserv
rserv
rserv
rserv
rserv
rserv
non rserv
VARBINARY
VARCHAR
rserv
non rserv (ne peut rserv
pas tre une fonction
ou un type)
VARIABLE
rserv
VARIADIC
rserv
VARYING
non rserv
rserv
rserv
VAR_POP
rserv
rserv
VAR_SAMP
rserv
rserv
non rserv
non rserv
VERBOSE
VERSION
non rserv
1379
rserv
rserv
Mots-cl SQL
Mot-cl
PostgreSQL
SQL:2008
SQL:2003
SQL:1999
SQL-92
VIEW
non rserv
non rserv
non rserv
rserv
rserv
VOLATILE
non rserv
WHEN
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
rserv
WHENEVER
WHERE
rserv
rserv
rserv
WHITESPACE
non rserv
non rserv
non rserv
rserv
rserv
WIDTH_BUCKET
WINDOW
rserv
rserv
rserv
WITH
rserv
rserv
rserv
rserv
rserv
WITHIN
WITHOUT
non rserv
rserv
rserv
rserv
WORK
non rserv
non rserv
non rserv
rserv
rserv
WRAPPER
non rserv
non rserv
non rserv
WRITE
non rserv
non rserv
non rserv
rserv
rserv
XML
non rserv
rserv
rserv
rserv
rserv
rserv
XMLBINARY
rserv
rserv
XMLCAST
rserv
XMLCOMMENT
rserv
rserv
rserv
XMLAGG
XMLATTRIBUTES
XMLCONCAT
XMLDECLARATION
non rserv
XMLDOCUMENT
rserv
XMLELEMENT
rserv
XMLEXISTS
rserv
XMLFOREST
rserv
XMLITERATE
rserv
XMLNAMESPACES
rserv
rserv
XMLPARSE
rserv
XMLPI
rserv
XMLQUERY
XMLROOT
rserv
non rserv (ne peut
pas tre une fonction
ou un type)
XMLSCHEMA
rserv
non rserv
1380
Mots-cl SQL
Mot-cl
PostgreSQL
SQL:2008
XMLSERIALIZE
XMLTABLE
rserv
XMLTEXT
rserv
XMLVALIDATE
rserv
YEAR
non rserv
rserv
YES
non rserv
non rserv
ZONE
non rserv
non rserv
1381
SQL:2003
SQL:1999
SQL-92
rserv
rserv
rserv
non rserv
rserv
rserv
rserv
ISO/IEC 9075-13 Routines and Types using the Java Language (SQL/JRT)
PostgreSQL couvre les parties 1, 2, 9, 11 et 14. La partie 3 est couverte par l'interface ODBC, et la partie 13 est couverte par le
plugin PL/Java, mais une conformance exacte n'est pas actuellement vrifie par ses composants. Il n'y a pas actuellement
d'implantations des parties 4 et 10 pour PostgreSQL.
PostgreSQL supporte la plupart des fonctionnalits majeures de SQL:2008. Sur les 179 fonctionnalits requises pour une conformit centrale complte (full Core conformance), PostgreSQL se conforme plus de 160. De plus, il existe une longue liste de
fonctionnalits optionelles supportes. la date de rdaction de ce document, aucune version de quelque systme de gestion de
bases de donnes que ce soit n'affiche une totale conformit au cur de SQL:2008.
Les deux sections qui suivent prsentent la liste des fonctionnalits supportes par PostgreSQL et celle des fonctionnalits dfinies dans SQL:2008 qui ne sont pas encore prises en compte. Ces deux listes sont approximatives : certains dtails d'une fonctionnalit prsente comme supporte peuvent ne pas tre conformes, alors que de grandes parties d'une fonctionnalit non supporte
peuvent tre implantes. La documentation principale fournit les informations prcises sur ce qui est, ou non, support.
Note
Les codes de fonctionnalit contenant un tiret sont des sous-fonctionnalits. Si une sous-fonctionnalit n'est pas
supporte, la fonctionnalit elle-mme sera dclare non supporte, alors mme que d'autres de ses sousfonctionnalits le sont.
1382
Conformit SQL
Paquetage
Description
B012
Embedded C
B021
Direct SQL
Commentaire
E011
Core
E011-01
Core
E011-02
Core
E011-03
Core
E011-04
Core
Arithmetic operators
E011-05
Core
Numeric comparison
E011-06
Core
E021
Core
E021-01
Core
E021-02
Core
E021-03
Core
Character literals
E021-04
Core
CHARACTER_LENGTH function
E021-05
Core
OCTET_LENGTH function
E021-06
Core
SUBSTRING function
E021-07
Core
Character concatenation
E021-08
Core
E021-09
Core
TRIM function
E021-10
Core
E021-11
Core
POSITION function
E021-12
Core
Character comparison
E031
Core
Identifiers
E031-01
Core
Delimited identifiers
E031-02
Core
E031-03
Core
Trailing underscore
E051
Core
E051-01
Core
SELECT DISTINCT
E051-02
Core
GROUP BY clause
E051-04
Core
E051-05
Core
E051-06
Core
HAVING clause
E051-07
Core
E051-08
Core
E051-09
Core
E061
Core
E061-01
Core
Comparison predicate
E061-02
Core
BETWEEN predicate
E061-03
Core
E061-04
Core
LIKE predicate
E061-05
Core
Conformit SQL
Identifiant
Paquetage
Description
E061-06
Core
NULL predicate
Commentaire
E061-07
Core
E061-08
Core
EXISTS predicate
E061-09
Core
E061-11
Core
Subqueries in IN predicate
E061-12
Core
E061-13
Core
Correlated subqueries
E061-14
Core
Search condition
E071
Core
E071-01
Core
E071-02
Core
E071-03
Core
E071-05
Core
E071-06
Core
E081-01
Core
SELECT privilege
E081-02
Core
DELETE privilege
E081-03
Core
E081-04
Core
E081-05
Core
E081-06
Core
E081-07
Core
E081-08
Core
E081-10
Core
EXECUTE privilege
E091
Core
Set functions
E091-01
Core
AVG
E091-02
Core
COUNT
E091-03
Core
MAX
E091-04
Core
MIN
E091-05
Core
SUM
E091-06
Core
ALL quantifier
E091-07
Core
DISTINCT quantifier
E101
Core
E101-01
Core
INSERT statement
E101-03
Core
E101-04
Core
E111
Core
E121
Core
E121-01
Core
DECLARE CURSOR
E121-02
Core
E121-03
Core
E121-04
Core
OPEN statement
E121-06
Core
E121-07
Core
Conformit SQL
Identifiant
Paquetage
Description
E121-08
Core
CLOSE statement
Commentaire
E121-10
Core
E121-17
Core
E131
Core
E141
Core
E141-01
Core
E141-02
Core
E141-03
Core
E141-04
Core
E141-06
Core
CHECK constraints
E141-07
Core
Column defaults
E141-08
Core
E141-10
Core
E151
Core
Transaction support
E151-01
Core
COMMIT statement
E151-02
Core
ROLLBACK statement
E152
Core
E152-01
Core
E152-02
Core
E161
Core
E171
Core
SQLSTATE support
F021
Core
F021-01
Core
COLUMNS view
F021-02
Core
TABLES view
F021-03
Core
VIEWS view
F021-04
Core
TABLE_CONSTRAINTS view
F021-05
Core
REFERENTIAL_CONSTRAINTS view
F021-06
Core
CHECK_CONSTRAINTS view
F031
Core
F031-01
Core
F031-02
Core
F031-03
Core
GRANT statement
F031-04
Core
F031-13
Core
F031-16
Core
F031-19
Core
F032
F033
F034
F034-01
Conformit SQL
Identifiant
Paquetage
Description
Commentaire
F034-02
F034-03
F041
Core
F041-01
Core
F041-02
Core
INNER keyword
F041-03
Core
F041-04
Core
F041-05
Core
F041-07
Core
F041-08
Core
F051
Core
F051-01
Core
F051-02
Core
F051-03
Core
TIMESTAMP data type (including support of TIMESTAMP literal) with fractional seconds precision of at
least 0 and 6
F051-04
Core
F051-05
Core
F051-06
Core
CURRENT_DATE
F051-07
Core
LOCALTIME
F051-08
Core
LOCALTIMESTAMP
F052
F053
F081
OVERLAPS predicate
Core
F111
F111-01
F111-02
F111-03
F131
Core
Grouped operations
F131-01
Core
F131-02
Core
F131-03
Core
F131-04
Core
F131-05
Core
F171
F191
Conformit SQL
Identifiant
Paquetage
F200
Description
Commentaire
F201
Core
CAST function
F221
Core
Explicit defaults
F222
F231
Privilege tables
F231-01
TABLE_PRIVILEGES view
F231-02
COLUMN_PRIVILEGES view
F231-03
USAGE_PRIVILEGES view
F251
Domain support
F261
Core
CASE expression
F261-01
Core
Simple CASE
F261-02
Core
Searched CASE
F261-03
Core
NULLIF
F261-04
Core
COALESCE
F262
F271
F281
LIKE enhancements
F302
F302-01
F302-02
F304
F311-01
Core
CREATE SCHEMA
F311-02
Core
F311-03
Core
CREATE VIEW
F311-05
Core
GRANT statement
F321
User authorization
F361
Subprogram support
F381
F381-01
F381-02
F381-03
F382
F391
Long identifiers
F392
F393
F401
F401-01
NATURAL JOIN
F401-02
F401-04
CROSS JOIN
F402
F411
F421
Conformit SQL
Identifiant
Paquetage
Description
Commentaire
F431
F431-01
F431-02
FETCH FIRST
F431-03
FETCH LAST
F431-04
FETCH PRIOR
F431-05
FETCH ABSOLUTE
F431-06
FETCH RELATIVE
F441
F442
F471
Core
F481
Core
F491
F501
Core
F501-01
Core
SQL_FEATURES view
F501-02
Core
SQL_SIZING view
F501-03
Core
SQL_LANGUAGES view
F502
F502-01
SQL_SIZING_PROFILES view
F502-02
SQL_IMPLEMENTATION_INFO view
F502-03
SQL_PACKAGES view
F531
Temporary tables
F555
F561
F571
F591
Derived tables
F611
F641
F651
F661
Simple tables
F672
F690
Collation support
F692
F701
F711
ALTER domain
F731
F761
Session management
F762
CURRENT_CATALOG
F763
CURRENT_SCHEMA
F771
Connection management
F781
Self-referencing operations
F791
Insensitive cursors
F801
Conformit SQL
Identifiant
Paquetage
Description
Commentaire
F850
F851
F852
F855
F856
F857
F858
F859
F860
F861
F862
F863
F864
F865
S071
Enhanced
support
S092
S095
S096
S098
ARRAY_AGG
S111
Enhanced
support
S201
S201-01
Array parameters
S201-02
S211
Enhanced
support
T031
T071
T121
T122
T131
Recursive query
T132
T141
SIMILAR predicate
T151
DISTINCT predicate
T152
T171
T172
T173
T191
T201
T211-01
Conformit SQL
Identifiant
Paquetage
T211-02
Description
Commentaire
T211-03
T211-04
T211-05
Active database, Ability to specify a search condition that must be true beEnhanced integri- fore the trigger is invoked
ty management
T211-07
T212
T213
INSTEAD OF triggers
T231
Sensitive cursors
T241
T271
Savepoints
T281
T312
OVERLAY function
T321-01
Core
T321-03
Core
Function invocation
T321-06
Core
ROUTINES view
T321-07
Core
PARAMETERS view
T322
PSM
T323
T331
Basic roles
T351
T441
T461
T501
T551
T581
T591
T614
NTILE function
T615
T617
T621
T631
Core
T651
T655
X010
XML type
X011
X016
Conformit SQL
Identifiant
Paquetage
Description
Commentaire
X020
XMLConcat
X031
XMLElement
X032
XMLForest
X034
XMLAgg
X035
X036
XMLComment
X037
XMLPI
X040
X041
X042
X043
X044
X045
X046
X047
X048
X049
X050
X051
X052
X053
X054
X055
X056
X057
X058
X059
X060
X061
X070
XMLSerialize: Character
CONTENT option
X071
X072
X090
X120
X121
X400
string
serialization
and
Conformit SQL
Identifiant
Paquetage
Description
Commentaire
B011
Embedded Ada
B013
Embedded COBOL
B014
Embedded Fortran
B015
Embedded MUMPS
B016
Embedded Pascal
B017
Embedded PL/I
B031
B032
B032-01
B033
B034
B035
B041
B051
B111
B112
Module language C
B113
B114
B115
B116
B117
B121
B122
Routine language C
B123
B124
B125
B126
B127
B128
E081
Core
Basic Privileges
E081-09
Core
USAGE privilege
E153
Core
E182
Core
Module language
F121
F121-01
F121-02
F122
F123
All diagnostics
F181
Core
F202
F263
F291
UNIQUE predicate
F301
Conformit SQL
Identifiant
Paquetage
Description
F311
Core
Commentaire
F311-04
Core
F312
MERGE statement
F313
F341
Usage tables
F394
F403
F451
F461
no
tables
ROUTINE_*_USAGE
F521
F671
intentionally omitted
F693
F695
Translation support
F696
F721
Deferrable constraints
F741
F751
F812
Basic flagging
F813
Extended flagging
F821
F831
F831-01
F831-02
F841
LIKE_REGEX predicate
F842
OCCURENCES_REGEX function
F843
POSITION_REGEX function
F844
SUBSTRING_REGEX function
F845
TRANSLATE_REGEX function
F846
F847
S011
Core
S011-01
Core
USER_DEFINED_TYPES view
S023
S024
Enhanced
support
S025
S026
S027
S028
S041
S043
Enhanced
Conformit SQL
Identifiant
Paquetage
Description
Commentaire
support
S051
S081
Enhanced
support
partially supported
object Subtables
S091
S091-01
S091-02
S091-03
Array expressions
S094
S097
S151
S161
Enhanced
support
partially supported
S162
S202
S231
Enhanced
support
S232
Array locators
S233
Multiset locators
S241
Transform functions
S242
S251
User-defined orderings
S261
S271
S272
S274
S275
S281
S291
S301
Enhanced UNNEST
S401
S402
S403
MAX_CARDINALITY
S404
TRIM_ARRAY
T011
T021
T022
T023
T024
T041
T041-01
Conformit SQL
Identifiant
Paquetage
T041-02
Description
Commentaire
T041-03
T041-04
T041-05
T042
T043
Multiplier T
T044
Multiplier P
T051
Row types
T052
T053
T061
UCS support
T101
T111
T174
Identity columns
T175
Generated columns
T176
T177
T178
T211
T211-06
Active database, Support for run-time rules for the interaction of triggers
Enhanced integri- and constraints
ty management
T211-08
Active database, Multiple triggers for the same event are executed in the intentionally omitted
Enhanced integri- order in which they were created in the catalog
ty management
T251
T261
Chained transactions
T272
T285
T301
Functional dependencies
T321
Core
T321-02
Core
T321-04
Core
CALL statement
T321-05
Core
RETURN statement
T324
T325
T326
Table functions
T332
Extended roles
T431
OLAP
partially supported
mostly supported
T432
T433
Conformit SQL
Identifiant
Paquetage
Description
Commentaire
T434
GROUP BY DISTINCT
T471
T491
T511
Transaction counts
T541
T561
Holdable locators
T571
T572
T601
T611
OLAP
T612
T613
Sampling
T616
T618
NTH_VALUE function
T641
T652
T653
T654
M001
Datalinks
M002
M003
M004
M005
M006
GetSQLString routine
M007
TransmitRequest
M009
M010
M011
M012
Datalinks via C
M013
M014
M015
Datalinks via M
M016
M017
M018
M019
M020
M021
M022
M023
M024
M030
partially supported
1396
Conformit SQL
Identifiant
Paquetage
Description
Commentaire
M031
X012
X013
X014
X015
X025
XMLCast
X030
XMLDocument
X038
XMLText
X065
X066
X068
XMLSerialize: BOM
X069
XMLSerialize: INDENT
X073
X074
X075
X076
XMLSerialize: VERSION
X077
X078
X080
X081
X082
X083
X084
X085
X086
X091
X096
XMLExists
X100
X101
X110
X111
X112
X113
X114
X131
X132
X133
X134
X135
X141
X142
Conformit SQL
Identifiant
Paquetage
Description
Commentaire
X143
X144
X145
X151
X152
X153
X155
X157
X160
X161
X170
X171
X181
XML(DOCUMENT(UNTYPED)) type
X182
XML(DOCUMENT(ANY)) type
X190
XML(SEQUENCE) type
X191
XML(DOCUMENT(XMLSCHEMA)) type
X192
XML(CONTENT(XMLSCHEMA)) type
X200
XMLQuery
X201
X202
X203
X204
X205
X206
X211
X221
X222
X231
XML(CONTENT(UNTYPED)) type
X232
XML(CONTENT(ANY)) type
X241
X242
X251
Persistent
XML
values
XML(DOCUMENT(UNTYPED)) type
X252
X253
Persistent
XML
values
XML(CONTENT(UNTYPED)) type
X254
X255
X256
Persistent
XML
values
XML(DOCUMENT(XMLSCHEMA)) type
of
X257
Persistent
XML
values
XML(CONTENT(XMLSCHEMA)) type
of
1398
of
of
Conformit SQL
Identifiant
Paquetage
Description
Commentaire
X260
X261
X263
X264
X271
X272
X273
X274
X281
X282
X283
X284
X286
X300
XMLTable
X301
X302
X303
X304
X305
1399
E.1.2. Changes
Correctly initialize padding bytes in contrib/btree_gist indexes on bit columns (Heikki Linnakangas)
This error could result in incorrect query results due to values that should compare equal not being seen as equal. Users with
GiST indexes on bit or bit varying columns should REINDEX those indexes after installing this update.
Protect against torn pages when deleting GIN list pages (Heikki Linnakangas)
This fix prevents possible index corruption if a system crash occurs while the page update is being written to disk.
Don't clear the right-link of a GiST index page while replaying updates from WAL (Heikki Linnakangas)
This error could lead to transiently wrong answers from GiST index scans performed in Hot Standby.
Fix feedback status when hot_standby is turned off on-the-fly (Simon Riggs)
Fix possibly-incorrect cache invalidation during nested calls to ReceiveSharedInvalidMessages (Andres Freund)
Fix could not find pathkey item to sort planner failures with UNION ALL over subqueries reading from tables with allance
children (Tom Lane)
Don't assume a subquery's output is unique if there's a set-returning function in its targetlist (David Rowley)
This oversight could lead to misoptimization of constructs like WHERE x IN (SELECT y, generate_series(1,10) FROM t GROUP BY y).
Fix failure to detoast fields in composite elements of structured types (Tom Lane)
This corrects cases where TOAST pointers could be copied into other tables without being dereferenced. If the original data is
later deleted, it would lead to errors like missing chunk number 0 for toast value ... when the now-dangling pointer is used.
Fix record type has not been registered failures with whole-row references to the output of Append plan nodes (Tom Lane)
1400
Notes de version
Fix possible crash when invoking a user-defined function while rewinding a cursor (Tom Lane)
Fix query-lifespan memory leak while evaluating the arguments for a function in FROM (Tom Lane)
Fix session-lifespan memory leaks in regular-expression processing (Tom Lane, Arthur O'Dwyer, Greg Stark)
Prevent foreign tables from being created with OIDS when default_with_oids is true (Etsuro Fujita)
Fix liveness checks for rows that were inserted in the current transaction and then deleted by a now-rolled-back subtransaction
(Andres Freund)
This could cause problems (at least spurious warnings, and at worst an infinite loop) if CREATE INDEX or CLUSTER were
done later in the same transaction.
Fix REASSIGN OWNED to not fail for text search objects (lvaro Herrera)
Fix client host name lookup when processing pg_hba.conf entries that specify host names instead of IP addresses (Tom
Lane)
Ensure that reverse-DNS lookup failures are reported, instead of just silently not matching such entries. Also ensure that we
make only one reverse-DNS lookup attempt per connection, not one per host name entry, which is what previously happened
if the lookup attempts failed.
Secure Unix-domain sockets of temporary postmasters started during make check (Noah Misch)
Any local user able to access the socket file could connect as the server's bootstrap superuser, then proceed to execute arbitrary
code as the operating-system user running the test, as we previously noted in CVE-2014-0067. This change defends against
that risk by placing the server's socket in a temporary, mode 0700 subdirectory of /tmp. The hazard remains however on platforms where Unix sockets are not supported, notably Windows, because then the temporary postmaster must accept local TCP
connections.
A useful side effect of this change is to simplify make check testing in builds that override DEFAULT_PGSOCKET_DIR.
Popular non-default values like /var/run/postgresql are often not writable by the build user, requiring workarounds
that will no longer be necessary.
On Windows, allow new sessions to absorb values of PGC_BACKEND parameters (such as log_connections) from the configuration file (Amit Kapila)
Previously, if such a parameter were changed in the file post-startup, the change would have no effect.
Avoid buffer bloat in libpq when the server consistently sends data faster than the client can absorb it (Shin-ichi Morita, Tom
Lane)
libpq could be coerced into enlarging its input buffer until it runs out of memory (which would be reported misleadingly as
lost synchronization with server ). Under ordinary circumstances it's quite far-fetched that data could be continuously transmitted more quickly than the recv() loop can absorb it, but this has been observed when the client is artificially slowed by
scheduler constraints.
Ensure that LDAP lookup attempts in libpq time out as intended (Laurenz Albe)
Fix ecpg to do the right thing when an array of char * is the target for a FETCH statement returning more than one row, as
1401
Notes de version
In contrib/pgcrypto functions, ensure sensitive information is cleared from stack variables before returning (Marko
Kreen)
In contrib/uuid-ossp, cache the state of the OSSP UUID library across calls (Tom Lane)
This improves the efficiency of UUID generation and reduces the amount of entropy drawn from /dev/urandom, on platforms that have that.
Update time zone data files to tzdata release 2014e for DST law changes in Crimea, Egypt, and Morocco.
E.2.2. Changes
Avoid race condition in checking transaction commit status during receipt of a NOTIFY message (Marko Tiikkaja)
This prevents a scenario wherein a sufficiently fast client might respond to a notification before database updates made by the
notifier have become visible to the recipient.
Allow regular-expression operators to be terminated early by query cancel requests (Tom Lane)
This prevents scenarios wherein a pathological regular expression could lock up a server process uninterruptably for a long
time.
Remove incorrect code that tried to allow OVERLAPS with single-element row arguments (Joshua Yanovski)
This code never worked correctly, and since the case is neither specified by the SQL standard nor documented, it seemed better to remove it than fix it.
Avoid getting more than AccessShareLock when de-parsing a rule or view (Dean Rasheed)
This oversight resulted in pg_dump unexpectedly acquiring RowExclusiveLock locks on tables mentioned as the targets
of INSERT/UPDATE/DELETE commands in rules. While usually harmless, that could interfere with concurrent transactions
that tried to acquire, for example, ShareLock on those tables.
Fix walsender's failure to shut down cleanly when client is pg_receivexlog (Fujii Masao)
Fix test to see if hot standby connections can be allowed immediately after a crash (Heikki Linnakangas)
1402
Notes de version
Fix memory leak in PL/Perl when returning a composite result, including multiple-OUT-parameter cases (Alex Hunsaker)
Prevent intermittent could not reserve shared memory region failures on recent Windows versions (MauMau)
Update time zone data files to tzdata release 2014a for DST law changes in Fiji and Turkey, plus historical changes in Israel
and Ukraine.
E.3.2. Changes
Prevent privilege escalation via manual calls to PL validator functions (Andres Freund)
The primary role of PL validator functions is to be called implicitly during CREATE FUNCTION, but they are also normal
SQL functions that a user can call explicitly. Calling a validator on a function actually written in some other language was not
checked for and could be exploited for privilege-escalation purposes. The fix involves adding a call to a privilege-checking
function in each validator function. Non-core procedural languages will also need to make this change to their own validator
functions, if any. (CVE-2014-0061)
Avoid multiple name lookups during table and index DDL (Robert Haas, Andres Freund)
If the name lookups come to different conclusions due to concurrent activity, we might perform some parts of the DDL on a
different table than other parts. At least in the case of CREATE INDEX, this can be used to cause the permissions checks to
be performed against a different table than the index creation, allowing for a privilege escalation attack. (CVE-2014-0062)
Prevent buffer overrun due to integer overflow in size calculations (Noah Misch, Heikki Linnakangas)
Several functions, mostly type input functions, calculated an allocation size without checking for overflow. If overflow did occur, a too-small buffer would be allocated and then written past. (CVE-2014-0064)
Notes de version
(CVE-2014-0065)
Document risks of make check in the regression testing instructions (Noah Misch, Tom Lane)
Since the temporary server started by make check uses trust authentication, another user on the same machine could
connect to it as database superuser, and then potentially exploit the privileges of the operating-system user who started the
tests. A future release will probably incorporate changes in the testing procedure to prevent this risk, but some public discussion is needed first. So for the moment, just warn people against using make check when there are untrusted users on the
same machine. (CVE-2014-0067)
Fix possible mis-replay of WAL records when some segments of a relation aren't full size (Greg Stark, Tom Lane)
The WAL update could be applied to the wrong page, potentially many pages past where it should have been. Aside from corrupting data, this error has been observed to result in significant bloat of standby servers compared to their masters, due to
updates being applied far beyond where the end-of-file should have been. This failure mode does not appear to be a significant
risk during crash recovery, only when initially synchronizing a standby created from a base backup taken from a quicklychanging master.
Fix bug in determining when recovery has reached consistency (Tomonari Katsumata, Heikki Linnakangas)
In some cases WAL replay would mistakenly conclude that the database was already consistent at the start of replay, thus possibly allowing hot-standby queries before the database was really consistent. Other symptoms such as PANIC: WAL
contains references to invalid pages were also possible.
Fix improper locking of btree index pages while replaying a VACUUM operation in hot-standby mode (Andres Freund, Heikki
Linnakangas, Tom Lane)
This error could result in PANIC: WAL contains references to invalid pages failures.
Ensure that insertions into non-leaf GIN index pages write a full-page WAL record when appropriate (Heikki Linnakangas)
The previous coding risked index corruption in the event of a partial-page write during a system crash.
When pause_at_recovery_target and recovery_target_inclusive are both set, ensure the target record is
applied before pausing, not after (Heikki Linnakangas)
Fix race conditions in walsender shutdown logic and walreceiver SIGHUP signal handler (Tom Lane)
Fix unsafe references to errno within error reporting logic (Christian Kruse)
This would typically lead to odd behaviors such as missing or inappropriate HINT fields.
Fix possible crashes from using ereport() too early during server startup (Tom Lane)
The principal case we've seen in the field is a crash if the server is started in a directory it doesn't have permission to read.
Clear retry flags properly in OpenSSL socket write function (Alexander Kukushkin)
This omission could result in a server lockup after unexpected loss of an SSL-encrypted connection.
Fix length checking for Unicode identifiers (U&"..." syntax) containing escapes (Tom Lane)
A spurious truncation warning would be printed for such identifiers if the escaped form of the identifier was too long, but the
identifier actually didn't need truncation after de-escaping.
Allow keywords that are type names to be used in lists of roles (Stephen Frost)
A previous patch allowed such keywords to be used without quoting in places such as role identifiers; but it missed cases
where a list of role identifiers was permitted, such as DROP ROLE.
Fix possible crash due to invalid plan for nested sub-selects, such as WHERE (... x IN (SELECT ...) ...) IN
(SELECT ...) (Tom Lane)
1404
Notes de version
Ensure that ANALYZE creates statistics for a table column even when all the values in it are too wide (Tom Lane)
ANALYZE intentionally omits very wide values from its histogram and most-common-values calculations, but it neglected to
do something sane in the case that all the sampled entries are too wide.
In ALTER TABLE ... SET TABLESPACE, allow the database's default tablespace to be used without a permissions
check (Stephen Frost)
CREATE TABLE has always allowed such usage, but ALTER TABLE didn't get the memo.
Fix cannot accept a set error when some arms of a CASE return a set and others don't (Tom Lane)
Fix checks for all-zero client addresses in pgstat functions (Kevin Grittner)
Fix possible misclassification of multibyte characters by the text search parser (Tom Lane)
Non-ASCII characters could be misclassified when using C locale with a multibyte encoding. On Cygwin, non-C locales could
fail as well.
Fix placement of permissions checks in pg_start_backup() and pg_stop_backup() (Andres Freund, Magnus Hagander)
The previous coding might attempt to do catalog access when it shouldn't.
Accept SHIFT_JIS as an encoding name for locale checking purposes (Tatsuo Ishii)
Improve error handling in libpq and psql for failures during COPY TO STDOUT/FROM STDIN (Tom Lane)
In particular this fixes an infinite loop that could occur in 9.2 and up if the server connection was lost during COPY FROM
STDIN. Variants of that scenario might be possible in older versions, or with other client applications.
Fix possible incorrect printing of filenames in pg_basebackup's verbose mode (Magnus Hagander)
Avoid including tablespaces inside PGDATA twice in base backups (Dimitri Fontaine, Magnus Hagander)
In ecpg, handle lack of a hostname in the connection parameters properly (Michael Meskes)
In contrib/isn, fix incorrect calculation of the check digit for ISMN values (Fabien Coelho)
In Mingw and Cygwin builds, install the libpq DLL in the bin directory (Andrew Dunstan)
This duplicates what the MSVC build has long done. It should fix problems with programs like psql failing to start because
they can't find the DLL.
Avoid using the deprecated dllwrap tool in Cygwin builds (Marco Atzeri)
Don't generate plain-text HISTORY and src/test/regress/README files anymore (Tom Lane)
These text files duplicated the main HTML and PDF documentation formats. The trouble involved in maintaining them greatly
outweighs the likely audience for plain-text format. Distribution tarballs will still contain files by these names, but they'll just
be stubs directing the reader to consult the main documentation. The plain-text INSTALL file will still be maintained, as there
is arguably a use-case for that.
Update time zone data files to tzdata release 2013i for DST law changes in Jordan and historical changes in Cuba.
In addition, the zones Asia/Riyadh87, Asia/Riyadh88, and Asia/Riyadh89 have been removed, as they are no longer maintained by IANA, and never represented actual civil timekeeping practice.
1405
Notes de version
E.4.2. Changes
Fix VACUUM's tests to see whether it can update relfrozenxid (Andres Freund)
In some cases VACUUM (either manual or autovacuum) could incorrectly advance a table's relfrozenxid value, allowing
tuples to escape freezing, causing those rows to become invisible once 2^31 transactions have elapsed. The probability of data
loss is fairly low since multiple incorrect advancements would need to happen before actual loss occurs, but it's not zero. Users
upgrading from releases 9.0.4 or 8.4.8 or earlier are not affected, but all later versions contain the bug.
The issue can be ameliorated by, after upgrading, vacuuming all tables in all databases while having vacuum_freeze_table_age set to zero. This will fix any latent corruption but will not be able to fix all pre-existing data
errors. However, an installation can be presumed safe after performing this vacuuming if it has executed fewer than 2^31 update transactions in its lifetime (check this with SELECT txid_current() < 2^31).
Fix initialization of pg_clog and pg_subtrans during hot standby startup (Andres Freund, Heikki Linnakangas)
This bug can cause data loss on standby servers at the moment they start to accept hot-standby queries, by marking committed
transactions as uncommitted. The likelihood of such corruption is small unless, at the time of standby startup, the primary server has executed many updating transactions since its last checkpoint. Symptoms include missing rows, rows that should have
been deleted being still visible, and obsolete versions of updated rows being still visible alongside their newer versions.
This bug was introduced in versions 9.3.0, 9.2.5, 9.1.10, and 9.0.14. Standby servers that have only been running earlier releases are not at risk. It's recommended that standby servers that have ever run any of the buggy releases be re-cloned from the
primary (e.g., with a new base backup) after upgrading.
Fix race condition in GIN index posting tree page deletion (Heikki Linnakangas)
This could lead to transient wrong answers or query failures.
Avoid flattening a subquery whose SELECT list contains a volatile function wrapped inside a sub-SELECT (Tom Lane)
This avoids unexpected results due to extra evaluations of the volatile function.
Fix planner's processing of non-simple-variable subquery outputs nested within outer joins (Tom Lane)
This error could lead to incorrect plans for queries involving multiple levels of subqueries within JOIN syntax.
Fix incorrect generation of optimized MIN()/MAX() plans for allance trees (Tom Lane)
The planner could fail in cases where the MIN()/MAX() argument was an expression rather than a simple variable.
Fix possible read past end of memory in rule printing (Peter Eisentraut)
Fix incorrect behaviors when using a SQL-standard, simple GMT offset timezone (Tom Lane)
1406
Notes de version
In some cases, the system would use the simple GMT offset value when it should have used the regular timezone setting that
had prevailed before the simple offset was selected. This change also causes the timeofday function to honor the simple
GMT offset zone.
Prevent possible misbehavior when logging translations of Windows error codes (Tom Lane)
Properly quote generated command lines in pg_ctl (Naoya Anzai and Tom Lane)
This fix applies only to Windows.
Fix pg_dumpall to work when a source database sets default_transaction_read_only via ALTER DATABASE
SET (Kevin Grittner)
Previously, the generated script would fail during restore.
Make ecpg search for quoted cursor names case-sensitively (Zoltn Bszrmnyi)
Update time zone data files to tzdata release 2013h for DST law changes in Argentina, Brazil, Jordan, Libya, Liechtenstein,
Morocco, and Palestine. Also, new timezone abbreviations WIB, WIT, WITA for Indonesia.
E.5.2. Changes
Prevent corruption of multi-byte characters when attempting to case-fold identifiers (Andrew Dunstan)
PostgreSQL case-folds non-ASCII characters only when using a single-byte server encoding.
Fix checkpoint memory leak in background writer when wal_level = hot_standby (Naoya Anzai)
Fix memory overcommit bug when work_mem is using more than 24GB of memory (Stephen Frost)
Fix possible SSL state corruption in threaded libpq applications (Nick Phillips, Stephen Frost)
Properly compute row estimates for boolean columns containing many NULL values (Andrew Gierth)
Previously tests like col IS NOT TRUE and col IS NOT FALSE did not properly factor in NULL values when estimating plan costs.
Prevent pushing down WHERE clauses into unsafe UNION/INTERSECT subqueries (Tom Lane)
Subqueries of a UNION or INTERSECT that contain set-returning functions or volatile functions in their SELECT lists could
be improperly optimized, leading to run-time errors or incorrect query results.
Fix rare case of failed to locate grouping columns planner failure (Tom Lane)
Notes de version
Reorder pg_dump processing of extension-related rules and event triggers (Joe Conway)
Improve view dumping code's handling of dropped columns in referenced tables (Tom Lane)
Fix pg_restore -l with the directory archive to display the correct format name (Fujii Masao)
Properly record index comments created using UNIQUE and PRIMARY KEY syntax (Andres Freund)
This fixes a parallel pg_restore failure.
Properly guarantee transmission of WAL files before clean switchover (Fujii Masao)
Previously, the streaming replication connection might close before all WAL files had been replayed on the standby.
Fix WAL segment timeline handling during recovery (Mitsumasa Kondo, Heikki Linnakangas)
WAL file recycling during standby recovery could lead to premature recovery completion, resulting in data loss.
Fix REINDEX TABLE and REINDEX DATABASE to properly revalidate constraints and mark invalidated indexes as valid
(Noah Misch)
REINDEX INDEX has always worked properly.
Fix possible deadlock during concurrent CREATE INDEX CONCURRENTLY operations (Tom Lane)
Fix regular expression match failures for back references combined with non-greedy quantifiers (Jeevan Chalke)
Prevent CREATE FUNCTION from checking SET variables unless function body checking is enabled (Tom Lane)
Allow ALTER DEFAULT PRIVILEGES to operate on schemas without requiring CREATE permission (Tom Lane)
Fix pgp_pub_decrypt() so it works for secret keys with passwords (Marko Kreen)
Make pg_upgrade use pg_dump --quote-all-identifiers to avoid problems with keyword changes between releases (Tom Lane)
Remove rare inaccurate warning during vacuum of index-less tables (Heikki Linnakangas)
Ensure that VACUUM ANALYZE still runs the ANALYZE phase if its attempt to truncate the file is cancelled due to lock
conflicts (Kevin Grittner)
Avoid possible failure when performing transaction control commands (e.g ROLLBACK) in prepared queries (Tom Lane)
Ensure that floating-point data input accepts standard spellings of infinity on all platforms (Tom Lane)
The C99 standard says that allowable spellings are inf, +inf, -inf, infinity, +infinity, and -infinity. Make
sure we recognize these even if the platform's strtod function doesn't.
Expand ability to compare rows to records and arrays (Rafal Rzepecki, Tom Lane)
Update time zone data files to tzdata release 2013d for DST law changes in Israel, Morocco, Palestine, and Paraguay. Also,
historical zone data corrections for Macquarie Island.
1408
Notes de version
This release contains a variety of fixes from 9.1.8. For information about new features in the 9.1 major release, see Section E.15,
Release 9.1 .
E.6.2. Changes
Fix insecure parsing of server command-line switches (Mitsumasa Kondo, Kyotaro Horiguchi)
A connection request containing a database name that begins with - could be crafted to damage or destroy files within the
server's data directory, even if the request is eventually rejected. (CVE-2013-1899)
Reset OpenSSL randomness state in each postmaster child process (Marko Kreen)
This avoids a scenario wherein random numbers generated by contrib/pgcrypto functions might be relatively easy for
another database user to guess. The risk is only significant when the postmaster is configured with ssl = on but most connections don't use SSL encryption. (CVE-2013-1900)
Make REPLICATION privilege checks test current user not authenticated user (Noah Misch)
An unprivileged database user could exploit this mistake to call pg_start_backup() or pg_stop_backup(), thus
possibly interfering with creation of routine backups. (CVE-2013-1901)
Fix GiST indexes to not use fuzzy geometric comparisons when it's not appropriate to do so (Alexander Korotkov)
The core geometric types perform comparisons using fuzzy equality, but gist_box_same must do exact comparisons,
else GiST indexes using it might become inconsistent. After installing this update, users should REINDEX any GiST indexes
on box, polygon, circle, or point columns, since all of these use gist_box_same.
Fix erroneous range-union and penalty logic in GiST indexes that use contrib/btree_gist for variable-width data
types, that is text, bytea, bit, and numeric columns (Tom Lane)
These errors could result in inconsistent indexes in which some keys that are present would not be found by searches, and also
in useless index bloat. Users are advised to REINDEX such indexes after installing this update.
Fix bugs in GiST page splitting code for multi-column indexes (Tom Lane)
These errors could result in inconsistent indexes in which some keys that are present would not be found by searches, and also
in indexes that are unnecessarily inefficient to search. Users are advised to REINDEX multi-column GiST indexes after installing this update.
Fix infinite-loop risk in regular expression compilation (Tom Lane, Don Porter)
Fix to_char() to use ASCII-only case-folding rules where appropriate (Tom Lane)
This fixes misbehavior of some template patterns that should be locale-independent, but mishandled I and i in Turkish
locales.
1409
Notes de version
Fix logic error when a single transaction does UNLISTEN then LISTEN (Tom Lane)
The session wound up not listening for notify events at all, though it surely should listen in this case.
Fix possible planner crash after columns have been added to a view that's depended on by another view (Tom Lane)
Remove useless picksplit doesn't support secondary split log messages (Josh Hansen, Tom Lane)
This message seems to have been added in expectation of code that was never written, and probably never will be, since
GiST's default handling of secondary splits is actually pretty good. So stop nagging end users about it.
Fix possible failure to send a session's last few transaction commit/abort counts to the statistics collector (Tom Lane)
Eliminate memory leaks in PL/Perl's spi_prepare() function (Alex Hunsaker, Tom Lane)
Avoid crash in pg_dump when an incorrect connection string is given (Heikki Linnakangas)
Ignore invalid indexes in pg_dump and pg_upgrade (Michael Paquier, Bruce Momjian)
Dumping invalid indexes can cause problems at restore time, for example if the reason the index creation failed was because it
tried to enforce a uniqueness condition not satisfied by the table's data. Also, if the index creation is in fact still in progress, it
seems reasonable to consider it to be an uncommitted DDL change, which pg_dump wouldn't be expected to dump anyway.
pg_upgrade now also skips invalid indexes rather than failing.
In pg_basebackup, include only the current server version's subdirectory when backing up a tablespace (Heikki Linnakangas)
Add a server version check in pg_basebackup and pg_receivexlog, so they fail cleanly with version combinations that won't
work (Heikki Linnakangas)
Fix contrib/pg_trgm's similarity() function to return zero for trigram-less strings (Tom Lane)
Previously it returned NaN due to internal division by zero.
Update time zone data files to tzdata release 2013b for DST law changes in Chile, Haiti, Morocco, Paraguay, and some Russian areas. Also, historical zone data corrections for numerous places.
Also, update the time zone abbreviation files for recent changes in Russia and elsewhere: CHOT, GET, IRKT, KGT, KRAT,
MAGT, MAWT, MSK, NOVT, OMST, TKT, VLAT, WST, YAKT, YEKT now follow their current meanings, and VOLT
(Europe/Volgograd) and MIST (Antarctica/Macquarie) are added to the default abbreviations list.
E.7.2. Changes
Fix multiple problems in detection of when a consistent database state has been reached during WAL replay (Fujii Masao,
Heikki Linnakangas, Simon Riggs, Andres Freund)
1410
Notes de version
Update minimum recovery point when truncating a relation file (Heikki Linnakangas)
Once data has been discarded, it's no longer safe to stop recovery at an earlier point in the timeline.
Fix recycling of WAL segments after changing recovery target timeline (Heikki Linnakangas)
Fix missing cancellations in hot standby mode (Noah Misch, Simon Riggs)
The need to cancel conflicting hot-standby queries would sometimes be missed, allowing those queries to see inconsistent data.
Prevent recovery pause feature from pausing before users can connect (Tom Lane)
Fix SQL grammar to allow subscripting or field selection from a sub-SELECT result (Tom Lane)
Fix performance problems with autovacuum truncation in busy workloads (Jan Wieck)
Truncation of empty pages at the end of a table requires exclusive lock, but autovacuum was coded to fail (and release the
table lock) when there are conflicting lock requests. Under load, it is easily possible that truncation would never occur, resulting in table bloat. Fix by performing a partial truncation, releasing the lock, then attempting to re-acquire the lock and continue. This fix also greatly reduces the average time before autovacuum releases the lock after a conflicting request arrives.
Protect against race conditions when scanning pg_tablespace (Stephen Frost, Tom Lane)
CREATE DATABASE and DROP DATABASE could misbehave if there were concurrent updates of pg_tablespace entries.
Prevent DROP OWNED from trying to drop whole databases or tablespaces (lvaro Herrera)
For safety, ownership of these objects must be reassigned, not dropped.
Prevent misbehavior when a RowExpr or XmlExpr is parse-analyzed twice (Andres Freund, Tom Lane)
This mistake could be user-visible in contexts such as CREATE TABLE LIKE INCLUDING INDEXES.
Improve defenses against integer overflow in hashtable sizing calculations (Jeff Davis)
Fix failure to ignore leftover temporary tables after a server crash (Tom Lane)
Fix PL/Python's handling of functions used as triggers on multiple tables (Andres Freund)
Ensure that non-ASCII prompt strings are translated to the correct code page on Windows (Alexander Law, Noah Misch)
This bug affected psql and some other client programs.
Fix possible crash in psql's \? command when not connected to a database (Meng Qingzhong)
Fix possible error if a relation file is removed while pg_basebackup is running (Heikki Linnakangas)
Make pg_dump exclude data of unlogged tables when running on a hot-standby server (Magnus Hagander)
This would fail anyway because the data is not available on the standby server, so it seems most convenient to assume -no-unlogged-table-data automatically.
Include our version of isinf() in libecpg if it's not provided by the system (Jiang Guiqing)
Rearrange configure's tests for supplied functions so it is not fooled by bogus exports from libedit/libreadline (Christoph Berg)
Notes de version
Make pgxs build executables with the right .exe suffix when cross-compiling for Windows (Zoltan Boszormenyi)
E.8.2. Changes
Fix multiple bugs associated with CREATE INDEX CONCURRENTLY (Andres Freund, Tom Lane)
Fix CREATE INDEX CONCURRENTLY to use in-place updates when changing the state of an index's pg_index row. This
prevents race conditions that could cause concurrent sessions to miss updating the target index, thus resulting in corrupt
concurrently-created indexes.
Also, fix various other operations to ensure that they ignore invalid indexes resulting from a failed CREATE INDEX
CONCURRENTLY command. The most important of these is VACUUM, because an auto-vacuum could easily be launched
on the table before corrective action can be taken to fix or remove the invalid index.
Fix an error in WAL generation logic for GIN indexes (Tom Lane)
This could result in index corruption, if a torn-page failure occurred.
Properly remove startup process's virtual XID lock when promoting a hot standby server to normal running (Simon Riggs)
This oversight could prevent subsequent execution of certain operations such as CREATE INDEX CONCURRENTLY.
Prevent the postmaster from launching new child processes after it's received a shutdown signal (Tom Lane)
This mistake could result in shutdown taking longer than it should, or even never completing at all without additional user action.
Avoid corruption of internal hash tables when out of memory (Hitoshi Harada)
Prevent file descriptors for dropped tables from being held open past transaction end (Tom Lane)
This should reduce problems with long-since-dropped tables continuing to occupy disk space.
Prevent database-wide crash and restart when a new child process is unable to create a pipe for its latch (Tom Lane)
Although the new process must fail, there is no good reason to force a database-wide restart, so avoid that. This improves robustness when the kernel is nearly out of file descriptors.
Fix planning of non-strict equivalence clauses above outer joins (Tom Lane)
The planner could derive incorrect constraints from a clause equating a non-strict construct to something else, for example
WHERE COALESCE(foo, 0) = 0 when foo is coming from the nullable side of an outer join.
Fix SELECT DISTINCT with index-optimized MIN/MAX on an allance tree (Tom Lane)
1412
Notes de version
The planner would fail with failed to re-find MinMaxAggInfo record given this combination of factors.
Improve planner's ability to prove exclusion constraints from equivalence classes (Tom Lane)
Fix partial-row matching in hashed subplans to handle cross-type cases correctly (Tom Lane)
This affects multicolumn NOT IN subplans, such as WHERE (a, b) NOT IN (SELECT x, y FROM ...) when for
instance b and y are int4 and int8 respectively. This mistake led to wrong answers or crashes depending on the specific datatypes involved.
Acquire buffer lock when re-fetching the old tuple for an AFTER ROW UPDATE/DELETE trigger (Andres Freund)
In very unusual circumstances, this oversight could result in passing incorrect data to a trigger WHEN condition, or to the precheck logic for a foreign-key enforcement trigger. That could result in a crash, or in an incorrect decision about whether to fire
the trigger.
Fix ALTER COLUMN TYPE to handle alled check constraints properly (Pavan Deolasee)
This worked correctly in pre-8.4 releases, and now works correctly in 8.4 and later.
Fix ALTER EXTENSION SET SCHEMA's failure to move some subsidiary objects into the new schema (lvaro Herrera,
Dimitri Fontaine)
Ignore incorrect pg_attribute entries for system columns for views (Tom Lane)
Views do not have any system columns. However, we forgot to remove such entries when converting a table to a view. That's
fixed properly for 9.3 and later, but in previous branches we need to defend against existing mis-converted views.
Fix rule printing to dump INSERT INTO table DEFAULT VALUES correctly (Tom Lane)
Guard against stack overflow when there are too many UNION/INTERSECT/EXCEPT clauses in a query (Tom Lane)
Prevent platform-dependent failures when dividing the minimum possible integer value by -1 (Xi Wang, Tom Lane)
Fix possible access past end of string in date parsing (Hitoshi Harada)
Fix failure to advance XID epoch if XID wraparound happens during a checkpoint and wal_level is hot_standby (Tom
Lane, Andres Freund)
While this mistake had no particular impact on PostgreSQL itself, it was bad for applications that rely on
txid_current() and related functions: the TXID value would appear to go backwards.
Produce an understandable error message if the length of the path name for a Unix-domain socket exceeds the platform-specific limit (Tom Lane, Andrew Dunstan)
Formerly, this would result in something quite unhelpful, such as Non-recoverable failure in name resolution .
Fix memory leaks when sending composite column values to the client (Tom Lane)
Make pg_ctl more robust about reading the postmaster.pid file (Heikki Linnakangas)
Fix race conditions and possible file descriptor leakage.
Fix possible crash in psql if incorrectly-encoded data is presented and the client_encoding setting is a client-only encoding, such as SJIS (Jiang Guiqing)
Make pg_dump dump SEQUENCE SET items in the data not pre-data section of the archive (Tom Lane)
This change fixes dumping of sequences that are marked as extension configuration tables.
Fix bugs in the restore.sql script emitted by pg_dump in tar output format (Tom Lane)
The script would fail outright on tables whose names include upper-case characters. Also, make the script capable of restoring
data in --inserts mode as well as the regular COPY mode.
Fix pg_restore to accept POSIX-conformant tar files (Brian Weaver, Tom Lane)
The original coding of pg_dump's tar output mode produced files that are not fully conformant with the POSIX standard.
This has been corrected for version 9.3. This patch updates previous branches so that they will accept both the incorrect and
the corrected formats, in hopes of avoiding compatibility problems when 9.3 comes out.
Fix tar files emitted by pg_basebackup to be POSIX conformant (Brian Weaver, Tom Lane)
1413
Notes de version
Fix pg_resetxlog to locate postmaster.pid correctly when given a relative path to the data directory (Tom Lane)
This mistake could lead to pg_resetxlog not noticing that there is an active postmaster using the data directory.
Fix libpq's lo_import() and lo_export() functions to report file I/O errors properly (Tom Lane)
Make contrib/pageinspect's btree page inspection functions take buffer locks while examining pages (Tom Lane)
Ensure that make install for an extension creates the extension installation directory (Cdric Villemain)
Previously, this step was missed if MODULEDIR was set in the extension's Makefile.
Fix pgxs support for building loadable modules on AIX (Tom Lane)
Building modules outside the original source tree didn't work on AIX.
Update time zone data files to tzdata release 2012j for DST law changes in Cuba, Israel, Jordan, Libya, Palestine, Western Samoa, and portions of Brazil.
E.9.2. Changes
Fix persistence marking of shared buffers during WAL replay (Jeff Davis)
This mistake can result in buffers not being written out during checkpoints, resulting in data corruption if the server later
crashes without ever having written those buffers. Corruption can occur on any server following crash recovery, but it is significantly more likely to occur on standby slave servers since those perform much more WAL replay. There is a low probability
of corruption of btree and GIN indexes. There is a much higher probability of corruption of table visibility maps . Fortunately, visibility maps are non-critical data in 9.1, so the worst consequence of such corruption in 9.1 installations is transient inefficiency of vacuuming. Table data proper cannot be corrupted by this bug.
While no index corruption due to this bug is known to have occurred in the field, as a precautionary measure it is recommended that production installations REINDEX all btree and GIN indexes at a convenient time after upgrading to 9.1.6.
Also, if you intend to do an in-place upgrade to 9.2.X, before doing so it is recommended to perform a VACUUM of all tables
while having vacuum_freeze_table_age set to zero. This will ensure that any lingering wrong data in the visibility
maps is corrected before 9.2.X can depend on it. vacuum_cost_delay can be adjusted to reduce the performance impact
of vacuuming, while causing it to take longer to finish.
Fix planner's assignment of executor parameters, and fix executor's rescan logic for CTE plan nodes (Tom Lane)
These errors could result in wrong answers from queries that scan the same WITH subquery multiple times.
Fix misbehavior when default_transaction_isolation is set to serializable (Kevin Grittner, Tom Lane,
Heikki Linnakangas)
Symptoms include crashes at process start on Windows, and crashes in hot standby operation.
Improve selectivity estimation for text search queries involving prefixes, i.e. word:* patterns (Tom Lane)
1414
Notes de version
Improve page-splitting decisions in GiST indexes (Alexander Korotkov, Robert Haas, Tom Lane)
Multi-column GiST indexes might suffer unexpected bloat due to this error.
Fix cascading privilege revoke to stop if privileges are still held (Tom Lane)
If we revoke a grant option from some role X, but X still holds that option via a grant from someone else, we should not recursively revoke the corresponding privilege from role(s) Y that X had granted it to.
Disallow extensions from containing the schema they are assigned to (Thom Brown)
This situation creates circular dependencies that confuse pg_dump and probably other things. It's confusing for humans too, so
disallow it.
Improve error messages for Hot Standby misconfiguration errors (Gurjeet Singh)
Prevent PL/Perl from crashing if a recursive PL/Perl function is redefined while being executed (Tom Lane)
On Windows, make pg_upgrade use backslash path separators in the scripts it emits (Andrew Dunstan)
Update time zone data files to tzdata release 2012f for DST law changes in Fiji
E.10.2. Changes
Prevent access to external files/URLs via XML entity references (Noah Misch, Tom Lane)
xml_parse() would attempt to fetch external files or URLs as needed to resolve DTD and entity references in an XML value, thus allowing unprivileged database users to attempt to fetch data with the privileges of the database server. While the external data wouldn't get returned directly to the user, portions of it could be exposed in error messages if the data didn't parse
as valid XML; and in any case the mere ability to check existence of a file might be useful to an attacker. (CVE-2012-3489)
1415
Notes de version
Fix race condition in enum-type value comparisons (Robert Haas, Tom Lane)
Comparisons could fail when encountering an enum value added since the current query started.
Fix txid_current() to report the correct epoch when not in hot standby (Heikki Linnakangas)
This fixes a regression introduced in the previous minor release.
Prevent selection of unsuitable replication connections as the synchronous standby (Fujii Masao)
The master might improperly choose pseudo-servers such as pg_receivexlog or pg_basebackup as the synchronous standby,
and then wait indefinitely for them.
Fix bug in startup of Hot Standby when a master transaction has many subtransactions (Andres Freund)
This mistake led to failures reported as out-of-order XID insertion in KnownAssignedXids .
Wake walsenders after each background flush by walwriter (Andres Freund, Simon Riggs)
This greatly reduces replication delay when the workload contains only asynchronously-committed transactions.
Fix LISTEN/NOTIFY to cope better with I/O problems, such as out of disk space (Tom Lane)
After a write failure, all subsequent attempts to send more NOTIFY messages would fail with messages like Could not read
from file "pg_notify/nnnn" at offset nnnnn: Success .
Fix log collector so that log_truncate_on_rotation works during the very first log rotation after server start (Tom
Lane)
Ensure that a whole-row reference to a subquery doesn't include any extra GROUP BY or ORDER BY columns (Tom Lane)
Fix dependencies generated during ALTER TABLE ... ADD CONSTRAINT USING INDEX (Tom Lane)
This command left behind a redundant pg_depend entry for the index, which could confuse later operations, notably ALTER
1416
Notes de version
Disallow copying whole-row references in CHECK constraints and index definitions during CREATE TABLE (Tom Lane)
This situation can arise in CREATE TABLE with LIKE or INHERITS. The copied whole-row variable was incorrectly labeled with the row type of the original table not the new one. Rejecting the case seems reasonable for LIKE, since the row types
might well diverge later. For INHERITS we should ideally allow it, with an implicit coercion to the parent table's row type;
but that will require more work than seems safe to back-patch.
Fix memory leak in ARRAY(SELECT ...) subqueries (Heikki Linnakangas, Tom Lane)
Fix planner to pass correct collation to operator selectivity estimators (Tom Lane)
This was not previously required by any core selectivity estimation function, but third-party code might need it.
Fix bugs with parsing signed hh:mm and hh:mm:ss fields in interval constants (Amit Kapila, Tom Lane)
Fix pg_dump to better handle views containing partial GROUP BY lists (Tom Lane)
A view that lists only a primary key column in GROUP BY, but uses other table columns as if they were grouped, gets marked
as depending on the primary key. Improper handling of such primary key dependencies in pg_dump resulted in poorly-ordered
dumps, which at best would be inefficient to restore and at worst could result in outright failure of a parallel pg_restore run.
In PL/Perl, avoid setting UTF8 flag when in SQL_ASCII encoding (Alex Hunsaker, Kyotaro Horiguchi, Alvaro Herrera)
Use Postgres' encoding conversion functions, not Python's, when converting a Python Unicode string to the server encoding in
PL/Python (Jan Urbanski)
This avoids some corner-case problems, notably that Python doesn't support all the encodings Postgres does. A notable functional change is that if the server encoding is SQL_ASCII, you will get the UTF-8 representation of the string; formerly, any
non-ASCII characters in the string would result in an error.
Update time zone data files to tzdata release 2012e for DST law changes in Morocco and Tokelau
E.11.2. Changes
Fix incorrect password transformation in contrib/pgcrypto's DES crypt() function (Solar Designer)
1417
Notes de version
If a password string contained the byte value 0x80, the remainder of the password was ignored, causing the password to be
much weaker than it appeared. With this fix, the rest of the string is properly included in the DES hash. Any stored password
values that are affected by this bug will thus no longer match, so the stored values may need to be updated. (CVE-2012-2143)
Ignore SECURITY DEFINER and SET attributes for a procedural language's call handler (Tom Lane)
Applying such attributes to a call handler could crash the server. (CVE-2012-2655)
Make contrib/citext's upgrade script fix collations of citext arrays and domains over citext (Tom Lane)
Release 9.1.2 provided a fix for collations of citext columns and indexes in databases upgraded or reloaded from pre-9.1 installations, but that fix was incomplete: it neglected to handle arrays and domains over citext. This release extends the module's
upgrade script to handle these cases. As before, if you have already run the upgrade script, you'll need to run the collation update commands by hand instead. See the 9.1.2 release notes for more information about doing this.
Allow numeric timezone offsets in timestamp input to be up to 16 hours away from UTC (Tom Lane)
Some historical time zones have offsets larger than 15 hours, the previous limit. This could result in dumped data values being
rejected during reload.
Fix timestamp conversion to cope when the given time is exactly the last DST transition time for the current timezone (Tom
Lane)
This oversight has been there a long time, but was not noticed previously because most DST-using zones are presumed to have
an indefinite sequence of future DST transitions.
Fix text to name and char to name casts to perform string truncation correctly in multibyte encodings (Karl Schnaitter)
Ensure txid_current() reports the correct epoch when executed in hot standby (Simon Riggs)
Fix planning of UNION ALL subqueries with output columns that are not simple variables (Tom Lane)
Planning of such cases got noticeably worse in 9.1 as a result of a misguided fix for MergeAppend child's targetlist doesn't
match MergeAppend errors. Revert that fix and do it another way.
Fix slow session startup when pg_attribute is very large (Tom Lane)
If pg_attribute exceeds one-fourth of shared_buffers, cache rebuilding code that is sometimes needed during session
start would trigger the synchronized-scan logic, causing it to take many times longer than normal. The problem was particularly acute if many new sessions were starting at once.
Ensure sequential scans check for query cancel reasonably often (Merlin Moncure)
A scan encountering many consecutive pages that contain no live tuples would not respond to interrupts meanwhile.
Ensure the Windows implementation of PGSemaphoreLock() clears ImmediateInterruptOK before returning (Tom
Lane)
This oversight meant that a query-cancel interrupt received later in the same query could be accepted at an unsafe time, with
unpredictable but not good consequences.
Show whole-row variables safely when printing views or rules (Abbas Butt, Tom Lane)
Corner cases involving ambiguous names (that is, the name could be either a table or column name of the query) were printed
in an ambiguous way, risking that the view or rule would be interpreted differently after dump and reload. Avoid the ambiguous case by attaching a no-op cast.
Fix COPY FROM to properly handle null marker strings that correspond to invalid encoding (Tom Lane)
A null marker string such as E'\\0' should work, and did work in the past, but the case got broken in 8.4.
Fix EXPLAIN VERBOSE for writable CTEs containing RETURNING clauses (Tom Lane)
Fix PREPARE TRANSACTION to work correctly in the presence of advisory locks (Tom Lane)
1418
Notes de version
Historically, PREPARE TRANSACTION has simply ignored any session-level advisory locks the session holds, but this
case was accidentally broken in 9.1.
Fix bugs with temporary or transient tables used in extension scripts (Tom Lane)
This includes cases such as a rewriting ALTER TABLE within an extension update script, since that uses a transient table behind the scenes.
Ensure autovacuum worker processes perform stack depth checking properly (Heikki Linnakangas)
Previously, infinite recursion in a function invoked by auto-ANALYZE could crash worker processes.
Fix logging collector to not lose log coherency under high load (Andrew Dunstan)
The collector previously could fail to reassemble large messages if it got too busy.
Fix logging collector to ensure it will restart file rotation after receiving SIGHUP (Tom Lane)
Fix too many LWLocks taken failure in GiST indexes (Heikki Linnakangas)
Fix WAL replay logic for GIN indexes to not fail if the index was subsequently dropped (Tom Lane)
Correctly detect SSI conflicts of prepared transactions after a crash (Dan Ports)
Avoid synchronous replication delay when committing a transaction that only modified temporary tables (Heikki Linnakangas)
In such a case the transaction's commit record need not be flushed to standby servers, but some of the code didn't know that
and waited for it to happen anyway.
Fix walsender to not go into a busy loop if connection is terminated (Fujii Masao)
Fix PL/pgSQL's GET DIAGNOSTICS command when the target is the function's first variable (Tom Lane)
Fix PL/Python functions returning composite types to accept a string for their result value (Jan Urbanski)
This case was accidentally broken by the 9.1 additions to allow a composite result value to be supplied in other formats, such
as dictionaries.
Fix potential access off the end of memory in psql's expanded display (\x) mode (Peter Eisentraut)
Fix several performance problems in pg_dump when the database contains many objects (Jeff Janes, Tom Lane)
pg_dump could get very slow if the database contained many schemas, or if many objects are in dependency loops, or if there
are many owned sequences.
Fix memory and file descriptor leaks in pg_restore when reading a directory-format archive (Peter Eisentraut)
Fix pg_upgrade for the case that a database stored in a non-default tablespace contains a table in the cluster's default tablespace (Bruce Momjian)
In ecpg, fix rare memory leaks and possible overwrite of one byte after the sqlca_t structure (Peter Eisentraut)
Fix contrib/dblink's dblink_exec() to not leak temporary database connections upon error (Tom Lane)
Fix contrib/dblink to report the correct connection name in error messages (Kyotaro Horiguchi)
Fix contrib/vacuumlo to use multiple transactions when dropping many large objects (Tim Lewis, Robert Haas, Tom
Lane)
This change avoids exceeding max_locks_per_transaction when many objects need to be dropped. The behavior can
be adjusted with the new -l (limit) option.
1419
Notes de version
Update time zone data files to tzdata release 2012c for DST law changes in Antarctica, Armenia, Chile, Cuba, Falkland Islands, Gaza, Haiti, Hebron, Morocco, Syria, and Tokelau Islands; also historical corrections for Canada.
E.12.2. Changes
Require execute permission on the trigger function for CREATE TRIGGER (Robert Haas)
This missing check could allow another user to execute a trigger function with forged input data, by installing it on a table he
owns. This is only of significance for trigger functions marked SECURITY DEFINER, since otherwise trigger functions run
as the table owner anyway. (CVE-2012-0866)
Remove arbitrary limitation on length of common name in SSL certificates (Heikki Linnakangas)
Both libpq and the server truncated the common name extracted from an SSL certificate at 32 bytes. Normally this would
cause nothing worse than an unexpected verification failure, but there are some rather-implausible scenarios in which it might
allow one certificate holder to impersonate another. The victim would have to have a common name exactly 32 bytes long, and
the attacker would have to persuade a trusted CA to issue a certificate in which the common name has that string as a prefix.
Impersonating a server would also require some additional exploit to redirect client connections. (CVE-2012-0867)
Fix btree index corruption from insertions concurrent with vacuuming (Tom Lane)
An index page split caused by an insertion could sometimes cause a concurrently-running VACUUM to miss removing index
entries that it should remove. After the corresponding table rows are removed, the dangling index entries would cause errors
(such as could not read block N in file ... ) or worse, silently wrong query results after unrelated rows are re-inserted at the
now-free table locations. This bug has been present since release 8.2, but occurs so infrequently that it was not diagnosed until
now. If you have reason to suspect that it has happened in your database, reindexing the affected index will fix things.
Fix transient zeroing of shared buffers during WAL replay (Tom Lane)
The replay logic would sometimes zero and refill a shared buffer, so that the contents were transiently invalid. In hot standby
mode this can result in a query that's executing in parallel seeing garbage data. Various symptoms could result from that, but
the most common one seems to be invalid memory alloc request size .
Fix handling of data-modifying WITH subplans in READ COMMITTED rechecking (Tom Lane)
A WITH clause containing INSERT/UPDATE/DELETE would crash if the parent UPDATE or DELETE command needed
to be re-evaluated at one or more rows due to concurrent updates in READ COMMITTED mode.
Notes de version
Fix CLUSTER/VACUUM FULL handling of toast values owned by recently-updated rows (Tom Lane)
This oversight could lead to duplicate key value violates unique constraint errors being reported against the toast table's index during one of these commands.
Update per-column permissions, not only per-table permissions, when changing table owner (Tom Lane)
Failure to do this meant that any previously granted column permissions were still shown as having been granted by the old
owner. This meant that neither the new owner nor a superuser could revoke the now-untraceable-to-table-owner permissions.
Support foreign data wrappers and foreign servers in REASSIGN OWNED (Alvaro Herrera)
This command failed with unexpected classid errors if it needed to change the ownership of any such objects.
Allow non-existent values for some settings in ALTER USER/DATABASE SET (Heikki Linnakangas)
Allow default_text_search_config, default_tablespace, and temp_tablespaces to be set to names that
are not known. This is because they might be known in another database where the setting is intended to be used, or for the tablespace cases because the tablespace might not be created yet. The same issue was previously recognized for
search_path, and these settings now act like that one.
Fix unsupported node type error caused by COLLATE in an INSERT expression (Tom Lane)
Avoid crashing when we have problems deleting table files post-commit (Tom Lane)
Dropping a table should lead to deleting the underlying disk files only after the transaction commits. In event of failure then
(for instance, because of wrong file permissions) the code is supposed to just emit a warning message and go on, since it's too
late to abort the transaction. This logic got broken as of release 8.4, causing such situations to result in a PANIC and an unrestartable database.
Recover from errors occurring during WAL replay of DROP TABLESPACE (Tom Lane)
Replay will attempt to remove the tablespace's directories, but there are various reasons why this might fail (for example, incorrect ownership or permissions on those directories). Formerly the replay code would panic, rendering the database unrestartable without manual intervention. It seems better to log the problem and continue, since the only consequence of failure to remove the directories is some wasted disk space.
Fix race condition in logging AccessExclusiveLocks for hot standby (Simon Riggs)
Sometimes a lock would be logged as being held by transaction zero . This is at least known to produce assertion failures
on slave servers, and might be the cause of more serious problems.
Track the OID counter correctly during WAL replay, even when it wraps around (Tom Lane)
Previously the OID counter would remain stuck at a high value until the system exited replay mode. The practical consequences of that are usually nil, but there are scenarios wherein a standby server that's been promoted to master might take a
long time to advance the OID counter to a reasonable value once values are needed.
Prevent emitting misleading consistent recovery state reached log message at the beginning of crash recovery (Heikki Linnakangas)
Fix planner's ability to push down index-expression restrictions through UNION ALL (Tom Lane)
This type of optimization was inadvertently disabled by a fix for another problem in 9.1.2.
Fix planning of WITH clauses referenced in UPDATE/DELETE on an alled table (Tom Lane)
This bug led to could not find plan for CTE failures.
1421
Notes de version
Fix GIN cost estimation to handle column IN (...) index conditions (Marti Raudsepp)
This oversight would usually lead to crashes if such a condition could be used with a GIN index.
Prevent assertion failure when exiting a session with an open, failed transaction (Tom Lane)
This bug has no impact on normal builds with asserts not enabled.
Fix dangling pointer after CREATE TABLE AS/SELECT INTO in a SQL-language function (Tom Lane)
In most cases this only led to an assertion failure in assert-enabled builds, but worse consequences seem possible.
Fix I/O-conversion-related memory leaks in plpgsql (Andres Freund, Jan Urbanski, Tom Lane)
Certain operations would leak memory until the end of the current function.
In pg_dump, don't dump contents of an extension's configuration tables if the extension itself is not being dumped (Tom Lane)
Fix pg_restore's direct-to-database mode for INSERT-style table data (Tom Lane)
Direct-to-database restores from archive files made with --inserts or --column-inserts options fail when using
pg_restore from a release dated September or December 2011, as a result of an oversight in a fix for another problem. The archive file itself is not at fault, and text-mode output is okay.
Make libpq ignore ENOTDIR errors when looking for an SSL client certificate file (Magnus Hagander)
This allows SSL connections to be established, though without a certificate, even when the user's home directory is set to something like /dev/null.
Fix some more field alignment issues in ecpg's SQLDA area (Zoltan Boszormenyi)
Do not use the variable name when defining a varchar structure in ecpg (Michael Meskes)
Fix contrib/auto_explain's JSON output mode to produce valid JSON (Andrew Dunstan)
The output used brackets at the top level, when it should have used braces.
Notes de version
test_parser is only example code, this is not a security issue in itself, but bad example code is still bad.
Use -fexcess-precision=standard option when building with gcc versions that accept it (Andrew Dunstan)
This prevents assorted scenarios wherein recent versions of gcc will produce creative results.
E.13.2. Changes
Make contrib/citext's upgrade script fix collations of citext columns and indexes (Tom Lane)
Existing citext columns and indexes aren't correctly marked as being of a collatable data type during pg_upgrade from a pre9.1 server, or when a pre-9.1 dump containing the citext type is loaded into a 9.1 server. That leads to operations on these columns failing with errors such as could not determine which collation to use for string comparison . This change allows
them to be fixed by the same script that upgrades the citext module into a proper 9.1 extension during CREATE EXTENSION
citext FROM unpackaged.
If you have a previously-upgraded database that is suffering from this problem, and you already ran the CREATE EXTENSION command, you can manually run (as superuser) the UPDATE commands found at the end of SHAREDIR/
extension/citext--unpackaged--1.0.sql. (Run pg_config --sharedir if you're uncertain where SHAREDIR is.) There is no harm in doing this again if unsure.
1423
Notes de version
Fix possible crash during UPDATE or DELETE that joins to the output of a scalar-returning function (Tom Lane)
A crash could only occur if the target row had been concurrently updated, so this problem surfaced only intermittently.
Fix incorrect replay of WAL records for GIN index updates (Tom Lane)
This could result in transiently failing to find index entries after a crash, or on a hot-standby server. The problem would be repaired by the next VACUUM of the index, however.
Fix TOAST-related data corruption during CREATE TABLE dest AS SELECT * FROM src or INSERT INTO
dest SELECT * FROM src (Tom Lane)
If a table has been modified by ALTER TABLE ADD COLUMN, attempts to copy its data verbatim to another table could
produce corrupt results in certain corner cases. The problem can only manifest in this precise form in 8.4 and later, but we patched earlier versions as well in case there are other code paths that could trigger the same bug.
Start hot standby faster when initial snapshot is incomplete (Simon Riggs)
Fix race condition during toast table access from stale syscache entries (Tom Lane)
The typical symptom was transient errors like missing chunk number 0 for toast value NNNNN in pg_toast_2619 , where
the cited toast table would always belong to a system catalog.
Track dependencies of functions on items used in parameter default expressions (Tom Lane)
Previously, a referenced object could be dropped without having dropped or modified the function, leading to misbehavior
when the function was used. Note that merely installing this update will not fix the missing dependency entries; to do that,
you'd need to CREATE OR REPLACE each such function afterwards. If you have functions whose defaults depend on nonbuilt-in objects, doing so is recommended.
Fix window functions that sort by expressions involving aggregates (Tom Lane)
Previously these could fail with could not find pathkey item to sort planner errors.
Fix MergeAppend child's targetlist doesn't match MergeAppend planner errors (Tom Lane)
Fix index matching for operators with both collatable and noncollatable inputs (Tom Lane)
In 9.1.0, an indexable operator that has a non-collatable left-hand input type and a collatable right-hand input type would not
be recognized as matching the left-hand column's index. An example is the hstore ? text operator.
Allow inlining of set-returning SQL functions with multiple OUT parameters (Tom Lane)
Don't trust deferred-unique indexes for join removal (Tom Lane and Marti Raudsepp)
A deferred uniqueness constraint might not hold intra-transaction, so assuming that it does could give incorrect query results.
Make DatumGetInetP() unpack inet datums that have a 1-byte header, and add a new macro, DatumGetInetPP(),
that does not (Heikki Linnakangas)
This change affects no core code, but might prevent crashes in add-on code that expects DatumGetInetP() to produce an
unpacked datum as per usual convention.
Improve locale support in money type's input and output (Tom Lane)
Aside from not supporting all standard lc_monetary formatting options, the input and output functions were inconsistent,
meaning there were locales in which dumped money values could not be re-read.
Don't let transform_null_equals affect CASE foo WHEN NULL ... constructs (Heikki Linnakangas)
transform_null_equals is only supposed to affect foo = NULL expressions written directly by the user, not equality
checks generated internally by this form of CASE.
Change foreign-key trigger creation order to better support self-referential foreign keys (Tom Lane)
For a cascading foreign key that references its own table, a row update will fire both the ON UPDATE trigger and the CHECK
trigger as one event. The ON UPDATE trigger must execute first, else the CHECK will check a non-final state of the row and
possibly throw an inappropriate error. However, the firing order of these triggers is determined by their names, which general1424
Notes de version
ly sort in creation order since the triggers have auto-generated names following the convention
RI_ConstraintTrigger_NNNN . A proper fix would require modifying that convention, which we will do in 9.2, but it
seems risky to change it in existing releases. So this patch just changes the creation order of the triggers. Users encountering
this type of error should drop and re-create the foreign key constraint to get its triggers into the right order.
Disallow dropping of an extension from within its own script (Tom Lane)
This prevents odd behavior in case of incorrect management of extension dependencies.
Cope with invalid pre-existing search_path settings during CREATE EXTENSION (Tom Lane)
Avoid floating-point underflow while tracking buffer allocation rate (Greg Matthews)
While harmless in itself, on certain platforms this would result in annoying kernel log messages.
Preserve configuration file name and line number values when starting child processes under Windows (Tom Lane)
Formerly, these would not be displayed correctly in the pg_settings view.
Preserve blank lines within commands in psql's command history (Robert Haas)
The former behavior could cause problems if an empty line was removed from within a string literal, for example.
Fix compression of plain-text output format in pg_dump (Adrian Klaver and Tom Lane)
pg_dump has historically understood -Z with no -F switch to mean that it should emit a gzip-compressed version of its plain
text output. Restore that behavior.
Fix pg_dump to dump user-defined casts between auto-generated types, such as table rowtypes (Tom Lane)
Fix up conversions of PL/Perl functions' results (Alex Hunsaker and Tom Lane)
Restore the pre-9.1 behavior that PL/Perl functions returning void ignore the result value of their last Perl statement; 9.1.0
would throw an error if that statement returned a reference. Also, make sure it works to return a string value for a composite
type, so long as the string meets the type's input format. In addition, throw errors for attempts to return Perl arrays or hashes
when the function's declared result type is not an array or composite type, respectively. (Pre-9.1 versions rather uselessly returned strings like ARRAY(0x221a9a0) or HASH(0x221aa90) in such cases.)
Ensure PL/Perl strings are always correctly UTF8-encoded (Amit Khandekar and Alex Hunsaker)
Use the preferred version of xsubpp to build PL/Perl, not necessarily the operating system's main copy (David Wheeler and
Alex Hunsaker)
Correctly propagate SQLSTATE in PL/Python exceptions (Mika Eloranta and Jan Urbanski)
Do not install PL/Python extension files for Python major versions other than the one built against (Peter Eisentraut)
Change all the contrib extension script files to report a useful error message if they are fed to psql (Andrew Dunstan and
1425
Notes de version
Tom Lane)
This should help teach people about the new method of using CREATE EXTENSION to load these files. In most cases, sourcing the scripts directly would fail anyway, but with harder-to-interpret messages.
Remove contrib/sepgsql tests from the regular regression test mechanism (Tom Lane)
Since these tests require root privileges for setup, they're impractical to run automatically. Switch over to a manual approach
instead, and provide a testing script to help with that.
Fix incorrect quoting of log file name in Mac OS X start script (Sidar Lopez)
Ensure VPATH builds properly install all server header files (Peter Eisentraut)
Fix interpretation of Windows timezone names for Central America (Tom Lane)
Map Central America Standard Time to CST6, not CST6CDT, because DST is generally not observed anywhere in Central
America.
Update time zone data files to tzdata release 2011n for DST law changes in Brazil, Cuba, Fiji, Palestine, Russia, and Samoa;
also historical corrections for Alaska and British East Africa.
E.14.2. Changes
Make pg_options_to_table return NULL for an option with no value (Tom Lane)
Previously such cases would result in a server crash.
Fix explicit reference to pg_temp schema in CREATE TEMPORARY TABLE (Robert Haas)
This used to be allowed, but failed in 9.1.0.
Notes de version
Release Date
2011-09-12
E.15.1. Overview
This release shows PostgreSQL moving beyond the traditional relational-database feature set with new, ground-breaking functionality that is unique to PostgreSQL. The streaming replication feature introduced in release 9.0 is significantly enhanced by
adding a synchronous-replication option, streaming backups, and monitoring improvements. Major enhancements include:
Add a SECURITY LABEL command and support for SELinux permissions control
The above items are explained in more detail in the sections below.
E.15.2.1. Strings
Avertissement
This change can break applications that are not expecting it and do their own string escaping according to the
old rules. The consequences could be as severe as introducing SQL-injection security holes. Be sure to test applications that are exposed to untrusted input, to ensure that they correctly handle single quotes and backslashes
in text strings.
E.15.2.2. Casting
Disallow function-style and attribute-style data type casts for composite types (Tom Lane)
For example, disallow composite_value.text and text(composite_value). Unintentional uses of this syntax
have frequently resulted in bug reports; although it was not a bug, it seems better to go back to rejecting such expressions. The
CAST and :: syntaxes are still available for use when a cast of an entire composite value is actually intended.
Notes de version
tance via UPDATE ... SET domaincol[5] = ..., will now result in rechecking the domain type's constraints, whereas before the checks were skipped.
E.15.2.3. Arrays
Change string_to_array() to return an empty array for a zero-length string (Pavel Stehule)
Previously this returned a null value.
Change string_to_array() so a NULL separator splits the string into characters (Pavel Stehule)
Previously this returned a null value.
Require superuser or CREATEROLE permissions in order to set comments on roles (Tom Lane)
Change PL/pgSQL's RAISE command without parameters to be catchable by the attached exception block (Piyush Newe)
Previously RAISE in a code block was always scoped to an attached exception block, so it was uncatchable at the same scope.
Adjust PL/pgSQL's error line numbering code to be consistent with other PLs (Pavel Stehule)
Previously, PL/pgSQL would ignore (not count) an empty line at the start of the function body. Since this was inconsistent
with all other languages, the special case was removed.
Make PL/pgSQL complain about conflicting IN and OUT parameter names (Tom Lane)
Formerly, the collision was not detected, and the name would just silently refer to only the OUT parameter.
Type modifiers of PL/pgSQL variables are now visible to the SQL parser (Tom Lane)
A type modifier (such as a varchar length limit) attached to a PL/pgSQL variable was formerly enforced during assignments,
but was ignored for all other purposes. Such variables will now behave more like table columns declared with the same modifier. This is not expected to make any visible difference in most cases, but it could result in subtle changes for some SQL commands issued by PL/pgSQL functions.
E.15.2.7. Contrib
All contrib modules are now installed with CREATE EXTENSION rather than by manually invoking their SQL scripts
(Dimitri Fontaine, Tom Lane)
To update an existing database containing the 9.0 version of a contrib module, use CREATE EXTENSION ... FROM unpackaged to wrap the existing contrib module's objects into an extension. When updating from a pre-9.0 version, drop the
contrib module's objects using its old uninstall script, then use CREATE EXTENSION.
Notes de version
Fix some information_schema.triggers column names to match the new SQL-standard names (Dean Rasheed)
E.15.3. Changes
Below you will find a detailed account of the changes between PostgreSQL 9.1 and the previous major release.
E.15.3.1. Server
E.15.3.1.1. Performance
Support unlogged tables using the UNLOGGED option in CREATE TABLE (Robert Haas)
Such tables provide better update performance than regular tables, but are not crash-safe: their contents are automatically cleared in case of a server crash. Their contents do not propagate to replication slaves, either.
Allow FULL OUTER JOIN to be implemented as a hash join, and allow either side of a LEFT OUTER JOIN or RIGHT
OUTER JOIN to be hashed (Tom Lane)
Previously FULL OUTER JOIN could only be implemented as a merge join, and LEFT OUTER JOIN and RIGHT OUTER
JOIN could hash only the nullable side of the join. These changes provide additional query optimization possibilities.
Reduce the memory requirement for large ispell dictionaries (Pavel Stehule, Tom Lane)
Avoid leaving data files open after blind writes (Alvaro Herrera)
This fixes scenarios in which backends might hold files open long after they were deleted, preventing the kernel from reclaiming disk space.
E.15.3.1.2. Optimizer
Allow allance table scans to return meaningfully-sorted results (Greg Stark, Hans-Jurgen Schonig, Robert Haas, Tom Lane)
This allows better optimization of queries that use ORDER BY, LIMIT, or MIN/MAX with alled tables.
Improve cost estimation for aggregates and window functions (Tom Lane)
E.15.3.1.3. Authentication
Support host names and host suffixes (e.g. .example.com) in pg_hba.conf (Peter Eisentraut)
Previously only host IP addresses and CIDR values were supported.
Support the key word all in the host column of pg_hba.conf (Peter Eisentraut)
Previously people used 0.0.0.0/0 or ::/0 for this.
Reject local lines in pg_hba.conf on platforms that don't support Unix-socket connections (Magnus Hagander)
Formerly, such lines were silently ignored, which could be surprising. This makes the behavior more like other unsupported
cases.
ident authentication over local sockets is now known as peer (Magnus Hagander)
1429
Notes de version
The old term is still accepted for backward compatibility, but since the two methods are fundamentally different, it seemed
better to adopt different names for them.
Rewrite peer authentication to avoid use of credential control messages (Tom Lane)
This change makes the peer authentication code simpler and better-performing. However, it requires the platform to provide
the getpeereid function or an equivalent socket operation. So far as is known, the only platform for which peer authentication worked before and now will not is pre-5.0 NetBSD.
E.15.3.1.4. Monitoring
Add details to the logging of restartpoints and checkpoints, which is controlled by log_checkpoints (Fujii Masao, Greg
Smith)
New details include WAL file and sync activity.
Add log_file_mode which controls the permissions on log files created by the logging collector (Martin Pihlak)
Reduce the default maximum line length for syslog logging to 900 bytes plus prefixes (Noah Misch)
This avoids truncation of long log lines on syslog implementations that have a 1KB length limit, rather than the more common
2KB.
Add time of last reset in database-level and background writer statistics views (Tomas Vondra)
Add columns showing the number of vacuum and analyze operations in pg_stat_*_tables views (Magnus Hagander)
Add protocol support for sending file system backups to standby servers using the streaming replication network connection
(Magnus Hagander, Heikki Linnakangas)
This avoids the requirement of manually transferring a file system backup when setting up a standby server.
Notes de version
Replication connections that are idle for more than the replication_timeout interval will be terminated automatically.
Formerly, a failed connection was typically not detected until the TCP timeout elapsed, which is inconveniently long in many
situations.
Add command-line tool pg_basebackup for creating a new standby server or database backup (Magnus Hagander)
Add system view pg_stat_replication which displays activity of WAL sender processes (Itagaki Takahiro, Simon Riggs)
This reports the status of all connected standby servers.
Add configuration parameter hot_standby_feedback to enable standbys to postpone cleanup of old row versions on the
primary (Simon Riggs)
This helps avoid canceling long-running queries on the standby.
Add the pg_stat_database_conflicts system view to show queries that have been canceled and the reason (Magnus Hagander)
Cancellations can occur because of dropped tablespaces, lock timeouts, old snapshots, pinned buffers, and deadlocks.
Add ERRCODE_T_R_DATABASE_DROPPED error code to report recovery conflicts due to dropped databases (Tatsuo Ishii)
This is useful for connection pooling software.
Add the ability to create named restore points using pg_create_restore_point() (Jaime Casanova)
These named restore points can be specified as recovery targets using the new recovery.conf setting recovery_target_name.
Add restart_after_crash setting which disables automatic server restart after a backend crash (Robert Haas)
This allows external cluster management software to control whether the database server restarts or not.
Allow recovery.conf to use the same quoting behavior as postgresql.conf (Dimitri Fontaine)
Previously all values had to be quoted.
1431
Notes de version
E.15.3.3. Queries
Allow data-modification commands (INSERT/UPDATE/DELETE) in WITH clauses (Marko Tiikkaja, Hitoshi Harada)
These commands can use RETURNING to pass data up to the containing query.
Allow WITH clauses to be attached to INSERT, UPDATE, DELETE statements (Marko Tiikkaja, Hitoshi Harada)
Allow non-GROUP BY columns in the query target list when the primary key is specified in the GROUP BY clause (Peter Eisentraut)
The SQL standard allows this behavior, and because of the primary key, the result is unambiguous.
Allow use of the key word DISTINCT in UNION/INTERSECT/EXCEPT clauses (Tom Lane)
DISTINCT is the default behavior so use of this key word is redundant, but the SQL standard allows it.
Fix ordinary queries with rules to use the same snapshot behavior as EXPLAIN ANALYZE (Marko Tiikkaja)
Previously EXPLAIN ANALYZE used slightly different snapshot timing for queries involving rules. The EXPLAIN ANALYZE behavior was judged to be more logical.
E.15.3.3.1. Strings
Add extensions which simplify packaging of additions to PostgreSQL (Dimitri Fontaine, Tom Lane)
Extensions are controlled by the new CREATE/ALTER/DROP EXTENSION commands. This replaces ad-hoc methods of
grouping objects that are added to a PostgreSQL installation.
Add support for foreign tables (Shigeru Hanada, Robert Haas, Jan Urbanski, Heikki Linnakangas)
This allows data stored outside the database to be used like native PostgreSQL-stored data. Foreign tables are currently
read-only, however.
Allow new values to be added to an existing enum type via ALTER TYPE (Andrew Dunstan)
Support ALTER TABLE name {OF | NOT OF} type (Noah Misch)
This syntax allows a standalone table to be made into a typed table, or a typed table to be made standalone.
Add support for more object types in ALTER ... SET SCHEMA commands (Dimitri Fontaine)
This command is now supported for conversions, operators, operator classes, operator families, text search configurations, text
search dictionaries, text search parsers, and text search templates.
1432
Notes de version
Add ALTER TABLE ... ADD UNIQUE/PRIMARY KEY USING INDEX (Gurjeet Singh)
This allows a primary key or unique constraint to be defined using an existing unique index, including a concurrently created
unique index.
Allow ALTER TABLE to add foreign keys without validation (Simon Riggs)
The new option is called NOT VALID. The constraint's state can later be modified to VALIDATED and validation checks performed. Together these allow you to add a foreign key with minimal impact on read and write operations.
Allow ALTER TABLE ... SET DATA TYPE to avoid table rewrites in appropriate cases (Noah Misch, Robert Haas)
For example, converting a varchar column to text no longer requires a rewrite of the table. However, increasing the length
constraint on a varchar column still requires a table rewrite.
Fix possible tuple concurrently updated error when two backends attempt to add an allance child to the same table at the
same time (Robert Haas)
ALTER TABLE now takes a stronger lock on the parent table, so that the sessions cannot try to update it simultaneously.
Make TRUNCATE ... RESTART IDENTITY restart sequences transactionally (Steve Singer)
Previously the counter could have been left out of sync if a backend crashed between the on-commit truncation activity and
commit completion.
E.15.3.5.1. COPY
E.15.3.5.2. EXPLAIN
Make EXPLAIN VERBOSE show the function call expression in a FunctionScan node (Tom Lane)
E.15.3.5.3. VACUUM
Add additional details to the output of VACUUM FULL VERBOSE and CLUSTER VERBOSE (Itagaki Takahiro)
New information includes the live and dead tuple count and whether CLUSTER is using an index to rebuild.
Prevent autovacuum from waiting if it cannot acquire a table lock (Robert Haas)
It will try to vacuum that table later.
E.15.3.5.4. CLUSTER
Allow CLUSTER to sort the table rather than scanning the index when it seems likely to be cheaper (Leonardo Francalanci)
1433
Notes de version
E.15.3.5.5. Indexes
Add nearest-neighbor (order-by-operator) searching to GiST indexes (Teodor Sigaev, Tom Lane)
This allows GiST indexes to quickly return the N closest values in a query with LIMIT. For example
SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
finds the ten places closest to a given target point.
Allow GIN indexes to index null and empty values (Tom Lane)
This allows full GIN index scans, and fixes various corner cases in which GIN scans would fail.
Allow GIN indexes to better recognize duplicate search entries (Tom Lane)
This reduces the cost of index scans, especially in cases where it avoids unnecessary full index scans.
Allow numeric to use a more compact, two-byte header in common cases (Robert Haas)
Previously all numeric values had four-byte headers; this change saves on disk storage.
Don't treat a composite type as sortable unless all its column types are sortable (Tom Lane)
This avoids possible could not identify a comparison function failures at runtime, if it is possible to implement the query
without sorting. Also, ANALYZE won't try to use inappropriate statistics-gathering methods for columns of such composite
types.
E.15.3.6.1. Casting
Add support for casting between money and numeric (Andy Balholm)
Add support for casting from int4 and int8 to money (Joey Adams)
Allow casting a table's row type to the table's supertype if it's a typed table (Peter Eisentraut)
This is analogous to the existing facility that allows casting a row type to a supertable's row type.
E.15.3.6.2. XML
E.15.3.7. Functions
1434
Notes de version
Add SQL function format(text, ...), which behaves analogously to C's printf() (Pavel Stehule, Robert Haas)
It currently supports formats for strings, SQL literals, and SQL identifiers.
Add string functions concat(), concat_ws(), left(), right(), and reverse() (Pavel Stehule)
These improve compatibility with other database products.
Add function pg_read_binary_file() to read binary files (Dimitri Fontaine, Itagaki Takahiro)
Add a single-parameter version of function pg_read_file() to read an entire file (Dimitri Fontaine, Itagaki Takahiro)
Add three-parameter forms of array_to_string() and string_to_array() for null value processing control (Pavel
Stehule)
Update comments for built-in operators and their underlying functions (Tom Lane)
Functions that are meant to be used via an associated operator are now commented as such.
Add variable quote_all_identifiers to force the quoting of all identifiers in EXPLAIN and in system catalog functions like pg_get_viewdef() (Robert Haas)
This makes exporting schemas to tools and other databases with different quoting rules easier.
Allow public as a pseudo-role name in has_table_privilege() and related functions (Alvaro Herrera)
This allows checking for public permissions.
Allow RAISE without parameters to be caught in the same places that could catch a RAISE ERROR from the same location
(Piyush Newe)
The previous coding threw the error from the block containing the active exception handler. The new behavior is more
consistent with other DBMS products.
Convert PL/Perl array arguments to Perl arrays (Alexey Klyukin, Alex Hunsaker)
String representations are still available.
Convert PL/Perl composite-type arguments to Perl hashes (Alexey Klyukin, Alex Hunsaker)
1435
Notes de version
Mark createlang and droplang as deprecated now that they just invoke extension commands (Tom Lane)
E.15.3.9.1. psql
Add psql command \conninfo to show current connection information (David Christensen)
Add the S ( system ) option to psql's \dn (list schemas) command (Tom Lane)
\dn without S now suppresses system schemas.
Allow psql's \e and \ef commands to accept a line number to be used to position the cursor in the editor (Pavel Stehule)
This is passed to the editor according to the PSQL_EDITOR_LINENUMBER_ARG environment variable.
Have psql set the client encoding from the operating system locale by default (Heikki Linnakangas)
This only happens if the PGCLIENTENCODING environment variable is not set.
Make \d distinguish between unique indexes and unique constraints (Josh Kupershmidt)
Make \dt+ report pg_table_size instead of pg_relation_size when talking to 9.0 or later servers (Bernd Helmle)
This is a more useful measure of table size, but note that it is not identical to what was previously reported in the same display.
Additional tab completion support (Itagaki Takahiro, Pavel Stehule, Andrey Popp, Christoph Berg, David Fetter, Josh Kupershmidt)
E.15.3.9.2. pg_dump
Add pg_dump and pg_dumpall option --quote-all-identifiers to force quoting of all identifiers (Robert Haas)
1436
Notes de version
E.15.3.9.3. pg_ctl
Fix pg_ctl so it no longer incorrectly reports that the server is not running (Bruce Momjian)
Previously this could happen if the server was running but pg_ctl could not authenticate.
Improve pg_ctl start's wait (-w) option (Bruce Momjian, Tom Lane)
The wait mode is now significantly more robust. It will not get confused by non-default postmaster port numbers, non-default
Unix-domain socket locations, permission problems, or stale postmaster lock files.
Add promote option to pg_ctl to switch a standby server to primary (Fujii Masao)
Add a libpq connection option client_encoding which behaves like the PGCLIENTENCODING environment variable
(Heikki Linnakangas)
The value auto sets the client encoding based on the operating system locale.
Add PQlibVersion() function which returns the libpq library version (Magnus Hagander)
libpq already had PQserverVersion() which returns the server version.
Allow libpq-using clients to check the user name of the server process when connecting via Unix-domain sockets, with the
new requirepeer connection option (Peter Eisentraut)
PostgreSQL already allowed servers to check the client user name when connecting via Unix-domain sockets.
E.15.3.10.2. ECPG
Allow ECPG to accept dynamic cursor names even in WHERE CURRENT OF clauses (Zoltan Boszormenyi)
Make ecpglib write double values with a precision of 15 digits, not 14 as formerly (Akira Kurosawa)
Use +Olibmerrno compile flag with HP-UX C compilers that accept it (Ibrar Ahmed)
This avoids possible misbehavior of math library calls on recent HP platforms.
E.15.3.11.1. Makefiles
E.15.3.11.2. Windows
1437
Notes de version
On Windows, allow pg_ctl to register the service as auto-start or start-on-demand (Quan Zongliang)
Add support for collecting crash dumps on Windows (Craig Ringer, Magnus Hagander)
minidumps can now be generated by non-debug Windows binaries and analyzed by standard debugging tools.
Revise the API for GUC variable assign hooks (Tom Lane)
The previous functions of assign hooks are now split between check hooks and assign hooks, where the former can fail but the
latter shouldn't. This change will impact add-on modules that define custom GUC parameters.
Add latches to the source code to support waiting for events (Heikki Linnakangas)
Improve ability to use C++ compilers for compiling add-on modules by removing conflicting key words (Tom Lane)
Add src/tools/git_changelog to replace cvs2cl and pgcvslog (Robert Haas, Tom Lane)
Add source code hooks to check permissions (Robert Haas, Stephen Frost)
Add post-object-creation function hooks for use by security frameworks (KaiGai Kohei)
E.15.3.13. Contrib
Modify contrib modules and procedural languages to install via the new extension mechanism (Tom Lane, Dimitri Fontaine)
Fix contrib/intarray and contrib/hstore to give consistent results with indexed empty arrays (Tom Lane)
Previously an empty-array query that used an index might return different results from one that used a sequential scan.
In contrib/intarray, avoid errors complaining about the presence of nulls in cases where no nulls are actually present
(Tom Lane)
1438
Notes de version
In contrib/intarray, fix behavior of containment operators with respect to empty arrays (Tom Lane)
Empty arrays are now correctly considered to be contained in any other array.
Remove contrib/xml2's arbitrary limit on the number of parameter=value pairs that can be handled by
xslt_process() (Pavel Stehule)
The previous limit was 10.
E.15.3.13.1. Security
E.15.3.13.2. Performance
Add support for LIKE and ILIKE index searches to contrib/pg_trgm (Alexander Korotkov)
Improve performance of pg_upgrade for databases with many relations (Bruce Momjian)
E.15.3.14. Documentation
Extensive proofreading and documentation improvements (Thom Brown, Josh Kupershmidt, Susanne Ebrecht)
Document that it is possible to access all composite type fields using (compositeval).* syntax (Peter Eisentraut)
Document that translate() removes characters in from that don't have a corresponding to character (Josh Kupershmidt)
Merge documentation for CREATE CONSTRAINT TRIGGER and CREATE TRIGGER (Alvaro Herrera)
Notes de version
E.16.2. Changes
Correctly initialize padding bytes in contrib/btree_gist indexes on bit columns (Heikki Linnakangas)
This error could result in incorrect query results due to values that should compare equal not being seen as equal. Users with
GiST indexes on bit or bit varying columns should REINDEX those indexes after installing this update.
Protect against torn pages when deleting GIN list pages (Heikki Linnakangas)
This fix prevents possible index corruption if a system crash occurs while the page update is being written to disk.
Don't clear the right-link of a GiST index page while replaying updates from WAL (Heikki Linnakangas)
This error could lead to transiently wrong answers from GiST index scans performed in Hot Standby.
Fix possibly-incorrect cache invalidation during nested calls to ReceiveSharedInvalidMessages (Andres Freund)
Don't assume a subquery's output is unique if there's a set-returning function in its targetlist (David Rowley)
This oversight could lead to misoptimization of constructs like WHERE x IN (SELECT y, generate_series(1,10) FROM t GROUP BY y).
Fix failure to detoast fields in composite elements of structured types (Tom Lane)
This corrects cases where TOAST pointers could be copied into other tables without being dereferenced. If the original data is
later deleted, it would lead to errors like missing chunk number 0 for toast value ... when the now-dangling pointer is used.
Fix record type has not been registered failures with whole-row references to the output of Append plan nodes (Tom Lane)
Fix possible crash when invoking a user-defined function while rewinding a cursor (Tom Lane)
Fix query-lifespan memory leak while evaluating the arguments for a function in FROM (Tom Lane)
Fix session-lifespan memory leaks in regular-expression processing (Tom Lane, Arthur O'Dwyer, Greg Stark)
Fix liveness checks for rows that were inserted in the current transaction and then deleted by a now-rolled-back subtransaction
(Andres Freund)
This could cause problems (at least spurious warnings, and at worst an infinite loop) if CREATE INDEX or CLUSTER were
done later in the same transaction.
Notes de version
After the PREPARE, the originating session is no longer in a transaction, so it should not continue to display a transaction
start time.
Fix REASSIGN OWNED to not fail for text search objects (lvaro Herrera)
Secure Unix-domain sockets of temporary postmasters started during make check (Noah Misch)
Any local user able to access the socket file could connect as the server's bootstrap superuser, then proceed to execute arbitrary
code as the operating-system user running the test, as we previously noted in CVE-2014-0067. This change defends against
that risk by placing the server's socket in a temporary, mode 0700 subdirectory of /tmp. The hazard remains however on platforms where Unix sockets are not supported, notably Windows, because then the temporary postmaster must accept local TCP
connections.
A useful side effect of this change is to simplify make check testing in builds that override DEFAULT_PGSOCKET_DIR.
Popular non-default values like /var/run/postgresql are often not writable by the build user, requiring workarounds
that will no longer be necessary.
On Windows, allow new sessions to absorb values of PGC_BACKEND parameters (such as log_connections) from the configuration file (Amit Kapila)
Previously, if such a parameter were changed in the file post-startup, the change would have no effect.
Avoid buffer bloat in libpq when the server consistently sends data faster than the client can absorb it (Shin-ichi Morita, Tom
Lane)
libpq could be coerced into enlarging its input buffer until it runs out of memory (which would be reported misleadingly as
lost synchronization with server ). Under ordinary circumstances it's quite far-fetched that data could be continuously transmitted more quickly than the recv() loop can absorb it, but this has been observed when the client is artificially slowed by
scheduler constraints.
Ensure that LDAP lookup attempts in libpq time out as intended (Laurenz Albe)
Fix ecpg to do the right thing when an array of char * is the target for a FETCH statement returning more than one row, as
well as some other array-handling fixes (Ashutosh Bapat)
In contrib/pgcrypto functions, ensure sensitive information is cleared from stack variables before returning (Marko
Kreen)
In contrib/uuid-ossp, cache the state of the OSSP UUID library across calls (Tom Lane)
This improves the efficiency of UUID generation and reduces the amount of entropy drawn from /dev/urandom, on platforms that have that.
Update time zone data files to tzdata release 2014e for DST law changes in Crimea, Egypt, and Morocco.
Notes de version
2014-03-20
This release contains a variety of fixes from 9.0.16. For information about new features in the 9.0 major release, see Section E.34,
Release 9.0 .
E.17.2. Changes
Avoid race condition in checking transaction commit status during receipt of a NOTIFY message (Marko Tiikkaja)
This prevents a scenario wherein a sufficiently fast client might respond to a notification before database updates made by the
notifier have become visible to the recipient.
Allow regular-expression operators to be terminated early by query cancel requests (Tom Lane)
This prevents scenarios wherein a pathological regular expression could lock up a server process uninterruptably for a long
time.
Remove incorrect code that tried to allow OVERLAPS with single-element row arguments (Joshua Yanovski)
This code never worked correctly, and since the case is neither specified by the SQL standard nor documented, it seemed better to remove it than fix it.
Avoid getting more than AccessShareLock when de-parsing a rule or view (Dean Rasheed)
This oversight resulted in pg_dump unexpectedly acquiring RowExclusiveLock locks on tables mentioned as the targets
of INSERT/UPDATE/DELETE commands in rules. While usually harmless, that could interfere with concurrent transactions
that tried to acquire, for example, ShareLock on those tables.
Fix test to see if hot standby connections can be allowed immediately after a crash (Heikki Linnakangas)
Prevent intermittent could not reserve shared memory region failures on recent Windows versions (MauMau)
Update time zone data files to tzdata release 2014a for DST law changes in Fiji and Turkey, plus historical changes in Israel
and Ukraine.
Notes de version
E.18.2. Changes
Prevent privilege escalation via manual calls to PL validator functions (Andres Freund)
The primary role of PL validator functions is to be called implicitly during CREATE FUNCTION, but they are also normal
SQL functions that a user can call explicitly. Calling a validator on a function actually written in some other language was not
checked for and could be exploited for privilege-escalation purposes. The fix involves adding a call to a privilege-checking
function in each validator function. Non-core procedural languages will also need to make this change to their own validator
functions, if any. (CVE-2014-0061)
Avoid multiple name lookups during table and index DDL (Robert Haas, Andres Freund)
If the name lookups come to different conclusions due to concurrent activity, we might perform some parts of the DDL on a
different table than other parts. At least in the case of CREATE INDEX, this can be used to cause the permissions checks to
be performed against a different table than the index creation, allowing for a privilege escalation attack. (CVE-2014-0062)
Prevent buffer overrun due to integer overflow in size calculations (Noah Misch, Heikki Linnakangas)
Several functions, mostly type input functions, calculated an allocation size without checking for overflow. If overflow did occur, a too-small buffer would be allocated and then written past. (CVE-2014-0064)
Document risks of make check in the regression testing instructions (Noah Misch, Tom Lane)
Since the temporary server started by make check uses trust authentication, another user on the same machine could
connect to it as database superuser, and then potentially exploit the privileges of the operating-system user who started the
tests. A future release will probably incorporate changes in the testing procedure to prevent this risk, but some public discussion is needed first. So for the moment, just warn people against using make check when there are untrusted users on the
same machine. (CVE-2014-0067)
Fix possible mis-replay of WAL records when some segments of a relation aren't full size (Greg Stark, Tom Lane)
The WAL update could be applied to the wrong page, potentially many pages past where it should have been. Aside from corrupting data, this error has been observed to result in significant bloat of standby servers compared to their masters, due to
updates being applied far beyond where the end-of-file should have been. This failure mode does not appear to be a significant
risk during crash recovery, only when initially synchronizing a standby created from a base backup taken from a quicklychanging master.
Fix bug in determining when recovery has reached consistency (Tomonari Katsumata, Heikki Linnakangas)
1443
Notes de version
In some cases WAL replay would mistakenly conclude that the database was already consistent at the start of replay, thus possibly allowing hot-standby queries before the database was really consistent. Other symptoms such as PANIC: WAL
contains references to invalid pages were also possible.
Fix improper locking of btree index pages while replaying a VACUUM operation in hot-standby mode (Andres Freund, Heikki
Linnakangas, Tom Lane)
This error could result in PANIC: WAL contains references to invalid pages failures.
Ensure that insertions into non-leaf GIN index pages write a full-page WAL record when appropriate (Heikki Linnakangas)
The previous coding risked index corruption in the event of a partial-page write during a system crash.
Fix unsafe references to errno within error reporting logic (Christian Kruse)
This would typically lead to odd behaviors such as missing or inappropriate HINT fields.
Fix possible crashes from using ereport() too early during server startup (Tom Lane)
The principal case we've seen in the field is a crash if the server is started in a directory it doesn't have permission to read.
Clear retry flags properly in OpenSSL socket write function (Alexander Kukushkin)
This omission could result in a server lockup after unexpected loss of an SSL-encrypted connection.
Fix length checking for Unicode identifiers (U&"..." syntax) containing escapes (Tom Lane)
A spurious truncation warning would be printed for such identifiers if the escaped form of the identifier was too long, but the
identifier actually didn't need truncation after de-escaping.
Allow keywords that are type names to be used in lists of roles (Stephen Frost)
A previous patch allowed such keywords to be used without quoting in places such as role identifiers; but it missed cases
where a list of role identifiers was permitted, such as DROP ROLE.
Fix possible crash due to invalid plan for nested sub-selects, such as WHERE (... x IN (SELECT ...) ...) IN
(SELECT ...) (Tom Lane)
Ensure that ANALYZE creates statistics for a table column even when all the values in it are too wide (Tom Lane)
ANALYZE intentionally omits very wide values from its histogram and most-common-values calculations, but it neglected to
do something sane in the case that all the sampled entries are too wide.
In ALTER TABLE ... SET TABLESPACE, allow the database's default tablespace to be used without a permissions
check (Stephen Frost)
CREATE TABLE has always allowed such usage, but ALTER TABLE didn't get the memo.
Fix cannot accept a set error when some arms of a CASE return a set and others don't (Tom Lane)
Fix checks for all-zero client addresses in pgstat functions (Kevin Grittner)
Fix possible misclassification of multibyte characters by the text search parser (Tom Lane)
Non-ASCII characters could be misclassified when using C locale with a multibyte encoding. On Cygwin, non-C locales could
fail as well.
Accept SHIFT_JIS as an encoding name for locale checking purposes (Tatsuo Ishii)
Improve error handling in libpq and psql for failures during COPY TO STDOUT/FROM STDIN (Tom Lane)
In particular this fixes an infinite loop that could occur in 9.2 and up if the server connection was lost during COPY FROM
STDIN. Variants of that scenario might be possible in older versions, or with other client applications.
1444
Notes de version
In ecpg, handle lack of a hostname in the connection parameters properly (Michael Meskes)
In contrib/isn, fix incorrect calculation of the check digit for ISMN values (Fabien Coelho)
In Mingw and Cygwin builds, install the libpq DLL in the bin directory (Andrew Dunstan)
This duplicates what the MSVC build has long done. It should fix problems with programs like psql failing to start because
they can't find the DLL.
Avoid using the deprecated dllwrap tool in Cygwin builds (Marco Atzeri)
Don't generate plain-text HISTORY and src/test/regress/README files anymore (Tom Lane)
These text files duplicated the main HTML and PDF documentation formats. The trouble involved in maintaining them greatly
outweighs the likely audience for plain-text format. Distribution tarballs will still contain files by these names, but they'll just
be stubs directing the reader to consult the main documentation. The plain-text INSTALL file will still be maintained, as there
is arguably a use-case for that.
Update time zone data files to tzdata release 2013i for DST law changes in Jordan and historical changes in Cuba.
In addition, the zones Asia/Riyadh87, Asia/Riyadh88, and Asia/Riyadh89 have been removed, as they are no longer maintained by IANA, and never represented actual civil timekeeping practice.
E.19.2. Changes
Fix VACUUM's tests to see whether it can update relfrozenxid (Andres Freund)
In some cases VACUUM (either manual or autovacuum) could incorrectly advance a table's relfrozenxid value, allowing
tuples to escape freezing, causing those rows to become invisible once 2^31 transactions have elapsed. The probability of data
loss is fairly low since multiple incorrect advancements would need to happen before actual loss occurs, but it's not zero. Users
upgrading from releases 9.0.4 or 8.4.8 or earlier are not affected, but all later versions contain the bug.
The issue can be ameliorated by, after upgrading, vacuuming all tables in all databases while having vacuum_freeze_table_age set to zero. This will fix any latent corruption but will not be able to fix all pre-existing data
errors. However, an installation can be presumed safe after performing this vacuuming if it has executed fewer than 2^31 update transactions in its lifetime (check this with SELECT txid_current() < 2^31).
Fix initialization of pg_clog and pg_subtrans during hot standby startup (Andres Freund, Heikki Linnakangas)
This bug can cause data loss on standby servers at the moment they start to accept hot-standby queries, by marking committed
transactions as uncommitted. The likelihood of such corruption is small unless, at the time of standby startup, the primary server has executed many updating transactions since its last checkpoint. Symptoms include missing rows, rows that should have
been deleted being still visible, and obsolete versions of updated rows being still visible alongside their newer versions.
1445
Notes de version
This bug was introduced in versions 9.3.0, 9.2.5, 9.1.10, and 9.0.14. Standby servers that have only been running earlier releases are not at risk. It's recommended that standby servers that have ever run any of the buggy releases be re-cloned from the
primary (e.g., with a new base backup) after upgrading.
Fix race condition in GIN index posting tree page deletion (Heikki Linnakangas)
This could lead to transient wrong answers or query failures.
Avoid flattening a subquery whose SELECT list contains a volatile function wrapped inside a sub-SELECT (Tom Lane)
This avoids unexpected results due to extra evaluations of the volatile function.
Fix planner's processing of non-simple-variable subquery outputs nested within outer joins (Tom Lane)
This error could lead to incorrect plans for queries involving multiple levels of subqueries within JOIN syntax.
Fix possible read past end of memory in rule printing (Peter Eisentraut)
Fix incorrect behaviors when using a SQL-standard, simple GMT offset timezone (Tom Lane)
In some cases, the system would use the simple GMT offset value when it should have used the regular timezone setting that
had prevailed before the simple offset was selected. This change also causes the timeofday function to honor the simple
GMT offset zone.
Prevent possible misbehavior when logging translations of Windows error codes (Tom Lane)
Properly quote generated command lines in pg_ctl (Naoya Anzai and Tom Lane)
This fix applies only to Windows.
Fix pg_dumpall to work when a source database sets default_transaction_read_only via ALTER DATABASE
SET (Kevin Grittner)
Previously, the generated script would fail during restore.
Update time zone data files to tzdata release 2013h for DST law changes in Argentina, Brazil, Jordan, Libya, Liechtenstein,
Morocco, and Palestine. Also, new timezone abbreviations WIB, WIT, WITA for Indonesia.
E.20.2. Changes
Prevent corruption of multi-byte characters when attempting to case-fold identifiers (Andrew Dunstan)
1446
Notes de version
PostgreSQL case-folds non-ASCII characters only when using a single-byte server encoding.
Fix checkpoint memory leak in background writer when wal_level = hot_standby (Naoya Anzai)
Fix memory overcommit bug when work_mem is using more than 24GB of memory (Stephen Frost)
Fix possible SSL state corruption in threaded libpq applications (Nick Phillips, Stephen Frost)
Properly compute row estimates for boolean columns containing many NULL values (Andrew Gierth)
Previously tests like col IS NOT TRUE and col IS NOT FALSE did not properly factor in NULL values when estimating plan costs.
Prevent pushing down WHERE clauses into unsafe UNION/INTERSECT subqueries (Tom Lane)
Subqueries of a UNION or INTERSECT that contain set-returning functions or volatile functions in their SELECT lists could
be improperly optimized, leading to run-time errors or incorrect query results.
Fix rare case of failed to locate grouping columns planner failure (Tom Lane)
Improve view dumping code's handling of dropped columns in referenced tables (Tom Lane)
Properly record index comments created using UNIQUE and PRIMARY KEY syntax (Andres Freund)
This fixes a parallel pg_restore failure.
Fix REINDEX TABLE and REINDEX DATABASE to properly revalidate constraints and mark invalidated indexes as valid
(Noah Misch)
REINDEX INDEX has always worked properly.
Fix possible deadlock during concurrent CREATE INDEX CONCURRENTLY operations (Tom Lane)
Fix regular expression match failures for back references combined with non-greedy quantifiers (Jeevan Chalke)
Prevent CREATE FUNCTION from checking SET variables unless function body checking is enabled (Tom Lane)
Allow ALTER DEFAULT PRIVILEGES to operate on schemas without requiring CREATE permission (Tom Lane)
Fix pgp_pub_decrypt() so it works for secret keys with passwords (Marko Kreen)
Remove rare inaccurate warning during vacuum of index-less tables (Heikki Linnakangas)
Ensure that VACUUM ANALYZE still runs the ANALYZE phase if its attempt to truncate the file is cancelled due to lock
conflicts (Kevin Grittner)
Avoid possible failure when performing transaction control commands (e.g ROLLBACK) in prepared queries (Tom Lane)
Ensure that floating-point data input accepts standard spellings of infinity on all platforms (Tom Lane)
The C99 standard says that allowable spellings are inf, +inf, -inf, infinity, +infinity, and -infinity. Make
sure we recognize these even if the platform's strtod function doesn't.
Expand ability to compare rows to records and arrays (Rafal Rzepecki, Tom Lane)
Update time zone data files to tzdata release 2013d for DST law changes in Israel, Morocco, Palestine, and Paraguay. Also,
historical zone data corrections for Macquarie Island.
Notes de version
Release Date
2013-04-04
This release contains a variety of fixes from 9.0.12. For information about new features in the 9.0 major release, see Section E.34,
Release 9.0 .
E.21.2. Changes
Fix insecure parsing of server command-line switches (Mitsumasa Kondo, Kyotaro Horiguchi)
A connection request containing a database name that begins with - could be crafted to damage or destroy files within the
server's data directory, even if the request is eventually rejected. (CVE-2013-1899)
Reset OpenSSL randomness state in each postmaster child process (Marko Kreen)
This avoids a scenario wherein random numbers generated by contrib/pgcrypto functions might be relatively easy for
another database user to guess. The risk is only significant when the postmaster is configured with ssl = on but most connections don't use SSL encryption. (CVE-2013-1900)
Fix GiST indexes to not use fuzzy geometric comparisons when it's not appropriate to do so (Alexander Korotkov)
The core geometric types perform comparisons using fuzzy equality, but gist_box_same must do exact comparisons,
else GiST indexes using it might become inconsistent. After installing this update, users should REINDEX any GiST indexes
on box, polygon, circle, or point columns, since all of these use gist_box_same.
Fix erroneous range-union and penalty logic in GiST indexes that use contrib/btree_gist for variable-width data
types, that is text, bytea, bit, and numeric columns (Tom Lane)
These errors could result in inconsistent indexes in which some keys that are present would not be found by searches, and also
in useless index bloat. Users are advised to REINDEX such indexes after installing this update.
Fix bugs in GiST page splitting code for multi-column indexes (Tom Lane)
These errors could result in inconsistent indexes in which some keys that are present would not be found by searches, and also
in indexes that are unnecessarily inefficient to search. Users are advised to REINDEX multi-column GiST indexes after installing this update.
Fix infinite-loop risk in regular expression compilation (Tom Lane, Don Porter)
Fix to_char() to use ASCII-only case-folding rules where appropriate (Tom Lane)
This fixes misbehavior of some template patterns that should be locale-independent, but mishandled I and i in Turkish
locales.
1448
Notes de version
Fix logic error when a single transaction does UNLISTEN then LISTEN (Tom Lane)
The session wound up not listening for notify events at all, though it surely should listen in this case.
Remove useless picksplit doesn't support secondary split log messages (Josh Hansen, Tom Lane)
This message seems to have been added in expectation of code that was never written, and probably never will be, since
GiST's default handling of secondary splits is actually pretty good. So stop nagging end users about it.
Fix possible failure to send a session's last few transaction commit/abort counts to the statistics collector (Tom Lane)
Eliminate memory leaks in PL/Perl's spi_prepare() function (Alex Hunsaker, Tom Lane)
Avoid crash in pg_dump when an incorrect connection string is given (Heikki Linnakangas)
Ignore invalid indexes in pg_dump and pg_upgrade (Michael Paquier, Bruce Momjian)
Dumping invalid indexes can cause problems at restore time, for example if the reason the index creation failed was because it
tried to enforce a uniqueness condition not satisfied by the table's data. Also, if the index creation is in fact still in progress, it
seems reasonable to consider it to be an uncommitted DDL change, which pg_dump wouldn't be expected to dump anyway.
pg_upgrade now also skips invalid indexes rather than failing.
Fix contrib/pg_trgm's similarity() function to return zero for trigram-less strings (Tom Lane)
Previously it returned NaN due to internal division by zero.
Update time zone data files to tzdata release 2013b for DST law changes in Chile, Haiti, Morocco, Paraguay, and some Russian areas. Also, historical zone data corrections for numerous places.
Also, update the time zone abbreviation files for recent changes in Russia and elsewhere: CHOT, GET, IRKT, KGT, KRAT,
MAGT, MAWT, MSK, NOVT, OMST, TKT, VLAT, WST, YAKT, YEKT now follow their current meanings, and VOLT
(Europe/Volgograd) and MIST (Antarctica/Macquarie) are added to the default abbreviations list.
E.22.2. Changes
Fix multiple problems in detection of when a consistent database state has been reached during WAL replay (Fujii Masao,
Heikki Linnakangas, Simon Riggs, Andres Freund)
Update minimum recovery point when truncating a relation file (Heikki Linnakangas)
Once data has been discarded, it's no longer safe to stop recovery at an earlier point in the timeline.
Fix missing cancellations in hot standby mode (Noah Misch, Simon Riggs)
The need to cancel conflicting hot-standby queries would sometimes be missed, allowing those queries to see inconsistent da1449
Notes de version
ta.
Fix SQL grammar to allow subscripting or field selection from a sub-SELECT result (Tom Lane)
Fix performance problems with autovacuum truncation in busy workloads (Jan Wieck)
Truncation of empty pages at the end of a table requires exclusive lock, but autovacuum was coded to fail (and release the
table lock) when there are conflicting lock requests. Under load, it is easily possible that truncation would never occur, resulting in table bloat. Fix by performing a partial truncation, releasing the lock, then attempting to re-acquire the lock and continue. This fix also greatly reduces the average time before autovacuum releases the lock after a conflicting request arrives.
Protect against race conditions when scanning pg_tablespace (Stephen Frost, Tom Lane)
CREATE DATABASE and DROP DATABASE could misbehave if there were concurrent updates of pg_tablespace entries.
Prevent DROP OWNED from trying to drop whole databases or tablespaces (lvaro Herrera)
For safety, ownership of these objects must be reassigned, not dropped.
Prevent misbehavior when a RowExpr or XmlExpr is parse-analyzed twice (Andres Freund, Tom Lane)
This mistake could be user-visible in contexts such as CREATE TABLE LIKE INCLUDING INDEXES.
Improve defenses against integer overflow in hashtable sizing calculations (Jeff Davis)
Ensure that non-ASCII prompt strings are translated to the correct code page on Windows (Alexander Law, Noah Misch)
This bug affected psql and some other client programs.
Fix possible crash in psql's \? command when not connected to a database (Meng Qingzhong)
Include our version of isinf() in libecpg if it's not provided by the system (Jiang Guiqing)
Rearrange configure's tests for supplied functions so it is not fooled by bogus exports from libedit/libreadline (Christoph Berg)
Make pgxs build executables with the right .exe suffix when cross-compiling for Windows (Zoltan Boszormenyi)
Notes de version
However, if you are upgrading from a version earlier than 9.0.6, see Section E.28, Release 9.0.6 .
E.23.2. Changes
Fix multiple bugs associated with CREATE INDEX CONCURRENTLY (Andres Freund, Tom Lane)
Fix CREATE INDEX CONCURRENTLY to use in-place updates when changing the state of an index's pg_index row. This
prevents race conditions that could cause concurrent sessions to miss updating the target index, thus resulting in corrupt
concurrently-created indexes.
Also, fix various other operations to ensure that they ignore invalid indexes resulting from a failed CREATE INDEX
CONCURRENTLY command. The most important of these is VACUUM, because an auto-vacuum could easily be launched
on the table before corrective action can be taken to fix or remove the invalid index.
Fix an error in WAL generation logic for GIN indexes (Tom Lane)
This could result in index corruption, if a torn-page failure occurred.
Properly remove startup process's virtual XID lock when promoting a hot standby server to normal running (Simon Riggs)
This oversight could prevent subsequent execution of certain operations such as CREATE INDEX CONCURRENTLY.
Prevent the postmaster from launching new child processes after it's received a shutdown signal (Tom Lane)
This mistake could result in shutdown taking longer than it should, or even never completing at all without additional user action.
Avoid corruption of internal hash tables when out of memory (Hitoshi Harada)
Fix planning of non-strict equivalence clauses above outer joins (Tom Lane)
The planner could derive incorrect constraints from a clause equating a non-strict construct to something else, for example
WHERE COALESCE(foo, 0) = 0 when foo is coming from the nullable side of an outer join.
Improve planner's ability to prove exclusion constraints from equivalence classes (Tom Lane)
Fix partial-row matching in hashed subplans to handle cross-type cases correctly (Tom Lane)
This affects multicolumn NOT IN subplans, such as WHERE (a, b) NOT IN (SELECT x, y FROM ...) when for
instance b and y are int4 and int8 respectively. This mistake led to wrong answers or crashes depending on the specific datatypes involved.
Acquire buffer lock when re-fetching the old tuple for an AFTER ROW UPDATE/DELETE trigger (Andres Freund)
In very unusual circumstances, this oversight could result in passing incorrect data to the precheck logic for a foreign-key enforcement trigger. That could result in a crash, or in an incorrect decision about whether to fire the trigger.
Fix ALTER COLUMN TYPE to handle alled check constraints properly (Pavan Deolasee)
This worked correctly in pre-8.4 releases, and now works correctly in 8.4 and later.
Ignore incorrect pg_attribute entries for system columns for views (Tom Lane)
Views do not have any system columns. However, we forgot to remove such entries when converting a table to a view. That's
fixed properly for 9.3 and later, but in previous branches we need to defend against existing mis-converted views.
Fix rule printing to dump INSERT INTO table DEFAULT VALUES correctly (Tom Lane)
Guard against stack overflow when there are too many UNION/INTERSECT/EXCEPT clauses in a query (Tom Lane)
Prevent platform-dependent failures when dividing the minimum possible integer value by -1 (Xi Wang, Tom Lane)
Fix possible access past end of string in date parsing (Hitoshi Harada)
Fix failure to advance XID epoch if XID wraparound happens during a checkpoint and wal_level is hot_standby (Tom
1451
Notes de version
Produce an understandable error message if the length of the path name for a Unix-domain socket exceeds the platform-specific limit (Tom Lane, Andrew Dunstan)
Formerly, this would result in something quite unhelpful, such as Non-recoverable failure in name resolution .
Fix memory leaks when sending composite column values to the client (Tom Lane)
Make pg_ctl more robust about reading the postmaster.pid file (Heikki Linnakangas)
Fix race conditions and possible file descriptor leakage.
Fix possible crash in psql if incorrectly-encoded data is presented and the client_encoding setting is a client-only encoding, such as SJIS (Jiang Guiqing)
Fix bugs in the restore.sql script emitted by pg_dump in tar output format (Tom Lane)
The script would fail outright on tables whose names include upper-case characters. Also, make the script capable of restoring
data in --inserts mode as well as the regular COPY mode.
Fix pg_restore to accept POSIX-conformant tar files (Brian Weaver, Tom Lane)
The original coding of pg_dump's tar output mode produced files that are not fully conformant with the POSIX standard.
This has been corrected for version 9.3. This patch updates previous branches so that they will accept both the incorrect and
the corrected formats, in hopes of avoiding compatibility problems when 9.3 comes out.
Fix pg_resetxlog to locate postmaster.pid correctly when given a relative path to the data directory (Tom Lane)
This mistake could lead to pg_resetxlog not noticing that there is an active postmaster using the data directory.
Fix libpq's lo_import() and lo_export() functions to report file I/O errors properly (Tom Lane)
Make contrib/pageinspect's btree page inspection functions take buffer locks while examining pages (Tom Lane)
Fix pgxs support for building loadable modules on AIX (Tom Lane)
Building modules outside the original source tree didn't work on AIX.
Update time zone data files to tzdata release 2012j for DST law changes in Cuba, Israel, Jordan, Libya, Palestine, Western Samoa, and portions of Brazil.
E.24.2. Changes
Fix planner's assignment of executor parameters, and fix executor's rescan logic for CTE plan nodes (Tom Lane)
These errors could result in wrong answers from queries that scan the same WITH subquery multiple times.
Improve page-splitting decisions in GiST indexes (Alexander Korotkov, Robert Haas, Tom Lane)
1452
Notes de version
Multi-column GiST indexes might suffer unexpected bloat due to this error.
Fix cascading privilege revoke to stop if privileges are still held (Tom Lane)
If we revoke a grant option from some role X, but X still holds that option via a grant from someone else, we should not recursively revoke the corresponding privilege from role(s) Y that X had granted it to.
Improve error messages for Hot Standby misconfiguration errors (Gurjeet Singh)
Prevent PL/Perl from crashing if a recursive PL/Perl function is redefined while being executed (Tom Lane)
On Windows, make pg_upgrade use backslash path separators in the scripts it emits (Andrew Dunstan)
Update time zone data files to tzdata release 2012f for DST law changes in Fiji
E.25.2. Changes
Prevent access to external files/URLs via XML entity references (Noah Misch, Tom Lane)
xml_parse() would attempt to fetch external files or URLs as needed to resolve DTD and entity references in an XML value, thus allowing unprivileged database users to attempt to fetch data with the privileges of the database server. While the external data wouldn't get returned directly to the user, portions of it could be exposed in error messages if the data didn't parse
as valid XML; and in any case the mere ability to check existence of a file might be useful to an attacker. (CVE-2012-3489)
Notes de version
Fix txid_current() to report the correct epoch when not in hot standby (Heikki Linnakangas)
This fixes a regression introduced in the previous minor release.
Fix bug in startup of Hot Standby when a master transaction has many subtransactions (Andres Freund)
This mistake led to failures reported as out-of-order XID insertion in KnownAssignedXids .
Back-patch 9.1 improvement to compress the fsync request queue (Robert Haas)
This improves performance during checkpoints. The 9.1 change has now seen enough field testing to seem safe to back-patch.
Fix LISTEN/NOTIFY to cope better with I/O problems, such as out of disk space (Tom Lane)
After a write failure, all subsequent attempts to send more NOTIFY messages would fail with messages like Could not read
from file "pg_notify/nnnn" at offset nnnnn: Success .
Fix log collector so that log_truncate_on_rotation works during the very first log rotation after server start (Tom
Lane)
Ensure that a whole-row reference to a subquery doesn't include any extra GROUP BY or ORDER BY columns (Tom Lane)
Disallow copying whole-row references in CHECK constraints and index definitions during CREATE TABLE (Tom Lane)
This situation can arise in CREATE TABLE with LIKE or INHERITS. The copied whole-row variable was incorrectly labeled with the row type of the original table not the new one. Rejecting the case seems reasonable for LIKE, since the row types
might well diverge later. For INHERITS we should ideally allow it, with an implicit coercion to the parent table's row type;
but that will require more work than seems safe to back-patch.
Fix memory leak in ARRAY(SELECT ...) subqueries (Heikki Linnakangas, Tom Lane)
Fix bugs with parsing signed hh:mm and hh:mm:ss fields in interval constants (Amit Kapila, Tom Lane)
Use Postgres' encoding conversion functions, not Python's, when converting a Python Unicode string to the server encoding in
PL/Python (Jan Urbanski)
This avoids some corner-case problems, notably that Python doesn't support all the encodings Postgres does. A notable functional change is that if the server encoding is SQL_ASCII, you will get the UTF-8 representation of the string; formerly, any
non-ASCII characters in the string would result in an error.
Update time zone data files to tzdata release 2012e for DST law changes in Morocco and Tokelau
1454
Notes de version
E.26.2. Changes
Fix incorrect password transformation in contrib/pgcrypto's DES crypt() function (Solar Designer)
If a password string contained the byte value 0x80, the remainder of the password was ignored, causing the password to be
much weaker than it appeared. With this fix, the rest of the string is properly included in the DES hash. Any stored password
values that are affected by this bug will thus no longer match, so the stored values may need to be updated. (CVE-2012-2143)
Ignore SECURITY DEFINER and SET attributes for a procedural language's call handler (Tom Lane)
Applying such attributes to a call handler could crash the server. (CVE-2012-2655)
Allow numeric timezone offsets in timestamp input to be up to 16 hours away from UTC (Tom Lane)
Some historical time zones have offsets larger than 15 hours, the previous limit. This could result in dumped data values being
rejected during reload.
Fix timestamp conversion to cope when the given time is exactly the last DST transition time for the current timezone (Tom
Lane)
This oversight has been there a long time, but was not noticed previously because most DST-using zones are presumed to have
an indefinite sequence of future DST transitions.
Fix text to name and char to name casts to perform string truncation correctly in multibyte encodings (Karl Schnaitter)
Ensure txid_current() reports the correct epoch when executed in hot standby (Simon Riggs)
Fix slow session startup when pg_attribute is very large (Tom Lane)
If pg_attribute exceeds one-fourth of shared_buffers, cache rebuilding code that is sometimes needed during session
start would trigger the synchronized-scan logic, causing it to take many times longer than normal. The problem was particularly acute if many new sessions were starting at once.
Ensure sequential scans check for query cancel reasonably often (Merlin Moncure)
A scan encountering many consecutive pages that contain no live tuples would not respond to interrupts meanwhile.
Ensure the Windows implementation of PGSemaphoreLock() clears ImmediateInterruptOK before returning (Tom
Lane)
This oversight meant that a query-cancel interrupt received later in the same query could be accepted at an unsafe time, with
unpredictable but not good consequences.
Show whole-row variables safely when printing views or rules (Abbas Butt, Tom Lane)
Corner cases involving ambiguous names (that is, the name could be either a table or column name of the query) were printed
in an ambiguous way, risking that the view or rule would be interpreted differently after dump and reload. Avoid the ambi1455
Notes de version
Fix COPY FROM to properly handle null marker strings that correspond to invalid encoding (Tom Lane)
A null marker string such as E'\\0' should work, and did work in the past, but the case got broken in 8.4.
Ensure autovacuum worker processes perform stack depth checking properly (Heikki Linnakangas)
Previously, infinite recursion in a function invoked by auto-ANALYZE could crash worker processes.
Fix logging collector to not lose log coherency under high load (Andrew Dunstan)
The collector previously could fail to reassemble large messages if it got too busy.
Fix logging collector to ensure it will restart file rotation after receiving SIGHUP (Tom Lane)
Fix WAL replay logic for GIN indexes to not fail if the index was subsequently dropped (Tom Lane)
Fix PL/pgSQL's GET DIAGNOSTICS command when the target is the function's first variable (Tom Lane)
Fix potential access off the end of memory in psql's expanded display (\x) mode (Peter Eisentraut)
Fix several performance problems in pg_dump when the database contains many objects (Jeff Janes, Tom Lane)
pg_dump could get very slow if the database contained many schemas, or if many objects are in dependency loops, or if there
are many owned sequences.
Fix pg_upgrade for the case that a database stored in a non-default tablespace contains a table in the cluster's default tablespace (Bruce Momjian)
In ecpg, fix rare memory leaks and possible overwrite of one byte after the sqlca_t structure (Peter Eisentraut)
Fix contrib/dblink's dblink_exec() to not leak temporary database connections upon error (Tom Lane)
Fix contrib/dblink to report the correct connection name in error messages (Kyotaro Horiguchi)
Fix contrib/vacuumlo to use multiple transactions when dropping many large objects (Tim Lewis, Robert Haas, Tom
Lane)
This change avoids exceeding max_locks_per_transaction when many objects need to be dropped. The behavior can
be adjusted with the new -l (limit) option.
Update time zone data files to tzdata release 2012c for DST law changes in Antarctica, Armenia, Chile, Cuba, Falkland Islands, Gaza, Haiti, Hebron, Morocco, Syria, and Tokelau Islands; also historical corrections for Canada.
E.27.2. Changes
Require execute permission on the trigger function for CREATE TRIGGER (Robert Haas)
This missing check could allow another user to execute a trigger function with forged input data, by installing it on a table he
owns. This is only of significance for trigger functions marked SECURITY DEFINER, since otherwise trigger functions run
as the table owner anyway. (CVE-2012-0866)
1456
Notes de version
Remove arbitrary limitation on length of common name in SSL certificates (Heikki Linnakangas)
Both libpq and the server truncated the common name extracted from an SSL certificate at 32 bytes. Normally this would
cause nothing worse than an unexpected verification failure, but there are some rather-implausible scenarios in which it might
allow one certificate holder to impersonate another. The victim would have to have a common name exactly 32 bytes long, and
the attacker would have to persuade a trusted CA to issue a certificate in which the common name has that string as a prefix.
Impersonating a server would also require some additional exploit to redirect client connections. (CVE-2012-0867)
Fix btree index corruption from insertions concurrent with vacuuming (Tom Lane)
An index page split caused by an insertion could sometimes cause a concurrently-running VACUUM to miss removing index
entries that it should remove. After the corresponding table rows are removed, the dangling index entries would cause errors
(such as could not read block N in file ... ) or worse, silently wrong query results after unrelated rows are re-inserted at the
now-free table locations. This bug has been present since release 8.2, but occurs so infrequently that it was not diagnosed until
now. If you have reason to suspect that it has happened in your database, reindexing the affected index will fix things.
Fix transient zeroing of shared buffers during WAL replay (Tom Lane)
The replay logic would sometimes zero and refill a shared buffer, so that the contents were transiently invalid. In hot standby
mode this can result in a query that's executing in parallel seeing garbage data. Various symptoms could result from that, but
the most common one seems to be invalid memory alloc request size .
Fix CLUSTER/VACUUM FULL handling of toast values owned by recently-updated rows (Tom Lane)
This oversight could lead to duplicate key value violates unique constraint errors being reported against the toast table's index during one of these commands.
Update per-column permissions, not only per-table permissions, when changing table owner (Tom Lane)
Failure to do this meant that any previously granted column permissions were still shown as having been granted by the old
owner. This meant that neither the new owner nor a superuser could revoke the now-untraceable-to-table-owner permissions.
Support foreign data wrappers and foreign servers in REASSIGN OWNED (Alvaro Herrera)
This command failed with unexpected classid errors if it needed to change the ownership of any such objects.
Allow non-existent values for some settings in ALTER USER/DATABASE SET (Heikki Linnakangas)
Allow default_text_search_config, default_tablespace, and temp_tablespaces to be set to names that
are not known. This is because they might be known in another database where the setting is intended to be used, or for the tablespace cases because the tablespace might not be created yet. The same issue was previously recognized for
search_path, and these settings now act like that one.
Avoid crashing when we have problems deleting table files post-commit (Tom Lane)
Dropping a table should lead to deleting the underlying disk files only after the transaction commits. In event of failure then
(for instance, because of wrong file permissions) the code is supposed to just emit a warning message and go on, since it's too
late to abort the transaction. This logic got broken as of release 8.4, causing such situations to result in a PANIC and an unrestartable database.
Recover from errors occurring during WAL replay of DROP TABLESPACE (Tom Lane)
Replay will attempt to remove the tablespace's directories, but there are various reasons why this might fail (for example, incorrect ownership or permissions on those directories). Formerly the replay code would panic, rendering the database unrestartable without manual intervention. It seems better to log the problem and continue, since the only consequence of failure to remove the directories is some wasted disk space.
Fix race condition in logging AccessExclusiveLocks for hot standby (Simon Riggs)
Sometimes a lock would be logged as being held by transaction zero . This is at least known to produce assertion failures
on slave servers, and might be the cause of more serious problems.
1457
Notes de version
Track the OID counter correctly during WAL replay, even when it wraps around (Tom Lane)
Previously the OID counter would remain stuck at a high value until the system exited replay mode. The practical consequences of that are usually nil, but there are scenarios wherein a standby server that's been promoted to master might take a
long time to advance the OID counter to a reasonable value once values are needed.
Prevent emitting misleading consistent recovery state reached log message at the beginning of crash recovery (Heikki Linnakangas)
Fix dangling pointer after CREATE TABLE AS/SELECT INTO in a SQL-language function (Tom Lane)
In most cases this only led to an assertion failure in assert-enabled builds, but worse consequences seem possible.
Fix I/O-conversion-related memory leaks in plpgsql (Andres Freund, Jan Urbanski, Tom Lane)
Certain operations would leak memory until the end of the current function.
Fix pg_restore's direct-to-database mode for INSERT-style table data (Tom Lane)
Direct-to-database restores from archive files made with --inserts or --column-inserts options fail when using
pg_restore from a release dated September or December 2011, as a result of an oversight in a fix for another problem. The archive file itself is not at fault, and text-mode output is okay.
Make libpq ignore ENOTDIR errors when looking for an SSL client certificate file (Magnus Hagander)
This allows SSL connections to be established, though without a certificate, even when the user's home directory is set to something like /dev/null.
Fix some more field alignment issues in ecpg's SQLDA area (Zoltan Boszormenyi)
Do not use the variable name when defining a varchar structure in ecpg (Michael Meskes)
Fix contrib/auto_explain's JSON output mode to produce valid JSON (Andrew Dunstan)
The output used brackets at the top level, when it should have used braces.
Notes de version
Use -fexcess-precision=standard option when building with gcc versions that accept it (Andrew Dunstan)
This prevents assorted scenarios wherein recent versions of gcc will produce creative results.
E.28.2. Changes
Fix possible crash during UPDATE or DELETE that joins to the output of a scalar-returning function (Tom Lane)
A crash could only occur if the target row had been concurrently updated, so this problem surfaced only intermittently.
Fix incorrect replay of WAL records for GIN index updates (Tom Lane)
This could result in transiently failing to find index entries after a crash, or on a hot-standby server. The problem would be repaired by the next VACUUM of the index, however.
Fix TOAST-related data corruption during CREATE TABLE dest AS SELECT * FROM src or INSERT INTO
1459
Notes de version
Start hot standby faster when initial snapshot is incomplete (Simon Riggs)
Fix race condition during toast table access from stale syscache entries (Tom Lane)
The typical symptom was transient errors like missing chunk number 0 for toast value NNNNN in pg_toast_2619 , where
the cited toast table would always belong to a system catalog.
Track dependencies of functions on items used in parameter default expressions (Tom Lane)
Previously, a referenced object could be dropped without having dropped or modified the function, leading to misbehavior
when the function was used. Note that merely installing this update will not fix the missing dependency entries; to do that,
you'd need to CREATE OR REPLACE each such function afterwards. If you have functions whose defaults depend on nonbuilt-in objects, doing so is recommended.
Allow inlining of set-returning SQL functions with multiple OUT parameters (Tom Lane)
Don't trust deferred-unique indexes for join removal (Tom Lane and Marti Raudsepp)
A deferred uniqueness constraint might not hold intra-transaction, so assuming that it does could give incorrect query results.
Make DatumGetInetP() unpack inet datums that have a 1-byte header, and add a new macro, DatumGetInetPP(),
that does not (Heikki Linnakangas)
This change affects no core code, but might prevent crashes in add-on code that expects DatumGetInetP() to produce an
unpacked datum as per usual convention.
Improve locale support in money type's input and output (Tom Lane)
Aside from not supporting all standard lc_monetary formatting options, the input and output functions were inconsistent,
meaning there were locales in which dumped money values could not be re-read.
Don't let transform_null_equals affect CASE foo WHEN NULL ... constructs (Heikki Linnakangas)
transform_null_equals is only supposed to affect foo = NULL expressions written directly by the user, not equality
checks generated internally by this form of CASE.
Change foreign-key trigger creation order to better support self-referential foreign keys (Tom Lane)
For a cascading foreign key that references its own table, a row update will fire both the ON UPDATE trigger and the CHECK
trigger as one event. The ON UPDATE trigger must execute first, else the CHECK will check a non-final state of the row and
possibly throw an inappropriate error. However, the firing order of these triggers is determined by their names, which generally sort in creation order since the triggers have auto-generated names following the convention
RI_ConstraintTrigger_NNNN . A proper fix would require modifying that convention, which we will do in 9.2, but it
seems risky to change it in existing releases. So this patch just changes the creation order of the triggers. Users encountering
this type of error should drop and re-create the foreign key constraint to get its triggers into the right order.
Avoid floating-point underflow while tracking buffer allocation rate (Greg Matthews)
While harmless in itself, on certain platforms this would result in annoying kernel log messages.
Preserve configuration file name and line number values when starting child processes under Windows (Tom Lane)
Formerly, these would not be displayed correctly in the pg_settings view.
Preserve blank lines within commands in psql's command history (Robert Haas)
The former behavior could cause problems if an empty line was removed from within a string literal, for example.
Fix pg_dump to dump user-defined casts between auto-generated types, such as table rowtypes (Tom Lane)
1460
Notes de version
Use the preferred version of xsubpp to build PL/Perl, not necessarily the operating system's main copy (David Wheeler and
Alex Hunsaker)
Fix incorrect quoting of log file name in Mac OS X start script (Sidar Lopez)
Ensure VPATH builds properly install all server header files (Peter Eisentraut)
Fix interpretation of Windows timezone names for Central America (Tom Lane)
Map Central America Standard Time to CST6, not CST6CDT, because DST is generally not observed anywhere in Central
America.
Update time zone data files to tzdata release 2011n for DST law changes in Brazil, Cuba, Fiji, Palestine, Russia, and Samoa;
also historical corrections for Alaska and British East Africa.
E.29.2. Changes
Fix catalog cache invalidation after a VACUUM FULL or CLUSTER on a system catalog (Tom Lane)
In some cases the relocation of a system catalog row to another place would not be recognized by concurrent server processes,
allowing catalog corruption to occur if they then tried to update that row. The worst-case outcome could be as bad as complete
loss of a table.
Fix incorrect order of operations during sinval reset processing, and ensure that TOAST OIDs are preserved in system catalogs
(Tom Lane)
These mistakes could lead to transient failures after a VACUUM FULL or CLUSTER on a system catalog.
Fix multiple bugs in GiST index page split processing (Heikki Linnakangas)
The probability of occurrence was low, but these could lead to index corruption.
Make pg_options_to_table return NULL for an option with no value (Tom Lane)
1461
Notes de version
Avoid possibly accessing off the end of memory in ANALYZE and in SJIS-2004 encoding conversion (Noah Misch)
This fixes some very-low-probability server crash scenarios.
Fix possible failure when a recovery conflict deadlock is detected within a sub-transaction (Tom Lane)
Avoid spurious conflicts while recycling btree index pages during hot standby (Noah Misch, Simon Riggs)
Shut down WAL receiver if it's still running at end of recovery (Heikki Linnakangas)
The postmaster formerly panicked in this situation, but it's actually a legitimate case.
Fix memory leak when encoding conversion has to be done on incoming command strings and LISTEN is active (Tom Lane)
Fix incorrect memory accounting (leading to possible memory bloat) in tuplestores supporting holdable cursors and plpgsql's
RETURN NEXT command (Tom Lane)
Fix trigger WHEN conditions when both BEFORE and AFTER triggers exist (Tom Lane)
Evaluation of WHEN conditions for AFTER ROW UPDATE triggers could crash if there had been a BEFORE ROW trigger fired
for the same update.
Fix performance problem when constructing a large, lossy bitmap (Tom Lane)
Fix nested PlaceHolderVar expressions that appear only in sub-select target lists (Tom Lane)
This mistake could result in outputs of an outer join incorrectly appearing as NULL.
Allow the planner to assume that empty parent tables really are empty (Tom Lane)
Normally an empty table is assumed to have a certain minimum size for planning purposes; but this heuristic seems to do more
harm than good for the parent table of an allance hierarchy, which often is permanently empty.
Fix array- and path-creating functions to ensure padding bytes are zeroes (Tom Lane)
This avoids some situations where the planner will think that semantically-equal constants are not equal, resulting in poor optimization.
Fix EXPLAIN to handle gating Result nodes within inner-indexscan subplans (Tom Lane)
The usual symptom of this oversight was bogus varno errors.
Work around gcc 4.6.0 bug that breaks WAL replay (Tom Lane)
This could lead to loss of committed transactions after a server crash.
Notes de version
Defend against integer overflow when computing size of a hash table (Tom Lane)
Fix cases where CLUSTER might attempt to access already-removed TOAST data (Tom Lane)
Fix premature timeout failures during initial authentication transaction (Tom Lane)
Fix portability bugs in use of credentials control messages for peer authentication (Tom Lane)
Fix SSPI login when multiple roundtrips are required (Ahmed Shinwari, Magnus Hagander)
The typical symptom of this problem was The function requested is not supported errors during SSPI login.
Fix failure when adding a new variable of a custom variable class to postgresql.conf (Tom Lane)
Throw an error if pg_hba.conf contains hostssl but SSL is disabled (Tom Lane)
This was concluded to be more user-friendly than the previous behavior of silently ignoring such lines.
Fix failure when DROP OWNED BY attempts to remove default privileges on sequences (Shigeru Hanada)
Avoid integer overflow when the sum of LIMIT and OFFSET values exceeds 2^63 (Heikki Linnakangas)
Add overflow checks to int4 and int8 versions of generate_series() (Robert Haas)
Fix pg_size_pretty() to avoid overflow for inputs close to 2^63 (Tom Lane)
Weaken plpgsql's check for typmod matching in record values (Tom Lane)
An overly enthusiastic check could lead to discarding length modifiers that should have been kept.
Fix pg_upgrade to preserve toast tables' relfrozenxids during an upgrade from 8.3 (Bruce Momjian)
Failure to do this could lead to pg_clog files being removed too soon after the upgrade.
Fix psql's counting of script file line numbers during COPY from a different file (Tom Lane)
Be more user-friendly about unsupported cases for parallel pg_restore (Tom Lane)
This change ensures that such cases are detected and reported before any restore actions have been taken.
Fix write-past-buffer-end and memory leak in libpq's LDAP service lookup code (Albe Laurenz)
In libpq, avoid failures when using nonblocking I/O and an SSL connection (Martin Pihlak, Tom Lane)
Notes de version
Fix PQsetvalue() to avoid possible crash when adding a new tuple to a PGresult originally obtained from a server query
(Andrew Chernow)
Make ecpglib write double values with 15 digits precision (Akira Kurosawa)
Apply upstream fix for blowfish signed-character bug (CVE-2011-2483) (Tom Lane)
contrib/pg_crypto's blowfish encryption code could give wrong results on platforms where char is signed (which is
most), leading to encrypted passwords being weaker than they should be.
Fix pgstatindex() to give consistent results for empty indexes (Tom Lane)
Fix assorted issues with build and install file paths containing spaces (Tom Lane)
Update time zone data files to tzdata release 2011i for DST law changes in Canada, Egypt, Russia, Samoa, and South Sudan.
E.30.2. Changes
Suppress incorrect PD_ALL_VISIBLE flag was incorrectly set warning (Heikki Linnakangas)
VACUUM would sometimes issue this warning in cases that are actually valid.
Use better SQLSTATE error codes for hot standby conflict cases (Tatsuo Ishii and Simon Riggs)
All retryable conflict errors now have an error code that indicates that a retry is possible. Also, session closure due to the database being dropped on the master is now reported as ERRCODE_DATABASE_DROPPED, rather than ERRCODE_ADMIN_SHUTDOWN, so that connection poolers can handle the situation correctly.
Prevent intermittent hang in interactions of startup process with bgwriter process (Simon Riggs)
This affected recovery in non-hot-standby cases.
Notes de version
Fix dangling-pointer problem in BEFORE ROW UPDATE trigger handling when there was a concurrent update to the target
tuple (Tom Lane)
This bug has been observed to result in intermittent cannot extract system attribute from virtual tuple failures while trying
to do UPDATE RETURNING ctid. There is a very small probability of more serious errors, such as generating incorrect index entries for the updated tuple.
Disallow DROP TABLE when there are pending deferred trigger events for the table (Tom Lane)
Formerly the DROP would go through, leading to could not open relation with OID nnn errors when the triggers were
eventually fired.
Prevent crash triggered by constant-false WHERE conditions during GEQO optimization (Tom Lane)
Fix selectivity estimation for text search to account for NULLs (Jesper Krogh)
Fix get_actual_variable_range() to support hypothetical indexes injected by an index adviser plugin (Gurjeet Singh)
Allow libpq's SSL initialization to succeed when user's home directory is unavailable (Tom Lane)
If the SSL mode is such that a root certificate file is not required, there is no need to fail. This change restores the behavior to
what it was in pre-9.0 releases.
Fix libpq to return a useful error message for errors detected in conninfo_array_parse (Joseph Adams)
A typo caused the library to return NULL, rather than the PGconn structure containing the error message, to the application.
Fix parallel pg_restore to handle comments on POST_DATA items correctly (Arnd Hannemann)
Fix pg_restore to cope with long lines (over 1KB) in TOC files (Tom Lane)
Put in more safeguards against crashing due to division-by-zero with overly enthusiastic compiler optimization (Aurelien Jarno)
Avoid crash when trying to write to the Windows console very early in process startup (Rushabh Lathia)
Support building with MinGW 64 bit compiler for Windows (Andrew Dunstan)
Fix usage of xcopy in Windows build scripts to work correctly under Windows 7 (Andrew Dunstan)
This affects the build scripts only, not installation or usage.
Update time zone data files to tzdata release 2011f for DST law changes in Chile, Cuba, Falkland Islands, Morocco, Samoa,
and Turkey; also historical corrections for South Australia, Alaska, and Hawaii.
1465
Notes de version
E.31.2. Changes
Before exiting walreceiver, ensure all the received WAL is fsync'd to disk (Heikki Linnakangas)
Otherwise the standby server could replay some un-synced WAL, conceivably leading to data corruption if the system crashes
just at that point.
Make ALTER TABLE revalidate uniqueness and exclusion constraints when needed (Noah Misch)
This was broken in 9.0 by a change that was intended to suppress revalidation during VACUUM FULL and CLUSTER, but
unintentionally affected ALTER TABLE as well.
Fix EvalPlanQual for UPDATE of an allance tree in which the tables are not all alike (Tom Lane)
Any variation in the table row types (including dropped columns present in only some child tables) would confuse the EvalPlanQual code, leading to misbehavior or even crashes. Since EvalPlanQual is only executed during concurrent updates to the
same row, the problem was only seen intermittently.
Avoid failures when EXPLAIN tries to display a simple-form CASE expression (Tom Lane)
If the CASE's test expression was a constant, the planner could simplify the CASE into a form that confused the expression-display code, resulting in unexpected CASE WHEN clause errors.
Fix assignment to an array slice that is before the existing range of subscripts (Tom Lane)
If there was a gap between the newly added subscripts and the first pre-existing subscript, the code miscalculated how many
entries needed to be copied from the old array's null bitmap, potentially leading to data corruption or crash.
Avoid unexpected conversion overflow in planner for very distant date values (Tom Lane)
The date type supports a wider range of dates than can be represented by the timestamp types, but the planner assumed it could
always convert a date to timestamp with impunity.
Fix PL/Python crash when an array contains null entries (Alex Hunsaker)
Remove ecpg's fixed length limit for constants defining an array dimension (Michael Meskes)
Fix erroneous parsing of tsquery values containing ... & !(subexpression) | ... (Tom Lane)
Queries containing this combination of operators were not executed correctly. The same error existed in contrib/intarray's query_int type and contrib/ltree's ltxtquery type.
Fix buffer overrun in contrib/intarray's input function for the query_int type (Apple)
This bug is a security risk since the function's return address could be overwritten. Thanks to Apple Inc's security team for reporting this issue and supplying the fix. (CVE-2010-4015)
Notes de version
Release Date
2010-12-16
This release contains a variety of fixes from 9.0.1. For information about new features in the 9.0 major release, see Section E.34,
Release 9.0 .
E.32.2. Changes
Force the default wal_sync_method to be fdatasync on Linux (Tom Lane, Marti Raudsepp)
The default on Linux has actually been fdatasync for many years, but recent kernel changes caused PostgreSQL to
choose open_datasync instead. This choice did not result in any performance improvement, and caused outright failures
on certain filesystems, notably ext4 with the data=journal mount option.
Fix too many KnownAssignedXids error during Hot Standby replay (Heikki Linnakangas)
Fix race condition in lock acquisition during Hot Standby (Simon Riggs)
Fix assorted bugs in WAL replay logic for GIN indexes (Tom Lane)
This could result in bad buffer id: 0 failures or corruption of index contents during replication.
Fix recovery from base backup when the starting checkpoint WAL record is not in the same WAL segment as its redo point
(Jeff Davis)
Fix corner-case bug when streaming replication is enabled immediately after creating the master database cluster (Heikki Linnakangas)
Fix persistent slowdown of autovacuum workers when multiple workers remain active for a long time (Tom Lane)
The effective vacuum_cost_limit for an autovacuum worker could drop to nearly zero if it processed enough tables, causing it to run extremely slowly.
Avoid failure when trying to report an impending transaction wraparound condition from outside a transaction (Tom Lane)
This oversight prevented recovery after transaction wraparound got too close, because database startup processing would fail.
Notes de version
Avoid memory leakage while ANALYZE'ing complex index expressions (Tom Lane)
Ensure an index that uses a whole-row Var still depends on its table (Tom Lane)
An index declared like create index i on t (foo(t.*)) would not automatically get dropped when its table was
dropped.
Add missing support in DROP OWNED BY for removing foreign data wrapper/server privileges belonging to a user (Heikki
Linnakangas)
Do not inline a SQL function with multiple OUT parameters (Tom Lane)
This avoids a possible crash due to loss of information about the expected result rowtype.
Fix crash when inline-ing a set-returning function whose argument list contains a reference to an inline-able user function
(Tom Lane)
Behave correctly if ORDER BY, LIMIT, FOR UPDATE, or WITH is attached to the VALUES part of INSERT ... VALUES
(Tom Lane)
Fix could not find pathkey item to sort planner failure with comparison of whole-row Vars (Tom Lane)
Fix postmaster crash when connection acceptance (accept() or one of the calls made immediately after it) fails, and the
postmaster was compiled with GSSAPI support (Alexander Chernikov)
Retry after receiving an invalid response packet from a RADIUS authentication server (Magnus Hagander)
This fixes a low-risk potential denial of service condition.
Fix missed unlink of temporary files when log_temp_files is active (Tom Lane)
If an error occurred while attempting to emit the log message, the unlink was not done, resulting in accumulation of temp files.
Fix incorrect calculation of distance from a point to a horizontal line segment (Tom Lane)
This bug affected several different geometric distance-measurement operators.
Speed up parallel pg_restore when the archive contains many large objects (blobs) (Tom Lane)
Fix PL/pgSQL's handling of simple expressions to not fail in recursion or error-recovery cases (Tom Lane)
Fix PL/Python to honor typmod (i.e., length or precision restrictions) when assigning to tuple fields (Tom Lane)
This fixes a regression from 8.4.
Don't emit identifier will be truncated notices in contrib/dblink except when creating new connections (Itagaki Ta1468
Notes de version
kahiro)
Update time zone data files to tzdata release 2010o for DST law changes in Fiji and Samoa; also historical corrections for
Hong Kong.
E.33.2. Changes
Use a separate interpreter for each calling SQL userid in PL/Perl and PL/Tcl (Tom Lane)
This change prevents security problems that can be caused by subverting Perl or Tcl code that will be executed later in the
same session under another SQL user identity (for example, within a SECURITY DEFINER function). Most scripting languages offer numerous ways that that might be done, such as redefining standard functions or operators called by the target
function. Without this change, any SQL user with Perl or Tcl language usage rights can do essentially anything with the SQL
privileges of the target function's owner.
The cost of this change is that intentional communication among Perl and Tcl functions becomes more difficult. To provide an
escape hatch, PL/PerlU and PL/TclU functions continue to use only one interpreter per session. This is not considered a security issue since all such functions execute at the trust level of a database superuser already.
It is likely that third-party procedural languages that claim to offer trusted execution have similar security issues. We advise
contacting the authors of any PL you are depending on for security-critical purposes.
Our thanks to Tim Bunce for pointing out this issue (CVE-2010-3433).
Improve pg_get_expr() security fix so that the function can still be used on the output of a sub-select (Tom Lane)
Fix possible duplicate scans of UNION ALL member relations (Tom Lane)
Make psql recognize DISCARD ALL as a command that should not be encased in a transaction block in autocommit-off
mode (Itagaki Takahiro)
Update build infrastructure and documentation to reflect the source code repository's move from CVS to Git (Magnus Hagander and others)
1469
Notes de version
E.34.1. Overview
This release of PostgreSQL adds features that have been requested for years, such as easy-to-use replication, a mass permissionchanging facility, and anonymous code blocks. While past major releases have been conservative in their scope, this release shows
a bold new desire to provide facilities that new and existing users of PostgreSQL will embrace. This has all been done with few
incompatibilities. Major enhancements include:
Built-in replication based on log shipping. This advance consists of two features: Streaming Replication, allowing continuous
archive (WAL) files to be streamed over a network connection to a standby server, and Hot Standby, allowing continuous archive standby servers to execute read-only queries. The net effect is to support a single master with multiple read-only slave
servers.
Easier database object permissions management. GRANT/REVOKE IN SCHEMA supports mass permissions changes on
existing objects, while ALTER DEFAULT PRIVILEGES allows control of privileges for objects created in the future.
Large objects (BLOBs) now support permissions management as well.
Broadly enhanced stored procedure support. The DO statement supports ad-hoc or anonymous code blocks. Functions can
now be called using named parameters. PL/pgSQL is now installed by default, and PL/Perl and PL/Python have been enhanced in several ways, including support for Python3.
More advanced reporting queries, including additional windowing options (PRECEDING and FOLLOWING) and the ability to
control the order in which values are fed to aggregate functions.
New trigger features, including SQL-standard-compliant per-column triggers and conditional trigger execution.
Deferrable unique constraints. Mass updates to unique keys are now possible without trickery.
Exclusion constraints. These provide a generalized version of unique constraints, allowing enforcement of complex conditions.
New and enhanced security features, including RADIUS authentication, LDAP authentication improvements, and a new
contrib module passwordcheck for testing password strength.
New high-performance implementation of the LISTEN/NOTIFY feature. Pending events are now stored in a memory-based
queue rather than a table. Also, a payload string can be sent with each event, rather than transmitting just an event name as
before.
New implementation of VACUUM FULL. This command now rewrites the entire table and indexes, rather than moving individual rows to compact space. It is substantially faster in most cases, and no longer results in index bloat.
New contrib module pg_upgrade to support in-place upgrades from 8.3 or 8.4 to 9.0.
Multiple performance enhancements for specific types of queries, including elimination of unnecessary joins. This helps optimize some automatically-generated queries, such as those produced by object-relational mappers (ORMs).
EXPLAIN enhancements. The output is now available in JSON, XML, or YAML format, and includes buffer utilization and
other data not previously available.
The above items are explained in more detail in the sections below.
1470
Notes de version
Remove server parameter add_missing_from, which was defaulted to off for many years (Tom Lane)
Remove server parameter regex_flavor, which was defaulted to advanced for many years (Tom Lane)
archive_mode now only affects archive_command; a new setting, wal_level, affects the contents of the write-ahead
log (Heikki Linnakangas)
log_temp_files now uses default file size units of kilobytes (Robert Haas)
E.34.2.2. Queries
When querying a parent table, do not do any separate permission checks on child tables scanned as part of the query (Peter Eisentraut)
The SQL standard specifies this behavior, and it is also much more convenient in practice than the former behavior of checking permissions on each child as well as the parent.
Array input now considers only plain ASCII whitespace characters to be potentially ignorable; it will never ignore non-ASCII
characters, even if they are whitespace according to some locales (Tom Lane)
This avoids some corner cases where array values could be interpreted differently depending on the server's locale settings.
Improve standards compliance of SIMILAR TO patterns and SQL-style substring() patterns (Tom Lane)
This includes treating ? and {...} as pattern metacharacters, while they were simple literal characters before; that corresponds to new features added in SQL:2008. Also, ^ and $ are now treated as simple literal characters; formerly they were treated as metacharacters, as if the pattern were following POSIX rather than SQL rules. Also, in SQL-standard substring(),
use of parentheses for nesting no longer interferes with capturing of a substring. Also, processing of bracket expressions
(character classes) is now more standards-compliant.
Reject negative length values in 3-parameter substring() for bit strings, per the SQL standard (Tom Lane)
Make date_trunc truncate rather than round when reducing precision of fractional seconds (Tom Lane)
The code always acted this way for integer-based dates/times. Now float-based dates/times behave similarly.
Tighten enforcement of column name consistency during RENAME when a child table alls the same column from multiple
unrelated parents (KaiGai Kohei)
No longer automatically rename indexes and index columns when the underlying table columns are renamed (Tom Lane)
Administrators can still rename such indexes and columns manually. This change will require an update of the JDBC driver,
and possibly other drivers, so that unique indexes are correctly recognized after a rename.
CREATE OR REPLACE FUNCTION can no longer change the declared names of function parameters (Pavel Stehule)
In order to avoid creating ambiguity in named-parameter calls, it is no longer allowed to change the aliases for input parameters in the declaration of an existing function (although names can still be assigned to previously unnamed parameters). You
now have to DROP and recreate the function to do that.
E.34.2.5. PL/pgSQL
PL/pgSQL now throws an error if a variable name conflicts with a column name used in a query (Tom Lane)
The former behavior was to bind ambiguous names to PL/pgSQL variables in preference to query columns, which often resulted in surprising misbehavior. Throwing an error allows easy detection of ambiguous situations. Although it's recommended
that functions encountering this type of error be modified to remove the conflict, the old behavior can be restored if necessary
1471
Notes de version
PL/pgSQL no longer allows variable names that match certain SQL reserved words (Tom Lane)
This is a consequence of aligning the PL/pgSQL parser to match the core SQL parser more closely. If necessary, variable
names can be double-quoted to avoid this restriction.
PL/pgSQL now requires columns of composite results to match the expected type modifier as well as base type (Pavel Stehule,
Tom Lane)
For example, if a column of the result type is declared as NUMERIC(30,2), it is no longer acceptable to return a NUMERIC
of some other precision in that column. Previous versions neglected to check the type modifier and would thus allow result
rows that didn't actually conform to the declared restrictions.
PL/pgSQL now treats selection into composite fields more consistently (Tom Lane)
Formerly, a statement like SELECT ... INTO rec.fld FROM ... was treated as a scalar assignment even if the record field fld was of composite type. Now it is treated as a record assignment, the same as when the INTO target is a regular
variable of composite type. So the values to be assigned to the field's subfields should be written as separate columns of the
SELECT list, not as a ROW(...) construct as in previous versions.
If you need to do this in a way that will work in both 9.0 and previous releases, you can write something like rec.fld :=
ROW(...) FROM ....
Remove support for platforms that don't have a working 64-bit integer data type (Tom Lane)
It is believed all still-supported platforms have working 64-bit integer data types.
E.34.3. Changes
Version 9.0 has an unprecedented number of new major features, and over 200 enhancements, improvements, new commands,
new functions, and other changes.
E.34.3.1. Server
E.34.3.1.1. Continuous Archiving and Streaming Replication
PostgreSQL's existing standby-server capability has been expanded both to support read-only queries on standby servers and to
greatly reduce the lag between master and standby servers. For many users, this will be a useful and low-administration form of
replication, either for high availability or for horizontal scalability.
Allow a standby server to accept read-only queries (Simon Riggs, Heikki Linnakangas)
This feature is called Hot Standby. There are new postgresql.conf and recovery.conf settings to control this feature, as well as extensive documentation.
Allow write-ahead log (WAL) data to be streamed to a standby server (Fujii Masao, Heikki Linnakangas)
This feature is called Streaming Replication. Previously WAL data could be sent to standby servers only in units of entire
WAL files (normally 16 megabytes each). Streaming Replication eliminates this inefficiency and allows updates on the master
to be propagated to standby servers with very little delay. There are new postgresql.conf and recovery.conf settings to control this feature, as well as extensive documentation.
Notes de version
monitor standby server WAL activity (Simon Riggs, Fujii Masao, Heikki Linnakangas)
E.34.3.1.2. Performance
Allow per-tablespace values to be set for sequential and random page cost estimates (seq_page_cost/random_page_cost) via ALTER TABLESPACE ... SET/RESET (Robert Haas)
Improve performance and reliability of EvalPlanQual rechecks in join queries (Tom Lane)
UPDATE, DELETE, and SELECT FOR UPDATE/SHARE queries that involve joins will now behave much better when
encountering freshly-updated rows.
Improve performance of TRUNCATE when the table was created or truncated earlier in the same transaction (Tom Lane)
E.34.3.1.3. Optimizer
Improve the optimizer's choices about when to use materialize nodes, and when to use sorting versus hashing for DISTINCT
(Tom Lane)
Improve the optimizer's equivalence detection for expressions involving boolean <> operators (Tom Lane)
E.34.3.1.4. GEQO
Use the same random seed every time GEQO plans a query (Andres Freund)
While the Genetic Query Optimizer (GEQO) still selects random plans, it now always selects the same random plans for identical queries, thus giving more consistent performance. You can modify geqo_seed to experiment with alternative plans.
E.34.3.1.6. Authentication
Add support for RADIUS (Remote Authentication Dial In User Service) authentication (Magnus Hagander)
1473
Notes de version
Allow LDAP (Lightweight Directory Access Protocol) authentication to operate in search/bind mode (Robert Fleming,
Magnus Hagander)
This allows the user to be looked up first, then the system uses the DN (Distinguished Name) returned for that user.
Pass trusted SSL root certificate names to the client so the client can return an appropriate client certificate (Craig Ringer)
E.34.3.1.7. Monitoring
Add the ability for clients to set an application name, which is displayed in pg_stat_activity (Dave Page)
This allows administrators to characterize database traffic and troubleshoot problems by source application.
Add pg_stat_reset_shared('bgwriter') to reset the cluster-wide shared statistics for the background writer (Greg
Smith)
Add server parameter bonjour, which controls whether a Bonjour-enabled server advertises itself via Bonjour (Tom
Lane)
The default is off, meaning it does not advertise. This allows packagers to distribute Bonjour-enabled builds without worrying
that individual users might not want the feature.
Add server parameter enable_material, which controls the use of materialize nodes in the optimizer (Robert Haas)
The default is on. When off, the optimizer will not add materialize nodes purely for performance reasons, though they will still
be used when necessary for correctness.
Change server parameter log_temp_files to use default file size units of kilobytes (Robert Haas)
Previously this setting was interpreted in bytes if no units were specified.
Properly enforce superuser permissions for custom server parameters (Tom Lane)
Non-superusers can no longer issue ALTER ROLE/DATABASE SET for parameters that are not currently known to the server. This allows the server to correctly check that superuser-only parameters are only set by superusers. Previously, the SET
would be allowed and then ignored at session start, making superuser-only custom parameters much less useful than they
should be.
E.34.3.2. Queries
1474
Notes de version
Perform SELECT FOR UPDATE/SHARE processing after applying LIMIT, so the number of rows returned is always predictable (Tom Lane)
Previously, changes made by concurrent transactions could cause a SELECT FOR UPDATE to unexpectedly return fewer
rows than specified by its LIMIT. FOR UPDATE in combination with ORDER BY can still produce surprising results, but that
can be corrected by placing FOR UPDATE in a subquery.
Make SELECT INTO and CREATE TABLE AS return row counts to the client in their command tags (Boszormenyi Zoltan)
This can save an entire round-trip to the client, allowing result counts and pagination to be calculated without an additional
COUNT query.
Support Unicode surrogate pairs (dual 16-bit representation) in U& strings and identifiers (Peter Eisentraut)
Speed up CREATE DATABASE by deferring flushes to disk (Andres Freund, Greg Stark)
Allow comments on columns of tables, views, and composite types only, not other relation types such as indexes and TOAST
tables (Tom Lane)
Let values of columns having storage type MAIN remain on the main heap page unless the row cannot fit on a page (Kevin
Grittner)
Previously MAIN values were forced out to TOAST tables until the row size was less than one-quarter of the page size.
Implement IF EXISTS for ALTER TABLE DROP COLUMN and ALTER TABLE DROP CONSTRAINT (Andres Freund)
Allow ALTER TABLE commands that rewrite tables to skip WAL logging (Itagaki Takahiro)
Such operations either produce a new copy of the table or are rolled back, so WAL archiving can be skipped, unless running in
continuous archiving mode. This reduces I/O overhead and improves performance.
Fix failure of ALTER TABLE table ADD COLUMN col serial when done by non-owner of table (Tom Lane)
Add support for copying COMMENTS and STORAGE settings in CREATE TABLE ... LIKE commands (Itagaki Takahiro)
Add a shortcut for copying all properties in CREATE TABLE ... LIKE commands (Itagaki Takahiro)
Add the SQL-standard CREATE TABLE ... OF type command (Peter Eisentraut)
This allows creation of a table that matches an existing composite type. Additional constraints and defaults can be specified in
the command.
E.34.3.3.3. Constraints
Notes de version
Improve uniqueness-constraint violation error messages to report the values causing the failure (Itagaki Takahiro)
For example, a uniqueness constraint violation might now report Key (x)=(2) already exists.
Add the ability to make mass permission changes across a whole schema using the new GRANT/REVOKE IN SCHEMA
clause (Petr Jelinek)
This simplifies management of object permissions and makes it easier to utilize database roles for application data security.
Add ALTER DEFAULT PRIVILEGES command to control privileges of objects created later (Petr Jelinek)
This greatly simplifies the assignment of object privileges in a complex database application. Default privileges can be set for
tables, views, sequences, and functions. Defaults may be assigned on a per-schema basis, or database-wide.
Add the ability to control large object (BLOB) permissions with GRANT/REVOKE (KaiGai Kohei)
Formerly, any database user could read or modify any large object. Read and write permissions can now be granted and revoked per large object, and the ownership of large objects is tracked.
Make LISTEN/NOTIFY store pending events in a memory queue, rather than in a system table (Joachim Wieland)
This substantially improves performance, while retaining the existing features of transactional support and guaranteed delivery.
E.34.3.4.1. COPY
Add new COPY syntax that allows options to be specified inside parentheses (Robert Haas, Emmanuel Cecchet)
This allows greater flexibility for future COPY options. The old syntax is still supported, but only for pre-existing options.
E.34.3.4.2. EXPLAIN
Allow EXPLAIN to output in XML, JSON, or YAML format (Robert Haas, Greg Sabino Mullane)
The new output formats are easily machine-readable, supporting the development of new tools for analysis of EXPLAIN output.
Add new BUFFERS option to report query buffer usage during EXPLAIN ANALYZE (Itagaki Takahiro)
This allows better query profiling for individual queries. Buffer usage is no longer reported in the output for
log_statement_stats and related settings.
Notes de version
Add new EXPLAIN syntax that allows options to be specified inside parentheses (Robert Haas)
This allows greater flexibility for future EXPLAIN options. The old syntax is still supported, but only for pre-existing options.
E.34.3.4.3. VACUUM
Change VACUUM FULL to rewrite the entire table and rebuild its indexes, rather than moving individual rows around to
compact space (Itagaki Takahiro, Tom Lane)
The previous method was usually slower and caused index bloat. Note that the new method will use more disk space transiently during VACUUM FULL; potentially as much as twice the space normally occupied by the table and its indexes.
Add new VACUUM syntax that allows options to be specified inside parentheses (Itagaki Takahiro)
This allows greater flexibility for future VACUUM options. The old syntax is still supported, but only for pre-existing options.
E.34.3.4.4. Indexes
Allow an index to be named automatically by omitting the index name in CREATE INDEX (Tom Lane)
By default, multicolumn indexes are now named after all their columns; and index expression columns are now named based
on their expressions (Tom Lane)
Reindexing shared system catalogs is now fully transactional and crash-safe (Tom Lane)
Formerly, reindexing a shared index was only allowed in standalone mode, and a crash during the operation could leave the index in worse condition than it was before.
Use red-black binary trees for GIN index creation (Teodor Sigaev)
Red-black trees are self-balancing. This avoids slowdowns in cases where the input is in nonrandom order.
Use more standards-compliant rules for parsing URL tokens (Tom Lane)
1477
Notes de version
E.34.3.6. Functions
Allow function calls to supply parameter names and match them to named parameters in the function definition (Pavel Stehule)
For example, if a function is defined to take parameters a and b, it can be called with func(a := 7, b := 12) or
func(b := 12, a := 7).
Support locale-specific regular expression processing with UTF-8 server encoding (Tom Lane)
Locale-specific regular expression functionality includes case-insensitive matching and locale-specific character classes. Previously, these features worked correctly for non-ASCII characters only if the database used a single-byte server encoding
(such as LATIN1). They will still misbehave in multi-byte encodings other than UTF-8.
Add support for scientific notation in to_char() (EEEE specification) (Pavel Stehule, Brendan Jurd)
Make to_char() honor FM (fill mode) in Y, YY, and YYY specifications (Bruce Momjian, Tom Lane)
It was already honored by YYYY.
Fix to_char() to output localized numeric and monetary strings in the correct encoding on Windows (Hiroshi Inoue, Itagaki Takahiro, Bruce Momjian)
Correct calculations of overlaps and contains operations for polygons (Teodor Sigaev)
The polygon && (overlaps) operator formerly just checked to see if the two polygons' bounding boxes overlapped. It now does
a more correct check. The polygon @> and <@ (contains/contained by) operators formerly checked to see if one polygon's vertexes were all contained in the other; this can wrongly report true for some non-convex polygons. Now they check that all
line segments of one polygon are contained in the other.
E.34.3.6.1. Aggregates
Add the string_agg() aggregate function to combine values into a single string (Pavel Stehule)
Aggregate functions that are called with DISTINCT are now passed NULL values if the aggregate transition function is not
marked as STRICT (Andrew Gierth)
For example, agg(DISTINCT x) might pass a NULL x value to agg(). This is more consistent with the behavior in
non-DISTINCT cases.
Add get_bit() and set_bit() functions for bit strings, mirroring those for bytea (Leonardo F)
Make the information_schema views correctly display maximum octet lengths for char and varchar columns (Peter Eisentraut)
1478
Notes de version
Support execution of anonymous code blocks using the DO statement (Petr Jelinek, Joshua Tolley, Hannu Valtonen)
This allows execution of server-side code without the need to create and delete a temporary function definition. Code can be
executed in any language for which the user has permissions to define a function.
Add the WHEN clause to CREATE TRIGGER to allow control over whether a trigger is fired (Itagaki Takahiro)
While the same type of check can always be performed inside the trigger, doing it in an external WHEN clause can have performance benefits.
Improve handling of cases where PL/pgSQL variable names conflict with identifiers used in queries within a function (Tom
Lane)
The default behavior is now to throw an error when there is a conflict, so as to avoid surprising behaviors. This can be modified, via the configuration parameter plpgsql.variable_conflict or the per-function option
#variable_conflict, to allow either the variable or the query-supplied column to be used. In any case PL/pgSQL will
no longer attempt to substitute variables in places where they would not be syntactically valid.
Make PL/pgSQL use the main lexer, rather than its own version (Tom Lane)
This ensures accurate tracking of the main system's behavior for details such as string escaping. Some user-visible details,
such as the set of keywords considered reserved in PL/pgSQL, have changed in consequence.
Avoid throwing an unnecessary error for an invalid record reference (Tom Lane)
An error is now thrown only if the reference is actually fetched, rather than whenever the enclosing expression is reached. For
example, many people have tried to do this in triggers:
if TG_OP = 'INSERT' and NEW.col1 = ... then
This will now actually work as expected.
Improve PL/pgSQL's ability to handle row types with dropped columns (Pavel Stehule)
Allow input parameters to be assigned values within PL/pgSQL functions (Steve Prentice)
Formerly, input parameters were treated as being declared CONST, so the function's code could not change their values. This
restriction has been removed to simplify porting of functions from other DBMSes that do not impose the equivalent restriction.
An input parameter now acts like a local variable initialized to the passed-in value.
Add count and ALL options to MOVE FORWARD/BACKWARD in PL/pgSQL (Pavel Stehule)
Allow PL/pgSQL's OPEN cursor FOR EXECUTE to use parameters (Pavel Stehule, Itagaki Takahiro)
This is accomplished with a new USING clause.
1479
Notes de version
Add new PL/Perl functions: quote_literal(), quote_nullable(), quote_ident(), encode_bytea(), decode_bytea(), looks_like_number(), encode_array_literal(), encode_array_constructor()
(Tim Bunce)
Add server parameter plperl.on_init to specify a PL/Perl initialization function (Tim Bunce)
plperl.on_plperl_init and plperl.on_plperlu_init are also available for initialization that is specific to the
trusted or untrusted language respectively.
Allow use feature in PL/Perl if Perl version 5.10 or later is used (Tim Bunce)
Verify that PL/Perl return values are valid in the server encoding (Andrew Dunstan)
E.34.3.8.1. psql
Add support for quoting/escaping the values of psql variables as SQL strings or identifiers (Pavel Stehule, Robert Haas)
For example, :'var' will produce the value of var quoted and properly escaped as a literal string, while :"var" will produce its value quoted and escaped as an identifier.
Ignore a leading UTF-8-encoded Unicode byte-order marker in script files read by psql (Itagaki Takahiro)
This is enabled when the client encoding is UTF-8. It improves compatibility with certain editors, mostly on Windows, that insist on inserting such markers.
Avoid overwriting of psql's command-line history when two psql sessions are run concurrently (Tom Lane)
Show \timing output when it is enabled, regardless of quiet mode (Peter Eisentraut)
1480
Notes de version
Allow psql to use fancy Unicode line-drawing characters via \pset linestyle unicode (Roger Leigh)
Make \d show child tables that all from the specified parent (Damien Clochard)
\d shows only the number of child tables, while \d+ shows the names of all child tables.
E.34.3.8.2. pg_dump
Fix pg_dump to properly dump large objects when standard_conforming_strings is enabled (Tom Lane)
The previous coding could fail when dumping to an archive file and then generating script output from pg_restore.
pg_restore now emits large-object data in hex format when generating script output (Tom Lane)
This could cause compatibility problems if the script is then loaded into a pre-9.0 server. To work around that, restore directly
to the server, instead.
Allow pg_dump to dump comments attached to columns of composite types (Taro Minowa (Higepon))
Make pg_dump --verbose output the pg_dump and server versions in text output mode (Jim Cox, Tom Lane)
These were already provided in custom output mode.
pg_restore now complains if any command-line arguments remain after the switches and optional file name (Tom Lane)
Previously, it silently ignored any such arguments.
E.34.3.8.3. pg_ctl
Allow pg_ctl to be used safely to start the postmaster during a system reboot (Tom Lane)
Previously, pg_ctl's parent process could have been mistakenly identified as a running postmaster based on a stale postmaster
lock file, resulting in a transient failure to start the database.
Give pg_ctl the ability to initialize the database (by invoking initdb) (Zdenek Kotala)
Add support for a per-user service file (.pg_service.conf), which is checked before the site-wide service file (Peter Eisentraut)
1481
Notes de version
Properly report an error if the specified libpq service cannot be found (Peter Eisentraut)
Add TCP keepalive settings in libpq (Tollef Fog Heen, Fujii Masao, Robert Haas)
Keepalive settings were already supported on the server end of TCP connections.
Avoid extra system calls to block and unblock SIGPIPE in libpq, on platforms that offer alternative methods (Jeremy Kerr)
When a .pgpass-supplied password fails, mention where the password came from in the error message (Bruce Momjian)
Load all SSL certificates given in the client certificate file (Tom Lane)
This improves support for indirectly-signed SSL certificates.
E.34.3.9.2. ecpg
Add an ECPGtransactionStatus function to return the current transaction status (Bernd Helmle)
Add the string data type in ecpg Informix-compatibility mode (Boszormenyi Zoltan)
Allow ecpg to use new and old variable names without restriction (Michael Meskes)
Make ecpg_dynamic_type() return zero for non-SQL3 data types (Michael Meskes)
Previously it returned the negative of the data type OID. This could be confused with valid type OIDs, however.
Support long long types on platforms that already have 64-bit long (Michael Meskes)
Allow ecpg to use noise words FROM and IN in FETCH and MOVE (Boszormenyi Zoltan)
Add support for controlling the Linux out-of-memory killer (Alex Hunsaker, Tom Lane)
Now that /proc/self/oom_adj allows disabling of the Linux out-of-memory (OOM) killer, it's recommendable to disable OOM kills for the postmaster. It may then be desirable to re-enable OOM kills for the postmaster's child processes. The
new compile-time option LINUX_OOM_ADJ allows the killer to be reactivated for child processes.
E.34.3.10.1. Makefiles
Add data and documentation installation location control to PGXS Makefiles (Mark Cave-Ayland)
Add Makefile rules to build the PostgreSQL documentation as a single HTML file or as a single plain-text file (Peter Eisentraut, Bruce Momjian)
E.34.3.10.2. Windows
1482
Notes de version
Support compiling on 64-bit Windows and running in 64-bit mode (Tsutomu Yamada, Magnus Hagander)
This allows for large shared memory sizes on Windows.
Distribute prebuilt documentation in a subdirectory tree, rather than as tar archive files inside the distribution tarball (Peter Eisentraut)
For example, the prebuilt HTML documentation is now in doc/src/sgml/html/; the manual pages are packaged similarly.
User-defined constraint triggers now have entries in pg_constraint as well as pg_trigger (Tom Lane)
Because of this change, pg_constraint.pgconstrname is now redundant and has been removed.
Add system catalog columns pg_constraint.conindid and pg_trigger.tgconstrindid to better document the use of indexes for constraint enforcement (Tom Lane)
Allow multiple conditions to be communicated to backends using a single operating system signal (Fujii Masao)
This allows new features to be added without a platform-specific constraint on the number of signal conditions.
Improve source code test coverage, including contrib, PL/Python, and PL/Perl (Peter Eisentraut, Andrew Dunstan)
Remove the use of flat files for system table bootstrapping (Tom Lane, Alvaro Herrera)
This improves performance when using many roles or databases, and eliminates some possible failure conditions.
Automatically generate the initial contents of pg_attribute for bootstrapped catalogs (John Naylor)
This greatly simplifies changes to these catalogs.
Reduce the lengths of some file names so that all file paths in the distribution tarball are less than 100 characters (Tom Lane)
Some decompression programs have problems with longer file paths.
With authors' permissions, remove the few remaining personal source code copyright notices (Bruce Momjian)
The personal copyright notices were insignificant but the community occasionally had to answer questions about them.
Add new documentation section about running PostgreSQL in non-durable mode to improve performance (Bruce Momjian)
Restructure the HTML documentation Makefile rules to make their dependency checks work correctly, avoiding unnecessary rebuilds (Peter Eisentraut)
Use DocBook XSL stylesheets for man page building, rather than Docbook2X (Peter Eisentraut)
This changes the set of tools needed to build the man pages.
Note that these requirements do not apply when building from a distribution tarball, since tarballs include the files that these programs are used to build.
1483
Notes de version
Require Flex 2.5.31 or later to build from a CVS checkout (Tom Lane)
Require Perl version 5.8 or later to build from a CVS checkout (John Naylor, Andrew Dunstan)
E.34.3.11.2. Portability
Allow non-GCC compilers to use inline functions if they support them (Kurt Harriman)
Remove support for platforms that don't have a working 64-bit integer data type (Tom Lane)
Make backend header files safe to include in C++ (Kurt Harriman, Peter Eisentraut)
These changes remove keyword conflicts that previously made C++ usage difficult in backend code. However, there are still
other complexities when using C++ for backend functions. extern "C" { } is still necessary in appropriate places, and
memory management and error handling are still problematic.
Add AggCheckCallContext() for use in detecting if a C function is being called as an aggregate (Hitoshi Harada)
Change calling convention for SearchSysCache() and related functions to avoid hard-wiring the maximum number of
cache keys (Robert Haas)
Existing calls will still work for the moment, but can be expected to break in 9.1 or later if not converted to the new style.
Require calls of fastgetattr() and heap_getattr() backend macros to provide a non-NULL fourth argument
(Robert Haas)
Custom typanalyze functions should no longer rely on VacAttrStats.attr to determine the type of data they will be passed
(Tom Lane)
This was changed to allow collection of statistics on index columns for which the storage type is different from the underlying
column data type. There are new fields that tell the actual datatype being analyzed.
Add parser hooks for processing ColumnRef and ParamRef nodes (Tom Lane)
Add a ProcessUtility hook so loadable modules can control utility commands (Itagaki Takahiro)
Add support for preserving relation relfilenode values during binary upgrades (Bruce Momjian)
Add support for preserving pg_type and pg_enum OIDs during binary upgrades (Bruce Momjian)
Move data files within tablespaces into PostgreSQL-version-specific subdirectories (Bruce Momjian)
This simplifies binary upgrades.
E.34.3.12. Contrib
1484
Notes de version
Greatly increase contrib/hstore's data length limit, and add B-tree and hash support so GROUP BY and DISTINCT
operations are possible on hstore columns (Andrew Gierth)
New functions and operators were also added. These improvements make hstore a full-function key-value store embedded in
PostgreSQL.
E.35.2. Changes
Correctly initialize padding bytes in contrib/btree_gist indexes on bit columns (Heikki Linnakangas)
This error could result in incorrect query results due to values that should compare equal not being seen as equal. Users with
1485
Notes de version
GiST indexes on bit or bit varying columns should REINDEX those indexes after installing this update.
Protect against torn pages when deleting GIN list pages (Heikki Linnakangas)
This fix prevents possible index corruption if a system crash occurs while the page update is being written to disk.
Fix possibly-incorrect cache invalidation during nested calls to ReceiveSharedInvalidMessages (Andres Freund)
Don't assume a subquery's output is unique if there's a set-returning function in its targetlist (David Rowley)
This oversight could lead to misoptimization of constructs like WHERE x IN (SELECT y, generate_series(1,10) FROM t GROUP BY y).
Fix failure to detoast fields in composite elements of structured types (Tom Lane)
This corrects cases where TOAST pointers could be copied into other tables without being dereferenced. If the original data is
later deleted, it would lead to errors like missing chunk number 0 for toast value ... when the now-dangling pointer is used.
Fix record type has not been registered failures with whole-row references to the output of Append plan nodes (Tom Lane)
Fix possible crash when invoking a user-defined function while rewinding a cursor (Tom Lane)
Fix query-lifespan memory leak while evaluating the arguments for a function in FROM (Tom Lane)
Fix session-lifespan memory leaks in regular-expression processing (Tom Lane, Arthur O'Dwyer, Greg Stark)
Fix liveness checks for rows that were inserted in the current transaction and then deleted by a now-rolled-back subtransaction
(Andres Freund)
This could cause problems (at least spurious warnings, and at worst an infinite loop) if CREATE INDEX or CLUSTER were
done later in the same transaction.
Fix REASSIGN OWNED to not fail for text search objects (lvaro Herrera)
Secure Unix-domain sockets of temporary postmasters started during make check (Noah Misch)
Any local user able to access the socket file could connect as the server's bootstrap superuser, then proceed to execute arbitrary
code as the operating-system user running the test, as we previously noted in CVE-2014-0067. This change defends against
that risk by placing the server's socket in a temporary, mode 0700 subdirectory of /tmp. The hazard remains however on platforms where Unix sockets are not supported, notably Windows, because then the temporary postmaster must accept local TCP
connections.
A useful side effect of this change is to simplify make check testing in builds that override DEFAULT_PGSOCKET_DIR.
Popular non-default values like /var/run/postgresql are often not writable by the build user, requiring workarounds
that will no longer be necessary.
On Windows, allow new sessions to absorb values of PGC_BACKEND parameters (such as log_connections) from the configuration file (Amit Kapila)
Previously, if such a parameter were changed in the file post-startup, the change would have no effect.
Avoid buffer bloat in libpq when the server consistently sends data faster than the client can absorb it (Shin-ichi Morita, Tom
Lane)
libpq could be coerced into enlarging its input buffer until it runs out of memory (which would be reported misleadingly as
1486
Notes de version
lost synchronization with server ). Under ordinary circumstances it's quite far-fetched that data could be continuously transmitted more quickly than the recv() loop can absorb it, but this has been observed when the client is artificially slowed by
scheduler constraints.
Ensure that LDAP lookup attempts in libpq time out as intended (Laurenz Albe)
In contrib/pgcrypto functions, ensure sensitive information is cleared from stack variables before returning (Marko
Kreen)
In contrib/uuid-ossp, cache the state of the OSSP UUID library across calls (Tom Lane)
This improves the efficiency of UUID generation and reduces the amount of entropy drawn from /dev/urandom, on platforms that have that.
Update time zone data files to tzdata release 2014e for DST law changes in Crimea, Egypt, and Morocco.
E.36.2. Changes
Allow regular-expression operators to be terminated early by query cancel requests (Tom Lane)
This prevents scenarios wherein a pathological regular expression could lock up a server process uninterruptably for a long
time.
Remove incorrect code that tried to allow OVERLAPS with single-element row arguments (Joshua Yanovski)
This code never worked correctly, and since the case is neither specified by the SQL standard nor documented, it seemed better to remove it than fix it.
Avoid getting more than AccessShareLock when de-parsing a rule or view (Dean Rasheed)
This oversight resulted in pg_dump unexpectedly acquiring RowExclusiveLock locks on tables mentioned as the targets
of INSERT/UPDATE/DELETE commands in rules. While usually harmless, that could interfere with concurrent transactions
that tried to acquire, for example, ShareLock on those tables.
Update time zone data files to tzdata release 2014a for DST law changes in Fiji and Turkey, plus historical changes in Israel
and Ukraine.
1487
Notes de version
E.37.2. Changes
Prevent privilege escalation via manual calls to PL validator functions (Andres Freund)
The primary role of PL validator functions is to be called implicitly during CREATE FUNCTION, but they are also normal
SQL functions that a user can call explicitly. Calling a validator on a function actually written in some other language was not
checked for and could be exploited for privilege-escalation purposes. The fix involves adding a call to a privilege-checking
function in each validator function. Non-core procedural languages will also need to make this change to their own validator
functions, if any. (CVE-2014-0061)
Avoid multiple name lookups during table and index DDL (Robert Haas, Andres Freund)
If the name lookups come to different conclusions due to concurrent activity, we might perform some parts of the DDL on a
different table than other parts. At least in the case of CREATE INDEX, this can be used to cause the permissions checks to
be performed against a different table than the index creation, allowing for a privilege escalation attack. (CVE-2014-0062)
Prevent buffer overrun due to integer overflow in size calculations (Noah Misch, Heikki Linnakangas)
Several functions, mostly type input functions, calculated an allocation size without checking for overflow. If overflow did occur, a too-small buffer would be allocated and then written past. (CVE-2014-0064)
Document risks of make check in the regression testing instructions (Noah Misch, Tom Lane)
1488
Notes de version
Since the temporary server started by make check uses trust authentication, another user on the same machine could
connect to it as database superuser, and then potentially exploit the privileges of the operating-system user who started the
tests. A future release will probably incorporate changes in the testing procedure to prevent this risk, but some public discussion is needed first. So for the moment, just warn people against using make check when there are untrusted users on the
same machine. (CVE-2014-0067)
Fix possible mis-replay of WAL records when some segments of a relation aren't full size (Greg Stark, Tom Lane)
The WAL update could be applied to the wrong page, potentially many pages past where it should have been. Aside from corrupting data, this error has been observed to result in significant bloat of standby servers compared to their masters, due to
updates being applied far beyond where the end-of-file should have been. This failure mode does not appear to be a significant
risk during crash recovery, only when initially synchronizing a standby created from a base backup taken from a quicklychanging master.
Ensure that insertions into non-leaf GIN index pages write a full-page WAL record when appropriate (Heikki Linnakangas)
The previous coding risked index corruption in the event of a partial-page write during a system crash.
Fix unsafe references to errno within error reporting logic (Christian Kruse)
This would typically lead to odd behaviors such as missing or inappropriate HINT fields.
Fix possible crashes from using ereport() too early during server startup (Tom Lane)
The principal case we've seen in the field is a crash if the server is started in a directory it doesn't have permission to read.
Clear retry flags properly in OpenSSL socket write function (Alexander Kukushkin)
This omission could result in a server lockup after unexpected loss of an SSL-encrypted connection.
Fix length checking for Unicode identifiers (U&"..." syntax) containing escapes (Tom Lane)
A spurious truncation warning would be printed for such identifiers if the escaped form of the identifier was too long, but the
identifier actually didn't need truncation after de-escaping.
Fix possible crash due to invalid plan for nested sub-selects, such as WHERE (... x IN (SELECT ...) ...) IN
(SELECT ...) (Tom Lane)
Ensure that ANALYZE creates statistics for a table column even when all the values in it are too wide (Tom Lane)
ANALYZE intentionally omits very wide values from its histogram and most-common-values calculations, but it neglected to
do something sane in the case that all the sampled entries are too wide.
In ALTER TABLE ... SET TABLESPACE, allow the database's default tablespace to be used without a permissions
check (Stephen Frost)
CREATE TABLE has always allowed such usage, but ALTER TABLE didn't get the memo.
Fix cannot accept a set error when some arms of a CASE return a set and others don't (Tom Lane)
Fix checks for all-zero client addresses in pgstat functions (Kevin Grittner)
Fix possible misclassification of multibyte characters by the text search parser (Tom Lane)
Non-ASCII characters could be misclassified when using C locale with a multibyte encoding. On Cygwin, non-C locales could
fail as well.
Accept SHIFT_JIS as an encoding name for locale checking purposes (Tatsuo Ishii)
Improve error handling in libpq and psql for failures during COPY TO STDOUT/FROM STDIN (Tom Lane)
In particular this fixes an infinite loop that could occur in 9.2 and up if the server connection was lost during COPY FROM
1489
Notes de version
STDIN. Variants of that scenario might be possible in older versions, or with other client applications.
In ecpg, handle lack of a hostname in the connection parameters properly (Michael Meskes)
In contrib/isn, fix incorrect calculation of the check digit for ISMN values (Fabien Coelho)
In Mingw and Cygwin builds, install the libpq DLL in the bin directory (Andrew Dunstan)
This duplicates what the MSVC build has long done. It should fix problems with programs like psql failing to start because
they can't find the DLL.
Don't generate plain-text HISTORY and src/test/regress/README files anymore (Tom Lane)
These text files duplicated the main HTML and PDF documentation formats. The trouble involved in maintaining them greatly
outweighs the likely audience for plain-text format. Distribution tarballs will still contain files by these names, but they'll just
be stubs directing the reader to consult the main documentation. The plain-text INSTALL file will still be maintained, as there
is arguably a use-case for that.
Update time zone data files to tzdata release 2013i for DST law changes in Jordan and historical changes in Cuba.
In addition, the zones Asia/Riyadh87, Asia/Riyadh88, and Asia/Riyadh89 have been removed, as they are no longer maintained by IANA, and never represented actual civil timekeeping practice.
E.38.2. Changes
Fix VACUUM's tests to see whether it can update relfrozenxid (Andres Freund)
In some cases VACUUM (either manual or autovacuum) could incorrectly advance a table's relfrozenxid value, allowing
tuples to escape freezing, causing those rows to become invisible once 2^31 transactions have elapsed. The probability of data
loss is fairly low since multiple incorrect advancements would need to happen before actual loss occurs, but it's not zero. Users
upgrading from release 8.4.8 or earlier are not affected, but all later versions contain the bug.
The issue can be ameliorated by, after upgrading, vacuuming all tables in all databases while having vacuum_freeze_table_age set to zero. This will fix any latent corruption but will not be able to fix all pre-existing data
errors. However, an installation can be presumed safe after performing this vacuuming if it has executed fewer than 2^31 update transactions in its lifetime (check this with SELECT txid_current() < 2^31).
Fix race condition in GIN index posting tree page deletion (Heikki Linnakangas)
This could lead to transient wrong answers or query failures.
Avoid flattening a subquery whose SELECT list contains a volatile function wrapped inside a sub-SELECT (Tom Lane)
This avoids unexpected results due to extra evaluations of the volatile function.
1490
Notes de version
Fix planner's processing of non-simple-variable subquery outputs nested within outer joins (Tom Lane)
This error could lead to incorrect plans for queries involving multiple levels of subqueries within JOIN syntax.
Fix possible read past end of memory in rule printing (Peter Eisentraut)
Fix incorrect behaviors when using a SQL-standard, simple GMT offset timezone (Tom Lane)
In some cases, the system would use the simple GMT offset value when it should have used the regular timezone setting that
had prevailed before the simple offset was selected. This change also causes the timeofday function to honor the simple
GMT offset zone.
Prevent possible misbehavior when logging translations of Windows error codes (Tom Lane)
Properly quote generated command lines in pg_ctl (Naoya Anzai and Tom Lane)
This fix applies only to Windows.
Fix pg_dumpall to work when a source database sets default_transaction_read_only via ALTER DATABASE
SET (Kevin Grittner)
Previously, the generated script would fail during restore.
Update time zone data files to tzdata release 2013h for DST law changes in Argentina, Brazil, Jordan, Libya, Liechtenstein,
Morocco, and Palestine. Also, new timezone abbreviations WIB, WIT, WITA for Indonesia.
E.39.2. Changes
Prevent corruption of multi-byte characters when attempting to case-fold identifiers (Andrew Dunstan)
PostgreSQL case-folds non-ASCII characters only when using a single-byte server encoding.
Fix memory overcommit bug when work_mem is using more than 24GB of memory (Stephen Frost)
Properly compute row estimates for boolean columns containing many NULL values (Andrew Gierth)
Previously tests like col IS NOT TRUE and col IS NOT FALSE did not properly factor in NULL values when estimating plan costs.
Prevent pushing down WHERE clauses into unsafe UNION/INTERSECT subqueries (Tom Lane)
Subqueries of a UNION or INTERSECT that contain set-returning functions or volatile functions in their SELECT lists could
1491
Notes de version
Fix rare case of failed to locate grouping columns planner failure (Tom Lane)
Improve view dumping code's handling of dropped columns in referenced tables (Tom Lane)
Fix possible deadlock during concurrent CREATE INDEX CONCURRENTLY operations (Tom Lane)
Fix regular expression match failures for back references combined with non-greedy quantifiers (Jeevan Chalke)
Prevent CREATE FUNCTION from checking SET variables unless function body checking is enabled (Tom Lane)
Fix pgp_pub_decrypt() so it works for secret keys with passwords (Marko Kreen)
Remove rare inaccurate warning during vacuum of index-less tables (Heikki Linnakangas)
Avoid possible failure when performing transaction control commands (e.g ROLLBACK) in prepared queries (Tom Lane)
Ensure that floating-point data input accepts standard spellings of infinity on all platforms (Tom Lane)
The C99 standard says that allowable spellings are inf, +inf, -inf, infinity, +infinity, and -infinity. Make
sure we recognize these even if the platform's strtod function doesn't.
Expand ability to compare rows to records and arrays (Rafal Rzepecki, Tom Lane)
Update time zone data files to tzdata release 2013d for DST law changes in Israel, Morocco, Palestine, and Paraguay. Also,
historical zone data corrections for Macquarie Island.
E.40.2. Changes
Reset OpenSSL randomness state in each postmaster child process (Marko Kreen)
This avoids a scenario wherein random numbers generated by contrib/pgcrypto functions might be relatively easy for
another database user to guess. The risk is only significant when the postmaster is configured with ssl = on but most connections don't use SSL encryption. (CVE-2013-1900)
Fix GiST indexes to not use fuzzy geometric comparisons when it's not appropriate to do so (Alexander Korotkov)
The core geometric types perform comparisons using fuzzy equality, but gist_box_same must do exact comparisons,
else GiST indexes using it might become inconsistent. After installing this update, users should REINDEX any GiST indexes
on box, polygon, circle, or point columns, since all of these use gist_box_same.
Fix erroneous range-union and penalty logic in GiST indexes that use contrib/btree_gist for variable-width data
types, that is text, bytea, bit, and numeric columns (Tom Lane)
These errors could result in inconsistent indexes in which some keys that are present would not be found by searches, and also
in useless index bloat. Users are advised to REINDEX such indexes after installing this update.
1492
Notes de version
Fix bugs in GiST page splitting code for multi-column indexes (Tom Lane)
These errors could result in inconsistent indexes in which some keys that are present would not be found by searches, and also
in indexes that are unnecessarily inefficient to search. Users are advised to REINDEX multi-column GiST indexes after installing this update.
Fix infinite-loop risk in regular expression compilation (Tom Lane, Don Porter)
Fix to_char() to use ASCII-only case-folding rules where appropriate (Tom Lane)
This fixes misbehavior of some template patterns that should be locale-independent, but mishandled I and i in Turkish
locales.
Remove useless picksplit doesn't support secondary split log messages (Josh Hansen, Tom Lane)
This message seems to have been added in expectation of code that was never written, and probably never will be, since
GiST's default handling of secondary splits is actually pretty good. So stop nagging end users about it.
Fix possible failure to send a session's last few transaction commit/abort counts to the statistics collector (Tom Lane)
Eliminate memory leaks in PL/Perl's spi_prepare() function (Alex Hunsaker, Tom Lane)
Avoid crash in pg_dump when an incorrect connection string is given (Heikki Linnakangas)
Fix contrib/pg_trgm's similarity() function to return zero for trigram-less strings (Tom Lane)
Previously it returned NaN due to internal division by zero.
Update time zone data files to tzdata release 2013b for DST law changes in Chile, Haiti, Morocco, Paraguay, and some Russian areas. Also, historical zone data corrections for numerous places.
Also, update the time zone abbreviation files for recent changes in Russia and elsewhere: CHOT, GET, IRKT, KGT, KRAT,
MAGT, MAWT, MSK, NOVT, OMST, TKT, VLAT, WST, YAKT, YEKT now follow their current meanings, and VOLT
(Europe/Volgograd) and MIST (Antarctica/Macquarie) are added to the default abbreviations list.
E.41.2. Changes
Notes de version
Update minimum recovery point when truncating a relation file (Heikki Linnakangas)
Once data has been discarded, it's no longer safe to stop recovery at an earlier point in the timeline.
Fix SQL grammar to allow subscripting or field selection from a sub-SELECT result (Tom Lane)
Protect against race conditions when scanning pg_tablespace (Stephen Frost, Tom Lane)
CREATE DATABASE and DROP DATABASE could misbehave if there were concurrent updates of pg_tablespace entries.
Prevent DROP OWNED from trying to drop whole databases or tablespaces (lvaro Herrera)
For safety, ownership of these objects must be reassigned, not dropped.
Prevent misbehavior when a RowExpr or XmlExpr is parse-analyzed twice (Andres Freund, Tom Lane)
This mistake could be user-visible in contexts such as CREATE TABLE LIKE INCLUDING INDEXES.
Improve defenses against integer overflow in hashtable sizing calculations (Jeff Davis)
Ensure that non-ASCII prompt strings are translated to the correct code page on Windows (Alexander Law, Noah Misch)
This bug affected psql and some other client programs.
Fix possible crash in psql's \? command when not connected to a database (Meng Qingzhong)
Rearrange configure's tests for supplied functions so it is not fooled by bogus exports from libedit/libreadline (Christoph Berg)
Make pgxs build executables with the right .exe suffix when cross-compiling for Windows (Zoltan Boszormenyi)
E.42.2. Changes
Fix multiple bugs associated with CREATE INDEX CONCURRENTLY (Andres Freund, Tom Lane)
Fix CREATE INDEX CONCURRENTLY to use in-place updates when changing the state of an index's pg_index row. This
prevents race conditions that could cause concurrent sessions to miss updating the target index, thus resulting in corrupt
1494
Notes de version
concurrently-created indexes.
Also, fix various other operations to ensure that they ignore invalid indexes resulting from a failed CREATE INDEX
CONCURRENTLY command. The most important of these is VACUUM, because an auto-vacuum could easily be launched
on the table before corrective action can be taken to fix or remove the invalid index.
Avoid corruption of internal hash tables when out of memory (Hitoshi Harada)
Fix planning of non-strict equivalence clauses above outer joins (Tom Lane)
The planner could derive incorrect constraints from a clause equating a non-strict construct to something else, for example
WHERE COALESCE(foo, 0) = 0 when foo is coming from the nullable side of an outer join.
Improve planner's ability to prove exclusion constraints from equivalence classes (Tom Lane)
Fix partial-row matching in hashed subplans to handle cross-type cases correctly (Tom Lane)
This affects multicolumn NOT IN subplans, such as WHERE (a, b) NOT IN (SELECT x, y FROM ...) when for
instance b and y are int4 and int8 respectively. This mistake led to wrong answers or crashes depending on the specific datatypes involved.
Acquire buffer lock when re-fetching the old tuple for an AFTER ROW UPDATE/DELETE trigger (Andres Freund)
In very unusual circumstances, this oversight could result in passing incorrect data to the precheck logic for a foreign-key enforcement trigger. That could result in a crash, or in an incorrect decision about whether to fire the trigger.
Fix ALTER COLUMN TYPE to handle alled check constraints properly (Pavan Deolasee)
This worked correctly in pre-8.4 releases, and now works correctly in 8.4 and later.
Ignore incorrect pg_attribute entries for system columns for views (Tom Lane)
Views do not have any system columns. However, we forgot to remove such entries when converting a table to a view. That's
fixed properly for 9.3 and later, but in previous branches we need to defend against existing mis-converted views.
Fix rule printing to dump INSERT INTO table DEFAULT VALUES correctly (Tom Lane)
Guard against stack overflow when there are too many UNION/INTERSECT/EXCEPT clauses in a query (Tom Lane)
Prevent platform-dependent failures when dividing the minimum possible integer value by -1 (Xi Wang, Tom Lane)
Fix possible access past end of string in date parsing (Hitoshi Harada)
Produce an understandable error message if the length of the path name for a Unix-domain socket exceeds the platform-specific limit (Tom Lane, Andrew Dunstan)
Formerly, this would result in something quite unhelpful, such as Non-recoverable failure in name resolution .
Fix memory leaks when sending composite column values to the client (Tom Lane)
Make pg_ctl more robust about reading the postmaster.pid file (Heikki Linnakangas)
Fix race conditions and possible file descriptor leakage.
Fix possible crash in psql if incorrectly-encoded data is presented and the client_encoding setting is a client-only encoding, such as SJIS (Jiang Guiqing)
Fix bugs in the restore.sql script emitted by pg_dump in tar output format (Tom Lane)
The script would fail outright on tables whose names include upper-case characters. Also, make the script capable of restoring
data in --inserts mode as well as the regular COPY mode.
Fix pg_restore to accept POSIX-conformant tar files (Brian Weaver, Tom Lane)
The original coding of pg_dump's tar output mode produced files that are not fully conformant with the POSIX standard.
This has been corrected for version 9.3. This patch updates previous branches so that they will accept both the incorrect and
the corrected formats, in hopes of avoiding compatibility problems when 9.3 comes out.
Fix pg_resetxlog to locate postmaster.pid correctly when given a relative path to the data directory (Tom Lane)
This mistake could lead to pg_resetxlog not noticing that there is an active postmaster using the data directory.
Fix libpq's lo_import() and lo_export() functions to report file I/O errors properly (Tom Lane)
Notes de version
Make contrib/pageinspect's btree page inspection functions take buffer locks while examining pages (Tom Lane)
Fix pgxs support for building loadable modules on AIX (Tom Lane)
Building modules outside the original source tree didn't work on AIX.
Update time zone data files to tzdata release 2012j for DST law changes in Cuba, Israel, Jordan, Libya, Palestine, Western Samoa, and portions of Brazil.
E.43.2. Changes
Fix planner's assignment of executor parameters, and fix executor's rescan logic for CTE plan nodes (Tom Lane)
These errors could result in wrong answers from queries that scan the same WITH subquery multiple times.
Improve page-splitting decisions in GiST indexes (Alexander Korotkov, Robert Haas, Tom Lane)
Multi-column GiST indexes might suffer unexpected bloat due to this error.
Fix cascading privilege revoke to stop if privileges are still held (Tom Lane)
If we revoke a grant option from some role X, but X still holds that option via a grant from someone else, we should not recursively revoke the corresponding privilege from role(s) Y that X had granted it to.
Prevent PL/Perl from crashing if a recursive PL/Perl function is redefined while being executed (Tom Lane)
Update time zone data files to tzdata release 2012f for DST law changes in Fiji
Notes de version
E.44.2. Changes
Prevent access to external files/URLs via XML entity references (Noah Misch, Tom Lane)
xml_parse() would attempt to fetch external files or URLs as needed to resolve DTD and entity references in an XML value, thus allowing unprivileged database users to attempt to fetch data with the privileges of the database server. While the external data wouldn't get returned directly to the user, portions of it could be exposed in error messages if the data didn't parse
as valid XML; and in any case the mere ability to check existence of a file might be useful to an attacker. (CVE-2012-3489)
Back-patch 9.1 improvement to compress the fsync request queue (Robert Haas)
This improves performance during checkpoints. The 9.1 change has now seen enough field testing to seem safe to back-patch.
Fix log collector so that log_truncate_on_rotation works during the very first log rotation after server start (Tom
Lane)
Ensure that a whole-row reference to a subquery doesn't include any extra GROUP BY or ORDER BY columns (Tom Lane)
Disallow copying whole-row references in CHECK constraints and index definitions during CREATE TABLE (Tom Lane)
This situation can arise in CREATE TABLE with LIKE or INHERITS. The copied whole-row variable was incorrectly labeled with the row type of the original table not the new one. Rejecting the case seems reasonable for LIKE, since the row types
might well diverge later. For INHERITS we should ideally allow it, with an implicit coercion to the parent table's row type;
but that will require more work than seems safe to back-patch.
Fix memory leak in ARRAY(SELECT ...) subqueries (Heikki Linnakangas, Tom Lane)
Fix bugs with parsing signed hh:mm and hh:mm:ss fields in interval constants (Amit Kapila, Tom Lane)
Update time zone data files to tzdata release 2012e for DST law changes in Morocco and Tokelau
1497
Notes de version
E.45.2. Changes
Fix incorrect password transformation in contrib/pgcrypto's DES crypt() function (Solar Designer)
If a password string contained the byte value 0x80, the remainder of the password was ignored, causing the password to be
much weaker than it appeared. With this fix, the rest of the string is properly included in the DES hash. Any stored password
values that are affected by this bug will thus no longer match, so the stored values may need to be updated. (CVE-2012-2143)
Ignore SECURITY DEFINER and SET attributes for a procedural language's call handler (Tom Lane)
Applying such attributes to a call handler could crash the server. (CVE-2012-2655)
Allow numeric timezone offsets in timestamp input to be up to 16 hours away from UTC (Tom Lane)
Some historical time zones have offsets larger than 15 hours, the previous limit. This could result in dumped data values being
rejected during reload.
Fix timestamp conversion to cope when the given time is exactly the last DST transition time for the current timezone (Tom
Lane)
This oversight has been there a long time, but was not noticed previously because most DST-using zones are presumed to have
an indefinite sequence of future DST transitions.
Fix text to name and char to name casts to perform string truncation correctly in multibyte encodings (Karl Schnaitter)
Fix slow session startup when pg_attribute is very large (Tom Lane)
If pg_attribute exceeds one-fourth of shared_buffers, cache rebuilding code that is sometimes needed during session
start would trigger the synchronized-scan logic, causing it to take many times longer than normal. The problem was particularly acute if many new sessions were starting at once.
Ensure sequential scans check for query cancel reasonably often (Merlin Moncure)
A scan encountering many consecutive pages that contain no live tuples would not respond to interrupts meanwhile.
Ensure the Windows implementation of PGSemaphoreLock() clears ImmediateInterruptOK before returning (Tom
Lane)
This oversight meant that a query-cancel interrupt received later in the same query could be accepted at an unsafe time, with
unpredictable but not good consequences.
Show whole-row variables safely when printing views or rules (Abbas Butt, Tom Lane)
Corner cases involving ambiguous names (that is, the name could be either a table or column name of the query) were printed
in an ambiguous way, risking that the view or rule would be interpreted differently after dump and reload. Avoid the ambiguous case by attaching a no-op cast.
1498
Notes de version
Fix COPY FROM to properly handle null marker strings that correspond to invalid encoding (Tom Lane)
A null marker string such as E'\\0' should work, and did work in the past, but the case got broken in 8.4.
Ensure autovacuum worker processes perform stack depth checking properly (Heikki Linnakangas)
Previously, infinite recursion in a function invoked by auto-ANALYZE could crash worker processes.
Fix logging collector to not lose log coherency under high load (Andrew Dunstan)
The collector previously could fail to reassemble large messages if it got too busy.
Fix logging collector to ensure it will restart file rotation after receiving SIGHUP (Tom Lane)
Fix WAL replay logic for GIN indexes to not fail if the index was subsequently dropped (Tom Lane)
Fix PL/pgSQL's GET DIAGNOSTICS command when the target is the function's first variable (Tom Lane)
Fix potential access off the end of memory in psql's expanded display (\x) mode (Peter Eisentraut)
Fix several performance problems in pg_dump when the database contains many objects (Jeff Janes, Tom Lane)
pg_dump could get very slow if the database contained many schemas, or if many objects are in dependency loops, or if there
are many owned sequences.
Fix contrib/dblink's dblink_exec() to not leak temporary database connections upon error (Tom Lane)
Fix contrib/dblink to report the correct connection name in error messages (Kyotaro Horiguchi)
Update time zone data files to tzdata release 2012c for DST law changes in Antarctica, Armenia, Chile, Cuba, Falkland Islands, Gaza, Haiti, Hebron, Morocco, Syria, and Tokelau Islands; also historical corrections for Canada.
E.46.2. Changes
Require execute permission on the trigger function for CREATE TRIGGER (Robert Haas)
This missing check could allow another user to execute a trigger function with forged input data, by installing it on a table he
owns. This is only of significance for trigger functions marked SECURITY DEFINER, since otherwise trigger functions run
as the table owner anyway. (CVE-2012-0866)
Remove arbitrary limitation on length of common name in SSL certificates (Heikki Linnakangas)
Both libpq and the server truncated the common name extracted from an SSL certificate at 32 bytes. Normally this would
cause nothing worse than an unexpected verification failure, but there are some rather-implausible scenarios in which it might
allow one certificate holder to impersonate another. The victim would have to have a common name exactly 32 bytes long, and
the attacker would have to persuade a trusted CA to issue a certificate in which the common name has that string as a prefix.
Impersonating a server would also require some additional exploit to redirect client connections. (CVE-2012-0867)
Notes de version
Fix btree index corruption from insertions concurrent with vacuuming (Tom Lane)
An index page split caused by an insertion could sometimes cause a concurrently-running VACUUM to miss removing index
entries that it should remove. After the corresponding table rows are removed, the dangling index entries would cause errors
(such as could not read block N in file ... ) or worse, silently wrong query results after unrelated rows are re-inserted at the
now-free table locations. This bug has been present since release 8.2, but occurs so infrequently that it was not diagnosed until
now. If you have reason to suspect that it has happened in your database, reindexing the affected index will fix things.
Update per-column permissions, not only per-table permissions, when changing table owner (Tom Lane)
Failure to do this meant that any previously granted column permissions were still shown as having been granted by the old
owner. This meant that neither the new owner nor a superuser could revoke the now-untraceable-to-table-owner permissions.
Allow non-existent values for some settings in ALTER USER/DATABASE SET (Heikki Linnakangas)
Allow default_text_search_config, default_tablespace, and temp_tablespaces to be set to names that
are not known. This is because they might be known in another database where the setting is intended to be used, or for the tablespace cases because the tablespace might not be created yet. The same issue was previously recognized for
search_path, and these settings now act like that one.
Avoid crashing when we have problems deleting table files post-commit (Tom Lane)
Dropping a table should lead to deleting the underlying disk files only after the transaction commits. In event of failure then
(for instance, because of wrong file permissions) the code is supposed to just emit a warning message and go on, since it's too
late to abort the transaction. This logic got broken as of release 8.4, causing such situations to result in a PANIC and an unrestartable database.
Track the OID counter correctly during WAL replay, even when it wraps around (Tom Lane)
Previously the OID counter would remain stuck at a high value until the system exited replay mode. The practical consequences of that are usually nil, but there are scenarios wherein a standby server that's been promoted to master might take a
long time to advance the OID counter to a reasonable value once values are needed.
Fix dangling pointer after CREATE TABLE AS/SELECT INTO in a SQL-language function (Tom Lane)
In most cases this only led to an assertion failure in assert-enabled builds, but worse consequences seem possible.
Fix I/O-conversion-related memory leaks in plpgsql (Andres Freund, Jan Urbanski, Tom Lane)
Certain operations would leak memory until the end of the current function.
Fix pg_restore's direct-to-database mode for INSERT-style table data (Tom Lane)
Direct-to-database restores from archive files made with --inserts or --column-inserts options fail when using
pg_restore from a release dated September or December 2011, as a result of an oversight in a fix for another problem. The archive file itself is not at fault, and text-mode output is okay.
Notes de version
case.
Use -fexcess-precision=standard option when building with gcc versions that accept it (Andrew Dunstan)
This prevents assorted scenarios wherein recent versions of gcc will produce creative results.
E.47.2. Changes
Fix incorrect replay of WAL records for GIN index updates (Tom Lane)
This could result in transiently failing to find index entries after a crash, or on a hot-standby server. The problem would be repaired by the next VACUUM of the index, however.
1501
Notes de version
Fix TOAST-related data corruption during CREATE TABLE dest AS SELECT * FROM src or INSERT INTO
dest SELECT * FROM src (Tom Lane)
If a table has been modified by ALTER TABLE ADD COLUMN, attempts to copy its data verbatim to another table could
produce corrupt results in certain corner cases. The problem can only manifest in this precise form in 8.4 and later, but we patched earlier versions as well in case there are other code paths that could trigger the same bug.
Fix race condition during toast table access from stale syscache entries (Tom Lane)
The typical symptom was transient errors like missing chunk number 0 for toast value NNNNN in pg_toast_2619 , where
the cited toast table would always belong to a system catalog.
Track dependencies of functions on items used in parameter default expressions (Tom Lane)
Previously, a referenced object could be dropped without having dropped or modified the function, leading to misbehavior
when the function was used. Note that merely installing this update will not fix the missing dependency entries; to do that,
you'd need to CREATE OR REPLACE each such function afterwards. If you have functions whose defaults depend on nonbuilt-in objects, doing so is recommended.
Allow inlining of set-returning SQL functions with multiple OUT parameters (Tom Lane)
Make DatumGetInetP() unpack inet datums that have a 1-byte header, and add a new macro, DatumGetInetPP(),
that does not (Heikki Linnakangas)
This change affects no core code, but might prevent crashes in add-on code that expects DatumGetInetP() to produce an
unpacked datum as per usual convention.
Improve locale support in money type's input and output (Tom Lane)
Aside from not supporting all standard lc_monetary formatting options, the input and output functions were inconsistent,
meaning there were locales in which dumped money values could not be re-read.
Don't let transform_null_equals affect CASE foo WHEN NULL ... constructs (Heikki Linnakangas)
transform_null_equals is only supposed to affect foo = NULL expressions written directly by the user, not equality
checks generated internally by this form of CASE.
Change foreign-key trigger creation order to better support self-referential foreign keys (Tom Lane)
For a cascading foreign key that references its own table, a row update will fire both the ON UPDATE trigger and the CHECK
trigger as one event. The ON UPDATE trigger must execute first, else the CHECK will check a non-final state of the row and
possibly throw an inappropriate error. However, the firing order of these triggers is determined by their names, which generally sort in creation order since the triggers have auto-generated names following the convention
RI_ConstraintTrigger_NNNN . A proper fix would require modifying that convention, which we will do in 9.2, but it
seems risky to change it in existing releases. So this patch just changes the creation order of the triggers. Users encountering
this type of error should drop and re-create the foreign key constraint to get its triggers into the right order.
Avoid floating-point underflow while tracking buffer allocation rate (Greg Matthews)
While harmless in itself, on certain platforms this would result in annoying kernel log messages.
Preserve configuration file name and line number values when starting child processes under Windows (Tom Lane)
Formerly, these would not be displayed correctly in the pg_settings view.
Preserve blank lines within commands in psql's command history (Robert Haas)
The former behavior could cause problems if an empty line was removed from within a string literal, for example.
Fix pg_dump to dump user-defined casts between auto-generated types, such as table rowtypes (Tom Lane)
Use the preferred version of xsubpp to build PL/Perl, not necessarily the operating system's main copy (David Wheeler and
Alex Hunsaker)
Ensure VPATH builds properly install all server header files (Peter Eisentraut)
Notes de version
Fix interpretation of Windows timezone names for Central America (Tom Lane)
Map Central America Standard Time to CST6, not CST6CDT, because DST is generally not observed anywhere in Central
America.
Update time zone data files to tzdata release 2011n for DST law changes in Brazil, Cuba, Fiji, Palestine, Russia, and Samoa;
also historical corrections for Alaska and British East Africa.
E.48.2. Changes
Fix multiple bugs in GiST index page split processing (Heikki Linnakangas)
The probability of occurrence was low, but these could lead to index corruption.
Make pg_options_to_table return NULL for an option with no value (Tom Lane)
Previously such cases would result in a server crash.
Avoid possibly accessing off the end of memory in ANALYZE and in SJIS-2004 encoding conversion (Noah Misch)
This fixes some very-low-probability server crash scenarios.
Prevent intermittent hang in interactions of startup process with bgwriter process (Simon Riggs)
This affected recovery in non-hot-standby cases.
Fix incorrect memory accounting (leading to possible memory bloat) in tuplestores supporting holdable cursors and plpgsql's
RETURN NEXT command (Tom Lane)
Fix performance problem when constructing a large, lossy bitmap (Tom Lane)
Notes de version
This fixes an erroneous planner heuristic that could lead to poor estimates of the result size of a join.
Fix nested PlaceHolderVar expressions that appear only in sub-select target lists (Tom Lane)
This mistake could result in outputs of an outer join incorrectly appearing as NULL.
Fix array- and path-creating functions to ensure padding bytes are zeroes (Tom Lane)
This avoids some situations where the planner will think that semantically-equal constants are not equal, resulting in poor optimization.
Fix EXPLAIN to handle gating Result nodes within inner-indexscan subplans (Tom Lane)
The usual symptom of this oversight was bogus varno errors.
Work around gcc 4.6.0 bug that breaks WAL replay (Tom Lane)
This could lead to loss of committed transactions after a server crash.
Defend against integer overflow when computing size of a hash table (Tom Lane)
Fix cases where CLUSTER might attempt to access already-removed TOAST data (Tom Lane)
Fix portability bugs in use of credentials control messages for peer authentication (Tom Lane)
Fix SSPI login when multiple roundtrips are required (Ahmed Shinwari, Magnus Hagander)
The typical symptom of this problem was The function requested is not supported errors during SSPI login.
Throw an error if pg_hba.conf contains hostssl but SSL is disabled (Tom Lane)
This was concluded to be more user-friendly than the previous behavior of silently ignoring such lines.
Avoid integer overflow when the sum of LIMIT and OFFSET values exceeds 2^63 (Heikki Linnakangas)
Add overflow checks to int4 and int8 versions of generate_series() (Robert Haas)
Fix pg_size_pretty() to avoid overflow for inputs close to 2^63 (Tom Lane)
Weaken plpgsql's check for typmod matching in record values (Tom Lane)
An overly enthusiastic check could lead to discarding length modifiers that should have been kept.
Fix pg_upgrade to preserve toast tables' relfrozenxids during an upgrade from 8.3 (Bruce Momjian)
Failure to do this could lead to pg_clog files being removed too soon after the upgrade.
Fix psql's counting of script file line numbers during COPY from a different file (Tom Lane)
Notes de version
pg_restore could emit incorrect commands when restoring directly to a database server from an archive file that had been
made with standard_conforming_strings set to on.
Be more user-friendly about unsupported cases for parallel pg_restore (Tom Lane)
This change ensures that such cases are detected and reported before any restore actions have been taken.
Fix write-past-buffer-end and memory leak in libpq's LDAP service lookup code (Albe Laurenz)
In libpq, avoid failures when using nonblocking I/O and an SSL connection (Martin Pihlak, Tom Lane)
Fix PQsetvalue() to avoid possible crash when adding a new tuple to a PGresult originally obtained from a server query
(Andrew Chernow)
Make ecpglib write double values with 15 digits precision (Akira Kurosawa)
Apply upstream fix for blowfish signed-character bug (CVE-2011-2483) (Tom Lane)
contrib/pg_crypto's blowfish encryption code could give wrong results on platforms where char is signed (which is
most), leading to encrypted passwords being weaker than they should be.
Fix pgstatindex() to give consistent results for empty indexes (Tom Lane)
Update configure script's method for probing existence of system functions (Tom Lane)
The version of autoconf we used in 8.3 and 8.2 could be fooled by compilers that perform link-time optimization.
Fix assorted issues with build and install file paths containing spaces (Tom Lane)
Update time zone data files to tzdata release 2011i for DST law changes in Canada, Egypt, Russia, Samoa, and South Sudan.
E.49.2. Changes
1505
Notes de version
This error poses a significant risk of data loss for installations that have been upgraded with pg_upgrade. This patch corrects
the problem for future uses of pg_upgrade, but does not in itself cure the issue in installations that have been processed with a
buggy version of pg_upgrade.
Suppress incorrect PD_ALL_VISIBLE flag was incorrectly set warning (Heikki Linnakangas)
VACUUM would sometimes issue this warning in cases that are actually valid.
Fix dangling-pointer problem in BEFORE ROW UPDATE trigger handling when there was a concurrent update to the target
tuple (Tom Lane)
This bug has been observed to result in intermittent cannot extract system attribute from virtual tuple failures while trying
to do UPDATE RETURNING ctid. There is a very small probability of more serious errors, such as generating incorrect index entries for the updated tuple.
Disallow DROP TABLE when there are pending deferred trigger events for the table (Tom Lane)
Formerly the DROP would go through, leading to could not open relation with OID nnn errors when the triggers were
eventually fired.
Prevent crash triggered by constant-false WHERE conditions during GEQO optimization (Tom Lane)
Fix selectivity estimation for text search to account for NULLs (Jesper Krogh)
Improve PL/pgSQL's ability to handle row types with dropped columns (Pavel Stehule)
This is a back-patch of fixes previously made in 9.0.
Fix pg_restore to cope with long lines (over 1KB) in TOC files (Tom Lane)
Put in more safeguards against crashing due to division-by-zero with overly enthusiastic compiler optimization (Aurelien Jarno)
Fix usage of xcopy in Windows build scripts to work correctly under Windows 7 (Andrew Dunstan)
This affects the build scripts only, not installation or usage.
Update time zone data files to tzdata release 2011f for DST law changes in Chile, Cuba, Falkland Islands, Morocco, Samoa,
and Turkey; also historical corrections for South Australia, Alaska, and Hawaii.
Notes de version
This release contains a variety of fixes from 8.4.6. For information about new features in the 8.4 major release, see Section E.57,
Release 8.4 .
E.50.2. Changes
Avoid failures when EXPLAIN tries to display a simple-form CASE expression (Tom Lane)
If the CASE's test expression was a constant, the planner could simplify the CASE into a form that confused the expression-display code, resulting in unexpected CASE WHEN clause errors.
Fix assignment to an array slice that is before the existing range of subscripts (Tom Lane)
If there was a gap between the newly added subscripts and the first pre-existing subscript, the code miscalculated how many
entries needed to be copied from the old array's null bitmap, potentially leading to data corruption or crash.
Avoid unexpected conversion overflow in planner for very distant date values (Tom Lane)
The date type supports a wider range of dates than can be represented by the timestamp types, but the planner assumed it could
always convert a date to timestamp with impunity.
Fix pg_restore's text output for large objects (BLOBs) when standard_conforming_strings is on (Tom Lane)
Although restoring directly to a database worked correctly, string escaping was incorrect if pg_restore was asked for SQL text
output and standard_conforming_strings had been enabled in the source database.
Fix erroneous parsing of tsquery values containing ... & !(subexpression) | ... (Tom Lane)
Queries containing this combination of operators were not executed correctly. The same error existed in contrib/intarray's query_int type and contrib/ltree's ltxtquery type.
Fix buffer overrun in contrib/intarray's input function for the query_int type (Apple)
This bug is a security risk since the function's return address could be overwritten. Thanks to Apple Inc's security team for reporting this issue and supplying the fix. (CVE-2010-4015)
E.51.2. Changes
Force the default wal_sync_method to be fdatasync on Linux (Tom Lane, Marti Raudsepp)
The default on Linux has actually been fdatasync for many years, but recent kernel changes caused PostgreSQL to
choose open_datasync instead. This choice did not result in any performance improvement, and caused outright failures
on certain filesystems, notably ext4 with the data=journal mount option.
1507
Notes de version
Fix assorted bugs in WAL replay logic for GIN indexes (Tom Lane)
This could result in bad buffer id: 0 failures or corruption of index contents during replication.
Fix recovery from base backup when the starting checkpoint WAL record is not in the same WAL segment as its redo point
(Jeff Davis)
Fix persistent slowdown of autovacuum workers when multiple workers remain active for a long time (Tom Lane)
The effective vacuum_cost_limit for an autovacuum worker could drop to nearly zero if it processed enough tables, causing it to run extremely slowly.
Avoid memory leakage while ANALYZE'ing complex index expressions (Tom Lane)
Ensure an index that uses a whole-row Var still depends on its table (Tom Lane)
An index declared like create index i on t (foo(t.*)) would not automatically get dropped when its table was
dropped.
Do not inline a SQL function with multiple OUT parameters (Tom Lane)
This avoids a possible crash due to loss of information about the expected result rowtype.
Behave correctly if ORDER BY, LIMIT, FOR UPDATE, or WITH is attached to the VALUES part of INSERT ... VALUES
(Tom Lane)
Fix postmaster crash when connection acceptance (accept() or one of the calls made immediately after it) fails, and the
postmaster was compiled with GSSAPI support (Alexander Chernikov)
Fix missed unlink of temporary files when log_temp_files is active (Tom Lane)
If an error occurred while attempting to emit the log message, the unlink was not done, resulting in accumulation of temp files.
Fix incorrect calculation of distance from a point to a horizontal line segment (Tom Lane)
This bug affected several different geometric distance-measurement operators.
Fix PL/pgSQL's handling of simple expressions to not fail in recursion or error-recovery cases (Tom Lane)
1508
Notes de version
Attempts to call SPI functions within the iterator generating a set result would fail.
Don't emit identifier will be truncated notices in contrib/dblink except when creating new connections (Itagaki Takahiro)
Update time zone data files to tzdata release 2010o for DST law changes in Fiji and Samoa; also historical corrections for
Hong Kong.
E.52.2. Changes
Use a separate interpreter for each calling SQL userid in PL/Perl and PL/Tcl (Tom Lane)
This change prevents security problems that can be caused by subverting Perl or Tcl code that will be executed later in the
same session under another SQL user identity (for example, within a SECURITY DEFINER function). Most scripting languages offer numerous ways that that might be done, such as redefining standard functions or operators called by the target
function. Without this change, any SQL user with Perl or Tcl language usage rights can do essentially anything with the SQL
privileges of the target function's owner.
The cost of this change is that intentional communication among Perl and Tcl functions becomes more difficult. To provide an
escape hatch, PL/PerlU and PL/TclU functions continue to use only one interpreter per session. This is not considered a security issue since all such functions execute at the trust level of a database superuser already.
It is likely that third-party procedural languages that claim to offer trusted execution have similar security issues. We advise
contacting the authors of any PL you are depending on for security-critical purposes.
Our thanks to Tim Bunce for pointing out this issue (CVE-2010-3433).
Prevent possible crashes in pg_get_expr() by disallowing it from being called with an argument that is not one of the system catalog columns it's intended to be used with (Heikki Linnakangas, Tom Lane)
Fix possible duplicate scans of UNION ALL member relations (Tom Lane)
Notes de version
Fix mishandling of whole-row Vars that reference a view or sub-select and appear within a nested sub-select (Tom Lane)
Improve planner's estimate of memory used by array_agg(), string_agg(), and similar aggregate functions (Hitoshi
Harada)
The previous drastic underestimate could lead to out-of-memory failures due to inappropriate choice of a hash-aggregation
plan.
Reduce PANIC to ERROR in some occasionally-reported btree failure cases, and provide additional detail in the resulting error messages (Tom Lane)
This should improve the system's robustness with corrupted indexes.
Fix incorrect search logic for partial-match queries with GIN indexes (Tom Lane)
Cases involving AND/OR combination of several GIN index conditions didn't always give the right answer, and were sometimes much slower than necessary.
Defend against functions returning setof record where not all the returned rows are actually of the same rowtype (Tom Lane)
Fix possible corruption of pending trigger event lists during subtransaction rollback (Tom Lane)
This could lead to a crash or incorrect firing of triggers.
Fix possible failure when hashing a pass-by-reference function result (Tao Ma, Tom Lane)
Improve merge join's handling of NULLs in the join columns (Tom Lane)
A merge join can now stop entirely upon reaching the first NULL, if the sort order is such that NULLs sort high.
Take care to fsync the contents of lockfiles (both postmaster.pid and the socket lockfile) while writing them (Tom Lane)
This omission could result in corrupted lockfile contents if the machine crashes shortly after postmaster start. That could in
turn prevent subsequent attempts to start the postmaster from succeeding, until the lockfile is manually removed.
Avoid recursion while assigning XIDs to heavily-nested subtransactions (Andres Freund, Robert Haas)
The original coding could result in a crash if there was limited stack space.
Avoid holding open old WAL segments in the walwriter process (Magnus Hagander, Heikki Linnakangas)
The previous coding would prevent removal of no-longer-needed segments.
Fix log_line_prefix's %i escape, which could produce junk early in backend startup (Tom Lane)
Prevent misinterpretation of partially-specified relation options for TOAST tables (Itagaki Takahiro)
In particular, fillfactor would be read as zero if any other reloption had been set for the table, leading to serious bloat.
Fix allance count tracking in ALTER TABLE ... ADD CONSTRAINT (Robert Haas)
Fix possible data corruption in ALTER TABLE ... SET TABLESPACE when archiving is enabled (Jeff Davis)
Allow CREATE DATABASE and ALTER DATABASE ... SET TABLESPACE to be interrupted by query-cancel
(Guillaume Lelarge)
Improve CREATE INDEX's checking of whether proposed index expressions are immutable (Tom Lane)
Fix REASSIGN OWNED to handle operator classes and families (Asko Tiidumaa)
Fix possible core dump when comparing two empty tsquery values (Tom Lane)
Notes de version
We've fixed this before, but there were still some incorrectly-handled cases.
Fix PL/pgSQL to throw an error, not crash, if a cursor is closed within a FOR loop that is iterating over that cursor (Heikki
Linnakangas)
In PL/Python, defend against null pointer results from PyCObject_AsVoidPtr and PyCObject_FromVoidPtr (Peter
Eisentraut)
In libpq, fix full SSL certificate verification for the case where both host and hostaddr are specified (Tom Lane)
Make psql recognize DISCARD ALL as a command that should not be encased in a transaction block in autocommit-off
mode (Itagaki Takahiro)
Improve pg_dump and pg_restore's handling of non-seekable archive files (Tom Lane, Robert Haas)
This is important for proper functioning of parallel restore.
Improve parallel pg_restore's ability to cope with selective restore (-L option) (Tom Lane)
The original code tended to fail if the -L file commanded a non-default restore ordering.
Fix ecpg to process data from RETURNING clauses correctly (Michael Meskes)
Fix connection leak after duplicate connection name errors in contrib/dblink (Itagaki Takahiro)
Fix contrib/dblink to handle connection names longer than 62 bytes correctly (Itagaki Takahiro)
Update build infrastructure and documentation to reflect the source code repository's move from CVS to Git (Magnus Hagander and others)
Update time zone data files to tzdata release 2010l for DST law changes in Egypt and Palestine; also historical corrections for
Finland.
This change also adds new names for two Micronesian timezones: Pacific/Chuuk is now preferred over Pacific/Truk (and the
preferred abbreviation is CHUT not TRUT) and Pacific/Pohnpei is preferred over Pacific/Ponape.
Make Windows' N. Central Asia Standard Time timezone map to Asia/Novosibirsk, not Asia/Almaty (Magnus Hagander)
Microsoft changed the DST behavior of this zone in the timezone update from KB976098. Asia/Novosibirsk is a better match
to its new behavior.
Notes de version
E.53.2. Changes
Enforce restrictions in plperl using an opmask applied to the whole interpreter, instead of using Safe.pm (Tim Bunce,
Andrew Dunstan)
Recent developments have convinced us that Safe.pm is too insecure to rely on for making plperl trustable. This change
removes use of Safe.pm altogether, in favor of using a separate interpreter with an opcode mask that is always applied. Pleasant side effects of the change include that it is now possible to use Perl's strict pragma in a natural way in plperl, and
that Perl's $a and $b variables work as expected in sort routines, and that function compilation is significantly faster.
(CVE-2010-1169)
Fix data corruption during WAL replay of ALTER ... SET TABLESPACE (Tom)
When archive_mode is on, ALTER ... SET TABLESPACE generates a WAL record whose replay logic was incorrect.
It could write the data to the wrong place, leading to possibly-unrecoverable data corruption. Data corruption would be observed on standby slaves, and could occur on the master as well if a database crash and recovery occurred after committing the
ALTER and before the next checkpoint.
Fix possible crash if a cache reset message is received during rebuild of a relcache entry (Heikki)
This error was introduced in 8.4.3 while fixing a related failure.
Apply per-function GUC settings while running the language validator for the function (Itagaki Takahiro)
This avoids failures if the function's code is invalid without the setting; an example is that SQL functions may not parse if the
search_path is not correct.
Do constraint exclusion for alled UPDATE and DELETE target tables when constraint_exclusion = partition
(Tom)
Due to an oversight, this setting previously only caused constraint exclusion to be checked in SELECT commands.
Avoid possible crash during backend shutdown if shutdown occurs when a CONTEXT addition would be made to log entries
(Tom)
In some cases the context-printing function would fail because the current transaction had already been rolled back when it
came time to print a log message.
Ensure the archiver process responds to changes in archive_command as soon as possible (Tom)
Fix pl/pgsql's CASE statement to not fail when the case expression is a query that returns no rows (Tom)
Prevent infinite recursion in psql when expanding a variable that refers to itself (Tom)
Fix psql's \copy to not add spaces around a dot within \copy (select ...) (Tom)
Addition of spaces around the decimal point in a numeric literal would result in a syntax error.
1512
Notes de version
Avoid formatting failure in psql when running in a locale context that doesn't match the client_encoding (Tom)
Fix unnecessary GIN indexes do not support whole-index scans errors for unsatisfiable queries using contrib/intarray operators (Tom)
Ensure that contrib/pgstattuple functions respond to cancel interrupts promptly (Tatsuhito Kasahara)
Make server startup deal properly with the case that shmget() returns EINVAL for an existing shared memory segment
(Tom)
This behavior has been observed on BSD-derived kernels including OS X. It resulted in an entirely-misleading startup failure
complaining that the shared memory request size was too large.
Deal more robustly with incomplete time zone information in the Windows registry (Magnus)
Update time zone data files to tzdata release 2010j for DST law changes in Argentina, Australian Antarctic, Bangladesh,
Mexico, Morocco, Pakistan, Palestine, Russia, Syria, Tunisia; also historical corrections for Taiwan.
Also, add PKST (Pakistan Summer Time) to the default set of timezone abbreviations.
E.54.2. Changes
Add new configuration parameter ssl_renegotiation_limit to control how often we do session key renegotiation for
an SSL connection (Magnus)
This can be set to zero to disable renegotiation completely, which may be required if a broken SSL library is used. In particular, some vendors are shipping stopgap patches for CVE-2009-3555 that cause renegotiation attempts to fail.
Fix possible crashes due to not handling errors during relcache reload cleanly (Tom)
Fix possible crash due to use of dangling pointer to a cached plan (Tatsuo)
Fix possible crash due to overenthusiastic invalidation of cached plan for ROLLBACK (Tom)
Fix possible crashes when trying to recover from a failure in subtransaction start (Tom)
Fix server memory leak associated with use of savepoints and a client encoding different from server's encoding (Tom)
Fix incorrect WAL data emitted during end-of-recovery cleanup of a GIST index page split (Yoichi Hirai)
This would result in index corruption, or even more likely an error during WAL replay, if we were unlucky enough to crash
during end-of-recovery cleanup after having completed an incomplete GIST insertion.
Fix bug in WAL redo cleanup method for GIN indexes (Heikki)
Make substring() for bit types treat any negative length as meaning all the rest of the string (Tom)
The previous coding treated only -1 that way, and would produce an invalid result value for other negative values, possibly
leading to a crash (CVE-2010-0442).
1513
Notes de version
Fix integer-to-bit-string conversions to handle the first fractional byte correctly when the output bit width is wider than the given integer by something other than a multiple of 8 bits (Tom)
Fix bug occurring when trying to inline a SQL function that returns a set of a composite type that contains dropped columns
(Tom)
Fix bug with trying to update a field of an element of a composite-type array column (Tom)
Avoid failure when EXPLAIN has to print a FieldStore or assignment ArrayRef expression (Tom)
These cases can arise now that EXPLAIN VERBOSE tries to print plan node target lists.
Avoid an unnecessary coercion failure in some cases where an undecorated literal string appears in a subquery within
UNION/INTERSECT/EXCEPT (Tom)
This fixes a regression for some cases that worked before 8.4.
Avoid undesirable rowtype compatibility check failures in some cases where a whole-row Var has a rowtype that contains
dropped columns (Tom)
Fix the STOP WAL LOCATION entry in backup history files to report the next WAL segment's name when the end location
is exactly at a segment boundary (Itagaki Takahiro)
Always pass the catalog ID to an option validator function specified in CREATE FOREIGN DATA WRAPPER (Martin
Pihlak)
Improve constraint exclusion processing of boolean-variable cases, in particular make it possible to exclude a partition that has
a bool_column = false constraint (Tom)
Include column name in the message when warning about inability to grant or revoke column-level privileges (Stephen Frost)
This is more useful than before and helps to prevent confusion when a REVOKE generates multiple messages, which formerly appeared to be duplicates.
When reading pg_hba.conf and related files, do not treat @something as a file inclusion request if the @ appears inside
quote marks; also, never treat @ by itself as a file inclusion request (Tom)
This prevents erratic behavior if a role or database name starts with @. If you need to include a file whose path name contains
spaces, you can still do so, but you must write @"/path to/file" rather than putting the quotes around the whole
construct.
Prevent infinite loop on some platforms if a directory is named as an inclusion target in pg_hba.conf and related files
(Tom)
Fix possible infinite loop if SSL_read or SSL_write fails without setting errno (Tom)
This is reportedly possible with some Windows versions of openssl.
Disallow GSSAPI authentication on local connections, since it requires a hostname to function correctly (Magnus)
Make ecpg report the proper SQLSTATE if the connection disappears (Michael)
Fix psql's numericlocale option to not format strings it shouldn't in latex and troff output formats (Heikki)
Make psql return the correct exit status (3) when ON_ERROR_STOP and --single-transaction are both specified and
an error occurs during the implied COMMIT (Bruce)
1514
Notes de version
Fix possible crash in parallel pg_restore due to out-of-range dependency IDs (Tom)
Fix plpgsql failure in one case where a composite column is set to NULL (Tom)
Fix possible failure when calling PL/Perl functions from PL/PerlU or vice versa (Tim Bunce)
Add volatile markings in PL/Python to avoid possible compiler-specific misbehavior (Zdenek Kotala)
Prevent ExecutorEnd from being run on portals created within a failed transaction or subtransaction (Tom)
This is known to cause issues when using contrib/auto_explain.
Prevent crash in contrib/dblink when too many key columns are specified to a dblink_build_sql_* function
(Rushabh Lathia, Joe Conway)
Make the configure script report failure if the C compiler does not provide a working 64-bit integer datatype (Tom)
This case has been broken for some time, and no longer seems worth supporting, so just reject it at configure time instead.
Update time zone data files to tzdata release 2010e for DST law changes in Bangladesh, Chile, Fiji, Mexico, Paraguay, Samoa.
E.55.2. Changes
Protect against indirect security threats caused by index functions changing session-local state (Gurjeet Singh, Tom)
This change prevents allegedly-immutable index functions from possibly subverting a superuser's session (CVE-2009-4136).
Reject SSL certificates containing an embedded null byte in the common name (CN) field (Magnus)
This prevents unintended matching of a certificate to a server or client name during SSL validation (CVE-2009-4034).
Notes de version
Fix possible crash due to integer overflow in hash table size calculation (Tom)
This could occur with extremely large planner estimates for the size of a hashjoin's result.
Ensure that shared tuple-level locks held by prepared transactions are not ignored (Heikki)
Fix premature drop of temporary files used for a cursor that is accessed within a subtransaction (Heikki)
Fix memory leak in syslogger process when rotating to a new CSV logfile (Tom)
Make FOR UPDATE/SHARE in the primary query not propagate into WITH queries (Tom)
For example, in
WITH w AS (SELECT * FROM foo) SELECT * FROM w, bar ... FOR UPDATE
the FOR UPDATE will now affect bar but not foo. This is more useful and consistent than the original 8.4 behavior, which
tried to propagate FOR UPDATE into the WITH query but always failed due to assorted implementation restrictions. It also
follows the design rule that WITH queries are executed as if independent of the main query.
Fix bug with a WITH RECURSIVE query immediately inside another one (Tom)
Fix incorrect logic for GiST index page splits, when the split depends on a non-first column of the index (Paul Ramsey)
Fix wrong search results for a multi-column GIN index with fastupdate enabled (Teodor)
Don't error out if recycling or removing an old WAL file fails at the end of checkpoint (Heikki)
It's better to treat the problem as non-fatal and allow the checkpoint to complete. Future checkpoints will retry the removal.
Such problems are not expected in normal operation, but have been seen to be caused by misdesigned Windows anti-virus and
backup software.
Raise the maximum authentication token (Kerberos ticket) size in GSSAPI and SSPI authentication methods (Ian Turner)
While the old 2000-byte limit was more than enough for Unix Kerberos implementations, tickets issued by Windows Domain
Controllers can be much larger.
Ensure that domain constraints are enforced in constructs like ARRAY[...]::domain, where the domain is over an array
1516
Notes de version
type (Heikki)
Fix foreign-key logic for some cases involving composite-type columns as foreign keys (Tom)
Fix CREATE TABLE to properly merge default expressions coming from different allance parent tables (Tom)
This used to work but was broken in 8.4.
Fix incorrect plan construction when using hash aggregation to implement DISTINCT for textually identical volatile expressions (Tom)
Fix bug with calling plperl from plperlu or vice versa (Tom)
An error exit from the inner function could result in crashes due to failure to re-select the correct Perl interpreter for the outer
function.
Ensure that Perl arrays are properly converted to PostgreSQL arrays when returned by a set-returning PL/Perl function
(Andrew Dunstan, Abhijit Menon-Sen)
This worked correctly already for non-set-returning functions.
Re-allow regular expression special characters in psql's \df function name parameter (Tom)
In contrib/fuzzystrmatch, correct the calculation of levenshtein distances with non-default costs (Marcin Mank)
Put FREEZE and VERBOSE options in the right order in the VACUUM command that contrib/vacuumdb produces
(Heikki)
Fix possible leak of connections when contrib/dblink encounters an error (Tatsuhito Kasahara)
Ensure psql's flex module is compiled with the correct system header definitions (Tom)
This fixes build failures on platforms where --enable-largefile causes incompatible changes in the generated code.
Make the postmaster ignore any application_name parameter in connection request packets, to improve compatibility
with future libpq versions (Tom)
Update the timezone abbreviation files to match current reality (Joachim Wieland)
1517
Notes de version
Update time zone data files to tzdata release 2009s for DST law changes in Antarctica, Argentina, Bangladesh, Fiji, Novokuznetsk, Pakistan, Palestine, Samoa, Syria; also historical corrections for Hong Kong.
E.56.2. Changes
Fix WAL page header initialization at the end of archive recovery (Heikki)
This could lead to failure to process the WAL in a subsequent archive recovery.
Fix cannot make new WAL entries during recovery error (Tom)
Fix problem that could make expired rows visible after a crash (Tom)
This bug involved a page status bit potentially not being set correctly after a server crash.
Disallow RESET ROLE and RESET SESSION AUTHORIZATION inside security-definer functions (Tom, Heikki)
This covers a case that was missed in the previous patch that disallowed SET ROLE and SET SESSION AUTHORIZATION inside security-definer functions. (See CVE-2007-6600)
Make window function PARTITION BY and ORDER BY items always be interpreted as simple expressions (Tom)
In 8.4.0 these lists were parsed following the rules used for top-level GROUP BY and ORDER BY lists. But this was not correct per the SQL standard, and it led to possible circularity.
Fix handling of whole-row references to subqueries that are within an outer join (Tom)
An example is SELECT COUNT(ss.*) FROM ... LEFT JOIN (SELECT ...) ss ON .... Here, ss.* would
be treated as ROW(NULL,NULL,...) for null-extended join rows, which is not the same as a simple NULL. Now it is treated as a simple NULL.
Fix handling of reloptions to ensure setting one option doesn't force default values for others (Itagaki Takahiro)
Ensure that a fast shutdown request will forcibly terminate open sessions, even if a smart shutdown was already in progress (Fujii Masao)
Notes de version
Include the fractional part in the result of EXTRACT(second) and EXTRACT(milliseconds) for time and time with
time zone inputs (Tom)
This has always worked for floating-point datetime configurations, but was broken in the integer datetime code.
Fix overflow for INTERVAL 'x ms' when x is more than 2 million and integer datetimes are in use (Alex Hunsaker)
Output early-startup messages to postmaster.log if the server is started in silent mode (Tom)
Previously such error messages were discarded, leading to difficulty in debugging.
Fix pg_ctl to not go into an infinite loop if postgresql.conf is empty (Jeff Davis)
Fix contrib/xml2's xslt_process() to properly handle the maximum number of parameters (twenty) (Tom)
Improve robustness of libpq's code to recover from errors during COPY FROM STDIN (Tom)
Avoid including conflicting readline and editline header files when both libraries are installed (Zdenek Kotala)
Work around gcc bug that causes floating-point exception instead of division by zero on some platforms (Tom)
Update time zone data files to tzdata release 2009l for DST law changes in Bangladesh, Egypt, Mauritius.
E.57.1. Overview
After many years of development, PostgreSQL has become feature-complete in many areas. This release shows a targeted approach to adding features (e.g., authentication, monitoring, space reuse), and adds capabilities defined in the later SQL standards.
The major areas of enhancement are:
Windowing Functions
Parallel Restore
Column Permissions
Notes de version
The above items are explained in more detail in the sections below.
E.57.2.1. General
Change default setting for log_min_messages to warning (previously it was notice) to reduce log file volume (Tom)
Make log_temp_files settable by superusers only, like other logging options (Simon Riggs)
Remove automatic appending of the epoch timestamp when no % escapes are present in log_filename (Robert Haas)
This change was made because some users wanted a fixed log filename, for use with an external log rotation tool.
Remove krb_realm and krb_server_hostname; these are now set in pg_hba.conf instead (Magnus)
E.57.2.3. Queries
Change TRUNCATE and LOCK to apply to child tables of the specified table(s) (Peter)
These commands now accept an ONLY option that prevents processing child tables; this option must be used if the old behavior is needed.
SELECT DISTINCT and UNION/INTERSECT/EXCEPT no longer always produce sorted output (Tom)
Previously, these types of queries always removed duplicate rows by means of Sort/Unique processing (i.e., sort then remove
adjacent duplicates). Now they can be implemented by hashing, which will not produce sorted output. If an application relied
on the output being in sorted order, the recommended fix is to add an ORDER BY clause. As a short-term workaround, the previous behavior can be restored by disabling enable_hashagg, but that is a very performance-expensive fix. SELECT
DISTINCT ON never uses hashing, however, so its behavior is unchanged.
Force child tables to all CHECK constraints from parents (Alex Hunsaker, Nikhil Sontakke, Tom)
1520
Notes de version
Formerly it was possible to drop such a constraint from a child table, allowing rows that violate the constraint to be visible
when scanning the parent table. This was deemed inconsistent, as well as contrary to SQL standard.
Disallow negative LIMIT or OFFSET values, rather than treating them as zero (Simon)
Make numeric zero raised to a fractional power return 0, rather than throwing an error, and make numeric zero raised to the
zero power return 1, rather than error (Bruce)
This matches the longstanding float8 behavior.
Throw an error if an escape character is the last character in a LIKE pattern (i.e., it has nothing to escape) (Tom)
Previously, such an escape character was silently ignored, thus possibly masking application logic errors.
Remove ~=~ and ~<>~ operators formerly used for LIKE index comparisons (Tom)
Pattern indexes now use the regular equality operator.
xpath() now passes its arguments to libxml without any changes (Andrew)
This means that the XML argument must be a well-formed XML document. The previous coding attempted to allow XML
fragments, but it did not work well.
Make xmlelement() format attribute values just like content values (Peter)
Previously, attribute values were formatted according to the normal SQL output behavior, which is sometimes at odds with
XML rules.
Adopt a faster algorithm for hash functions (Kenneth Marshall, based on work of Bob Jenkins)
Many of the built-in hash functions now deliver different results on little-endian and big-endian platforms.
DateStyle no longer controls interval output formatting; instead there is a new variable IntervalStyle (Ron Mayer)
Improve consistency of handling of fractional seconds in timestamp and interval output (Ron Mayer)
This may result in displaying a different number of fractional digits than before, or rounding instead of truncating.
Make to_char()'s localized month/day names depend on LC_TIME, not LC_MESSAGES (Euler Taveira de Oliveira)
Cause to_date() and to_timestamp() to more consistently report errors for invalid input (Brendan Jurd)
Previous versions would often ignore or silently misread input that did not match the format string. Such cases will now result
in an error.
Fix to_timestamp() to not require upper/lower case matching for meridian (AM/PM) and era (BC/AD) format designations
(Brendan Jurd)
For example, input value ad now matches the format string AD.
E.57.3. Changes
1521
Notes de version
Below you will find a detailed account of the changes between PostgreSQL 8.4 and the previous major release.
E.57.3.1. Performance
Improve the performance of text_position() and related functions by using Boyer-Moore-Horspool searching (David
Rowley)
This is particularly helpful for long search patterns.
Reduce I/O load of writing the statistics collection file by writing the file only when requested (Martin Pihlak)
Increase the default value of default_statistics_target from 10 to 100 (Greg Sabino Mullane, Tom)
The maximum value was also increased from 1000 to 10000.
Perform constraint_exclusion checking by default in queries involving allance or UNION ALL (Tom)
A new constraint_exclusion setting, partition, was added to specify this behavior.
Improve performance of multi-batch hash joins by providing a special case for join key values that are especially common in
the outer relation (Bryce Cutt, Ramon Lawrence)
Reduce volume of temporary data in multi-batch hash joins by suppressing physical tlist optimization (Michael Henderson,
Ramon Lawrence)
Avoid waiting for idle-in-transaction sessions during CREATE INDEX CONCURRENTLY (Simon)
E.57.3.2. Server
E.57.3.2.1. Settings
Convert many postgresql.conf settings to enumerated values so that pg_settings can display the valid values
(Magnus)
Add cursor_tuple_fraction parameter to control the fraction of a cursor's rows that the planner assumes will be fetched (Robert Hell)
Notes de version
This effectively obsoletes pre-PostgreSQL 7.2 client libraries, as there is no longer any non-plaintext password method that
they can use.
Report appropriate error message for combination of MD5 authentication and db_user_namespace enabled (Bruce)
E.57.3.2.3. pg_hba.conf
Remove the ident sameuser option, instead making that behavior the default if no usermap is specified (Magnus)
Add cert authentication method to allow user authentication via SSL certificates (Magnus)
Previously SSL certificates could only verify that the client had access to a certificate, not authenticate a user.
Allow krb5, gssapi and sspi realm and krb5 host settings to be specified in pg_hba.conf (Magnus)
These override the settings in postgresql.conf.
Add include_realm parameter for krb5, gssapi, and sspi methods (Magnus)
This allows identical usernames from different realms to be authenticated as different database users using usermaps.
Parse pg_hba.conf fully when it is loaded, so that errors are reported immediately (Magnus)
Previously, most errors in the file wouldn't be detected until clients tried to connect, so an erroneous file could render the system unusable. With the new behavior, if an error is detected during reload then the bad file is rejected and the postmaster
continues to use its old copy.
Show all parsing errors in pg_hba.conf instead of aborting after the first one (Selena Deckelmann)
Provide an option to pg_start_backup() to force its implied checkpoint to finish as quickly as possible (Tom)
The default behavior avoids excess I/O consumption, but that is pointless if no concurrent query activity is going on.
When archiving is enabled, rotate the last WAL segment at shutdown so that all transactions can be archived immediately
(Guillaume Smet, Heikki)
Delay smart shutdown while a continuous archiving base backup is in progress (Laurenz Albe)
Cancel a continuous archiving base backup if fast shutdown is requested (Laurenz Albe)
Allow recovery.conf boolean variables to take the same range of string values as postgresql.conf boolean variables (Bruce)
1523
Notes de version
E.57.3.2.5. Monitoring
Add pg_conf_load_time() to report when the PostgreSQL configuration files were last loaded (George Gensure)
Add pg_terminate_backend() to safely terminate a backend (the SIGTERM signal works also) (Tom, Bruce)
While it's always been possible to SIGTERM a single backend, this was previously considered unsupported; and testing of the
case found some bugs that are now fixed.
Add ability to track user-defined functions' call counts and runtimes (Martin Pihlak)
Function statistics appear in a new system view, pg_stat_user_functions. Tracking is controlled by the new parameter track_functions.
Allow specification of the maximum query string size in pg_stat_activity via new
track_activity_query_size parameter (Thomas Lee)
Increase the maximum line length sent to syslog, in hopes of improving performance (Tom)
Add read-only configuration variables segment_size, wal_block_size, and wal_segment_size (Bernd Helmle)
When reporting a deadlock, report the text of all queries involved in the deadlock to the server log (Itagaki Takahiro)
Allow the location of the server's statistics file to be specified via stats_temp_directory (Magnus)
This allows the statistics file to be placed in a RAM-resident directory to reduce I/O requirements. On startup/shutdown, the
file is copied to its traditional location ($PGDATA/global/) so it is preserved across restarts.
E.57.3.3. Queries
Add support for WITH clauses (CTEs), including WITH RECURSIVE (Yoshiyuki Asaba, Tatsuo Ishii, Tom)
Allow AS to be optional when specifying a SELECT (or RETURNING) column output label (Hiroshi Saito)
This works so long as the column label is not any PostgreSQL keyword; otherwise AS is still needed.
Support set-returning functions in SELECT result lists even for functions that return their result via a tuplestore (Tom)
In particular, this means that functions written in PL/pgSQL and other PL languages can now be called this way.
Support set-returning functions in the output of aggregation and grouping queries (Tom)
Invalidate cached plans when referenced schemas, functions, operators, or operator classes are modified (Martin Pihlak, Tom)
This improves the system's ability to respond to on-the-fly DDL changes.
Allow comparison of composite types and allow arrays of anonymous composite types (Tom)
This allows constructs such as row(1, 1.1) = any (array[row(7, 7.7), row(1, 1.0)]). This is particularly useful in recursive queries.
Add support for Unicode string literal and identifier specifications using code points, e.g. U&'d\0061t\+000061' (Peter)
Notes de version
zed.
E.57.3.3.1. TRUNCATE
E.57.3.3.2. EXPLAIN
Make EXPLAIN VERBOSE show the output columns of each plan node (Tom)
Previously EXPLAIN VERBOSE output an internal representation of the query plan. (That behavior is now available via
debug_print_plan.)
Make EXPLAIN identify subplans and initplans with individual labels (Tom)
E.57.3.3.3. LIMIT/OFFSET
Refactor multi-object DROP operations to reduce the need for CASCADE (Alex Hunsaker)
For example, if table B has a dependency on table A, the command DROP TABLE A, B no longer requires the CASCADE
option.
Fix various problems with concurrent DROP commands by ensuring that locks are taken before we begin to drop dependencies of an object (Tom)
Add WITH [NO] DATA clause to CREATE TABLE AS, per the SQL standard (Peter, Tom)
Allow specification of the type category and preferred status for user-defined base types (Tom)
This allows more control over the coercion behavior of user-defined types.
Allow CREATE OR REPLACE VIEW to add columns to the end of a view (Robert Haas)
E.57.3.4.1. ALTER
1525
Notes de version
Add ALTER SEQUENCE ... RESTART (with no parameter) to reset a sequence to its initial value (Zoltan Boszormenyi)
Modify the ALTER TABLE syntax to allow all reasonable combinations for tables, indexes, sequences, and views (Tom)
This change allows the following new syntaxes:
There is no actual new functionality here, but formerly you had to say ALTER TABLE to do these things, which was confusing.
Add support for the syntax ALTER TABLE ... ALTER COLUMN ... SET DATA TYPE (Peter)
This is SQL-standard syntax for functionality that was already supported.
Make ALTER TABLE SET WITHOUT OIDS rewrite the table to physically remove OID values (Tom)
Also, add ALTER TABLE SET WITH OIDS to rewrite the table to add OIDs.
Improve reporting of CREATE/DROP/RENAME DATABASE failure when uncommitted prepared transactions are the
cause (Tom)
Make LC_COLLATE and LC_CTYPE into per-database settings (Radek Strnad, Heikki)
This makes collation similar to encoding, which was always configurable per database.
Improve checks that the database encoding, collation (LC_COLLATE), and character classes (LC_CTYPE) match (Heikki,
Tom)
Note in particular that a new database's encoding and locale settings can be changed only when copying from template0.
This prevents possibly copying data that doesn't match the settings.
Add ALTER DATABASE SET TABLESPACE to move a database to a new tablespace (Guillaume Lelarge, Bernd Helmle)
Add a VERBOSE option to the CLUSTER command and clusterdb (Jim Cox)
E.57.3.5.1. Indexes
Dramatically improve the speed of building and accessing hash indexes (Tom Raney, Shreya Bhargava)
This allows hash indexes to be sometimes faster than btree indexes. However, hash indexes are still not crash-safe.
Make hash indexes store only the hash code, not the full value of the indexed column (Xiao Meng)
This greatly reduces the size of hash indexes for long indexed values, improving performance.
xxx_pattern_ops indexes can now be used for simple equality comparisons, not only for LIKE (Tom)
Remove the requirement to use @@@ when doing GIN weighted lookups on full text indexes (Tom, Teodor)
The normal @@ text search operator can be used instead.
Add an optimizer selectivity function for @@ text search operations (Jan Urbanski)
1526
Notes de version
Allow prefix matching in full text searches (Teodor Sigaev, Oleg Bartunov)
E.57.3.5.3. VACUUM
Add a visibility map to track pages that do not require vacuuming (Heikki)
This allows VACUUM to avoid scanning all of a table when only a portion of the table needs vacuuming. The visibility map
is stored in per-relation fork files.
Add vacuum_freeze_table_age parameter to control when VACUUM should ignore the visibility map and do a full
table scan to freeze tuples (Heikki)
Add ability to specify per-relation autovacuum and TOAST parameters in CREATE TABLE (Alvaro, Euler Taveira de Oliveira)
Autovacuum options used to be stored in a system table.
Allow UUID input to accept an optional hyphen after every fourth digit (Robert Haas)
Allow on/off as input for the boolean data type (Itagaki Takahiro)
Allow spaces around NaN in the input string for type numeric (Sam Mason)
Include SGT (Singapore time) in the default list of known time zone abbreviations (Tom)
Allow interval fractional-seconds precision to be specified after the second keyword, for SQL standard compliance (Tom)
Formerly the precision had to be specified after the keyword interval. (For backwards compatibility, this syntax is still supported, though deprecated.) Data type definitions will now be output using the standard format.
Support the IS0 8601 interval syntax (Ron Mayer, Kevin Grittner)
For example, INTERVAL 'P1Y2M3DT4H5M6.7S' is now supported.
Add IntervalStyle parameter which controls how interval values are output (Ron Mayer)
1527
Notes de version
Valid values are: postgres, postgres_verbose, sql_standard, iso_8601. This setting also controls the handling
of negative interval input when only some fields have positive/negative designations.
Improve consistency of handling of fractional seconds in timestamp and interval output (Ron Mayer)
E.57.3.6.2. Arrays
Improve the handling of casts applied to ARRAY[] constructs, such as ARRAY[...]::integer[] (Brendan Jurd)
Formerly PostgreSQL attempted to determine a data type for the ARRAY[] construct without reference to the ensuing cast.
This could fail unnecessarily in many cases, in particular when the ARRAY[] construct was empty or contained only ambiguous entries such as NULL. Now the cast is consulted to determine the type that the array elements must be.
Make SQL-syntax ARRAY dimensions optional to match the SQL standard (Peter)
Add array_length() to return the length of an array for a specified dimension (Jim Nasby, Robert Haas, Peter Eisentraut)
Add aggregate function array_agg(), which returns all aggregated values as a single array (Robert Haas, Jeff Davis, Peter)
Add generate_subscripts() to simplify generating the range of an array's subscripts (Pavel Stehule)
Consider TOAST compression on values as short as 32 bytes (previously 256 bytes) (Greg Stark)
Require 25% minimum space savings before using TOAST compression (previously 20% for small values and any-savings-at-all for large values) (Greg)
Improve TOAST heuristics for rows that have a mix of large and small toastable fields, so that we prefer to push large values
out of line and don't compress small values unnecessarily (Greg, Tom)
E.57.3.7. Functions
Document that setseed() allows values from -1 to 1 (not just 0 to 1), and enforce the valid range (Kris Jurka)
Add quote_nullable(), which behaves like quote_literal() but returns the string NULL for a null argument
(Brendan Jurd)
Improve full text search headline() function to allow extracting several fragments of text (Sushant Sinha)
Implement current_query() for use by functions that need to know the currently running query (Tomas Doran)
Allow the second argument of pg_get_expr() to be zero when deparsing an expression that does not contain variables
(Tom)
Notes de version
Add source file name and line number columns to pg_settings output for variables set in a configuration file (Magnus, Alvaro)
For security reasons, these columns are only visible to superusers.
Add support for CURRENT_CATALOG, CURRENT_SCHEMA, SET CATALOG, SET SCHEMA (Peter)
These provide SQL-standard syntax for existing features.
Add pg_typeof() which returns the data type of any value (Brendan Jurd)
Make version() return information about whether the server is a 32- or 64-bit binary (Bruce)
Fix the behavior of information schema columns is_insertable_into and is_updatable to be consistent (Peter)
Convert remaining builtin set-returning functions to use OUT parameters (Jaime Casanova)
This makes it possible to call these functions without specifying a column list: pg_show_all_settings(),
pg_lock_status(), pg_prepared_xact(), pg_prepared_statement(), pg_cursor()
Make pg_*_is_visible() and has_*_privilege() functions return NULL for invalid OIDs, rather than reporting
an error (Tom)
Extend has_*_privilege() functions to allow inquiring about the OR of multiple privileges in one call (Stephen Frost,
Tom)
Support variadic functions (functions with a variable number of arguments) (Pavel Stehule)
Only trailing arguments can be optional, and they all must be of the same data type.
Allow SQL-language functions to return the output of an INSERT/UPDATE/DELETE RETURNING clause (Tom)
Support EXECUTE USING for easier insertion of data values into a dynamic query string (Pavel Stehule)
Allow looping over the results of a cursor using a FOR loop (Pavel Stehule)
Allow RAISE without parameters in an exception block to re-throw the current error
Notes de version
Make RETURN QUERY set the special FOUND and GET DIAGNOSTICS ROW_COUNT variables (Pavel Stehule)
Make FETCH and MOVE set the GET DIAGNOSTICS ROW_COUNT variable (Andrew Gierth)
Make EXIT without a label always exit the innermost loop (Tom)
Formerly, if there were a BEGIN block more closely nested than any loop, it would exit that block instead. The new behavior
matches Oracle(TM) and is also what was previously stated by our own documentation.
Make processing of string literals and nested block comments match the main SQL parser's processing (Tom)
In particular, the format string in RAISE now works the same as any other string literal, including being subject to standard_conforming_strings. This change also fixes other cases in which valid commands would fail when standard_conforming_strings is on.
Avoid memory leakage when the same function is called at varying exception-block nesting depths (Tom)
Add -w/--no-password option that prevents password prompting in all utilities that have a -W/--password option
(Peter)
E.57.3.8.1. psql
Remove verbose startup banner; now just suggest help (Joshua Drake)
Add \pset format wrapped mode to wrap output to the screen width, or file/pipe output too if \pset columns is set
(Bryce Nesbitt)
Allow all supported spellings of boolean values in \pset, rather than just on and off (Bruce)
Formerly, any string other than off was silently taken to mean true. psql will now complain about unrecognized spellings
(but still take them as true).
Require a space between a one-letter backslash command and its first argument (Bernd Helmle)
This removes a historical source of ambiguity.
Improve tab completion support for schema-qualified and quoted identifiers (Greg Sabino Mullane)
Display access control rights on multiple lines (Brendan Jurd, Andreas Scherbaum)
Make \d* commands that do not have a pattern argument show system objects only if the S modifier is specified (Greg Sabino
Mullane, Bruce)
The former behavior was inconsistent across different variants of \d, and in most cases it provided no easy way to see just user
objects.
Improve \d* commands to work with older PostgreSQL server versions (back to 7.4), not only the current server version
(Guillaume Lelarge)
Make \d show foreign-key constraints that reference the selected table (Kenneth D'Souza)
1530
Notes de version
Add column storage type and other relation options to the \d+ display (Gregory Stark, Euler Taveira de Oliveira)
Allow \dC to accept a wildcard pattern, which matches either datatype involved in the cast (Tom)
Add a function type column to \df's output, and add options to list only selected types of functions (David Fetter)
Make \df not hide functions that take or return type cstring (Tom)
Previously, such functions were hidden because most of them are datatype I/O functions, which were deemed uninteresting.
The new policy about hiding system functions by default makes this wart unnecessary.
E.57.3.8.3. pg_dump
Add a --no-tablespaces option to pg_dump/pg_dumpall/pg_restore so that dumps can be restored to clusters that have
non-matching tablespace layouts (Gavin Roy)
Reorder pg_dump --data-only output to dump tables referenced by foreign keys before the referencing tables (Tom)
This allows data loads when foreign keys are already present. If circular references make a safe ordering impossible, a NOTICE is issued.
Allow pg_dump, pg_dumpall, and pg_restore to use a specified role (Benedek Lszl)
Allow the OID to be specified when importing a large object, via new function lo_import_with_oid() (Tatsuo)
Improve error handling to allow the return of multiple error messages as multi-line error reports (Magnus)
Make PQexecParams() and related functions return PGRES_EMPTY_QUERY for an empty query (Tom)
They previously returned PGRES_COMMAND_OK.
Do not rely on Kerberos tickets to determine the default database username (Magnus)
Previously, a Kerberos-capable build of libpq would use the principal name from any available Kerberos ticket as default database username, even if the connection wasn't using Kerberos authentication. This was deemed inconsistent and confusing. The
1531
Notes de version
default username is now determined the same way with or without Kerberos. Note however that the database username must
still match the ticket when Kerberos authentication is used.
E.57.3.9.2. libpq SSL (Secure Sockets Layer) support
Allow the file locations for client certificates to be specified (Mark Woodward, Alvaro, Magnus)
Add a PQinitOpenSSL function to allow greater control over OpenSSL/libcrypto initialization (Andrew Chernow)
Make libpq unregister its OpenSSL callbacks when no database connections remain open (Bruce, Magnus, Russell Smith)
This is required for applications that unload the libpq library, otherwise invalid OpenSSL callbacks will remain.
E.57.3.9.3. ecpg
ecpg parser is now automatically generated from the server parser (Michael)
Previously the ecpg parser was hand-maintained.
Pass float8, int8, and related datatypes by value inside the server on 64-bit platforms (Zoltan Boszormenyi)
Add configure option --disable-float8-byval to use the old behavior. As above, this change might break old-style
external C functions.
Add configure options --with-segsize, --with-blocksize, --with-wal-blocksize, -with-wal-segsize (Zdenek Kotala, Tom)
1532
Notes de version
This simplifies build-time control over several constants that previously could only be changed by editing
pg_config_manual.h.
Add support for the Sun Studio compiler on Linux (Julius Stroffek)
Append the major version number to the backend gettext domain, and the soname major version number to libraries' gettext
domain (Peter)
This simplifies parallel installations of multiple versions.
Add support for code coverage testing with gcov (Michelle Caisse)
Fix bug in handling of the time zone database when cross-compiling (Richard Evans)
Link backend object files in one step, rather than in stages (Peter)
Enable DTrace support on Mac OS X Leopard and other non-Solaris platforms (Robert Lor)
Simplify and standardize conversions between C strings and text datums, by providing common functions for the purpose
(Brendan Jurd, Tom)
Clean up the include/catalog/ header files so that frontend programs can include them without including
postgres.h (Zdenek Kotala)
Make name char-aligned, and suppress zero-padding of name entries in indexes (Tom)
Add a hook to allow the planner's statistics lookup behavior to be overridden (Simon Riggs)
Replace the index access method amgetmulti entry point with amgetbitmap, and extend the API for amgettuple to
support run-time determination of operator lossiness (Heikki, Tom, Teodor)
The API for GIN and GiST opclass consistent functions has been extended as well.
Add support for partial-match searches in GIN indexes (Teodor Sigaev, Oleg Bartunov)
Notes de version
Prevent parser input files from being built with any conflicts (Peter)
Fix problem when setting LC_MESSAGES on MSVC-built systems (Hiroshi Inoue, Hiroshi Saito, Magnus)
E.57.3.12. Contrib
Add contrib/auto_explain to automatically run EXPLAIN on queries exceeding a specified duration (Itagaki Takahiro, Tom)
Add contrib/btree_gin to allow GIN indexes to handle more datatypes (Oleg, Teodor)
Add contrib/citext to provide a case-insensitive, multibyte-aware text data type (David Wheeler)
Add contrib/pg_stat_statements for server-wide tracking of statement execution statistics (Itagaki Takahiro)
Make contrib/pgbench use table names pgbench_accounts, pgbench_branches, pgbench_history, and pgbench_tellers,
rather than just accounts, branches, history, and tellers (Tom)
This is to reduce the risk of accidentally destroying real data by running pgbench.
Fix contrib/pgstattuple to handle tables and indexes with over 2 billion pages (Tatsuhito Kasahara)
In contrib/fuzzystrmatch, add a version of the Levenshtein string-distance function that allows the user to specify the
costs of insertion, deletion, and substitution (Volkan Yazici)
Enable contrib/dblink to use connection information stored in the SQL/MED catalogs (Joe Conway)
Improve contrib/dblink's reporting of errors from the remote server (Joe Conway)
Make contrib/dblink set client_encoding to match the local database's encoding (Joe Conway)
This prevents encoding problems when communicating with a remote database that uses a different encoding.
Make sure contrib/dblink uses a password supplied by the user, and not accidentally taken from the server's .pgpass
file (Joe Conway)
This is a minor security enhancement.
Modify get_raw_page() to support free space map (*_fsm) files. Also update contrib/pg_freespacemap.
Make contrib/pg_standby recover all available WAL before failover (Fujii Masao, Simon, Heikki)
To make this work safely, you now need to set the new recovery_end_command option in recovery.conf to clean up
the trigger file after failover. pg_standby will no longer remove the trigger file itself.
1534
Notes de version
This is expected to be the last PostgreSQL release in the 8.3.X series. Users are encouraged to update to a newer release branch
soon.
E.58.2. Changes
Fix SQL grammar to allow subscripting or field selection from a sub-SELECT result (Tom Lane)
Protect against race conditions when scanning pg_tablespace (Stephen Frost, Tom Lane)
CREATE DATABASE and DROP DATABASE could misbehave if there were concurrent updates of pg_tablespace entries.
Prevent DROP OWNED from trying to drop whole databases or tablespaces (lvaro Herrera)
For safety, ownership of these objects must be reassigned, not dropped.
Prevent misbehavior when a RowExpr or XmlExpr is parse-analyzed twice (Andres Freund, Tom Lane)
This mistake could be user-visible in contexts such as CREATE TABLE LIKE INCLUDING INDEXES.
Improve defenses against integer overflow in hashtable sizing calculations (Jeff Davis)
Ensure that non-ASCII prompt strings are translated to the correct code page on Windows (Alexander Law, Noah Misch)
This bug affected psql and some other client programs.
Fix possible crash in psql's \? command when not connected to a database (Meng Qingzhong)
Rearrange configure's tests for supplied functions so it is not fooled by bogus exports from libedit/libreadline (Christoph Berg)
Make pgxs build executables with the right .exe suffix when cross-compiling for Windows (Zoltan Boszormenyi)
Notes de version
E.59.2. Changes
Fix multiple bugs associated with CREATE INDEX CONCURRENTLY (Andres Freund, Tom Lane)
Fix CREATE INDEX CONCURRENTLY to use in-place updates when changing the state of an index's pg_index row. This
prevents race conditions that could cause concurrent sessions to miss updating the target index, thus resulting in corrupt
concurrently-created indexes.
Also, fix various other operations to ensure that they ignore invalid indexes resulting from a failed CREATE INDEX
CONCURRENTLY command. The most important of these is VACUUM, because an auto-vacuum could easily be launched
on the table before corrective action can be taken to fix or remove the invalid index.
Avoid corruption of internal hash tables when out of memory (Hitoshi Harada)
Fix planning of non-strict equivalence clauses above outer joins (Tom Lane)
The planner could derive incorrect constraints from a clause equating a non-strict construct to something else, for example
WHERE COALESCE(foo, 0) = 0 when foo is coming from the nullable side of an outer join.
Improve planner's ability to prove exclusion constraints from equivalence classes (Tom Lane)
Fix partial-row matching in hashed subplans to handle cross-type cases correctly (Tom Lane)
This affects multicolumn NOT IN subplans, such as WHERE (a, b) NOT IN (SELECT x, y FROM ...) when for
instance b and y are int4 and int8 respectively. This mistake led to wrong answers or crashes depending on the specific datatypes involved.
Acquire buffer lock when re-fetching the old tuple for an AFTER ROW UPDATE/DELETE trigger (Andres Freund)
In very unusual circumstances, this oversight could result in passing incorrect data to the precheck logic for a foreign-key enforcement trigger. That could result in a crash, or in an incorrect decision about whether to fire the trigger.
Ignore incorrect pg_attribute entries for system columns for views (Tom Lane)
Views do not have any system columns. However, we forgot to remove such entries when converting a table to a view. That's
fixed properly for 9.3 and later, but in previous branches we need to defend against existing mis-converted views.
Fix rule printing to dump INSERT INTO table DEFAULT VALUES correctly (Tom Lane)
Guard against stack overflow when there are too many UNION/INTERSECT/EXCEPT clauses in a query (Tom Lane)
Prevent platform-dependent failures when dividing the minimum possible integer value by -1 (Xi Wang, Tom Lane)
Fix possible access past end of string in date parsing (Hitoshi Harada)
Produce an understandable error message if the length of the path name for a Unix-domain socket exceeds the platform-specific limit (Tom Lane, Andrew Dunstan)
Formerly, this would result in something quite unhelpful, such as Non-recoverable failure in name resolution .
Fix memory leaks when sending composite column values to the client (Tom Lane)
Make pg_ctl more robust about reading the postmaster.pid file (Heikki Linnakangas)
Fix race conditions and possible file descriptor leakage.
Fix possible crash in psql if incorrectly-encoded data is presented and the client_encoding setting is a client-only encoding, such as SJIS (Jiang Guiqing)
Fix bugs in the restore.sql script emitted by pg_dump in tar output format (Tom Lane)
The script would fail outright on tables whose names include upper-case characters. Also, make the script capable of restoring
data in --inserts mode as well as the regular COPY mode.
Fix pg_restore to accept POSIX-conformant tar files (Brian Weaver, Tom Lane)
The original coding of pg_dump's tar output mode produced files that are not fully conformant with the POSIX standard.
This has been corrected for version 9.3. This patch updates previous branches so that they will accept both the incorrect and
the corrected formats, in hopes of avoiding compatibility problems when 9.3 comes out.
Fix pg_resetxlog to locate postmaster.pid correctly when given a relative path to the data directory (Tom Lane)
This mistake could lead to pg_resetxlog not noticing that there is an active postmaster using the data directory.
1536
Notes de version
Fix libpq's lo_import() and lo_export() functions to report file I/O errors properly (Tom Lane)
Make contrib/pageinspect's btree page inspection functions take buffer locks while examining pages (Tom Lane)
Fix pgxs support for building loadable modules on AIX (Tom Lane)
Building modules outside the original source tree didn't work on AIX.
Update time zone data files to tzdata release 2012j for DST law changes in Cuba, Israel, Jordan, Libya, Palestine, Western Samoa, and portions of Brazil.
E.60.2. Changes
Improve page-splitting decisions in GiST indexes (Alexander Korotkov, Robert Haas, Tom Lane)
Multi-column GiST indexes might suffer unexpected bloat due to this error.
Fix cascading privilege revoke to stop if privileges are still held (Tom Lane)
If we revoke a grant option from some role X, but X still holds that option via a grant from someone else, we should not recursively revoke the corresponding privilege from role(s) Y that X had granted it to.
Prevent PL/Perl from crashing if a recursive PL/Perl function is redefined while being executed (Tom Lane)
Update time zone data files to tzdata release 2012f for DST law changes in Fiji
Notes de version
E.61.2. Changes
Prevent access to external files/URLs via XML entity references (Noah Misch, Tom Lane)
xml_parse() would attempt to fetch external files or URLs as needed to resolve DTD and entity references in an XML value, thus allowing unprivileged database users to attempt to fetch data with the privileges of the database server. While the external data wouldn't get returned directly to the user, portions of it could be exposed in error messages if the data didn't parse
as valid XML; and in any case the mere ability to check existence of a file might be useful to an attacker. (CVE-2012-3489)
Back-patch 9.1 improvement to compress the fsync request queue (Robert Haas)
This improves performance during checkpoints. The 9.1 change has now seen enough field testing to seem safe to back-patch.
Fix log collector so that log_truncate_on_rotation works during the very first log rotation after server start (Tom
Lane)
Ensure that a whole-row reference to a subquery doesn't include any extra GROUP BY or ORDER BY columns (Tom Lane)
Disallow copying whole-row references in CHECK constraints and index definitions during CREATE TABLE (Tom Lane)
This situation can arise in CREATE TABLE with LIKE or INHERITS. The copied whole-row variable was incorrectly labeled with the row type of the original table not the new one. Rejecting the case seems reasonable for LIKE, since the row types
might well diverge later. For INHERITS we should ideally allow it, with an implicit coercion to the parent table's row type;
but that will require more work than seems safe to back-patch.
Fix memory leak in ARRAY(SELECT ...) subqueries (Heikki Linnakangas, Tom Lane)
Notes de version
Update time zone data files to tzdata release 2012e for DST law changes in Morocco and Tokelau
E.62.2. Changes
Fix incorrect password transformation in contrib/pgcrypto's DES crypt() function (Solar Designer)
If a password string contained the byte value 0x80, the remainder of the password was ignored, causing the password to be
much weaker than it appeared. With this fix, the rest of the string is properly included in the DES hash. Any stored password
values that are affected by this bug will thus no longer match, so the stored values may need to be updated. (CVE-2012-2143)
Ignore SECURITY DEFINER and SET attributes for a procedural language's call handler (Tom Lane)
Applying such attributes to a call handler could crash the server. (CVE-2012-2655)
Allow numeric timezone offsets in timestamp input to be up to 16 hours away from UTC (Tom Lane)
Some historical time zones have offsets larger than 15 hours, the previous limit. This could result in dumped data values being
rejected during reload.
Fix timestamp conversion to cope when the given time is exactly the last DST transition time for the current timezone (Tom
Lane)
This oversight has been there a long time, but was not noticed previously because most DST-using zones are presumed to have
an indefinite sequence of future DST transitions.
Fix text to name and char to name casts to perform string truncation correctly in multibyte encodings (Karl Schnaitter)
Fix slow session startup when pg_attribute is very large (Tom Lane)
If pg_attribute exceeds one-fourth of shared_buffers, cache rebuilding code that is sometimes needed during session
start would trigger the synchronized-scan logic, causing it to take many times longer than normal. The problem was particularly acute if many new sessions were starting at once.
Ensure sequential scans check for query cancel reasonably often (Merlin Moncure)
A scan encountering many consecutive pages that contain no live tuples would not respond to interrupts meanwhile.
Ensure the Windows implementation of PGSemaphoreLock() clears ImmediateInterruptOK before returning (Tom
Lane)
This oversight meant that a query-cancel interrupt received later in the same query could be accepted at an unsafe time, with
unpredictable but not good consequences.
Show whole-row variables safely when printing views or rules (Abbas Butt, Tom Lane)
Corner cases involving ambiguous names (that is, the name could be either a table or column name of the query) were printed
in an ambiguous way, risking that the view or rule would be interpreted differently after dump and reload. Avoid the ambiguous case by attaching a no-op cast.
Ensure autovacuum worker processes perform stack depth checking properly (Heikki Linnakangas)
Previously, infinite recursion in a function invoked by auto-ANALYZE could crash worker processes.
1539
Notes de version
Fix logging collector to not lose log coherency under high load (Andrew Dunstan)
The collector previously could fail to reassemble large messages if it got too busy.
Fix logging collector to ensure it will restart file rotation after receiving SIGHUP (Tom Lane)
Fix PL/pgSQL's GET DIAGNOSTICS command when the target is the function's first variable (Tom Lane)
Fix several performance problems in pg_dump when the database contains many objects (Jeff Janes, Tom Lane)
pg_dump could get very slow if the database contained many schemas, or if many objects are in dependency loops, or if there
are many owned sequences.
Fix contrib/dblink's dblink_exec() to not leak temporary database connections upon error (Tom Lane)
Update time zone data files to tzdata release 2012c for DST law changes in Antarctica, Armenia, Chile, Cuba, Falkland Islands, Gaza, Haiti, Hebron, Morocco, Syria, and Tokelau Islands; also historical corrections for Canada.
E.63.2. Changes
Require execute permission on the trigger function for CREATE TRIGGER (Robert Haas)
This missing check could allow another user to execute a trigger function with forged input data, by installing it on a table he
owns. This is only of significance for trigger functions marked SECURITY DEFINER, since otherwise trigger functions run
as the table owner anyway. (CVE-2012-0866)
Fix btree index corruption from insertions concurrent with vacuuming (Tom Lane)
An index page split caused by an insertion could sometimes cause a concurrently-running VACUUM to miss removing index
entries that it should remove. After the corresponding table rows are removed, the dangling index entries would cause errors
(such as could not read block N in file ... ) or worse, silently wrong query results after unrelated rows are re-inserted at the
now-free table locations. This bug has been present since release 8.2, but occurs so infrequently that it was not diagnosed until
now. If you have reason to suspect that it has happened in your database, reindexing the affected index will fix things.
Allow non-existent values for some settings in ALTER USER/DATABASE SET (Heikki Linnakangas)
Allow default_text_search_config, default_tablespace, and temp_tablespaces to be set to names that
are not known. This is because they might be known in another database where the setting is intended to be used, or for the tablespace cases because the tablespace might not be created yet. The same issue was previously recognized for
search_path, and these settings now act like that one.
Track the OID counter correctly during WAL replay, even when it wraps around (Tom Lane)
Previously the OID counter would remain stuck at a high value until the system exited replay mode. The practical consequences of that are usually nil, but there are scenarios wherein a standby server that's been promoted to master might take a
long time to advance the OID counter to a reasonable value once values are needed.
Notes de version
Rather than enforcing an exact string match, the code would effectively accept any string that satisfies the pattern subexpression referenced by the back-reference symbol.
A similar problem still afflicts back-references that are embedded in a larger quantified expression, rather than being the immediate subject of the quantifier. This will be addressed in a future PostgreSQL release.
Fix I/O-conversion-related memory leaks in plpgsql (Andres Freund, Jan Urbanski, Tom Lane)
Certain operations would leak memory until the end of the current function.
Fix pg_restore's direct-to-database mode for INSERT-style table data (Tom Lane)
Direct-to-database restores from archive files made with --inserts or --column-inserts options fail when using
pg_restore from a release dated September or December 2011, as a result of an oversight in a fix for another problem. The archive file itself is not at fault, and text-mode output is okay.
Use -fexcess-precision=standard option when building with gcc versions that accept it (Andrew Dunstan)
This prevents assorted scenarios wherein recent versions of gcc will produce creative results.
Notes de version
E.64.2. Changes
Fix TOAST-related data corruption during CREATE TABLE dest AS SELECT * FROM src or INSERT INTO
dest SELECT * FROM src (Tom Lane)
If a table has been modified by ALTER TABLE ADD COLUMN, attempts to copy its data verbatim to another table could
produce corrupt results in certain corner cases. The problem can only manifest in this precise form in 8.4 and later, but we patched earlier versions as well in case there are other code paths that could trigger the same bug.
Fix race condition during toast table access from stale syscache entries (Tom Lane)
The typical symptom was transient errors like missing chunk number 0 for toast value NNNNN in pg_toast_2619 , where
the cited toast table would always belong to a system catalog.
Make DatumGetInetP() unpack inet datums that have a 1-byte header, and add a new macro, DatumGetInetPP(),
that does not (Heikki Linnakangas)
This change affects no core code, but might prevent crashes in add-on code that expects DatumGetInetP() to produce an
unpacked datum as per usual convention.
Improve locale support in money type's input and output (Tom Lane)
Aside from not supporting all standard lc_monetary formatting options, the input and output functions were inconsistent,
meaning there were locales in which dumped money values could not be re-read.
Don't let transform_null_equals affect CASE foo WHEN NULL ... constructs (Heikki Linnakangas)
transform_null_equals is only supposed to affect foo = NULL expressions written directly by the user, not equality
checks generated internally by this form of CASE.
Change foreign-key trigger creation order to better support self-referential foreign keys (Tom Lane)
For a cascading foreign key that references its own table, a row update will fire both the ON UPDATE trigger and the CHECK
trigger as one event. The ON UPDATE trigger must execute first, else the CHECK will check a non-final state of the row and
possibly throw an inappropriate error. However, the firing order of these triggers is determined by their names, which generally sort in creation order since the triggers have auto-generated names following the convention
RI_ConstraintTrigger_NNNN . A proper fix would require modifying that convention, which we will do in 9.2, but it
seems risky to change it in existing releases. So this patch just changes the creation order of the triggers. Users encountering
this type of error should drop and re-create the foreign key constraint to get its triggers into the right order.
Avoid floating-point underflow while tracking buffer allocation rate (Greg Matthews)
While harmless in itself, on certain platforms this would result in annoying kernel log messages.
Preserve blank lines within commands in psql's command history (Robert Haas)
The former behavior could cause problems if an empty line was removed from within a string literal, for example.
Fix pg_dump to dump user-defined casts between auto-generated types, such as table rowtypes (Tom Lane)
Use the preferred version of xsubpp to build PL/Perl, not necessarily the operating system's main copy (David Wheeler and
1542
Notes de version
Alex Hunsaker)
Ensure VPATH builds properly install all server header files (Peter Eisentraut)
Fix interpretation of Windows timezone names for Central America (Tom Lane)
Map Central America Standard Time to CST6, not CST6CDT, because DST is generally not observed anywhere in Central
America.
Update time zone data files to tzdata release 2011n for DST law changes in Brazil, Cuba, Fiji, Palestine, Russia, and Samoa;
also historical corrections for Alaska and British East Africa.
E.65.2. Changes
Fix multiple bugs in GiST index page split processing (Heikki Linnakangas)
The probability of occurrence was low, but these could lead to index corruption.
Avoid possibly accessing off the end of memory in ANALYZE and in SJIS-2004 encoding conversion (Noah Misch)
This fixes some very-low-probability server crash scenarios.
Fix performance problem when constructing a large, lossy bitmap (Tom Lane)
Fix array- and path-creating functions to ensure padding bytes are zeroes (Tom Lane)
1543
Notes de version
This avoids some situations where the planner will think that semantically-equal constants are not equal, resulting in poor optimization.
Work around gcc 4.6.0 bug that breaks WAL replay (Tom Lane)
This could lead to loss of committed transactions after a server crash.
Defend against integer overflow when computing size of a hash table (Tom Lane)
Fix cases where CLUSTER might attempt to access already-removed TOAST data (Tom Lane)
Fix portability bugs in use of credentials control messages for peer authentication (Tom Lane)
Fix SSPI login when multiple roundtrips are required (Ahmed Shinwari, Magnus Hagander)
The typical symptom of this problem was The function requested is not supported errors during SSPI login.
Avoid integer overflow when the sum of LIMIT and OFFSET values exceeds 2^63 (Heikki Linnakangas)
Add overflow checks to int4 and int8 versions of generate_series() (Robert Haas)
Fix pg_size_pretty() to avoid overflow for inputs close to 2^63 (Tom Lane)
Fix psql's counting of script file line numbers during COPY from a different file (Tom Lane)
Fix write-past-buffer-end and memory leak in libpq's LDAP service lookup code (Albe Laurenz)
In libpq, avoid failures when using nonblocking I/O and an SSL connection (Martin Pihlak, Tom Lane)
Make ecpglib write double values with 15 digits precision (Akira Kurosawa)
Apply upstream fix for blowfish signed-character bug (CVE-2011-2483) (Tom Lane)
contrib/pg_crypto's blowfish encryption code could give wrong results on platforms where char is signed (which is
most), leading to encrypted passwords being weaker than they should be.
Fix pgstatindex() to give consistent results for empty indexes (Tom Lane)
Update configure script's method for probing existence of system functions (Tom Lane)
The version of autoconf we used in 8.3 and 8.2 could be fooled by compilers that perform link-time optimization.
Fix assorted issues with build and install file paths containing spaces (Tom Lane)
1544
Notes de version
Update time zone data files to tzdata release 2011i for DST law changes in Canada, Egypt, Russia, Samoa, and South Sudan.
E.66.2. Changes
Fix dangling-pointer problem in BEFORE ROW UPDATE trigger handling when there was a concurrent update to the target
tuple (Tom Lane)
This bug has been observed to result in intermittent cannot extract system attribute from virtual tuple failures while trying
to do UPDATE RETURNING ctid. There is a very small probability of more serious errors, such as generating incorrect index entries for the updated tuple.
Disallow DROP TABLE when there are pending deferred trigger events for the table (Tom Lane)
Formerly the DROP would go through, leading to could not open relation with OID nnn errors when the triggers were
eventually fired.
Fix pg_restore to cope with long lines (over 1KB) in TOC files (Tom Lane)
Put in more safeguards against crashing due to division-by-zero with overly enthusiastic compiler optimization (Aurelien Jarno)
Fix usage of xcopy in Windows build scripts to work correctly under Windows 7 (Andrew Dunstan)
This affects the build scripts only, not installation or usage.
Update time zone data files to tzdata release 2011f for DST law changes in Chile, Cuba, Falkland Islands, Morocco, Samoa,
and Turkey; also historical corrections for South Australia, Alaska, and Hawaii.
Notes de version
Release Date
2011-01-31
This release contains a variety of fixes from 8.3.13. For information about new features in the 8.3 major release, see Section E.81,
Release 8.3 .
E.67.2. Changes
Avoid failures when EXPLAIN tries to display a simple-form CASE expression (Tom Lane)
If the CASE's test expression was a constant, the planner could simplify the CASE into a form that confused the expression-display code, resulting in unexpected CASE WHEN clause errors.
Fix assignment to an array slice that is before the existing range of subscripts (Tom Lane)
If there was a gap between the newly added subscripts and the first pre-existing subscript, the code miscalculated how many
entries needed to be copied from the old array's null bitmap, potentially leading to data corruption or crash.
Avoid unexpected conversion overflow in planner for very distant date values (Tom Lane)
The date type supports a wider range of dates than can be represented by the timestamp types, but the planner assumed it could
always convert a date to timestamp with impunity.
Fix pg_restore's text output for large objects (BLOBs) when standard_conforming_strings is on (Tom Lane)
Although restoring directly to a database worked correctly, string escaping was incorrect if pg_restore was asked for SQL text
output and standard_conforming_strings had been enabled in the source database.
Fix erroneous parsing of tsquery values containing ... & !(subexpression) | ... (Tom Lane)
Queries containing this combination of operators were not executed correctly. The same error existed in contrib/intarray's query_int type and contrib/ltree's ltxtquery type.
Fix buffer overrun in contrib/intarray's input function for the query_int type (Apple)
This bug is a security risk since the function's return address could be overwritten. Thanks to Apple Inc's security team for reporting this issue and supplying the fix. (CVE-2010-4015)
E.68.2. Changes
1546
Notes de version
Force the default wal_sync_method to be fdatasync on Linux (Tom Lane, Marti Raudsepp)
The default on Linux has actually been fdatasync for many years, but recent kernel changes caused PostgreSQL to
choose open_datasync instead. This choice did not result in any performance improvement, and caused outright failures
on certain filesystems, notably ext4 with the data=journal mount option.
Fix assorted bugs in WAL replay logic for GIN indexes (Tom Lane)
This could result in bad buffer id: 0 failures or corruption of index contents during replication.
Fix recovery from base backup when the starting checkpoint WAL record is not in the same WAL segment as its redo point
(Jeff Davis)
Fix persistent slowdown of autovacuum workers when multiple workers remain active for a long time (Tom Lane)
The effective vacuum_cost_limit for an autovacuum worker could drop to nearly zero if it processed enough tables, causing it to run extremely slowly.
Avoid memory leakage while ANALYZE'ing complex index expressions (Tom Lane)
Ensure an index that uses a whole-row Var still depends on its table (Tom Lane)
An index declared like create index i on t (foo(t.*)) would not automatically get dropped when its table was
dropped.
Do not inline a SQL function with multiple OUT parameters (Tom Lane)
This avoids a possible crash due to loss of information about the expected result rowtype.
Behave correctly if ORDER BY, LIMIT, FOR UPDATE, or WITH is attached to the VALUES part of INSERT ... VALUES
(Tom Lane)
Fix postmaster crash when connection acceptance (accept() or one of the calls made immediately after it) fails, and the
postmaster was compiled with GSSAPI support (Alexander Chernikov)
Fix missed unlink of temporary files when log_temp_files is active (Tom Lane)
If an error occurred while attempting to emit the log message, the unlink was not done, resulting in accumulation of temp files.
Fix incorrect calculation of distance from a point to a horizontal line segment (Tom Lane)
This bug affected several different geometric distance-measurement operators.
Fix PL/pgSQL's handling of simple expressions to not fail in recursion or error-recovery cases (Tom Lane)
1547
Notes de version
Don't emit identifier will be truncated notices in contrib/dblink except when creating new connections (Itagaki Takahiro)
Update time zone data files to tzdata release 2010o for DST law changes in Fiji and Samoa; also historical corrections for
Hong Kong.
E.69.2. Changes
Use a separate interpreter for each calling SQL userid in PL/Perl and PL/Tcl (Tom Lane)
This change prevents security problems that can be caused by subverting Perl or Tcl code that will be executed later in the
same session under another SQL user identity (for example, within a SECURITY DEFINER function). Most scripting languages offer numerous ways that that might be done, such as redefining standard functions or operators called by the target
function. Without this change, any SQL user with Perl or Tcl language usage rights can do essentially anything with the SQL
privileges of the target function's owner.
The cost of this change is that intentional communication among Perl and Tcl functions becomes more difficult. To provide an
escape hatch, PL/PerlU and PL/TclU functions continue to use only one interpreter per session. This is not considered a security issue since all such functions execute at the trust level of a database superuser already.
It is likely that third-party procedural languages that claim to offer trusted execution have similar security issues. We advise
contacting the authors of any PL you are depending on for security-critical purposes.
Our thanks to Tim Bunce for pointing out this issue (CVE-2010-3433).
Prevent possible crashes in pg_get_expr() by disallowing it from being called with an argument that is not one of the system catalog columns it's intended to be used with (Heikki Linnakangas, Tom Lane)
Fix possible duplicate scans of UNION ALL member relations (Tom Lane)
Reduce PANIC to ERROR in some occasionally-reported btree failure cases, and provide additional detail in the resulting error messages (Tom Lane)
1548
Notes de version
Defend against functions returning setof record where not all the returned rows are actually of the same rowtype (Tom Lane)
Fix possible failure when hashing a pass-by-reference function result (Tao Ma, Tom Lane)
Improve merge join's handling of NULLs in the join columns (Tom Lane)
A merge join can now stop entirely upon reaching the first NULL, if the sort order is such that NULLs sort high.
Take care to fsync the contents of lockfiles (both postmaster.pid and the socket lockfile) while writing them (Tom Lane)
This omission could result in corrupted lockfile contents if the machine crashes shortly after postmaster start. That could in
turn prevent subsequent attempts to start the postmaster from succeeding, until the lockfile is manually removed.
Avoid recursion while assigning XIDs to heavily-nested subtransactions (Andres Freund, Robert Haas)
The original coding could result in a crash if there was limited stack space.
Avoid holding open old WAL segments in the walwriter process (Magnus Hagander, Heikki Linnakangas)
The previous coding would prevent removal of no-longer-needed segments.
Fix log_line_prefix's %i escape, which could produce junk early in backend startup (Tom Lane)
Fix possible data corruption in ALTER TABLE ... SET TABLESPACE when archiving is enabled (Jeff Davis)
Allow CREATE DATABASE and ALTER DATABASE ... SET TABLESPACE to be interrupted by query-cancel
(Guillaume Lelarge)
Fix REASSIGN OWNED to handle operator classes and families (Asko Tiidumaa)
Fix possible core dump when comparing two empty tsquery values (Tom Lane)
In PL/Python, defend against null pointer results from PyCObject_AsVoidPtr and PyCObject_FromVoidPtr (Peter
Eisentraut)
Make psql recognize DISCARD ALL as a command that should not be encased in a transaction block in autocommit-off
mode (Itagaki Takahiro)
Fix ecpg to process data from RETURNING clauses correctly (Michael Meskes)
Fix connection leak after duplicate connection name errors in contrib/dblink (Itagaki Takahiro)
Fix contrib/dblink to handle connection names longer than 62 bytes correctly (Itagaki Takahiro)
Update build infrastructure and documentation to reflect the source code repository's move from CVS to Git (Magnus Hagander and others)
Update time zone data files to tzdata release 2010l for DST law changes in Egypt and Palestine; also historical corrections for
Finland.
This change also adds new names for two Micronesian timezones: Pacific/Chuuk is now preferred over Pacific/Truk (and the
preferred abbreviation is CHUT not TRUT) and Pacific/Pohnpei is preferred over Pacific/Ponape.
Make Windows' N. Central Asia Standard Time timezone map to Asia/Novosibirsk, not Asia/Almaty (Magnus Hagander)
Microsoft changed the DST behavior of this zone in the timezone update from KB976098. Asia/Novosibirsk is a better match
to its new behavior.
Notes de version
Release Date
2010-05-17
This release contains a variety of fixes from 8.3.10. For information about new features in the 8.3 major release, see Section E.81,
Release 8.3 .
E.70.2. Changes
Enforce restrictions in plperl using an opmask applied to the whole interpreter, instead of using Safe.pm (Tim Bunce,
Andrew Dunstan)
Recent developments have convinced us that Safe.pm is too insecure to rely on for making plperl trustable. This change
removes use of Safe.pm altogether, in favor of using a separate interpreter with an opcode mask that is always applied. Pleasant side effects of the change include that it is now possible to use Perl's strict pragma in a natural way in plperl, and
that Perl's $a and $b variables work as expected in sort routines, and that function compilation is significantly faster.
(CVE-2010-1169)
Fix possible crash if a cache reset message is received during rebuild of a relcache entry (Heikki)
This error was introduced in 8.3.10 while fixing a related failure.
Apply per-function GUC settings while running the language validator for the function (Itagaki Takahiro)
This avoids failures if the function's code is invalid without the setting; an example is that SQL functions may not parse if the
search_path is not correct.
Avoid possible crash during backend shutdown if shutdown occurs when a CONTEXT addition would be made to log entries
(Tom)
In some cases the context-printing function would fail because the current transaction had already been rolled back when it
came time to print a log message.
Ensure the archiver process responds to changes in archive_command as soon as possible (Tom)
Prevent infinite recursion in psql when expanding a variable that refers to itself (Tom)
Fix psql's \copy to not add spaces around a dot within \copy (select ...) (Tom)
Addition of spaces around the decimal point in a numeric literal would result in a syntax error.
Fix unnecessary GIN indexes do not support whole-index scans errors for unsatisfiable queries using contrib/intarray operators (Tom)
Ensure that contrib/pgstattuple functions respond to cancel interrupts promptly (Tatsuhito Kasahara)
Make server startup deal properly with the case that shmget() returns EINVAL for an existing shared memory segment
1550
Notes de version
(Tom)
This behavior has been observed on BSD-derived kernels including OS X. It resulted in an entirely-misleading startup failure
complaining that the shared memory request size was too large.
Deal more robustly with incomplete time zone information in the Windows registry (Magnus)
Update time zone data files to tzdata release 2010j for DST law changes in Argentina, Australian Antarctic, Bangladesh,
Mexico, Morocco, Pakistan, Palestine, Russia, Syria, Tunisia; also historical corrections for Taiwan.
Also, add PKST (Pakistan Summer Time) to the default set of timezone abbreviations.
E.71.2. Changes
Add new configuration parameter ssl_renegotiation_limit to control how often we do session key renegotiation for
an SSL connection (Magnus)
This can be set to zero to disable renegotiation completely, which may be required if a broken SSL library is used. In particular, some vendors are shipping stopgap patches for CVE-2009-3555 that cause renegotiation attempts to fail.
Fix possible crashes due to not handling errors during relcache reload cleanly (Tom)
Fix possible crash due to use of dangling pointer to a cached plan (Tatsuo)
Fix possible crashes when trying to recover from a failure in subtransaction start (Tom)
Fix server memory leak associated with use of savepoints and a client encoding different from server's encoding (Tom)
Fix incorrect WAL data emitted during end-of-recovery cleanup of a GIST index page split (Yoichi Hirai)
This would result in index corruption, or even more likely an error during WAL replay, if we were unlucky enough to crash
during end-of-recovery cleanup after having completed an incomplete GIST insertion.
Make substring() for bit types treat any negative length as meaning all the rest of the string (Tom)
The previous coding treated only -1 that way, and would produce an invalid result value for other negative values, possibly
leading to a crash (CVE-2010-0442).
Fix integer-to-bit-string conversions to handle the first fractional byte correctly when the output bit width is wider than the given integer by something other than a multiple of 8 bits (Tom)
Fix assorted crashes in xml processing caused by sloppy memory management (Tom)
This is a back-patch of changes first applied in 8.4. The 8.3 code was known buggy, but the new code was sufficiently different to not want to back-patch it until it had gotten some field testing.
Fix bug with trying to update a field of an element of a composite-type array column (Tom)
Fix the STOP WAL LOCATION entry in backup history files to report the next WAL segment's name when the end location
1551
Notes de version
Improve constraint exclusion processing of boolean-variable cases, in particular make it possible to exclude a partition that has
a bool_column = false constraint (Tom)
When reading pg_hba.conf and related files, do not treat @something as a file inclusion request if the @ appears inside
quote marks; also, never treat @ by itself as a file inclusion request (Tom)
This prevents erratic behavior if a role or database name starts with @. If you need to include a file whose path name contains
spaces, you can still do so, but you must write @"/path to/file" rather than putting the quotes around the whole
construct.
Prevent infinite loop on some platforms if a directory is named as an inclusion target in pg_hba.conf and related files
(Tom)
Fix possible infinite loop if SSL_read or SSL_write fails without setting errno (Tom)
This is reportedly possible with some Windows versions of openssl.
Disallow GSSAPI authentication on local connections, since it requires a hostname to function correctly (Magnus)
Make ecpg report the proper SQLSTATE if the connection disappears (Michael)
Fix psql's numericlocale option to not format strings it shouldn't in latex and troff output formats (Heikki)
Make psql return the correct exit status (3) when ON_ERROR_STOP and --single-transaction are both specified and
an error occurs during the implied COMMIT (Bruce)
Fix plpgsql failure in one case where a composite column is set to NULL (Tom)
Fix possible failure when calling PL/Perl functions from PL/PerlU or vice versa (Tim Bunce)
Add volatile markings in PL/Python to avoid possible compiler-specific misbehavior (Zdenek Kotala)
Prevent crash in contrib/dblink when too many key columns are specified to a dblink_build_sql_* function
(Rushabh Lathia, Joe Conway)
Update time zone data files to tzdata release 2010e for DST law changes in Bangladesh, Chile, Fiji, Mexico, Paraguay, Samoa.
Notes de version
A dump/restore is not required for those running 8.3.X. However, if you are upgrading from a version earlier than 8.3.8, see Section E.73, Release 8.3.8 .
E.72.2. Changes
Protect against indirect security threats caused by index functions changing session-local state (Gurjeet Singh, Tom)
This change prevents allegedly-immutable index functions from possibly subverting a superuser's session (CVE-2009-4136).
Reject SSL certificates containing an embedded null byte in the common name (CN) field (Magnus)
This prevents unintended matching of a certificate to a server or client name during SSL validation (CVE-2009-4034).
Fix possible crash due to integer overflow in hash table size calculation (Tom)
This could occur with extremely large planner estimates for the size of a hashjoin's result.
Ensure that shared tuple-level locks held by prepared transactions are not ignored (Heikki)
Fix premature drop of temporary files used for a cursor that is accessed within a subtransaction (Heikki)
Fix memory leak in syslogger process when rotating to a new CSV logfile (Tom)
Fix incorrect logic for GiST index page splits, when the split depends on a non-first column of the index (Paul Ramsey)
Don't error out if recycling or removing an old WAL file fails at the end of checkpoint (Heikki)
It's better to treat the problem as non-fatal and allow the checkpoint to complete. Future checkpoints will retry the removal.
Such problems are not expected in normal operation, but have been seen to be caused by misdesigned Windows anti-virus and
backup software.
Raise the maximum authentication token (Kerberos ticket) size in GSSAPI and SSPI authentication methods (Ian Turner)
While the old 2000-byte limit was more than enough for Unix Kerberos implementations, tickets issued by Windows Domain
Controllers can be much larger.
1553
Notes de version
If the XML header doesn't specify an encoding, we now assume UTF-8 by default; the previous handling was inconsistent.
Fix bug with calling plperl from plperlu or vice versa (Tom)
An error exit from the inner function could result in crashes due to failure to re-select the correct Perl interpreter for the outer
function.
Ensure that Perl arrays are properly converted to PostgreSQL arrays when returned by a set-returning PL/Perl function
(Andrew Dunstan, Abhijit Menon-Sen)
This worked correctly already for non-set-returning functions.
Ensure psql's flex module is compiled with the correct system header definitions (Tom)
This fixes build failures on platforms where --enable-largefile causes incompatible changes in the generated code.
Make the postmaster ignore any application_name parameter in connection request packets, to improve compatibility
with future libpq versions (Tom)
Update the timezone abbreviation files to match current reality (Joachim Wieland)
This includes adding IDT and SGT to the default timezone abbreviation set.
Update time zone data files to tzdata release 2009s for DST law changes in Antarctica, Argentina, Bangladesh, Fiji, Novokuznetsk, Pakistan, Palestine, Samoa, Syria; also historical corrections for Hong Kong.
E.73.2. Changes
Disallow RESET ROLE and RESET SESSION AUTHORIZATION inside security-definer functions (Tom, Heikki)
This covers a case that was missed in the previous patch that disallowed SET ROLE and SET SESSION AUTHORIZATION inside security-definer functions. (See CVE-2007-6600)
1554
Notes de version
Fix handling of sub-SELECTs appearing in the arguments of an outer-level aggregate function (Tom)
Fix bugs associated with fetching a whole-row value from the output of a Sort or Materialize plan node (Tom)
Prevent synchronize_seqscans from changing the results of scrollable and WITH HOLD cursors (Tom)
Revert planner change that disabled partial-index and constraint exclusion optimizations when there were more than 100
clauses in an AND or OR list (Tom)
Fix overflow for INTERVAL 'x ms' when x is more than 2 million and integer datetimes are in use (Alex Hunsaker)
Fix money data type to work in locales where currency amounts have no fractional digits, e.g. Japan (Itagaki Takahiro)
Fix poor choice of page split point in GiST R-tree operator classes (Teodor)
Ensure that a fast shutdown request will forcibly terminate open sessions, even if a smart shutdown was already in progress (Fujii Masao)
Avoid performance degradation in bulk inserts into GIN indexes when the input values are (nearly) in sorted order (Tom)
Correctly enforce NOT NULL domain constraints in some contexts in PL/pgSQL (Tom)
Fix pg_ctl to not go into an infinite loop if postgresql.conf is empty (Jeff Davis)
Improve pg_dump's efficiency when there are many large objects (Tamas Vincze)
Use SIGUSR1, not SIGQUIT, as the failover signal for pg_standby (Heikki)
Make contrib/hstore throw an error when a key or value is too long to fit in its data structure, rather than silently truncating it (Andrew Gierth)
Fix contrib/xml2's xslt_process() to properly handle the maximum number of parameters (twenty) (Tom)
Improve robustness of libpq's code to recover from errors during COPY FROM STDIN (Tom)
Avoid including conflicting readline and editline header files when both libraries are installed (Zdenek Kotala)
Update time zone data files to tzdata release 2009l for DST law changes in Bangladesh, Egypt, Jordan, Pakistan, Argentina/
San_Luis, Cuba, Jordan (historical correction only), Mauritius, Morocco, Palestine, Syria, Tunisia.
Notes de version
A dump/restore is not required for those running 8.3.X. However, if you are upgrading from a version earlier than 8.3.5, see Section E.76, Release 8.3.5 .
E.74.2. Changes
Disallow CREATE CONVERSION with the wrong encodings for the specified conversion function (Heikki)
This prevents one possible scenario for encoding conversion failure. The previous change is a backstop to guard against other
kinds of failures in the same area.
Fix xpath() to not modify the path expression unless necessary, and to make a saner attempt at it when necessary (Andrew)
The SQL standard suggests that xpath should work on data that is a document fragment, but libxml doesn't support that, and
indeed it's not clear that this is sensible according to the XPath standard. xpath attempted to work around this mismatch by
modifying both the data and the path expression, but the modification was buggy and could cause valid searches to fail. Now,
xpath checks whether the data is in fact a well-formed document, and if so invokes libxml with no change to the data or path
expression. Otherwise, a different modification method that is somewhat less likely to fail is used.
Note
The new modification method is still not 100% satisfactory, and it seems likely that no real solution is possible.
This patch should therefore be viewed as a band-aid to keep from breaking existing applications unnecessarily.
It is likely that PostgreSQL 8.4 will simply reject use of xpath on data that is not a well-formed document.
Fix core dump when to_char() is given format codes that are inappropriate for the type of the data argument (Tom)
Fix possible failure in text search when C locale is used with a multi-byte encoding (Teodor)
Crashes were possible on platforms where wchar_t is narrower than int; Windows in particular.
Fix extreme inefficiency in text search parser's handling of an email-like string containing multiple @ characters (Heikki)
Fix planner problem with sub-SELECT in the output list of a larger subquery (Tom)
The known symptom of this bug is a failed to locate grouping columns error that is dependent on the datatype involved;
but there could be other issues as well.
Change UNLISTEN to exit quickly if the current session has never executed any LISTEN command (Tom)
Most of the time this is not a particularly useful optimization, but since DISCARD ALL invokes UNLISTEN, the previous
coding caused a substantial performance problem for applications that made heavy use of DISCARD ALL.
Fix PL/pgSQL to not treat INTO after INSERT as an INTO-variables clause anywhere in the string, not only at the start; in
particular, don't fail for INSERT INTO within CREATE RULE (Tom)
Clean up PL/pgSQL error status variables fully at block exit (Ashesh Vashi and Dave Page)
This is not a problem for PL/pgSQL itself, but the omission could cause the PL/pgSQL Debugger to crash while examining the
state of a function.
1556
Notes de version
Add MUST (Mauritius Island Summer Time) to the default list of known timezone abbreviations (Xavier Bugaud)
E.75.2. Changes
Make DISCARD ALL release advisory locks, in addition to everything it already did (Tom)
This was decided to be the most appropriate behavior. This could affect existing applications, however.
Fix possible crash in ispell dictionary if high-bit-set characters are used as flags (Teodor)
This is known to be done by one widely available Norwegian dictionary, and the same condition may exist in others.
Prevent possible Assert failure or misconversion if an encoding conversion is created with the wrong conversion function for
the specified pair of encodings (Tom, Heikki)
Fix possible Assert failure if a statement executed in PL/pgSQL is rewritten into another kind of statement, for example if an
INSERT is rewritten into an UPDATE (Heikki)
Make it safer for SPI-using functions to be used within datatype I/O; in particular, to be used in domain check constraints
(Tom)
Fix a problem that sometimes kept ALTER TABLE ENABLE/DISABLE RULE from being recognized by active sessions
(Tom)
Fix a problem that made UPDATE RETURNING tableoid return zero instead of the correct OID (Tom)
Allow functions declared as taking ANYARRAY to work on the pg_statistic columns of that type (Tom)
This used to work, but was unintentionally broken in 8.3.
Fix planner misestimation of selectivity when transitive equality is applied to an outer-join clause (Tom)
1557
Notes de version
This could result in bad plans for queries like ... from a left join b on a.a1 = b.b1 where a.a1 = 42
...
Ensure that the contents of a holdable cursor don't depend on the contents of TOAST tables (Tom)
Previously, large field values in a cursor result might be represented as TOAST pointers, which would fail if the referenced
table got dropped before the cursor is read, or if the large value is deleted and then vacuumed away. This cannot happen with
an ordinary cursor, but it could with a cursor that is held past its creating transaction.
Fix memory leak when a set-returning function is terminated without reading its whole result (Tom)
Fix encoding conversion problems in XML functions when the database encoding isn't UTF-8 (Tom)
Fix incorrect behavior of contrib/tsearch2 compatibility trigger when it's fired more than once in a command (Teodor)
Fix configure script to properly report failure when unable to obtain linkage information for PL/Perl (Andrew)
Make all documentation reference pgsql-bugs and/or pgsql-hackers as appropriate, instead of the nowdecommissioned pgsql-ports and pgsql-patches mailing lists (Tom)
Update time zone data files to tzdata release 2009a (for Kathmandu and historical DST corrections in Switzerland, Cuba)
E.76.2. Changes
Fix GiST index corruption due to marking the wrong index entry dead after a deletion (Teodor)
This would result in index searches failing to find rows they should have found. Corrupted indexes can be fixed with REINDEX.
Fix backend crash when the client encoding cannot represent a localized error message (Tom)
We have addressed similar issues before, but it would still fail if the character has no equivalent message itself couldn't be
converted. The fix is to disable localization and send the plain ASCII error message when we detect such a situation.
Notes de version
Fix possible crash when deeply nested functions are invoked from a trigger (Tom)
Improve optimization of expression IN (expression-list) queries (Tom, per an idea from Robert Haas)
Cases in which there are query variables on the right-hand side had been handled less efficiently in 8.2.x and 8.3.x than in
prior versions. The fix restores 8.1 behavior for such cases.
Fix mis-expansion of rule queries when a sub-SELECT appears in a function call in FROM, a multi-row VALUES list, or a RETURNING list (Tom)
The usual symptom of this problem is an unrecognized node type error.
Fix Assert failure during rescan of an IS NULL search of a GiST index (Teodor)
Ensure an error is reported when a newly-defined PL/pgSQL trigger function is invoked as a normal function (Tom)
Prevent possible collision of relfilenode numbers when moving a table to another tablespace with ALTER SET TABLESPACE (Heikki)
The command tried to re-use the existing filename, instead of picking one that is known unused in the destination directory.
Fix incorrect text search headline generation when single query item matches first word of text (Sushant Sinha)
Fix improper display of fractional seconds in interval values when using a non-ISO datestyle in an -enable-integer-datetimes build (Ron Mayer)
Make ILIKE compare characters case-insensitively even when they're escaped (Andrew)
Ensure SPI_getvalue and SPI_getbinval behave correctly when the passed tuple and tuple descriptor have different
numbers of columns (Tom)
This situation is normal when a table has had columns added or removed, but these two functions didn't handle it properly. The
only likely consequence is an incorrect error indication.
Fix small memory leak when using libpq's gsslib parameter (Magnus)
The space used by the parameter string was not freed at connection close.
Update time zone data files to tzdata release 2008i (for DST law changes in Argentina, Brazil, Mauritius, Syria)
Notes de version
A dump/restore is not required for those running 8.3.X. However, if you are upgrading from a version earlier than 8.3.1, see Section E.80, Release 8.3.1 .
E.77.2. Changes
Fix potential use of wrong cutoff XID for HOT page pruning (Alvaro)
This error created a risk of corruption in system catalogs that are consulted by VACUUM: dead tuple versions might be removed too soon. The impact of this on actual database operations would be minimal, since the system doesn't follow MVCC rules
while examining catalogs, but it might result in transiently wrong output from pg_dump or other client programs.
Prevent autovacuum from crashing if the table it's currently checking is deleted at just the wrong time (Alvaro)
Fix possible duplicate output of tuples during a GiST index scan (Teodor)
Regenerate foreign key checking queries from scratch when either table is modified (Tom)
Previously, 8.3 would attempt to replan the query, but would work from previously generated query text. This led to failures if
a table or column was renamed.
Fix missed permissions checks when a view contains a simple UNION ALL construct (Heikki)
Permissions for the referenced tables were checked properly, but not permissions for the view itself.
Add checks in executor startup to ensure that the tuples produced by an INSERT or UPDATE will match the target table's
current rowtype (Tom)
This situation is believed to be impossible in 8.3, but it can happen in prior releases, so a check seems prudent.
Fix xmlserialize() to raise error properly for unacceptable target data type (Tom)
Fix a couple of places that mis-handled multibyte characters in text search configuration file parsing (Tom)
Certain characters occurring in configuration files would always cause invalid byte sequence for encoding failures.
Provide file name and line number location for all errors reported in text search configuration files (Tom)
Fix AT TIME ZONE to first try to interpret its timezone argument as a timezone abbreviation, and only try it as a full timezone name if that fails, rather than the other way around as formerly (Tom)
The timestamp input functions have always resolved ambiguous zone names in this order. Making AT TIME ZONE do so as
well improves consistency, and fixes a compatibility bug introduced in 8.1: in ambiguous cases we now behave the same as
8.0 and before did, since in the older versions AT TIME ZONE accepted only abbreviations.
Fix datetime input functions to correctly detect integer overflow when running on a 64-bit platform (Tom)
Prevent integer overflows during units conversion when displaying a configuration parameter that has units (Tom)
1560
Notes de version
Fix planner bug that could improperly push down IS NULL tests below an outer join (Tom)
This was triggered by occurrence of IS NULL tests for the same relation in all arms of an upper OR clause.
Fix planner to estimate that GROUP BY expressions yielding boolean results always result in two groups, regardless of the expressions' contents (Tom)
This is very substantially more accurate than the regular GROUP BY estimate for certain boolean tests like col IS NULL.
Fix PL/pgSQL to not fail when a FOR loop's target variable is a record containing composite-type fields (Tom)
Fix PL/Tcl to behave correctly with Tcl 8.5, and to be more careful about the encoding of data sent to or from Tcl (Tom)
On Windows, work around a Microsoft bug by preventing libpq from trying to send more than 64kB per system call (Magnus)
Improve pg_dump and pg_restore's error reporting after failure to send a SQL command (Tom)
Fix pg_ctl to properly preserve postmaster command-line arguments across a restart (Bruce)
Update time zone data files to tzdata release 2008f (for DST law changes in Argentina, Bahamas, Brazil, Mauritius, Morocco,
Pakistan, Palestine, and Paraguay)
E.78.2. Changes
Notes de version
Release Date
never released
This release contains a variety of fixes from 8.3.1. For information about new features in the 8.3 major release, see Section E.81,
Release 8.3 .
E.79.2. Changes
Fix ERRORDATA_STACK_SIZE exceeded crash that occurred on Windows when using UTF-8 database encoding and a
different client encoding (Tom)
Fix incorrect archive truncation point calculation for the %r macro in recovery_command parameters (Simon)
This could lead to data loss if a warm-standby script relied on %r to decide when to throw away WAL segment files.
Fix ALTER TABLE ADD COLUMN ... PRIMARY KEY so that the new column is correctly checked to see if it's been initialized to all non-nulls (Brendan Jurd)
Previous versions neglected to check this requirement at all.
Fix problems with SELECT FOR UPDATE/SHARE occurring as a subquery in a query with a non-SELECT top-level operation (Tom)
Fix possible CREATE TABLE failure when alling the same constraint from multiple parent relations that alled that
constraint from a common ancestor (Tom)
Fix pg_get_ruledef() to show the alias, if any, attached to the target table of an UPDATE or DELETE (Tom)
Restore the pre-8.3 behavior that an out-of-range block number in a TID being used in a TidScan plan results in silently not
matching any rows (Tom)
8.3.0 and 8.3.1 threw an error instead.
Fix GIN bug that could result in a too many LWLocks taken failure (Teodor)
Fix tsvector_update_trigger() and ts_stat() to accept domains over the types they expect to work with (Tom)
Fix race conditions between delayed unlinks and DROP DATABASE (Heikki)
In the worst case this could result in deleting a newly created table in a new database that happened to get the same OID as the
recently-dropped one; but of course that is an extremely low-probability scenario.
Repair two places where SIGTERM exit of a backend could leave corrupted state in shared memory (Tom)
Neither case is very important if SIGTERM is used to shut down the whole database cluster together, but there was a problem
if someone tried to SIGTERM individual backends.
Fix possible crash due to incorrect plan generated for an x IN (SELECT y FROM ...) clause when x and y have different data types; and make sure the behavior is semantically correct when the conversion from y's type to x's type is lossy
(Tom)
Fix oversight that prevented the planner from substituting known Param values as if they were constants (Tom)
This mistake partially disabled optimization of unnamed extended-Query statements in 8.3.0 and 8.3.1: in particular the LIKEto-indexscan optimization would never be applied if the LIKE pattern was passed as a parameter, and constraint exclusion depending on a parameter value didn't work either.
Fix planner failure when an indexable MIN or MAX aggregate is used with DISTINCT or ORDER BY (Tom)
1562
Notes de version
Fix planner to ensure it never uses a physical tlist for a plan node that is feeding a Sort node (Tom)
This led to the sort having to push around more data than it really needed to, since unused column values were included in the
sorted data.
Make TransactionIdIsCurrentTransactionId() use binary search instead of linear search when checking childtransaction XIDs (Heikki)
This fixes some cases in which 8.3.0 was significantly slower than earlier releases.
Fix conversions between ISO-8859-5 and other encodings to handle Cyrillic Yo characters (e and E with two dots)
(Sergey Burladyan)
Fix several datatype input functions, notably array_in(), that were allowing unused bytes in their results to contain uninitialized, unpredictable values (Tom)
This could lead to failures in which two apparently identical literal values were not seen as equal, resulting in the parser complaining about unmatched ORDER BY and DISTINCT expressions.
Fix a corner case in regular-expression substring matching (substring(string from pattern)) (Tom)
The problem occurs when there is a match to the pattern overall but the user has specified a parenthesized subexpression and
that subexpression hasn't got a match. An example is substring('foo' from 'foo(bar)?'). This should return
NULL, since (bar) isn't matched, but it was mistakenly returning the whole-pattern match instead (ie, foo).
Prevent cancellation of an auto-vacuum that was launched to prevent XID wraparound (Alvaro)
Improve ANALYZE's handling of in-doubt tuples (those inserted or deleted by a not-yet-committed transaction) so that the
counts it reports to the stats collector are more likely to be correct (Pavan Deolasee)
Fix initdb to reject a relative path for its --xlogdir (-X) option (Tom)
Make psql print tab characters as an appropriate number of spaces, rather than \x09 as was done in 8.3.0 and 8.3.1 (Bruce)
Update time zone data files to tzdata release 2008c (for DST law changes in Morocco, Iraq, Choibalsan, Pakistan, Syria, Cuba,
and Argentina/San_Luis)
Fix core dump in contrib/xml2's xpath_table() function when the input query returns a NULL value (Tom)
Fix contrib/xml2's makefile to not override CFLAGS, and make it auto-configure properly for libxslt present or not (Tom)
E.80.2. Changes
1563
Notes de version
Fix character string comparison for Windows locales that consider different character combinations as equal (Tom)
This fix applies only on Windows and only when using UTF-8 database encoding. The same fix was made for all other cases
over two years ago, but Windows with UTF-8 uses a separate code path that was not updated. If you are using a locale that
considers some non-identical strings as equal, you may need to REINDEX to fix existing indexes on textual columns.
Fix misbehavior of foreign key checks involving character or bit columns (Tom)
If the referencing column were of a different but compatible type (for instance varchar), the constraint was enforced incorrectly.
Avoid needless deadlock failures in no-op foreign-key checks (Stephan Szabo, Tom)
Fix possible failure when re-planning a query that calls an SPI-using function (Tom)
Fix rare crash when an error occurs during a query using a hash index (Heikki)
Fix incorrect behavior of LIKE with non-ASCII characters in single-byte encodings (Rolf Jentsch)
Make encode(bytea, 'escape') convert all high-bit-set byte values into \nnn octal escape sequences (Tom)
This is necessary to avoid encoding problems when the database encoding is multi-byte. This change could pose compatibility
issues for applications that are expecting specific results from encode.
Fix unrecognized node type error in some variants of ALTER OWNER (Tom)
1564
Notes de version
Avoid tablespace permissions errors in CREATE TABLE LIKE INCLUDING INDEXES (Tom)
Update time zone data files to tzdata release 2008a (in particular, recent Chile changes); adjust timezone abbreviation VET
(Venezuela) to mean UTC-4:30, not UTC-4:00 (Tom)
Fix pg_ctl to correctly extract the postmaster's port number from command-line options (Itagaki Takahiro, Tom)
Previously, pg_ctl start -w could try to contact the postmaster on the wrong port, leading to bogus reports of startup
failure.
Use -fwrapv to defend against possible misoptimization in recent gcc versions (Tom)
This is known to be necessary when building PostgreSQL with gcc 4.3 or later.
E.81.1. Overview
With significant new functionality and performance enhancements, this release represents a major leap forward for PostgreSQL.
This was made possible by a growing community that has dramatically accelerated the pace of development. This release adds the
following major features:
Support for the SQL/XML standard, including new operators and an XML data type
Updatable cursors
Automatically re-plan cached queries when table definitions change or statistics are updated
Allow the whole PostgreSQL distribution to be compiled with Microsoft Visual C++
Major performance improvements are listed below. Most of these enhancements are automatic and do not require user changes or
tuning:
Checkpoint writes can be spread over a longer time period to smooth the I/O spike during each checkpoint
Heap-Only Tuples (HOT) accelerate space reuse for most UPDATEs and DELETEs
1565
Notes de version
Using non-persistent transaction IDs for read-only transactions reduces overhead and VACUUM requirements
Large sequential scans no longer force out frequently used cached pages
The above items are explained in more detail in the sections below.
E.81.2.1. General
Non-character data types are no longer automatically cast to TEXT (Peter, Tom)
Previously, if a non-character value was supplied to an operator or function that requires text input, it was automatically cast to
text, for most (though not all) built-in data types. This no longer happens: an explicit cast to text is now required for all noncharacter-string types. For example, these expressions formerly worked:
substr(current_date, 1, 4)
23 LIKE '2%'
but will now draw function does not exist and operator does not exist errors respectively. Use an explicit cast instead:
substr(current_date::text, 1, 4)
23::text LIKE '2%'
(Of course, you can use the more verbose CAST() syntax too.) The reason for the change is that these automatic casts too often caused surprising behavior. An example is that in previous releases, this expression was accepted but did not do what was
expected:
current_date < 2017-11-17
This is actually comparing a date to an integer, which should be (and now is) rejected -- but in the presence of automatic casts
both sides were cast to text and a textual comparison was done, because the text < text operator was able to match the
expression when no other < operator could.
Types char(n) and varchar(n) still cast to text automatically. Also, automatic casting to text still works for inputs to the concatenation (||) operator, so long as least one input is a character-string type.
Full text search features from contrib/tsearch2 have been moved into the core server, with some minor syntax changes
contrib/tsearch2 now contains a compatibility interface.
ARRAY(SELECT ...), where the SELECT returns no rows, now returns an empty array, rather than NULL (Tom)
The array type name for a base data type is no longer always the base type's name with an underscore prefix
The old naming convention is still honored when possible, but application code should no longer depend on it. Instead use the
new pg_type.typarray column to identify the array data type associated with a given type.
ORDER BY ... USING operator must now use a less-than or greater-than operator that is defined in a btree operator
class
This restriction was added to prevent inconsistent results.
SET LOCAL changes now persist until the end of the outermost transaction, unless rolled back (Tom)
Previously SET LOCAL's effects were lost after subtransaction commit (RELEASE SAVEPOINT or exit from a PL/pgSQL
exception block).
Commands rejected in transaction blocks are now also rejected in multiple-statement query strings (Tom)
1566
Notes de version
For example, "BEGIN; DROP DATABASE; COMMIT" will now be rejected even if submitted as a single query message.
ROLLBACK outside a transaction block now issues NOTICE instead of WARNING (Bruce)
Foreign keys now must match indexable conditions for cross-data-type references (Tom)
This improves semantic consistency and helps avoid performance problems.
Restrict object size functions to users who have reasonable permissions to view such information (Tom)
For example, pg_database_size() now requires CONNECT permission, which is granted to everyone by default.
pg_tablespace_size() requires CREATE permission in the tablespace, or is allowed if the tablespace is the default tablespace for the database.
C-code conventions for handling variable-length data values have changed (Greg Stark, Tom)
The new SET_VARSIZE() macro must be used to set the length of generated varlena values. Also, it might be necessary to
expand ( de-TOAST ) input values in more cases.
Continuous archiving no longer reports each successful archive operation to the server logs unless DEBUG level is used
(Simon)
Commenting out a parameter in postgresql.conf now causes it to revert to its default value (Joachim Wieland)
Previously, commenting out an entry left the parameter's value unchanged until the next server restart.
Disallow database encodings that are inconsistent with the server's locale setting (Tom)
On most platforms, C locale is the only locale that will work with any database encoding. Other locale settings imply a specific
encoding and will misbehave if the database encoding is something different. (Typical symptoms include bogus textual sort order and wrong results from upper() or lower().) The server now rejects attempts to create databases that have an incompatible encoding.
1567
Notes de version
convert_from(bytea, name) returns text -- converts the first argument from the named encoding to the database
encoding
convert_to(text, name) returns bytea -- converts the first argument from the database encoding to the named encoding
length(bytea, name) returns integer -- gives the length of the first argument in characters in the named encoding
E.81.3. Changes
Below you will find a detailed account of the changes between PostgreSQL 8.3 and the previous major release.
E.81.3.1. Performance
Checkpoint writes can be spread over a longer time period to smooth the I/O spike during each checkpoint (Itagaki Takahiro
and Heikki Linnakangas)
Previously all modified buffers were forced to disk as quickly as possible during a checkpoint, causing an I/O spike that decreased server performance. This new approach spreads out disk writes during checkpoints, reducing peak I/O usage.
(User-requested and shutdown checkpoints are still written as quickly as possible.)
Heap-Only Tuples (HOT) accelerate space reuse for most UPDATEs and DELETEs (Pavan Deolasee, with ideas from many
others)
UPDATEs and DELETEs leave dead tuples behind, as do failed INSERTs. Previously only VACUUM could reclaim space
taken by dead tuples. With HOT dead tuple space can be automatically reclaimed at the time of INSERT or UPDATE if no
changes are made to indexed columns. This allows for more consistent performance. Also, HOT avoids adding duplicate index
entries.
Just-in-time background writer strategy improves disk write efficiency (Greg Smith, Itagaki Takahiro)
This greatly reduces the need for manual tuning of the background writer.
Per-field and per-row storage overhead have been reduced (Greg Stark, Heikki Linnakangas)
Variable-length data types with data values less than 128 bytes long will see a storage decrease of 3 to 6 bytes. For example,
two adjacent char(1) fields now use 4 bytes instead of 16. Row headers are also 4 bytes shorter than before.
Using non-persistent transaction IDs for read-only transactions reduces overhead and VACUUM requirements (Florian Pflug)
Non-persistent transaction IDs do not increment the global transaction counter. Therefore, they reduce the load on pg_clog and
increase the time between forced vacuums to prevent transaction ID wraparound. Other performance improvements were also
1568
Notes de version
Create a dedicated WAL writer process to off-load work from backends (Simon)
Large sequential scans no longer force out frequently used cached pages (Simon, Heikki, Tom)
Concurrent large sequential scans can now share disk reads (Jeff Davis)
This is accomplished by starting the new sequential scan in the middle of the table (where another sequential scan is already
in-progress) and wrapping around to the beginning to finish. This can affect the order of returned rows in a query that does not
specify ORDER BY. The synchronize_seqscans configuration parameter can be used to disable this if necessary.
Put a rate limit on messages sent to the statistics collector by backends (Tom)
This reduces overhead for short transactions, but might sometimes increase the delay before statistics are tallied.
Improve hash join performance for cases with many NULLs (Tom)
Speed up operator lookup for cases with non-exact datatype matches (Tom)
E.81.3.2. Server
Automatically re-plan cached queries when table definitions change or statistics are updated (Tom)
Previously PL/pgSQL functions that referenced temporary tables would fail if the temporary table was dropped and recreated
between function invocations, unless EXECUTE was used. This improvement fixes that problem and many related issues.
Add a temp_tablespaces parameter to control the tablespaces for temporary tables and files (Jaime Casanova, Albert
Cervera, Bernd Helmle)
This parameter defines a list of tablespaces to be used. This enables spreading the I/O load across multiple tablespaces. A random tablespace is chosen each time a temporary object is created. Temporary files are no longer stored in per-database pgsql_tmp/ directories but in per-tablespace directories.
Place temporary tables' TOAST tables in special schemas named pg_toast_temp_nnn (Tom)
This allows low-level code to recognize these tables as temporary, which enables various optimizations such as not WALlogging changes and using local rather than shared buffers for access. This also fixes a bug wherein backends unexpectedly
held open file references to temporary TOAST tables.
Fix problem that a constant flow of new connection requests could indefinitely delay the postmaster from completing a shutdown or a crash restart (Tom)
Guard against a very-low-probability data loss scenario by preventing re-use of a deleted table's relfilenode until after the next
checkpoint (Heikki)
Fix CREATE CONSTRAINT TRIGGER to convert old-style foreign key trigger definitions into regular foreign key
constraints (Tom)
1569
Notes de version
This will ease porting of foreign key constraints carried forward from pre-7.3 databases, if they were never converted using
contrib/adddepend.
Change server startup log message from database system is ready to database system is ready to accept connections ,
and adjust its timing
The message now appears only when the postmaster is really ready to accept connections.
E.81.3.3. Monitoring
Add log_autovacuum_min_duration parameter to support configurable logging of autovacuum activity (Simon, Alvaro)
Last transaction end time is now logged at end of recovery and at each logged restart point (Simon)
Allow server log output in comma-separated value (CSV) format (Arul Shaji, Greg Smith, Andrew Dunstan)
CSV-format log files can easily be loaded into a database table for subsequent analysis.
Use PostgreSQL-supplied timezone support for formatting timestamps displayed in the server log (Tom)
This avoids Windows-specific problems with localized time zone names that are in the wrong encoding. There is a new
log_timezone parameter that controls the timezone used in log messages, independently of the client-visible timezone
parameter.
New system view pg_stat_bgwriter displays statistics about background writer activity (Magnus)
Add n_live_tuples and n_dead_tuples columns to pg_stat_all_tables and related views (Glen Parker)
Merge stats_block_level and stats_row_level parameters into a single parameter track_counts, which
controls all messages sent to the statistics collector process (Tom)
Fix statistical counting of live and dead tuples to recognize that committed and aborted transactions have different effects
(Tom)
E.81.3.4. Authentication
Support Security Service Provider Interface (SSPI) for authentication on Windows (Magnus)
Notes de version
Change the timestamps recorded in transaction WAL records from time_t to TimestampTz representation (Tom)
This provides sub-second resolution in WAL, which can be useful for point-in-time recovery.
E.81.3.6. Queries
Full text search is integrated into the core database system (Teodor, Oleg)
Text search has been improved, moved into the core code, and is now installed by default. contrib/tsearch2 now
contains a compatibility interface.
Add control over whether NULLs sort first or last (Teodor, Tom)
The syntax is ORDER BY ... NULLS FIRST/LAST.
Allow per-column ascending/descending (ASC/DESC) ordering options for indexes (Teodor, Tom)
Previously a query using ORDER BY with mixed ASC/DESC specifiers could not fully use an index. Now an index can be fully used in such cases if the index was created with matching ASC/DESC specifications. NULL sort order within an index can be
controlled, too.
Create a general mechanism that supports casts to and from the standard string types (TEXT, VARCHAR, CHAR) for every
datatype, by invoking the datatype's I/O functions (Tom)
Previously, such casts were available only for types that had specialized function(s) for the purpose. These new casts are assignment-only in the to-string direction, explicit-only in the other direction, and therefore should create no surprising behavior.
Allow UNION and related constructs to return a domain type, when all inputs are of that domain type (Tom)
Formerly, the output would be considered to be of the domain's base type.
Allow limited hashing when using two different data types (Tom)
This allows hash joins, hash indexes, hashed subplans, and hash aggregation to be used in situations involving cross-data-type
comparisons, if the data types have compatible hash functions. Currently, cross-data-type hashing support exists for smallint/integer/bigint, and for float4/float8.
Improve optimizer logic for detecting when variables are equal in a WHERE clause (Tom)
This allows mergejoins to work with descending sort orders, and improves recognition of redundant sort columns.
Improve performance when planning large allance trees in cases where most tables are excluded by constraints (Tom)
Notes de version
Implement CREATE TABLE LIKE ... INCLUDING INDEXES (Trevor Hardcastle, Nikhil Sontakke, Neil)
Add ALTER VIEW ... RENAME TO and ALTER SEQUENCE ... RENAME TO (David Fetter, Neil)
Previously this could only be done via ALTER TABLE ... RENAME TO.
Make CREATE/DROP/RENAME DATABASE wait briefly for conflicting backends to exit before failing (Tom)
This increases the likelihood that these commands will succeed.
Allow triggers and rules to be deactivated in groups using a configuration parameter, for replication purposes (Jan)
This allows replication systems to disable triggers and rewrite rules as a group without modifying the system catalogs directly.
The behavior is controlled by ALTER TABLE and a new parameter session_replication_role.
Non-superuser database owners now are able to add trusted procedural languages to their databases by default (Jeremy Drake)
While this is reasonably safe, some administrators might wish to revoke the privilege. It is controlled by pg_pltemplate.tmpldbacreate.
Allow a session's current parameter setting to be used as the default for future sessions (Tom)
This is done with SET ... FROM CURRENT in CREATE/ALTER FUNCTION, ALTER DATABASE, or ALTER
ROLE.
Implement new commands DISCARD ALL, DISCARD PLANS, DISCARD TEMPORARY, CLOSE ALL, and DEALLOCATE ALL (Marko Kreen, Neil)
These commands simplify resetting a database session to its initial state, and are particularly useful for connection-pooling
software.
Add new CLUSTER syntax: CLUSTER table USING index (Holger Schurig)
The old CLUSTER syntax is still supported, but the new form is considered more logical.
Notes de version
Support for the SQL/XML standard, including new operators and an XML data type (Nikolay Samokhvalov, Pavel Stehule,
Peter)
Fix float4/float8 to handle Infinity and NAN (Not A Number) consistently (Bruce)
The code formerly was not consistent about distinguishing Infinity from overflow conditions.
Allow leading and trailing whitespace during input of boolean values (Neil)
Prevent COPY from using digits and lowercase letters as delimiters (Tom)
E.81.3.10. Functions
Add new regular expression functions regexp_matches(), regexp_split_to_array(), and regexp_split_to_table() (Jeremy Drake, Neil)
These functions provide extraction of regular expression subexpressions and allow splitting a string using a POSIX regular expression.
Add pg_stat_clear_snapshot() to discard statistics snapshots collected during the current transaction (Tom)
The first request for statistics in a transaction takes a statistics snapshot that does not change during the transaction. This function allows the snapshot to be discarded and a new snapshot loaded during the next statistics query. This is particularly useful
for PL/pgSQL functions, which are confined to a single transaction.
Add ID (ISO day of week) and IDDD (ISO day of year) format codes for to_char(), to_date(), and
to_timestamp() (Brendan Jurd)
Make to_timestamp() and to_date() assume TM (trim) option for potentially variable-width fields (Bruce)
This matches Oracle's behavior.
Fix off-by-one conversion error in to_date()/to_timestamp() D (non-ISO day of week) fields (Bruce)
Make setseed() return void, rather than a useless integer value (Neil)
Improve efficiency of LIKE/ILIKE, especially for multi-byte character sets like UTF-8 (Andrew, Itagaki Takahiro)
Make currtid() functions require SELECT privileges on the target table (Tom)
Add scrollable cursor support, including directional control in FETCH (Pavel Stehule)
Allow IN as an alternative to FROM in PL/pgSQL's FETCH statement, for consistency with the backend's FETCH command
1573
Notes de version
(Pavel Stehule)
Allow function parameter names to be qualified with the function's name (Tom)
For example, myfunc.myvar. This is particularly useful for specifying variables in a query where the variable name might
match a column name.
Allow type-name arguments to PL/Perl spi_prepare() to be data type aliases in addition to names found in pg_type
(Andrew)
Allow type-name arguments to PL/Python plpy.prepare() to be data type aliases in addition to names found in
pg_type (Andrew)
Allow type-name arguments to PL/Tcl spi_prepare to be data type aliases in addition to names found in pg_type
(Andrew)
Support a true PL/Python boolean type in compatible Python versions (Python 2.3 and later) (Marko Kreen)
Fix PL/Tcl problems with thread-enabled libtcl spawning multiple threads within the backend (Steve Marshall, Paul Bayer,
Doug Knight)
This caused all sorts of unpleasantness.
E.81.3.13. psql
Allow \pset, \t, and \x to specify on or off, rather than just toggling (Chad Wagner)
Correctly detect and report errors while reading a -f input file (Peter)
E.81.3.14. pg_dump
1574
Notes de version
Allow pg_dumpall to accept an initial-connection database name rather than the default template1 (Dave Page)
In initdb, allow the location of the pg_xlog directory to be specified (Euler Taveira de Oliveira)
Enable server core dump generation in pg_regress on supported operating systems (Andrew)
Allow Control-C to cancel clusterdb, reindexdb, and vacuumdb (Itagaki Takahiro, Magnus)
Suppress command tag output for createdb, createuser, dropdb, and dropuser (Peter)
The --quiet option is ignored and will be removed in 8.4. Progress messages when acting on all databases now go to stdout
instead of stderr because they are not actually errors.
E.81.3.16. libpq
Interpret the dbName parameter of PQsetdbLogin() as a conninfo string if it contains an equals sign (Andrew)
This allows use of conninfo strings in client programs that still use PQsetdbLogin().
Add environment variable PGSSLKEY to control SSL hardware keys (Victor Wagner)
Add PQconnectionNeedsPassword() that returns true if the server required a password but none was supplied (Joe
Conway, Tom)
If this returns true after a failed connection attempt, a client application should prompt the user for a password. In the past applications have had to check for a specific error message string to decide whether a password is needed; that approach is now
deprecated.
Add PQconnectionUsedPassword() that returns true if the supplied password was actually used (Joe Conway, Tom)
This is useful in some security contexts where it is important to know whether a user-supplied password is actually valid.
E.81.3.17. ecpg
Make the ecpg libraries export only necessary API symbols (Michael)
Notes de version
Allow the whole PostgreSQL distribution to be compiled with Microsoft Visual C++ (Magnus and others)
This allows Windows-based developers to use familiar development and debugging tools. Windows executables made with
Visual C++ might also have better stability and performance than those made with other tool sets. The client-only Visual C++
build scripts have been removed.
Drastically reduce postmaster's memory usage when it has many child processes (Magnus)
SPI plan pointers are now declared as SPIPlanPtr instead of void * (Tom)
This does not break application code, but switching is recommended to help catch simple programming mistakes.
Add configure option --enable-profiling to enable code profiling (works only with gcc) (Korry Douglas and Nikhil
Sontakke)
Add configure option --with-system-tzdata to use the operating system's time zone database (Peter)
Fix PGXS so extensions can be built against PostgreSQL installations whose pg_config program does not appear first in the
PATH (Tom)
Rename macro DLLIMPORT to PGDLLIMPORT to avoid conflicting with third party includes (like Tcl) that define DLLIMPORT (Magnus)
Create operator families to improve planning of queries involving cross-data-type comparisons (Tom)
Update GIN extractQuery() API to allow signalling that nothing can satisfy the query (Teodor)
Provide strlcpy() and strlcat() on all platforms, and replace error-prone uses of strncpy(), strncat(), etc
(Peter)
Create hooks to let an external plugin monitor (or even replace) the planner and create plans for hypothetical situations
(Gurjeet Singh, Tom)
Create a function variable join_search_hook to let plugins override the join search order portion of the planner (Julius
Stroffek)
quote_identifier() and pg_dump no longer quote keywords that are unreserved according to the grammar (Tom)
Change the on-disk representation of the NUMERIC data type so that the sign_dscale word comes before the weight
(Tom)
Use SYSV semaphores rather than POSIX on Darwin >= 6.0, i.e., OS X 10.2 and up (Chris Marcellino)
Notes de version
Add documentation about preventing database server spoofing when the server is down (Bruce)
E.81.3.22. Contrib
Move contrib README content into the main PostgreSQL documentation (Albert Cervera i Areny)
Add contrib/uuid-ossp module for generating UUID values using the OSSP UUID library (Peter)
Use configure --with-ossp-uuid to activate. This takes advantage of the new UUID builtin type.
Restrict pgrowlocks() and dblink_get_pkey() to users who have SELECT privilege on the target table (Tom)
E.82.2. Changes
Notes de version
information_schema.sql. (Run pg_config --sharedir if you're uncertain where SHAREDIR is.) This must be
repeated in each database to be fixed.
Fix TOAST-related data corruption during CREATE TABLE dest AS SELECT * FROM src or INSERT INTO
dest SELECT * FROM src (Tom Lane)
If a table has been modified by ALTER TABLE ADD COLUMN, attempts to copy its data verbatim to another table could
produce corrupt results in certain corner cases. The problem can only manifest in this precise form in 8.4 and later, but we patched earlier versions as well in case there are other code paths that could trigger the same bug.
Fix race condition during toast table access from stale syscache entries (Tom Lane)
The typical symptom was transient errors like missing chunk number 0 for toast value NNNNN in pg_toast_2619 , where
the cited toast table would always belong to a system catalog.
Improve locale support in money type's input and output (Tom Lane)
Aside from not supporting all standard lc_monetary formatting options, the input and output functions were inconsistent,
meaning there were locales in which dumped money values could not be re-read.
Don't let transform_null_equals affect CASE foo WHEN NULL ... constructs (Heikki Linnakangas)
transform_null_equals is only supposed to affect foo = NULL expressions written directly by the user, not equality
checks generated internally by this form of CASE.
Change foreign-key trigger creation order to better support self-referential foreign keys (Tom Lane)
For a cascading foreign key that references its own table, a row update will fire both the ON UPDATE trigger and the CHECK
trigger as one event. The ON UPDATE trigger must execute first, else the CHECK will check a non-final state of the row and
possibly throw an inappropriate error. However, the firing order of these triggers is determined by their names, which generally sort in creation order since the triggers have auto-generated names following the convention
RI_ConstraintTrigger_NNNN . A proper fix would require modifying that convention, which we will do in 9.2, but it
seems risky to change it in existing releases. So this patch just changes the creation order of the triggers. Users encountering
this type of error should drop and re-create the foreign key constraint to get its triggers into the right order.
Preserve blank lines within commands in psql's command history (Robert Haas)
The former behavior could cause problems if an empty line was removed from within a string literal, for example.
Use the preferred version of xsubpp to build PL/Perl, not necessarily the operating system's main copy (David Wheeler and
Alex Hunsaker)
Ensure VPATH builds properly install all server header files (Peter Eisentraut)
Fix interpretation of Windows timezone names for Central America (Tom Lane)
Map Central America Standard Time to CST6, not CST6CDT, because DST is generally not observed anywhere in Central
America.
Update time zone data files to tzdata release 2011n for DST law changes in Brazil, Cuba, Fiji, Palestine, Russia, and Samoa;
also historical corrections for Alaska and British East Africa.
Notes de version
E.83.2. Changes
Fix multiple bugs in GiST index page split processing (Heikki Linnakangas)
The probability of occurrence was low, but these could lead to index corruption.
Avoid possibly accessing off the end of memory in ANALYZE (Noah Misch)
This fixes a very-low-probability server crash scenario.
Fix performance problem when constructing a large, lossy bitmap (Tom Lane)
Fix array- and path-creating functions to ensure padding bytes are zeroes (Tom Lane)
This avoids some situations where the planner will think that semantically-equal constants are not equal, resulting in poor optimization.
Work around gcc 4.6.0 bug that breaks WAL replay (Tom Lane)
This could lead to loss of committed transactions after a server crash.
Defend against integer overflow when computing size of a hash table (Tom Lane)
Fix portability bugs in use of credentials control messages for peer authentication (Tom Lane)
Avoid integer overflow when the sum of LIMIT and OFFSET values exceeds 2^63 (Heikki Linnakangas)
Add overflow checks to int4 and int8 versions of generate_series() (Robert Haas)
Fix pg_size_pretty() to avoid overflow for inputs close to 2^63 (Tom Lane)
Fix psql's counting of script file line numbers during COPY from a different file (Tom Lane)
Fix write-past-buffer-end and memory leak in libpq's LDAP service lookup code (Albe Laurenz)
In libpq, avoid failures when using nonblocking I/O and an SSL connection (Martin Pihlak, Tom Lane)
Notes de version
Make ecpglib write double values with 15 digits precision (Akira Kurosawa)
Apply upstream fix for blowfish signed-character bug (CVE-2011-2483) (Tom Lane)
contrib/pg_crypto's blowfish encryption code could give wrong results on platforms where char is signed (which is
most), leading to encrypted passwords being weaker than they should be.
Fix pgstatindex() to give consistent results for empty indexes (Tom Lane)
Update configure script's method for probing existence of system functions (Tom Lane)
The version of autoconf we used in 8.3 and 8.2 could be fooled by compilers that perform link-time optimization.
Fix assorted issues with build and install file paths containing spaces (Tom Lane)
Update time zone data files to tzdata release 2011i for DST law changes in Canada, Egypt, Russia, Samoa, and South Sudan.
E.84.2. Changes
Fix dangling-pointer problem in BEFORE ROW UPDATE trigger handling when there was a concurrent update to the target
tuple (Tom Lane)
This bug has been observed to result in intermittent cannot extract system attribute from virtual tuple failures while trying
to do UPDATE RETURNING ctid. There is a very small probability of more serious errors, such as generating incorrect index entries for the updated tuple.
Disallow DROP TABLE when there are pending deferred trigger events for the table (Tom Lane)
Formerly the DROP would go through, leading to could not open relation with OID nnn errors when the triggers were
eventually fired.
Fix pg_restore to cope with long lines (over 1KB) in TOC files (Tom Lane)
Put in more safeguards against crashing due to division-by-zero with overly enthusiastic compiler optimization (Aurelien Jarno)
Update time zone data files to tzdata release 2011f for DST law changes in Chile, Cuba, Falkland Islands, Morocco, Samoa,
1580
Notes de version
and Turkey; also historical corrections for South Australia, Alaska, and Hawaii.
E.85.2. Changes
Avoid failures when EXPLAIN tries to display a simple-form CASE expression (Tom Lane)
If the CASE's test expression was a constant, the planner could simplify the CASE into a form that confused the expression-display code, resulting in unexpected CASE WHEN clause errors.
Fix assignment to an array slice that is before the existing range of subscripts (Tom Lane)
If there was a gap between the newly added subscripts and the first pre-existing subscript, the code miscalculated how many
entries needed to be copied from the old array's null bitmap, potentially leading to data corruption or crash.
Avoid unexpected conversion overflow in planner for very distant date values (Tom Lane)
The date type supports a wider range of dates than can be represented by the timestamp types, but the planner assumed it could
always convert a date to timestamp with impunity.
Fix pg_restore's text output for large objects (BLOBs) when standard_conforming_strings is on (Tom Lane)
Although restoring directly to a database worked correctly, string escaping was incorrect if pg_restore was asked for SQL text
output and standard_conforming_strings had been enabled in the source database.
Fix erroneous parsing of tsquery values containing ... & !(subexpression) | ... (Tom Lane)
Queries containing this combination of operators were not executed correctly. The same error existed in contrib/intarray's query_int type and contrib/ltree's ltxtquery type.
Fix buffer overrun in contrib/intarray's input function for the query_int type (Apple)
This bug is a security risk since the function's return address could be overwritten. Thanks to Apple Inc's security team for reporting this issue and supplying the fix. (CVE-2010-4015)
Notes de version
A dump/restore is not required for those running 8.2.X. However, if you are upgrading from a version earlier than 8.2.14, see Section E.91, Release 8.2.14 .
E.86.2. Changes
Force the default wal_sync_method to be fdatasync on Linux (Tom Lane, Marti Raudsepp)
The default on Linux has actually been fdatasync for many years, but recent kernel changes caused PostgreSQL to
choose open_datasync instead. This choice did not result in any performance improvement, and caused outright failures
on certain filesystems, notably ext4 with the data=journal mount option.
Fix assorted bugs in WAL replay logic for GIN indexes (Tom Lane)
This could result in bad buffer id: 0 failures or corruption of index contents during replication.
Fix recovery from base backup when the starting checkpoint WAL record is not in the same WAL segment as its redo point
(Jeff Davis)
Avoid memory leakage while ANALYZE'ing complex index expressions (Tom Lane)
Ensure an index that uses a whole-row Var still depends on its table (Tom Lane)
An index declared like create index i on t (foo(t.*)) would not automatically get dropped when its table was
dropped.
Do not inline a SQL function with multiple OUT parameters (Tom Lane)
This avoids a possible crash due to loss of information about the expected result rowtype.
Behave correctly if ORDER BY, LIMIT, FOR UPDATE, or WITH is attached to the VALUES part of INSERT ... VALUES
(Tom Lane)
Fix incorrect calculation of distance from a point to a horizontal line segment (Tom Lane)
This bug affected several different geometric distance-measurement operators.
Fix PL/pgSQL's handling of simple expressions to not fail in recursion or error-recovery cases (Tom Lane)
Don't emit identifier will be truncated notices in contrib/dblink except when creating new connections (Itagaki Takahiro)
Notes de version
Update time zone data files to tzdata release 2010o for DST law changes in Fiji and Samoa; also historical corrections for
Hong Kong.
E.87.2. Changes
Use a separate interpreter for each calling SQL userid in PL/Perl and PL/Tcl (Tom Lane)
This change prevents security problems that can be caused by subverting Perl or Tcl code that will be executed later in the
same session under another SQL user identity (for example, within a SECURITY DEFINER function). Most scripting languages offer numerous ways that that might be done, such as redefining standard functions or operators called by the target
function. Without this change, any SQL user with Perl or Tcl language usage rights can do essentially anything with the SQL
privileges of the target function's owner.
The cost of this change is that intentional communication among Perl and Tcl functions becomes more difficult. To provide an
escape hatch, PL/PerlU and PL/TclU functions continue to use only one interpreter per session. This is not considered a security issue since all such functions execute at the trust level of a database superuser already.
It is likely that third-party procedural languages that claim to offer trusted execution have similar security issues. We advise
contacting the authors of any PL you are depending on for security-critical purposes.
Our thanks to Tim Bunce for pointing out this issue (CVE-2010-3433).
Prevent possible crashes in pg_get_expr() by disallowing it from being called with an argument that is not one of the system catalog columns it's intended to be used with (Heikki Linnakangas, Tom Lane)
Fix possible duplicate scans of UNION ALL member relations (Tom Lane)
Reduce PANIC to ERROR in some occasionally-reported btree failure cases, and provide additional detail in the resulting error messages (Tom Lane)
This should improve the system's robustness with corrupted indexes.
Defend against functions returning setof record where not all the returned rows are actually of the same rowtype (Tom Lane)
Fix possible failure when hashing a pass-by-reference function result (Tao Ma, Tom Lane)
Take care to fsync the contents of lockfiles (both postmaster.pid and the socket lockfile) while writing them (Tom Lane)
This omission could result in corrupted lockfile contents if the machine crashes shortly after postmaster start. That could in
1583
Notes de version
turn prevent subsequent attempts to start the postmaster from succeeding, until the lockfile is manually removed.
Avoid recursion while assigning XIDs to heavily-nested subtransactions (Andres Freund, Robert Haas)
The original coding could result in a crash if there was limited stack space.
Fix log_line_prefix's %i escape, which could produce junk early in backend startup (Tom Lane)
Fix possible data corruption in ALTER TABLE ... SET TABLESPACE when archiving is enabled (Jeff Davis)
Allow CREATE DATABASE and ALTER DATABASE ... SET TABLESPACE to be interrupted by query-cancel
(Guillaume Lelarge)
In PL/Python, defend against null pointer results from PyCObject_AsVoidPtr and PyCObject_FromVoidPtr (Peter
Eisentraut)
Fix connection leak after duplicate connection name errors in contrib/dblink (Itagaki Takahiro)
Fix contrib/dblink to handle connection names longer than 62 bytes correctly (Itagaki Takahiro)
Update build infrastructure and documentation to reflect the source code repository's move from CVS to Git (Magnus Hagander and others)
Update time zone data files to tzdata release 2010l for DST law changes in Egypt and Palestine; also historical corrections for
Finland.
This change also adds new names for two Micronesian timezones: Pacific/Chuuk is now preferred over Pacific/Truk (and the
preferred abbreviation is CHUT not TRUT) and Pacific/Pohnpei is preferred over Pacific/Ponape.
Make Windows' N. Central Asia Standard Time timezone map to Asia/Novosibirsk, not Asia/Almaty (Magnus Hagander)
Microsoft changed the DST behavior of this zone in the timezone update from KB976098. Asia/Novosibirsk is a better match
to its new behavior.
E.88.2. Changes
Enforce restrictions in plperl using an opmask applied to the whole interpreter, instead of using Safe.pm (Tim Bunce,
Andrew Dunstan)
Recent developments have convinced us that Safe.pm is too insecure to rely on for making plperl trustable. This change
removes use of Safe.pm altogether, in favor of using a separate interpreter with an opcode mask that is always applied. Pleasant side effects of the change include that it is now possible to use Perl's strict pragma in a natural way in plperl, and
that Perl's $a and $b variables work as expected in sort routines, and that function compilation is significantly faster.
(CVE-2010-1169)
Notes de version
PL/Tcl's feature for autoloading Tcl code from a database table could be exploited for trojan-horse attacks, because there was
no restriction on who could create or insert into that table. This change disables the feature unless pltcl_modules is owned by a
superuser. (However, the permissions on the table are not checked, so installations that really need a less-than-secure modules
table can still grant suitable privileges to trusted non-superusers.) Also, prevent loading code into the unrestricted normal
Tcl interpreter unless we are really going to execute a pltclu function. (CVE-2010-1170)
Fix possible crash if a cache reset message is received during rebuild of a relcache entry (Heikki)
This error was introduced in 8.2.16 while fixing a related failure.
Avoid possible crash during backend shutdown if shutdown occurs when a CONTEXT addition would be made to log entries
(Tom)
In some cases the context-printing function would fail because the current transaction had already been rolled back when it
came time to print a log message.
Prevent infinite recursion in psql when expanding a variable that refers to itself (Tom)
Fix psql's \copy to not add spaces around a dot within \copy (select ...) (Tom)
Addition of spaces around the decimal point in a numeric literal would result in a syntax error.
Ensure that contrib/pgstattuple functions respond to cancel interrupts promptly (Tatsuhito Kasahara)
Make server startup deal properly with the case that shmget() returns EINVAL for an existing shared memory segment
(Tom)
This behavior has been observed on BSD-derived kernels including OS X. It resulted in an entirely-misleading startup failure
complaining that the shared memory request size was too large.
Deal more robustly with incomplete time zone information in the Windows registry (Magnus)
Update time zone data files to tzdata release 2010j for DST law changes in Argentina, Australian Antarctic, Bangladesh,
Mexico, Morocco, Pakistan, Palestine, Russia, Syria, Tunisia; also historical corrections for Taiwan.
Also, add PKST (Pakistan Summer Time) to the default set of timezone abbreviations.
E.89.2. Changes
Add new configuration parameter ssl_renegotiation_limit to control how often we do session key renegotiation for
1585
Notes de version
Fix possible crashes due to not handling errors during relcache reload cleanly (Tom)
Fix possible crashes when trying to recover from a failure in subtransaction start (Tom)
Fix server memory leak associated with use of savepoints and a client encoding different from server's encoding (Tom)
Fix incorrect WAL data emitted during end-of-recovery cleanup of a GIST index page split (Yoichi Hirai)
This would result in index corruption, or even more likely an error during WAL replay, if we were unlucky enough to crash
during end-of-recovery cleanup after having completed an incomplete GIST insertion.
Make substring() for bit types treat any negative length as meaning all the rest of the string (Tom)
The previous coding treated only -1 that way, and would produce an invalid result value for other negative values, possibly
leading to a crash (CVE-2010-0442).
Fix integer-to-bit-string conversions to handle the first fractional byte correctly when the output bit width is wider than the given integer by something other than a multiple of 8 bits (Tom)
Fix the STOP WAL LOCATION entry in backup history files to report the next WAL segment's name when the end location
is exactly at a segment boundary (Itagaki Takahiro)
Improve constraint exclusion processing of boolean-variable cases, in particular make it possible to exclude a partition that has
a bool_column = false constraint (Tom)
When reading pg_hba.conf and related files, do not treat @something as a file inclusion request if the @ appears inside
quote marks; also, never treat @ by itself as a file inclusion request (Tom)
This prevents erratic behavior if a role or database name starts with @. If you need to include a file whose path name contains
spaces, you can still do so, but you must write @"/path to/file" rather than putting the quotes around the whole
construct.
Prevent infinite loop on some platforms if a directory is named as an inclusion target in pg_hba.conf and related files
(Tom)
Fix possible infinite loop if SSL_read or SSL_write fails without setting errno (Tom)
This is reportedly possible with some Windows versions of openssl.
Fix psql's numericlocale option to not format strings it shouldn't in latex and troff output formats (Heikki)
Make psql return the correct exit status (3) when ON_ERROR_STOP and --single-transaction are both specified and
an error occurs during the implied COMMIT (Bruce)
Fix plpgsql failure in one case where a composite column is set to NULL (Tom)
Fix possible failure when calling PL/Perl functions from PL/PerlU or vice versa (Tim Bunce)
Add volatile markings in PL/Python to avoid possible compiler-specific misbehavior (Zdenek Kotala)
Prevent crash in contrib/dblink when too many key columns are specified to a dblink_build_sql_* function
(Rushabh Lathia, Joe Conway)
Notes de version
One known symptom of this bug is that rows in pg_listener could be dropped under heavy load.
Update time zone data files to tzdata release 2010e for DST law changes in Bangladesh, Chile, Fiji, Mexico, Paraguay, Samoa.
E.90.2. Changes
Protect against indirect security threats caused by index functions changing session-local state (Gurjeet Singh, Tom)
This change prevents allegedly-immutable index functions from possibly subverting a superuser's session (CVE-2009-4136).
Reject SSL certificates containing an embedded null byte in the common name (CN) field (Magnus)
This prevents unintended matching of a certificate to a server or client name during SSL validation (CVE-2009-4034).
Fix possible crash due to integer overflow in hash table size calculation (Tom)
This could occur with extremely large planner estimates for the size of a hashjoin's result.
Ensure that shared tuple-level locks held by prepared transactions are not ignored (Heikki)
Fix premature drop of temporary files used for a cursor that is accessed within a subtransaction (Heikki)
Fix incorrect logic for GiST index page splits, when the split depends on a non-first column of the index (Paul Ramsey)
Don't error out if recycling or removing an old WAL file fails at the end of checkpoint (Heikki)
It's better to treat the problem as non-fatal and allow the checkpoint to complete. Future checkpoints will retry the removal.
Such problems are not expected in normal operation, but have been seen to be caused by misdesigned Windows anti-virus and
backup software.
Fix bug with calling plperl from plperlu or vice versa (Tom)
An error exit from the inner function could result in crashes due to failure to re-select the correct Perl interpreter for the outer
function.
1587
Notes de version
Ensure that Perl arrays are properly converted to PostgreSQL arrays when returned by a set-returning PL/Perl function
(Andrew Dunstan, Abhijit Menon-Sen)
This worked correctly already for non-set-returning functions.
Ensure psql's flex module is compiled with the correct system header definitions (Tom)
This fixes build failures on platforms where --enable-largefile causes incompatible changes in the generated code.
Make the postmaster ignore any application_name parameter in connection request packets, to improve compatibility
with future libpq versions (Tom)
Update the timezone abbreviation files to match current reality (Joachim Wieland)
This includes adding IDT and SGT to the default timezone abbreviation set.
Update time zone data files to tzdata release 2009s for DST law changes in Antarctica, Argentina, Bangladesh, Fiji, Novokuznetsk, Pakistan, Palestine, Samoa, Syria; also historical corrections for Hong Kong.
E.91.2. Changes
Disallow RESET ROLE and RESET SESSION AUTHORIZATION inside security-definer functions (Tom, Heikki)
This covers a case that was missed in the previous patch that disallowed SET ROLE and SET SESSION AUTHORIZATION inside security-definer functions. (See CVE-2007-6600)
Fix handling of sub-SELECTs appearing in the arguments of an outer-level aggregate function (Tom)
Fix bugs associated with fetching a whole-row value from the output of a Sort or Materialize plan node (Tom)
Revert planner change that disabled partial-index and constraint exclusion optimizations when there were more than 100
clauses in an AND or OR list (Tom)
Notes de version
Fix overflow for INTERVAL 'x ms' when x is more than 2 million and integer datetimes are in use (Alex Hunsaker)
Fix money data type to work in locales where currency amounts have no fractional digits, e.g. Japan (Itagaki Takahiro)
Fix poor choice of page split point in GiST R-tree operator classes (Teodor)
Avoid performance degradation in bulk inserts into GIN indexes when the input values are (nearly) in sorted order (Tom)
Correctly enforce NOT NULL domain constraints in some contexts in PL/pgSQL (Tom)
Fix pg_ctl to not go into an infinite loop if postgresql.conf is empty (Jeff Davis)
Make contrib/hstore throw an error when a key or value is too long to fit in its data structure, rather than silently truncating it (Andrew Gierth)
Fix contrib/xml2's xslt_process() to properly handle the maximum number of parameters (twenty) (Tom)
Improve robustness of libpq's code to recover from errors during COPY FROM STDIN (Tom)
Avoid including conflicting readline and editline header files when both libraries are installed (Zdenek Kotala)
Update time zone data files to tzdata release 2009l for DST law changes in Bangladesh, Egypt, Jordan, Pakistan, Argentina/
San_Luis, Cuba, Jordan (historical correction only), Mauritius, Morocco, Palestine, Syria, Tunisia.
E.92.2. Changes
Disallow CREATE CONVERSION with the wrong encodings for the specified conversion function (Heikki)
This prevents one possible scenario for encoding conversion failure. The previous change is a backstop to guard against other
kinds of failures in the same area.
Fix core dump when to_char() is given format codes that are inappropriate for the type of the data argument (Tom)
Fix possible failure in contrib/tsearch2 when C locale is used with a multi-byte encoding (Teodor)
Crashes were possible on platforms where wchar_t is narrower than int; Windows in particular.
Fix extreme inefficiency in contrib/tsearch2 parser's handling of an email-like string containing multiple @ characters
(Heikki)
Notes de version
This mistake could lead to Assert failures in an Assert-enabled build, or an unexpected CASE WHEN clause error message
in other cases, when trying to examine or dump a view.
Fix PL/pgSQL to not treat INTO after INSERT as an INTO-variables clause anywhere in the string, not only at the start; in
particular, don't fail for INSERT INTO within CREATE RULE (Tom)
Clean up PL/pgSQL error status variables fully at block exit (Ashesh Vashi and Dave Page)
This is not a problem for PL/pgSQL itself, but the omission could cause the PL/pgSQL Debugger to crash while examining the
state of a function.
Add MUST (Mauritius Island Summer Time) to the default list of known timezone abbreviations (Xavier Bugaud)
E.93.2. Changes
Prevent possible Assert failure or misconversion if an encoding conversion is created with the wrong conversion function for
the specified pair of encodings (Tom, Heikki)
Fix possible Assert failure if a statement executed in PL/pgSQL is rewritten into another kind of statement, for example if an
INSERT is rewritten into an UPDATE (Heikki)
Make it safer for SPI-using functions to be used within datatype I/O; in particular, to be used in domain check constraints
(Tom)
Fix a problem that made UPDATE RETURNING tableoid return zero instead of the correct OID (Tom)
Fix planner misestimation of selectivity when transitive equality is applied to an outer-join clause (Tom)
This could result in bad plans for queries like ... from a left join b on a.a1 = b.b1 where a.a1 = 42
...
1590
Notes de version
Ensure that the contents of a holdable cursor don't depend on the contents of TOAST tables (Tom)
Previously, large field values in a cursor result might be represented as TOAST pointers, which would fail if the referenced
table got dropped before the cursor is read, or if the large value is deleted and then vacuumed away. This cannot happen with
an ordinary cursor, but it could with a cursor that is held past its creating transaction.
Fix memory leak when a set-returning function is terminated without reading its whole result (Tom)
Fix configure script to properly report failure when unable to obtain linkage information for PL/Perl (Andrew)
Make all documentation reference pgsql-bugs and/or pgsql-hackers as appropriate, instead of the nowdecommissioned pgsql-ports and pgsql-patches mailing lists (Tom)
Update time zone data files to tzdata release 2009a (for Kathmandu and historical DST corrections in Switzerland, Cuba)
E.94.2. Changes
Fix GiST index corruption due to marking the wrong index entry dead after a deletion (Teodor)
This would result in index searches failing to find rows they should have found. Corrupted indexes can be fixed with REINDEX.
Fix backend crash when the client encoding cannot represent a localized error message (Tom)
We have addressed similar issues before, but it would still fail if the character has no equivalent message itself couldn't be
converted. The fix is to disable localization and send the plain ASCII error message when we detect such a situation.
Fix possible crash when deeply nested functions are invoked from a trigger (Tom)
Improve optimization of expression IN (expression-list) queries (Tom, per an idea from Robert Haas)
Cases in which there are query variables on the right-hand side had been handled less efficiently in 8.2.x and 8.3.x than in
prior versions. The fix restores 8.1 behavior for such cases.
Fix mis-expansion of rule queries when a sub-SELECT appears in a function call in FROM, a multi-row VALUES list, or a RETURNING list (Tom)
The usual symptom of this problem is an unrecognized node type error.
Ensure an error is reported when a newly-defined PL/pgSQL trigger function is invoked as a normal function (Tom)
Prevent possible collision of relfilenode numbers when moving a table to another tablespace with ALTER SET TABLESPACE (Heikki)
The command tried to re-use the existing filename, instead of picking one that is known unused in the destination directory.
1591
Notes de version
Fix incorrect tsearch2 headline generation when single query item matches first word of text (Sushant Sinha)
Fix improper display of fractional seconds in interval values when using a non-ISO datestyle in an -enable-integer-datetimes build (Ron Mayer)
Ensure SPI_getvalue and SPI_getbinval behave correctly when the passed tuple and tuple descriptor have different
numbers of columns (Tom)
This situation is normal when a table has had columns added or removed, but these two functions didn't handle it properly. The
only likely consequence is an incorrect error indication.
Update time zone data files to tzdata release 2008i (for DST law changes in Argentina, Brazil, Mauritius, Syria)
E.95.2. Changes
Fix possible duplicate output of tuples during a GiST index scan (Teodor)
Fix missed permissions checks when a view contains a simple UNION ALL construct (Heikki)
Permissions for the referenced tables were checked properly, but not permissions for the view itself.
Add checks in executor startup to ensure that the tuples produced by an INSERT or UPDATE will match the target table's
current rowtype (Tom)
ALTER COLUMN TYPE, followed by re-use of a previously cached plan, could produce this type of situation. The check
protects against data corruption and/or crashes that could ensue.
Fix AT TIME ZONE to first try to interpret its timezone argument as a timezone abbreviation, and only try it as a full timezone name if that fails, rather than the other way around as formerly (Tom)
The timestamp input functions have always resolved ambiguous zone names in this order. Making AT TIME ZONE do so as
well improves consistency, and fixes a compatibility bug introduced in 8.1: in ambiguous cases we now behave the same as
1592
Notes de version
8.0 and before did, since in the older versions AT TIME ZONE accepted only abbreviations.
Fix datetime input functions to correctly detect integer overflow when running on a 64-bit platform (Tom)
Prevent integer overflows during units conversion when displaying a configuration parameter that has units (Tom)
Fix planner to estimate that GROUP BY expressions yielding boolean results always result in two groups, regardless of the expressions' contents (Tom)
This is very substantially more accurate than the regular GROUP BY estimate for certain boolean tests like col IS NULL.
Fix PL/pgSQL to not fail when a FOR loop's target variable is a record containing composite-type fields (Tom)
Fix PL/Tcl to behave correctly with Tcl 8.5, and to be more careful about the encoding of data sent to or from Tcl (Tom)
On Windows, work around a Microsoft bug by preventing libpq from trying to send more than 64kB per system call (Magnus)
Improve pg_dump and pg_restore's error reporting after failure to send a SQL command (Tom)
Fix pg_ctl to properly preserve postmaster command-line arguments across a restart (Bruce)
Update time zone data files to tzdata release 2008f (for DST law changes in Argentina, Bahamas, Brazil, Mauritius, Morocco,
Pakistan, Palestine, and Paraguay)
E.96.2. Changes
Notes de version
never released
This release contains a variety of fixes from 8.2.7. For information about new features in the 8.2 major release, see Section E.105,
Release 8.2 .
E.97.2. Changes
Fix ERRORDATA_STACK_SIZE exceeded crash that occurred on Windows when using UTF-8 database encoding and a
different client encoding (Tom)
Fix ALTER TABLE ADD COLUMN ... PRIMARY KEY so that the new column is correctly checked to see if it's been initialized to all non-nulls (Brendan Jurd)
Previous versions neglected to check this requirement at all.
Fix possible CREATE TABLE failure when alling the same constraint from multiple parent relations that alled that
constraint from a common ancestor (Tom)
Fix pg_get_ruledef() to show the alias, if any, attached to the target table of an UPDATE or DELETE (Tom)
Fix GIN bug that could result in a too many LWLocks taken failure (Teodor)
Repair two places where SIGTERM exit of a backend could leave corrupted state in shared memory (Tom)
Neither case is very important if SIGTERM is used to shut down the whole database cluster together, but there was a problem
if someone tried to SIGTERM individual backends.
Fix conversions between ISO-8859-5 and other encodings to handle Cyrillic Yo characters (e and E with two dots)
(Sergey Burladyan)
Fix several datatype input functions, notably array_in(), that were allowing unused bytes in their results to contain uninitialized, unpredictable values (Tom)
This could lead to failures in which two apparently identical literal values were not seen as equal, resulting in the parser complaining about unmatched ORDER BY and DISTINCT expressions.
Fix a corner case in regular-expression substring matching (substring(string from pattern)) (Tom)
The problem occurs when there is a match to the pattern overall but the user has specified a parenthesized subexpression and
that subexpression hasn't got a match. An example is substring('foo' from 'foo(bar)?'). This should return
NULL, since (bar) isn't matched, but it was mistakenly returning the whole-pattern match instead (ie, foo).
Update time zone data files to tzdata release 2008c (for DST law changes in Morocco, Iraq, Choibalsan, Pakistan, Syria, Cuba,
and Argentina/San_Luis)
Fix broken GiST comparison function for contrib/tsearch2's tsquery type (Teodor)
Fix core dump in contrib/xml2's xpath_table() function when the input query returns a NULL value (Tom)
Notes de version
Release Date
2008-03-17
This release contains a variety of fixes from 8.2.6. For information about new features in the 8.2 major release, see Section E.105,
Release 8.2 .
E.98.2. Changes
Fix character string comparison for Windows locales that consider different character combinations as equal (Tom)
This fix applies only on Windows and only when using UTF-8 database encoding. The same fix was made for all other cases
over two years ago, but Windows with UTF-8 uses a separate code path that was not updated. If you are using a locale that
considers some non-identical strings as equal, you may need to REINDEX to fix existing indexes on textual columns.
Repair potential deadlock between concurrent VACUUM FULL operations on different system catalogs (Tom)
Fix rare crash when an error occurs during a query using a hash index (Heikki)
Fix unrecognized node type error in some variants of ALTER OWNER (Tom)
Update time zone data files to tzdata release 2008a (in particular, recent Chile changes); adjust timezone abbreviation VET
(Venezuela) to mean UTC-4:30, not UTC-4:00 (Tom)
Fix pg_ctl to correctly extract the postmaster's port number from command-line options (Itagaki Takahiro, Tom)
Previously, pg_ctl start -w could try to contact the postmaster on the wrong port, leading to bogus reports of startup
failure.
Use -fwrapv to defend against possible misoptimization in recent gcc versions (Tom)
This is known to be necessary when building PostgreSQL with gcc 4.3 or later.
Correctly enforce statement_timeout values longer than INT_MAX microseconds (about 35 minutes) (Tom)
This bug affects only builds with --enable-integer-datetimes.
Fix unexpected PARAM_SUBLINK ID planner error when constant-folding simplifies a sub-select (Tom)
1595
Notes de version
Fix logical errors in constraint-exclusion handling of IS NULL and NOT expressions (Tom)
The planner would sometimes exclude partitions that should not have been excluded because of the possibility of NULL results.
Fix another cause of failed to build any N-way joins planner errors (Tom)
This could happen in cases where a clauseless join needed to be forced before a join clause could be exploited.
Fix libpq to handle NOTICE messages correctly during COPY OUT (Tom)
This failure has only been observed to occur when a user-defined datatype's output routine issues a NOTICE, but there is no
guarantee it couldn't happen due to other causes.
E.99.2. Changes
Prevent functions in indexes from executing with the privileges of the user running VACUUM, ANALYZE, etc (Tom)
Functions used in index expressions and partial-index predicates are evaluated whenever a new table entry is made. It has long
been understood that this poses a risk of trojan-horse code execution if one modifies a table owned by an untrustworthy user.
(Note that triggers, defaults, check constraints, etc. pose the same type of risk.) But functions in indexes pose extra danger because they will be executed by routine maintenance operations such as VACUUM FULL, which are commonly performed automatically under a superuser account. For example, a nefarious user can execute code with superuser privileges by setting up
a trojan-horse index definition and waiting for the next routine vacuum. The fix arranges for standard maintenance operations
(including VACUUM, ANALYZE, REINDEX, and CLUSTER) to execute as the table owner rather than the calling user,
using the same privilege-switching mechanism already used for SECURITY DEFINER functions. To prevent bypassing this
security measure, execution of SET SESSION AUTHORIZATION and SET ROLE is now forbidden within a SECURITY
DEFINER context. (CVE-2007-6600)
Require non-superusers who use /contrib/dblink to use only password authentication, as a security measure (Joe)
The fix that appeared for this in 8.2.5 was incomplete, as it plugged the hole for only some dblink functions.
(CVE-2007-6601, CVE-2007-3278)
Fix GIN index build to work properly when maintenance_work_mem is 4GB or more (Tom)
Update time zone data files to tzdata release 2007k (in particular, recent Argentina changes) (Tom)
1596
Notes de version
Fix planning-speed problem for deep outer-join nests, as well as possible poor choice of join order (Tom)
Fix planner failure in some cases of WHERE false AND var IN (SELECT ...) (Tom)
Make CREATE TABLE ... SERIAL and ALTER SEQUENCE ... OWNED BY not change the currval() state of the
sequence (Tom)
Preserve the tablespace and storage parameters of indexes that are rebuilt by ALTER TABLE ... ALTER COLUMN TYPE
(Tom)
Make archive recovery always start a new WAL timeline, rather than only when a recovery stop time was used (Simon)
This avoids a corner-case risk of trying to overwrite an existing archived copy of the last WAL segment, and seems simpler
and cleaner than the original definition.
Make VACUUM not use all of maintenance_work_mem when the table is too small for it to be useful (Alvaro)
Fix potential crash in translate() when using a multibyte database encoding (Tom)
Make corr() return the correct result for negative correlation values (Neil)
Fix overflow in extract(epoch from interval) for intervals exceeding 68 years (Tom)
Fix PL/Perl to not fail when a UTF-8 regular expression is used in a trusted function (Andrew)
Fix PL/Perl to cope when platform's Perl defines type bool as int rather than char (Tom)
While this could theoretically happen anywhere, no standard build of Perl did things this way ... until Mac OS X 10.5.
Fix PL/Python to work correctly with Python 2.5 on 64-bit machines (Marko Kreen)
Fix pg_dump to correctly handle allance child tables that have default expressions different from their parent's (Tom)
Fix libpq crash when PGPASSFILE refers to a file that is not a plain file (Martin Pitt)
Make contrib/pgcrypto defend against OpenSSL libraries that fail on keys longer than 128 bits; which is the case at
least on some Solaris versions (Marko Kreen)
Make contrib/tablefunc's crosstab() handle NULL rowid as a category in its own right, rather than crashing (Joe)
Fix tsvector and tsquery output routines to escape backslashes correctly (Teodor, Bruce)
Require a specific version of Autoconf to be used when re-generating the configure script (Peter)
This affects developers and packagers only. The change was made to prevent accidental use of untested combinations of Autoconf and PostgreSQL versions. You can remove the version check if you really want to use a different Autoconf version, but it's your responsibility whether the result works or not.
Update gettimeofday configuration check so that PostgreSQL can be built on newer versions of MinGW (Magnus)
E.100.2. Changes
1597
Notes de version
Prevent index corruption when a transaction inserts rows and then aborts close to the end of a concurrent VACUUM on the
same table (Tom)
Fix ALTER DOMAIN ADD CONSTRAINT for cases involving domains over domains (Tom)
Fix some planner problems with outer joins, notably poor size estimation for t1 LEFT JOIN t2 WHERE t2.col IS
NULL (Tom)
Allow the interval data type to accept input consisting only of milliseconds or microseconds (Neil)
Allow timezone name to appear before the year in timestamp input (Tom)
Fix logging so that log messages are never interleaved when using the syslogger process (Andrew)
Prevent REINDEX and CLUSTER from failing due to attempting to process temporary tables of other sessions (Alvaro)
Update the time zone database rules, particularly New Zealand's upcoming changes (Tom)
Fix memory allocation bug when using MIT Kerberos on Windows (Magnus)
Suppress timezone name (%Z) in log timestamps on Windows because of possible encoding mismatches (Tom)
Require non-superusers who use /contrib/dblink to use only password authentication, as a security measure (Joe)
Do not let /contrib/intarray try to make its GIN opclass the default (this caused problems at dump/restore) (Tom)
E.101.2. Changes
Support explicit placement of the temporary-table schema within search_path, and disable searching it for functions and
operators (Tom)
This is needed to allow a security-definer function to set a truly secure value of search_path. Without it, an unprivileged
SQL user can use temporary objects to execute code with the privileges of the security-definer function (CVE-2007-2138). See
CREATE FUNCTION for more information.
Fix shared_preload_libraries for Windows by forcing reload in each backend (Korry Douglas)
Fix to_char() so it properly upper/lower cases localized day or month names (Pavel Stehule)
1598
Notes de version
Require COMMIT PREPARED to be executed in the same database as the transaction was prepared in (Heikki)
Allow pg_dump to do binary backups larger than two gigabytes on Windows (Magnus)
Prevent the statistics collector from writing to disk too frequently (Tom)
Fix potential-data-corruption bug in how VACUUM FULL handles UPDATE chains (Tom, Pavan Deolasee)
Fix pg_dump so it can dump a serial column's sequence using -t when not also dumping the owning table (Tom)
Planner fixes, including improving outer join and bitmap scan selection logic (Tom)
Fix possible wrong answers or crash when a PL/pgSQL function tries to RETURN from within an EXCEPTION block (Tom)
Fix POSIX-style timezone specs to follow new USA DST rules (Tom)
E.102.2. Changes
Remove overly-restrictive check for type length in constraints and functional indexes(Tom)
E.103.2. Changes
Remove security vulnerabilities that allowed connected users to read backend memory (Tom)
The vulnerabilities involve suppressing the normal check that a SQL function returns the data type it's declared to, and changing the data type of a table column (CVE-2007-0555, CVE-2007-0556). These errors can easily be exploited to cause a backend crash, and in principle might be used to read database content that the user should not be able to access.
Fix not-so-rare-anymore bug wherein btree index page splits could fail due to choosing an infeasible split point (Heikki Linna1599
Notes de version
kangas)
Fix potentially incorrect results from index searches using ROW inequality conditions (Tom)
Tighten security of multi-byte character processing for UTF8 sequences over three bytes long (Tom)
Fix bogus permission denied failures occurring on Windows due to attempts to fsync already-deleted files (Magnus, Tom)
Fix bug that could cause the statistics collector to hang on Windows (Magnus)
This would in turn lead to autovacuum not working.
E.104.2. Changes
Fix crash with SELECT ... LIMIT ALL (also LIMIT NULL) (Tom)
On Windows, make log messages coming from the operating system use ASCII encoding (Hiroshi Saito)
This fixes a conversion problem when there is a mismatch between the encoding of the operating system and database server.
Notes de version
Have psql print multi-byte combining characters as before, rather than output as \u (Tom)
Make pg_dumpall assume that databases have public CONNECT privilege, when dumping from a pre-8.2 server (Tom)
This preserves the previous behavior that anyone can connect to a database if allowed by pg_hba.conf.
E.105.1. Overview
This release adds many functionality and performance improvements that were requested by users, including:
Query language enhancements including INSERT/UPDATE/DELETE RETURNING, multirow VALUES lists, and optional
target-table alias in UPDATE/DELETE
Many query optimization improvements, including support for reordering outer joins
Table allance relationships can be defined for and removed from pre-existing tables
Change the row constructor syntax (ROW(...)) so that list elements foo.* will be expanded to a list of their member fields,
rather than creating a nested row type field as formerly (Tom)
The new behavior is substantially more useful since it allows, for example, triggers to check for data changes with IF
row(new.*) IS DISTINCT FROM row(old.*). The old behavior is still available by omitting .*.
Make row comparisons follow SQL standard semantics and allow them to be used in index scans (Tom)
1601
Notes de version
Previously, row = and <> comparisons followed the standard but < <= > >= did not. A row comparison can now be used as an
index constraint for a multicolumn index matching the row value.
Make row IS [NOT] NULL tests follow SQL standard semantics (Tom)
The former behavior conformed to the standard for simple cases with IS NULL, but IS NOT NULL would return true if any
row field was non-null, whereas the standard says it should return true only when all fields are non-null.
Declare libpq PQgetssl() as returning void *, rather than SSL * (Martijn van Oosterhout)
This allows applications to use the function without including the OpenSSL headers.
C-language loadable modules must now include a PG_MODULE_MAGIC macro call for version compatibility checking
(Martijn van Oosterhout)
For security's sake, modules used by a PL/PerlU function are no longer available to PL/Perl functions (Andrew)
Note
This also implies that data can no longer be shared between a PL/Perl function and a PL/PerlU function. Some
1602
Notes de version
Perl installations have not been compiled with the correct flags to allow multiple interpreters to exist within a
single process. In this situation PL/Perl and PL/PerlU cannot both be used in a single backend. The solution is
to get a Perl installation which supports multiple interpreters.
Remove contrib modules that have been migrated to PgFoundry: adddepend, dbase, dbmirror, fulltextindex,
mac, userlock
E.105.3. Changes
Below you will find a detailed account of the changes between PostgreSQL 8.2 and the previous major release.
Improve locking performance by breaking the lock manager tables into sections (Tom)
This allows locking to be more fine-grained, reducing contention.
Improve the optimizer's selectivity estimates for LIKE, ILIKE, and regular expression operations (Tom)
Improve planning of joins to inherited tables and UNION ALL views (Tom)
Allow constraint exclusion to be applied to inherited UPDATE and DELETE queries (Tom)
SELECT already honored constraint exclusion.
Improve planning of constant WHERE clauses, such as a condition that depends only on variables alled from an outer query level (Tom)
Protocol-level unnamed prepared statements are re-planned for each set of BIND values (Tom)
This improves performance because the exact parameter values can be used in the plan.
Avoid extra scan of tables without indexes during VACUUM (Greg Stark)
1603
Notes de version
Remove dead index entries before B-Tree page split (Junji Teramoto)
Add archive_timeout to force transaction log file switches at a given interval (Simon)
This enforces a maximum replication delay for warm standby servers.
Add support for SSL Certificate Revocation List (CRL) files (Libor Hoho)
The server and libpq both recognize CRL files now.
Track maximum XID age within individual tables, instead of whole databases (Alvaro)
This reduces the overhead involved in preventing transaction ID wraparound, by avoiding unnecessary VACUUMs.
Add last vacuum and analyze timestamp columns to the stats collector (Larry Rosenman)
These values now appear in the pg_stat_*_tables system views.
Add configuration parameter update_process_title to control whether the ps display is updated for every command
(Bruce)
On platforms where it is expensive to update the ps display, it might be worthwhile to turn this off and rely solely on
pg_stat_activity for status information.
Notes de version
Fix race condition for truncation of a large relation across a gigabyte boundary by VACUUM (Tom)
Each backend process is now its own process group leader (Tom)
This allows query cancel to abort subprocesses invoked from a backend or archive/recovery process.
Add support for multiple-row VALUES clauses, per SQL standard (Joe, Tom)
This allows INSERT to insert multiple rows of constants, or queries to generate result sets using constants. For example, INSERT ... VALUES (...), (...), ...., and SELECT * FROM (VALUES (...), (...), ....) AS
alias(f1, ...).
Allow UPDATE and DELETE to use an alias for the target table (Atsushi Ogawa)
The SQL standard does not permit an alias in these commands, but many database systems allow one anyway for notational
convenience.
Allow UPDATE to set multiple columns with a list of values (Susanne Ebrecht)
This is basically a short-hand for assigning the columns and values in pairs. The syntax is UPDATE tab SET (column,
...) = (val, ...).
Support FOR UPDATE and FOR SHARE in the same SELECT command (Tom)
Notes de version
When all corresponding columns are of the same defined length, that length is used for the result, rather than a generic length.
Do not flatten subqueries that contain volatile functions in their target lists (Jaime Casanova)
This prevents surprising behavior due to multiple evaluation of a volatile function (such as random() or nextval()).
It might cause performance degradation in the presence of functions that are unnecessarily marked as volatile.
Add system views pg_prepared_statements and pg_cursors to show prepared statements and open cursors
(Joachim Wieland, Neil)
These are very useful in pooled connection setups.
If SQL-level PREPARE parameters are unspecified, infer their types from the content of the query (Neil)
Protocol-level PREPARE already did this.
Aggregate functions now support multiple input parameters (Sergey Koposov, Tom)
Add ALTER ROLE PASSWORD NULL to remove a previously set role password (Peter)
Add REASSIGN OWNED to reassign ownership of all objects owned by a role (Alvaro)
This, and DROP OWNED above, facilitate dropping roles.
Notes de version
compatibility.
Add USAGE permission for sequences that allows only currval() and nextval(), not setval() (Bruce)
USAGE permission allows more fine-grained control over sequence access. Granting USAGE allows users to increment a sequence, but prevents them from setting the sequence to an arbitrary value using setval().
Add option to allow indexes to be created without blocking concurrent writes to the table (Greg Stark, Tom)
The new syntax is CREATE INDEX CONCURRENTLY. The default behavior is still to block table modification while a
index is being created.
Make the COPY command return a command tag that includes the number of rows copied (Volkan YAZICI)
Allow VACUUM to expire rows without being affected by other concurrent VACUUM operations (Hannu Krossing, Alvaro,
Tom)
Make initdb detect the operating system locale and set the default DateStyle accordingly (Peter)
This makes it more likely that the installed postgresql.conf DateStyle value will be as desired.
Add pg_timezone_abbrevs and pg_timezone_names views to show supported timezones (Magnus Hagander)
Allow to_char() to print localized month and day names (Euler Taveira de Oliveira)
Notes de version
Allow assignment to array elements not contiguous with the existing entries (Tom)
The intervening array positions will be filled with nulls. This is per SQL standard.
New built-in operators for array-subset comparisons (@>, <@, &&) (Teodor, Tom)
These operators can be indexed for many data types using GiST or GIN indexes.
Add convenient arithmetic operations on INET/CIDR values (Stephen R. van den Berg)
The new operators are & (and), | (or), ~ (not), inet + int8, inet - int8, and inet - inet.
Add all comparison operators for the tid (tuple id) data type (Mark Kirkwood, Greg Stark, Tom)
Allow FOR statements to return values to scalars as well as records and row types (Pavel Stehule)
Add a BY clause to the FOR loop, to control the iteration increment (Jaime Casanova)
Run PL/Perl and PL/PerlU in separate interpreters, for security reasons (Andrew)
In consequence, they can no longer share data nor loaded modules. Also, if Perl has not been compiled with the requisite flags
to allow multiple interpreters, only one of these languages can be used in any given backend process.
1608
Notes de version
Named parameters are passed as ordinary variables, as well as in the args[] array (Sven Suursoho)
Add new command \password for changing role password with client-side password encryption (Peter)
Allow \c to connect to a new host and port number (David, Volkan YAZICI)
Improve \df slash command to include the argument names and modes (OUT or INOUT) of the function (David Fetter)
Support for automatically retrieving SELECT results in batches using a cursor (Chris Mair)
This is enabled using \set FETCH_COUNT n. This feature allows large result sets to be retrieved in psql without attempting
to buffer the entire result set in memory.
Make multi-line values align in the proper column (Martijn van Oosterhout)
Field values containing newlines are now displayed in a more readable fashion.
Save multi-line statements as a single entry, rather than one line at a time (Sergey E. Koposov)
This makes up-arrow recall of queries easier. (This is not available on Windows, because that platform uses the native command-line editing present in the operating system.)
Make the line counter 64-bit so it can handle files with more than two billion lines (David Fetter)
Report both the returned data and the command status tag for INSERT/UPDATE/DELETE RETURNING (Tom)
Allow complex selection of objects to be included or excluded by pg_dump (Greg Sabino Mullane)
pg_dump now supports multiple -n (schema) and -t (table) options, and adds -N and -T options to exclude objects. Also,
the arguments of these switches can now be wild-card expressions rather than single object names, for example -t 'foo*',
and a schema can be part of a -t or -T switch, for example -t schema1.table1.
Add pg_restore --no-data-for-failed-tables option to suppress loading data if table creation failed (i.e., the table
already exists) (Martin Pitt)
Add pg_restore option to run the entire session in a single transaction (Simon)
Use option -1 or --single-transaction.
1609
Notes de version
Add PQdescribePrepared(), PQdescribePortal(), and related functions to return information about previously
prepared statements and open cursors (Volkan YAZICI)
Add MSVC support for utility commands and pg_dump (Hiroshi Saito)
Add support for Windows code pages 1253, 1254, 1255, and 1257 (Kris Jurka)
Drop privileges on startup, so that the server can be started from an administrative account (Magnus)
Add GIN (Generalized Inverted iNdex) index access method (Teodor, Oleg)
Reduce libraries needlessly linked into the backend (Martijn van Oosterhout, Tom)
Add a configure flag to allow libedit to be preferred over GNU readline (Bruce)
Use configure --with-libedit-preferred.
Add support for Solaris x86_64 using the Solaris compiler (Pierre Girard, Theo Schlossnagle, Bruce)
Add PG_VERSION_NUM for use by third-party applications wanting to test the backend version in C using > and < comparisons (Bruce)
Add server support for plugin libraries that can be used for add-on tasks such as debugging and performance measurement
(Korry Douglas)
1610
Notes de version
This consists of two features: a table of rendezvous variables that allows separately-loaded shared libraries to communicate, and a new configuration parameter local_preload_libraries that allows libraries to be loaded into specific sessions without explicit cooperation from the client application. This allows external add-ons to implement features such as a
PL/pgSQL debugger.
Allow loadable modules to allocate shared memory and lightweight locks (Marc Munro)
Add automatic initialization and finalization of dynamically loaded libraries (Ralf Engelschall, Tom)
New functions _PG_init() and _PG_fini() are called if the library defines such symbols. Hence we no longer need to
specify an initialization function in shared_preload_libraries; we can assume that the library used the
_PG_init() convention instead.
Add PG_MODULE_MAGIC header block to all shared object files (Martijn van Oosterhout)
The magic block prevents version mismatches between loadable object files and servers.
GIN support
Add pg_freespacemap module to display free space map information (Mark Kirkwood)
Include iMath library in pgcrypto to have the public-key encryption functions always available.
1611
Notes de version
Activate builtin code for SHA224/256/384/512 hashes on older OpenSSL to have those algorithms always available.
New function gen_random_bytes() that returns cryptographically strong randomness. Useful for generating encryption
keys.
Add uninstall scripts for all contrib packages that have install scripts (David, Josh Drake)
E.106.2. Changes
Force the default wal_sync_method to be fdatasync on Linux (Tom Lane, Marti Raudsepp)
The default on Linux has actually been fdatasync for many years, but recent kernel changes caused PostgreSQL to
choose open_datasync instead. This choice did not result in any performance improvement, and caused outright failures
on certain filesystems, notably ext4 with the data=journal mount option.
Fix recovery from base backup when the starting checkpoint WAL record is not in the same WAL segment as its redo point
(Jeff Davis)
Avoid memory leakage while ANALYZE'ing complex index expressions (Tom Lane)
Ensure an index that uses a whole-row Var still depends on its table (Tom Lane)
1612
Notes de version
An index declared like create index i on t (foo(t.*)) would not automatically get dropped when its table was
dropped.
Do not inline a SQL function with multiple OUT parameters (Tom Lane)
This avoids a possible crash due to loss of information about the expected result rowtype.
Fix incorrect calculation of distance from a point to a horizontal line segment (Tom Lane)
This bug affected several different geometric distance-measurement operators.
Fix PL/pgSQL's handling of simple expressions to not fail in recursion or error-recovery cases (Tom Lane)
Don't emit identifier will be truncated notices in contrib/dblink except when creating new connections (Itagaki Takahiro)
Update time zone data files to tzdata release 2010o for DST law changes in Fiji and Samoa; also historical corrections for
Hong Kong.
E.107.2. Changes
Use a separate interpreter for each calling SQL userid in PL/Perl and PL/Tcl (Tom Lane)
This change prevents security problems that can be caused by subverting Perl or Tcl code that will be executed later in the
same session under another SQL user identity (for example, within a SECURITY DEFINER function). Most scripting languages offer numerous ways that that might be done, such as redefining standard functions or operators called by the target
function. Without this change, any SQL user with Perl or Tcl language usage rights can do essentially anything with the SQL
privileges of the target function's owner.
The cost of this change is that intentional communication among Perl and Tcl functions becomes more difficult. To provide an
escape hatch, PL/PerlU and PL/TclU functions continue to use only one interpreter per session. This is not considered a security issue since all such functions execute at the trust level of a database superuser already.
It is likely that third-party procedural languages that claim to offer trusted execution have similar security issues. We advise
1613
Notes de version
contacting the authors of any PL you are depending on for security-critical purposes.
Our thanks to Tim Bunce for pointing out this issue (CVE-2010-3433).
Prevent possible crashes in pg_get_expr() by disallowing it from being called with an argument that is not one of the system catalog columns it's intended to be used with (Heikki Linnakangas, Tom Lane)
Defend against functions returning setof record where not all the returned rows are actually of the same rowtype (Tom Lane)
Fix possible failure when hashing a pass-by-reference function result (Tao Ma, Tom Lane)
Take care to fsync the contents of lockfiles (both postmaster.pid and the socket lockfile) while writing them (Tom Lane)
This omission could result in corrupted lockfile contents if the machine crashes shortly after postmaster start. That could in
turn prevent subsequent attempts to start the postmaster from succeeding, until the lockfile is manually removed.
Avoid recursion while assigning XIDs to heavily-nested subtransactions (Andres Freund, Robert Haas)
The original coding could result in a crash if there was limited stack space.
Fix log_line_prefix's %i escape, which could produce junk early in backend startup (Tom Lane)
Fix possible data corruption in ALTER TABLE ... SET TABLESPACE when archiving is enabled (Jeff Davis)
Allow CREATE DATABASE and ALTER DATABASE ... SET TABLESPACE to be interrupted by query-cancel
(Guillaume Lelarge)
In PL/Python, defend against null pointer results from PyCObject_AsVoidPtr and PyCObject_FromVoidPtr (Peter
Eisentraut)
Fix connection leak after duplicate connection name errors in contrib/dblink (Itagaki Takahiro)
Fix contrib/dblink to handle connection names longer than 62 bytes correctly (Itagaki Takahiro)
Update build infrastructure and documentation to reflect the source code repository's move from CVS to Git (Magnus Hagander and others)
Update time zone data files to tzdata release 2010l for DST law changes in Egypt and Palestine; also historical corrections for
Finland.
This change also adds new names for two Micronesian timezones: Pacific/Chuuk is now preferred over Pacific/Truk (and the
preferred abbreviation is CHUT not TRUT) and Pacific/Pohnpei is preferred over Pacific/Ponape.
E.108.2. Changes
Enforce restrictions in plperl using an opmask applied to the whole interpreter, instead of using Safe.pm (Tim Bunce,
Andrew Dunstan)
1614
Notes de version
Recent developments have convinced us that Safe.pm is too insecure to rely on for making plperl trustable. This change
removes use of Safe.pm altogether, in favor of using a separate interpreter with an opcode mask that is always applied. Pleasant side effects of the change include that it is now possible to use Perl's strict pragma in a natural way in plperl, and
that Perl's $a and $b variables work as expected in sort routines, and that function compilation is significantly faster.
(CVE-2010-1169)
Avoid possible crash during backend shutdown if shutdown occurs when a CONTEXT addition would be made to log entries
(Tom)
In some cases the context-printing function would fail because the current transaction had already been rolled back when it
came time to print a log message.
Prevent infinite recursion in psql when expanding a variable that refers to itself (Tom)
Ensure that contrib/pgstattuple functions respond to cancel interrupts promptly (Tatsuhito Kasahara)
Make server startup deal properly with the case that shmget() returns EINVAL for an existing shared memory segment
(Tom)
This behavior has been observed on BSD-derived kernels including OS X. It resulted in an entirely-misleading startup failure
complaining that the shared memory request size was too large.
Update time zone data files to tzdata release 2010j for DST law changes in Argentina, Australian Antarctic, Bangladesh,
Mexico, Morocco, Pakistan, Palestine, Russia, Syria, Tunisia; also historical corrections for Taiwan.
E.109.2. Changes
Add new configuration parameter ssl_renegotiation_limit to control how often we do session key renegotiation for
an SSL connection (Magnus)
This can be set to zero to disable renegotiation completely, which may be required if a broken SSL library is used. In particular, some vendors are shipping stopgap patches for CVE-2009-3555 that cause renegotiation attempts to fail.
Fix possible crashes when trying to recover from a failure in subtransaction start (Tom)
1615
Notes de version
Fix server memory leak associated with use of savepoints and a client encoding different from server's encoding (Tom)
Make substring() for bit types treat any negative length as meaning all the rest of the string (Tom)
The previous coding treated only -1 that way, and would produce an invalid result value for other negative values, possibly
leading to a crash (CVE-2010-0442).
Fix integer-to-bit-string conversions to handle the first fractional byte correctly when the output bit width is wider than the given integer by something other than a multiple of 8 bits (Tom)
Fix the STOP WAL LOCATION entry in backup history files to report the next WAL segment's name when the end location
is exactly at a segment boundary (Itagaki Takahiro)
When reading pg_hba.conf and related files, do not treat @something as a file inclusion request if the @ appears inside
quote marks; also, never treat @ by itself as a file inclusion request (Tom)
This prevents erratic behavior if a role or database name starts with @. If you need to include a file whose path name contains
spaces, you can still do so, but you must write @"/path to/file" rather than putting the quotes around the whole
construct.
Prevent infinite loop on some platforms if a directory is named as an inclusion target in pg_hba.conf and related files
(Tom)
Fix psql's numericlocale option to not format strings it shouldn't in latex and troff output formats (Heikki)
Fix plpgsql failure in one case where a composite column is set to NULL (Tom)
Add volatile markings in PL/Python to avoid possible compiler-specific misbehavior (Zdenek Kotala)
Prevent crash in contrib/dblink when too many key columns are specified to a dblink_build_sql_* function
(Rushabh Lathia, Joe Conway)
Update time zone data files to tzdata release 2010e for DST law changes in Bangladesh, Chile, Fiji, Mexico, Paraguay, Samoa.
E.110.2. Changes
Protect against indirect security threats caused by index functions changing session-local state (Gurjeet Singh, Tom)
This change prevents allegedly-immutable index functions from possibly subverting a superuser's session (CVE-2009-4136).
Reject SSL certificates containing an embedded null byte in the common name (CN) field (Magnus)
This prevents unintended matching of a certificate to a server or client name during SSL validation (CVE-2009-4034).
1616
Notes de version
Fix possible crash due to integer overflow in hash table size calculation (Tom)
This could occur with extremely large planner estimates for the size of a hashjoin's result.