-
Notifications
You must be signed in to change notification settings - Fork 0
/
rss20.xml.off
2789 lines (2541 loc) · 366 KB
/
rss20.xml.off
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0"?>
<rss version="2.0">
<channel>
<title>La planète francophone de PostgreSQL</title>
<link>http://planete.postgresql.fr/</link>
<language>en</language>
<description>La planète francophone de PostgreSQL - http://planete.postgresql.fr/</description>
<item>
<title>Actualités PostgreSQL.fr: Nouvelles hebdomadaires de PostgreSQL - 11 juillet 2010</title>
<guid>urn:md5:228ce8974efb36a743de3462ed78acda</guid>
<link>http://blog.postgresql.fr/index.php?post/2010/07/18/Nouvelles-hebdomadaires-de-PostgreSQL-11-juillet-2010</link>
<description><p>PostgreSQL 9.0 beta 3 sera bient&ocirc;t disponible [ndt: <a href="http://blog.postgresql.fr/index.php?post/2010/07/13/Sortie-de-la-verion-beta-3-de-PostgreSQL-9.0">article d&eacute;di&eacute;</a>].Pr&eacute;parez-vous &agrave; tester&nbsp;!
<a target="_blank" href="http://www.postgresql.org/developer/beta">http://www.postgresql.org/developer/beta</a></p>
<p>Rassemblement PostgreSQL/PostGIS le 14 juillet 2010 &agrave; 18h, &agrave; Zurich (Suisse) au bOm kultur caf&eacute; &amp; bar &agrave; l'ETH [ndt: institut f&eacute;d&eacute;ral technologique] Zurich. Informations et inscriptions (informelles)&nbsp;:
<a target="_blank" href="http://www.gis.hsr.ch/wiki/Agenda">http://www.gis.hsr.ch/wiki/Agenda</a></p>
<p>Reuven Lerner donnera un cours de 5 jours sur PostgreSQL du 1er au 5 ao&ucirc;t au "Hi-Tech College" de Herzliya (Isra&euml;l)&nbsp;:
<a target="_blank" href="http://www.hi-tech.co.il/college/default.asp?PageID=12&CourseNum=4288">http://www.hi-tech.co.il/college/default.asp?PageID=12&amp;CourseNum=4288</a></p>
<p><strong>Les nouveaut&eacute;s des produits d&eacute;riv&eacute;s</strong></p>
<ul>
<li>Benetl 3.5, un ETL pour fichiers utilisant PostgreSQL&nbsp;:
<a target="_blank" href="http://www.benetl.net">http://www.benetl.net</a></li>
<li>DataArchitect 4.2, un outil de dessin de diagramme relationnel et d'ing&eacute;nierie inverse compatible PostgreSQL&nbsp;:
<a target="_blank" href="http://www.thekompany.com/products/dataarchitect/">http://www.thekompany.com/products/dataarchitect/</a></li>
<li>PostgreSQL Maestro 10.7, un outil d'administration graphique pour PostgreSQL&nbsp;:
<a target="_blank" href="http://www.sqlmaestro.com/products/postgresql/maestro/">http://www.sqlmaestro.com/products/postgresql/maestro/</a></li>
<li>Muldis-D 0.130.0, une sp&eacute;cification pour un langage objet-relationnel pr&eacute;vu pour utiliser, entre autres syst&egrave;mes, PostgreSQL&nbsp;:
<a target="_blank" href="http://muldis.com/Muldis_D.html">http://muldis.com/Muldis_D.html</a></li>
<li>RHQ 3.0.0, une application de gestion et de surveillance&nbsp;:
<a target="_blank" href="http://rhq-project.org/">http://rhq-project.org/</a></li>
</ul>
<p><strong>Offres d'emplois autour de PostgreSQL en juillet</strong></p>
<ul>
<li>Internationales&nbsp;:
<a target="_blank" href="http://archives.postgresql.org/pgsql-jobs/2010-07/threads.php">http://archives.postgresql.org/pgsql-jobs/2010-07/threads.php</a>;</li>
<li>Francophones&nbsp;:
<a target="_blank" href="http://forums.postgresql.fr/viewforum.php?id=4">http://forums.postgresql.fr/viewforum.php?id=4</a>.</li>
</ul>
<p><strong>PostgreSQL Local</strong></p>
<ul>
<li>Le PDXPUG Day est programm&eacute; pour le 18 juillet 2010 &agrave; "l'Oregon Convention Center" &agrave; Portland. D'avantage d'informations&nbsp;:
<a target="_blank" href="http://wiki.postgresql.org/wiki/PDXPUGDay2010">http://wiki.postgresql.org/wiki/PDXPUGDay2010</a></li>
<li>L'OSCON aura lieu &agrave; Portland (Oregon) du 19 au 23 juillet 2010&nbsp;:
<a target="_blank" href="http://www.oscon.com/oscon2010">http://www.oscon.com/oscon2010</a></li>
<li>La FrOSCon 2010 aura lieu &agrave; St. Augustin, Allemagne les 21 &amp; 22 ao&ucirc;t 2010. Le PUG allemand a obtenu sa propre salle de dev. et est &agrave; la recherche de conf&eacute;renciers. Plus de d&eacute;tails&nbsp;:
<a target="_blank" href="http://andreas.scherbaum.la/blog/archives/711-FrOSCon-2010-PostgreSQL-devroom-Call-for-papers.html">http://andreas.scherbaum.la/blog/archives/711-FrOSCon-2010-PostgreSQL-devroom-Call-for-papers.html</a></li>
</ul>
<p><strong>PostgreSQL dans les m&eacute;dia</strong></p>
<ul>
<li>Planet PostgreSQL&nbsp;:
<a target="_blank" href="http://planet.postgresql.org/">http://planet.postgresql.org/</a></li>
<li>Planet PostgreSQLFr&nbsp;:
<a target="_blank" href="http://planete.postgresql.fr/">http://planete.postgresql.fr/</a></li>
</ul>
<p><i>PostgreSQL Weekly News / les nouvelles hebdomadaires vous sont offertes cette semaine par David Fetter. Traduction par l'&eacute;quipe PostgreSQLFr sous licence CC BY-NC-SA.</i></p>
<p><i>Proposez vos articles ou annonces avant dimanche 15:00 (heure du Pacifique). Merci de les envoyer en anglais &agrave; david (a) fetter.org, en allemand &agrave; pwn (a) pgug.de, en italien &agrave; pwn (a) itpug.org et en espagnol &agrave; pwn (a) arpug.com.ar.</i></p>
<p>(<a target="_blank" href="http://www.postgresql.org/community/weeklynews/pwn20100711">lien vers l'article original</a>)</p> <p><strong>Revues</strong></p>
<p>KaiGai Kohei reviewed Robert Haas's patch to add get_whatever_oid functionality.</p>
<p><strong>Correctifs appliqu&eacute;s</strong></p>
<p>Tom Lane a commit&eacute;&nbsp;:</p>
<ul>
<li>Improve pg_dump's checkSeek() function to verify the functioning of ftello as well as fseeko, and to not assume that fseeko(fp, 0, SEEK_CUR) proves anything. Also improve some related comments. Per my observation that the SEEK_CUR test didn't actually work on some platforms, and subsequent discussion with Robert Haas. Back-patch to 8.4. In earlier releases it's not that important whether we get the hasSeek test right, but with parallel restore it matters.</li>
<li>In pgsql/doc/src/sgml/release-9.0.sgml, add compatibility note warning that plpgsql is now stricter about the column datatypes of composite results, per gripe from Marcel Asio. Some desultory copy-editing of plpgsql-related sections of the release notes.</li>
<li>Get rid of some more stuff in pg_upgrade that duplicates c.h or port.h.</li>
<li>In pgsql/doc/src/sgml/datatype.sgml, fix assorted misstatements and poor wording in the descriptions of the I/O formats for geometric types. Per bug #5536 from Jon Strait, and my own testing. Back-patch to all supported branches, since this doco has been wrong right along -- we certainly haven't changed the I/O behavior of these types in many years.</li>
<li>Replace max_standby_delay with two parameters, max_standby_archive_delay and max_standby_streaming_delay, and revise the implementation to avoid assuming that timestamps found in WAL records can meaningfully be compared to clock time on the standby server. Instead, the delay limits are compared to the elapsed time since we last obtained a new WAL segment from archive or since we were last "caught up" to WAL data arriving via streaming replication. This avoids problems with clock skew between primary and standby, as well as other corner cases that the original coding would misbehave in, such as the primary server having significant idle time between transactions. Per my complaint some time ago and considerable ensuing discussion. Do some desultory editing on the hot standby documentation, too.</li>
<li>Make vacuum_defer_cleanup_age be PGC_SIGHUP level, since it's not sensible to have different values in different processes of the primary server. Also put it into the "Streaming Replication" GUC category; it doesn't belong in "Standby Servers" because you use it on the master not the standby. In passing also correct guc.c's idea of wal_keep_segments' category.</li>
<li>In pgsql/src/backend/access/transam/xlog.c, don't set recoveryLastXTime when replaying a checkpoint --- that was a bogus idea from the start since the variable is only meant to track commit/abort events. This patch reverts the logic around the variable to what it was in 8.4, except that the value is now kept in shared memory rather than a static variable, so that it can be reported correctly by CreateRestartPoint (which is executed in the bgwriter).</li>
<li>Split the LDFLAGS make variable into two parts: LDFLAGS is now used for linking both executables and shared libraries, and we add on LDFLAGS_EX when linking executables or LDFLAGS_SL when linking shared libraries. This provides a significantly cleaner way of dealing with link-time switches than the former behavior. Also, make sure that the various platform-specific %.so: %.o rules incorporate LDFLAGS and LDFLAGS_SL; most of them missed that before. (I did not add these variables for the platforms that invoke $(LD) directly, however. It's not clear if we can do that safely, since for the most part we assume these variables use CC command-line syntax.) Per gripe from Aaron Swenson and subsequent investigation.</li>
<li>Fix a few single-file (MODULES, not MODULE_big) contrib makefiles that were supposing that they should set SHLIB_LINK rather than LDFLAGS_SL. Since these don't go through Makefile.shlib that was a no-op on most platforms. Also regularize the few platform-specific Makefiles that did pay attention to SHLIB_LINK: it seems that the real value of that is to pull in BE_DLLLIBS, so do that instead. Per buildfarm failures on cygwin.</li>
<li>In pgsql/src/makefiles/pgxs.mk, make sure LDFLAGS come before LIBS when linking contrib programs. Solaris, at least, seems to be sensitive to the relative order of -L and -l switches, so this is needed. Per buildfarm results.</li>
<li>In pgsql/src/makefiles/pgxs.mk, dept. of third thoughts: PG_LIBS may contain a -L switch, so it had better stay in front of LDFLAGS.</li>
<li>In pgsql/src/makefiles/Makefile.aix, allow for LDFLAGS_SL already having a value in Makefile.aix. Per buildfarm results.</li>
<li>In pgsql/src/Makefile.shlib, still more third thoughts: when linking shared libraries, LDFLAGS probably needs to appear before anything placed in SHLIB_LINK. This is because SHLIB_LINK is typically a subset of LIBS, and LIBS has to appear after LDFLAGS on platforms that are sensitive to the relative order of -L and -l switches.</li>
<li>In pgsql/src/backend/utils/mb/mbutils.c, undo pgindent breakage (again). Per buildfarm.</li>
<li>In pgsql/src/Makefile.global.in, accept slightly grotty coding in Makefile.global in order to keep the -L flag for src/port/ in front of any -L flags placed in LDFLAGS by configure. This undoes an L-flag-ordering change that I had thought would be safe, but seems to be making at least one buildfarm member fail --- the only theory for orca's failure that I can think of is that it's got an old copy of libpgport.a in /usr/lib. Also allow for LDFLAGS_SL to be set by contrib makefiles before they invoke Makefile.global.</li>
<li>In pgsql/src/backend/utils/mb/mbutils.c, adjust mbutils.c so it won't get broken by future pgindent runs. To do that, replace L'\0' by (WCHAR) 0. Perhaps someday we should teach pgindent about wide-character literals, but so long as this is the only use-case in the entire Postgres sources, a workaround seems easier.</li>
<li>Fix "cannot handle unplanned sub-select" error that can occur when a sub-select contains a join alias reference that expands into an expression containing another sub-select. Per yesterday's report from Merlin Moncure and subsequent off-list investigation. Back-patch to 7.4. Older versions didn't attempt to flatten sub-selects in ways that would trigger this problem.</li>
<li>Fix variant float8 expected files to have exactly the expected spacing. This wasn't important when we used diff's -w (--ignore-all-space) option to compare regression result files, but it is now. Per buildfarm member canary, which evidently has been offline since we did that in November, but came to life again today.</li>
<li>In pgsql/src/backend/access/transam/xlogutils.c, update obsolete comment. Noted by Josh Tolley.</li>
<li>In pgsql/doc/src/sgml/ref/create_operator.sgml, add a cross-reference to precedence information to CREATE OPERATOR's documentation. Per suggestion from Marc Cousin.</li>
<li>In pgsql/src/pl/plpython/plpython.c, minor kibitzing on previous patch from Peter Eisentraut which guards against using PL/PythonU2 and PL/PythonU3 in the same session: no need to run check more than once. (_PG_init should be called only once anyway, but as long as it's got an internal guard against repeat calls, that should be in front of the version check.)</li>
<li>Stamp HEAD as 9.1devel. (And there was much rejoicing.)</li>
<li>In pgsql/src/backend/utils/adt/ruleutils.c, fix ruleutils' get_variable() to print something useful for Vars referencing resjunk outputs of subquery tlists, instead of throwing an error. Per bug #5548 from Daniel Grace. We might at some point find we ought to back-patch this further than 9.0, but I think that such Vars can only occur as resjunk members of upper-level tlists, in which case the problem can't arise because prior versions didn't print resjunk tlist items in EXPLAIN VERBOSE.</li>
<li>In pgsql/src/backend/utils/cache/lsyscache.c, avoid an Assert failure in deconstruct_array() by making get_attstatsslot() use the actual element type of the array it's disassembling, rather than trusting the type OID passed in by its caller. This is needed because sometimes the planner passes in a type OID that's only binary-compatible with the target column's type, rather than being an exact match. Per an example from Bernd Helmle. Possibly we should refactor get_attstatsslot/free_attstatsslot to not expect the caller to supply type ID data at all, but for now I'll just do the minimum-change fix. Back-patch to 7.4. Bernd's test case only crashes back to 8.0, but since these subroutines are the same in 7.4, I suspect there may be variant cases that would crash 7.4 as well.</li>
<li>In pgsql/doc/src/sgml/sources.sgml, add a note about preferred window width to the section about code formatting conventions.</li>
</ul>
<p>Bruce Momjian a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/doc/src/sgml/high-availability.sgml, remove tab from SGML.</li>
<li>Add new Non-Durable Settings documentation section. Document that synchronous_commit can lose transactions in a db crash, not just a OS crash.</li>
<li>Fix doc double-wording in non-durable patch. Report from Thom Brown.</li>
<li>In pgsql/src/backend/access/transam/xact.c, add C comment about why synchronous_commit=off behavior can lose committed transactions in a postmaster crash.</li>
<li>In pgsql/doc/src/sgml/config.sgml, document that shared_preload_libraries and local_preload_libraries lowercase the library names, unless double-quoted.</li>
<li>In documentation, use "lower case"/"upper case" consistently (use space between words).</li>
<li>In pgsql/doc/src/sgml/config.sgml, document that /bin/true on Windows is implemented by 'REM'.</li>
<li>In pgsql/doc/src/sgml/release-9.0.sgml, update 9.0 release notes so streaming replication and hot standby is not assumed to require continuous archiving. Per report from Fujii Masao.</li>
<li>In pgsql/contrib/pg_upgrade/pg_upgrade.h, remove port.h prototypes from pg_upgrade.h, per report from Robert Haas.</li>
<li>In pgsql/src/backend/commands/tablespace.c, issue 'mkdir' hint when replying CREATE TABLESPACE in recovery mode. Per idea from Fujii Masao.</li>
<li>Add CVS tags to pg_upgrade and pg_upgrade_support files, per request from Tom Lane.</li>
<li>Add copyrights to pg_upgrade and pg_upgrade_tools files, per Tom Lane.</li>
<li>Make pg_upgrade copyrights just 2010, not 2010-2010.</li>
<li>In pgsql/doc/src/sgml/func.sgml, document more clearly on XML namespaces inside xpath function. Nikolay Samokhvalov.</li>
<li>In pgsql/doc/src/sgml/config.sgml, remove SGML tab.</li>
<li>In pgsql/src/tools/fsync/test_fsync.c, report test_fynsc times in tests per second, instead of total seconds.</li>
<li>In pgsql/src/tools/fsync/test_fsync.c, simplify test_fsync duration computation.</li>
<li>Update pgindent testing instructions.</li>
<li>pgindent run for 9.0, second run.</li>
<li>In pgsql/src/tools/pgindent/README, mention why one C file fails pgindent.</li>
<li>In pgsql/doc/src/sgml/wal.sgml, document the interaction of write-barrier-enabled file systems, and BBU caches, per June email thread.</li>
<li>In pgsql/doc/src/sgml/wal.sgml, doc change: effected -&gt; affected, per correction from Matthew Wakeling.</li>
<li>In pgsql/doc/src/sgml/release-9.0.sgml, update release notes for 9.0 beta 3.</li>
<li>Properly report errno/out-of-disk-space error from pg_upgrade when in copy mode, per report from [email protected]. Patch suggestion from Magnus. Backpatch to 9.0.X.</li>
</ul>
<p>Peter Eisentraut a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/doc/src/sgml/sources.sgml, add guidelines for formatting errcontext strings</li>
<li>In pgsql/doc/src/sgml/datatype.sgml, add note clarifying that XML fragments don't accept DTDs, per complaint from Craig Ringer.</li>
<li>Use different function names for plpython3 handlers, to avoid clashes in pg_pltemplate. This should have a catversion bump, but it's still being debated whether it's worth it during beta.</li>
<li>Message tuning.</li>
<li>In pgsql/doc/src/sgml/plpython.sgml, add note that using PL/Python 2 and 3 in the same session will probably crash.</li>
<li>Install safeguard against running PL/Python 2 and 3 in the same session.</li>
<li>Translation updates for 9.0beta3.</li>
<li>In pgsql/doc/src/sgml/plperl.sgml, some small changes: wrapped long code-lines for pdf, fix typo. Erik Rijkers</li>
</ul>
<p>Robert Haas a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/src/backend/access/transam/xlog.c, emode_for_corrupt_record shouldn't reduce LOG messages to WARNING. In non-interactive sessions, WARNING sorts below LOG.</li>
<li>In pgsql/src/backend/commands/tablecmds.c, allow ALTER TABLE .. SET TABLESPACE to be interrupted. Backpatch to 8.0, where tablespaces were introduced. Guillaume Lelarge</li>
<li>In pgsql/src/port/copydir.c, allow copydir() to be interrupted. This makes ALTER DATABASE .. SET TABLESPACE and CREATE DATABASE more sensitive to interrupts. Backpatch to 8.4, where ALTER DATABASE .. SET TABLESPACE was introduced. We could go back further, but in the absence of complaints about the CREATE DATABASE case it doesn't seem worth it. Guillaume Lelarge, with a small correction by me.</li>
<li>Move copydir.c from src/port to src/backend/storage/file. The previous commit to make copydir() interruptible prevented postgres.exe from linking on MinGW and Cygwin, because on those platforms libpgport_srv.a can't freely reference symbols defined by the backend. Since that code is already backend-specific anyway, just move the whole file into the backend rather than adding further kludges to deal with the symbols needed by CHECK_FOR_INTERRUPTS(). This probably needs some further cleanup, but this commit just moves the file as-is, which should hopefully be enough to turn the buildfarm green again.</li>
<li>Remove hstore % text[] operator; use slice() function instead. David Wheeler, with one small correction by me.</li>
<li>Additional cross-references to window functions documentation. Erik Rijkers.</li>
<li>Allow REASSIGNED OWNED to handle opclasses and opfamilies. Backpatch to 8.3, which is as far back as we have opfamilies. The opclass portion could probably be backpatched to 8.2, when REASSIGN OWNED was added, but for now I have not done that. Asko Tiidumaa, with minor adjustments by me.</li>
<li>Support setting the keepalive idle time on MacOS X. MacOS X uses TCP_KEEPALIVE rather than TCP_KEEPIDLE for this purpose. Thanks to Fujii Masao for the review.</li>
<li>Make log_temp_files based on kB, and revert docs &amp; comments to match. Per extensive discussion on pgsql-hackers. We are deliberately not back-patching this even though the behavior of 8.3 and 8.4 is unquestionably broken, for fear of breaking existing users of this parameter. This incompatibility should be release-noted.</li>
<li>Add a hook in ExecCheckRTPerms(). This hook allows a loadable module to gain control when table permissions are checked. It is expected to be used by an eventual SE-PostgreSQL implementation, but there are other possible applications as well. A sample contrib module can be found in the archives at:
<a target="_blank" href="http://archives.postgresql.org/pgsql-hackers/2010-05/msg01095.php">http://archives.postgresql.org/pgsql-hackers/2010-05/msg01095.php</a> Robert Haas and Stephen Frost.</li>
<li>In pgsql/doc/src/sgml/ref/psql-ref.sgml, clarify that "psql -c" ignores psqlrc files. Tim Landscheidt</li>
</ul>
<p>Andrew Dunstan a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/doc/src/sgml/release-9.0.sgml, correct missing/misspelled surname.</li>
<li>In pgsql/src/tools/msvc/Mkvcbuild.pm, unbreak MSVC builds by removing copydir.c from list of libpgport files</li>
</ul>
<p>Heikki Linnakangas a commit&eacute;&nbsp;:</p>
<ul>
<li>stringToNode() and deparse_expression_pretty() crash on invalid input, but we have nevertheless exposed them to users via pg_get_expr(). It would be too much maintenance effort to rigorously check the input, so put a hack in place instead to restrict pg_get_expr() so that the argument must come from one of the system catalog columns known to contain valid expressions. Per report from Rushabh Lathia. Backpatch to 7.4 which is the oldest supported version at the moment.</li>
<li>The previous fix in CVS HEAD and 8.4 for handling the case where a cursor being used in a PL/pgSQL FOR loop is closed was inadequate, as Tom Lane pointed out. The bug affects FOR statement variants too, because you can close an implicitly created cursor too by guessing the "&lt;unnamed portal X&gt;" name created for it. To fix that, "pin" the portal to prevent it from being dropped while it's being used in a PL/pgSQL FOR loop. Backpatch all the way to 7.4 which is the oldest supported version.</li>
</ul>
<p>Magnus Hagander a commit&eacute;&nbsp;:</p>
<ul>
<li>Add support for TCP keepalives on Windows, both for backend and the new libpq support.</li>
<li>Make the Windows tcp keepalive support depend on the existance of the SIO_KEEPALIVE_VALS define instead of just WIN32, since MingW doesn't support this API (yet?).</li>
</ul>
<p>Marc Fournier a commit&eacute;&nbsp;:</p>
<ul>
<li>tag beta3</li>
</ul>
<p><strong>Correctifs rejet&eacute;s (&agrave; ce jour)</strong></p>
<ul>
<li>Pas de d&eacute;ception cette semaine&nbsp;:-)</li>
</ul>
<p><strong>Correctifs en attente</strong></p>
<ul>
<li>Robert Haas sent in another revision of the patch to suppress automatic recovery after backend crash. This is for a volatile caching version of PostgreSQL.</li>
<li>Robert Haas sent in another revision of the patch to add get_whatever_oid functionality.</li>
<li>Magnus Hagander sent in two revisions of a patch to fix keepalives on Win32.</li>
<li>Robert Haas sent in a patch to implmenet a warning message in pg_standby.</li>
<li>Mike Fowler sent in another revision of the xpath_exists patch.</li>
<li>Peter Eisentraut sent in another revision of the patch to allow server authentication over Unix-domain sockets.</li>
<li>Mike Fowler sent in another revision of patch to add XMLEXISTS to the grammar.</li>
<li>Robert Haas sent in two revisions of a patch to fix keepalives on OSX.</li>
<li>Bruce Momjian sent in a patch to show a hint only in recovery after a crash of Hot Standby/Streaming Replication.</li>
<li>Fujii Masao sent in an updated patch to fix the docs re: checkpoint_segments and keep_wal_segments for Hot Standby/Streaming Replication.</li>
<li>Martin Pihlak sent in two revisions of a patch to add a GUC log_file_mode which allows specifying the creation mode for log files. This would enable, for example, permitting readers other than the system PostgreSQL user to read the log files PostgreSQL generates.</li>
<li>Teodor Sigaev sent in a patch to implement more accurate cost estimation function for GIN index scans.</li>
<li>Markus Shiltknecht sent in a patch to add a lock-based dynamic shared memory allocator, which lets components delay memory allocation rather than allocate all needed memory in advance.</li>
<li>Pavel Stehule sent in a patch to add parameters to DO statements.</li>
<li>Robert Haas sent in three more revisions of a patch to implement get_whatever_oid, a refactoring which to a large extent centralizes get_*_oid logic.</li>
<li>Robert Haas sent in a patch to fix log_temp_files docs and comments to say kilobytes rather than bytes.</li>
<li>Greg Smith sent in another revision of the patch to make pgbench more 64-bit-clean.</li>
<li>ITAGAKI Takahiro sent in another revision of the patch to help make CLUSTER behave better.</li>
<li>Mike Fowler sent in two more revisions of a patch to add an xml_is_well_formed function.</li>
<li>Rajanikant Chirmade sent in a patch to make downcase_truncate_identifier() multibyte-character-aware.</li>
<li>Pavel Stehule sent in two more revisions of the string functions for 9.1.</li>
<li>Robert Haas sent in another revision of the patch to include the backend ID in relpath of temp rels.</li>
<li>Pavel Baros sent in another revision of the patch to add materialized views.</li>
<li>Kevin Grittner sent in another revision of the patch to implement predicate locking, in part a prerequisite for better serialization.</li>
<li>Robert Haas sent in a patch to slim down the representation of numerics by about two bytes.</li>
<li>Zhai Boxuan sent in a patch to implement a MERGE command.</li>
<li>Erik Rijkers sent in a patch to fix the contrib makefile to include the stringfunc patch.</li>
</ul></description>
<pubDate>dim, 18 jui 2010 00:18:19 +0000</pubDate>
</item>
<item>
<title>Guillaume Lelarge: GIT, cette nouvelle mode</title>
<guid>urn:md5:a9b60f6e56880b30de60d1052c365938</guid>
<link>http://blog.guillaume.lelarge.info/index.php/post/2010/07/15/GIT%2C-cette-nouvelle-mode</link>
<description><p>Donc <a href="http://www.postgresql.org" hreflang="en">PostgreSQL</a> passe à git mi-août. Du coup, un peu tout le monde y passe. <a href="http://www.pgadmin.org" hreflang="en">pgAdmin</a> commence son passage ce soir (avec le <a href="http://git.postgresql.org/gitweb?p=pgagent.git;a=summary" hreflang="en">dépôt pgagent</a> par exemple). <a href="http://slony.info/" hreflang="en">Slony</a> se pose officiellement la question. Quant aux dépôts de PostgreSQLfr, ils y sont passés depuis un mois en gros.</p>
<p>Je trouve ça plutôt bien. Ça uniformise les dépôts sur un système véritablement excellent. Pour une fois qu'on uniformise vers le haut, on ne va pas se plaindre <img src="http://blog.guillaume.lelarge.info/themes/default/smilies/smile.png" alt=":)" class="smiley" /></p></description>
<pubDate>jeu, 15 jui 2010 21:09:00 +0000</pubDate>
</item>
<item>
<title>Guillaume Lelarge: Manuel 9.0 beta 3 disponible</title>
<guid>urn:md5:39aa5b64041b529fc46cec6b36343f8d</guid>
<link>http://blog.guillaume.lelarge.info/index.php/post/2010/07/15/Manuel-9.0-beta-3-disponible</link>
<description><p>Et non, pas de vacances pour moi pour l'instant. Les deux semaines d'inactivité sur ce blog ont une raison : la mise à jour de la traduction du manuel en beta3, mais aussi et surtout du travail sur pgAdmin (dont je parlerais plus tard, certainement en fin de semaine).</p>
<p>Bref. Tout ça pour dire que la traduction française du manuel de PostgreSQL 9.0 beta 3 est disponible. Normalement, tout est traduit. Peut-être mal, il va falloir que je fasse une passe importante de relecture. En attendant, un <a href="http://docs.postgresql.fr/9.0/" hreflang="fr">lien pour consulter la doc en ligne</a> et un <a href="http://docs.postgresql.fr/9.0/pg90.pdf" hreflang="fr">lien pour récupérer le PDF</a>.</p>
<p>Merci de me rapporter tout soucis constaté dans la traduction.</p>
<p>Update: correction du lien vers le PDF. Merci à &quot;Fly&quot;.</p></description>
<pubDate>jeu, 15 jui 2010 11:27:00 +0000</pubDate>
</item>
<item>
<title>Actualités PostgreSQL.fr: Sortie de la verion beta 3 de PostgreSQL 9.0</title>
<guid>urn:md5:e04ea2674d51729f6a4e4f831c7c961c</guid>
<link>http://blog.postgresql.fr/index.php?post/2010/07/13/Sortie-de-la-verion-beta-3-de-PostgreSQL-9.0</link>
<description><p>La 3ème version beta de PostgreSQL 9.0 est désormais disponible. Cette version contient de nombreuses corrections et plusieurs changements par rapport à la Beta 2, notamment un dépoussiérage final de la Streaming Replication et du Hot Standby. N'hésitez pas à télécharger, installer et tester cette version pour aider les développeurs à avancer vers la version finale. Plusieurs changement significatifs ont été introduit dans la Beta3, ce qui implique que certaines fonctionnalités doivent être re-testées, notamment&nbsp;:</p>
<pre> * Corrections du hot standby
* Correction de la gestion des tableaux en plpython
* Plusieurs corrections pour dblink
* Support du TCP keepalive dans libpq
* Correction du comportement de checkSeek() sur les platformes anciennes</pre>
<p>Notez que suite à un changement du catalogue système, un initdb et un reload sont nécessaires pour mettre à jour depuis la version 9.0Beta1. C'est une belle opportunité pour tester pg_upgrade à partir de la version Beta2 ou antérieure.</p>
<p>Si vous avez la possibilité de réaliser des tests, rendez-vous sur<a href="http://www.postgresql.org/developer/beta" hreflang="en"> la page dédiée aux tests de la version beta</a></p>
<p>Nous rappelons que les versions beta ne sont pas stables et qu'elles ne doivent pas être utilisées en production. Elles sont uniquement destinées aux tests. D'autres versions beta et des versions candidates seront produites dans les semaines à venir…</p>
<ul>
<li>L'annonce officielle&nbsp;: <a href="http://www.postgresql.org/about/news.1220" hreflang="en">http://www.postgresql.org/about/news.1220</a></li>
<li>Lien de téléchargement&nbsp;: <a href="http://www.postgresql.org/ftp/source/v9.0beta3/" hreflang="en">http://www.postgresql.org/ftp/source/v9.0beta3/</a></li>
</ul></description>
<pubDate>mar, 13 jui 2010 07:18:34 +0000</pubDate>
</item>
<item>
<title>Guillaume Lelarge: Comment un problème constaté chez un client peut se transformer en un nouveau patch pour PostgreSQL</title>
<guid>urn:md5:7efeba317cd06eb9b075c01aacc5e0a4</guid>
<link>http://blog.guillaume.lelarge.info/index.php/post/2010/07/03/Comment-un-probl%C3%A8me-constat%C3%A9-chez-un-client-peut-se-transformer-en-un-nouveau-patch-pour-PostgreSQL</link>
<description><p>Mardi dernier, un client en support <a href="http://www.dalibo.com" hreflang="fr">nous</a> appelle à cause d'un problème d'espace disque. Il est en version 8.2. Il dispose de place libre sur d'autres partitions. Rien de plus simple. Il suffit de créer un tablespace sur une des partitions où il reste suffisamment d'espace et d'y déplacer quelques objets pour faire de la place sur le répertoire principal des données. Tout se passe bien : création du répertoire, ajout du tablespace (avec <a href="http://docs.postgresql.fr/current/sql-createtablespace.html" hreflang="fr">CREATE TABLESPACE</a>), choix de la table à déplacer, et déplacement de la table (avec un <a href="http://docs.postgresql.fr/current/sql-altertable.html" hreflang="fr">ALTER TABLE</a>). Malheureusement, l'opération prends du temps, beaucoup de temps. Et les performances du serveur ont commencé à en pâtir. Le client a voulu interrompre l'opération, quitte à la reprendre plus tard. Pas de soucis, un simple Ctrl-C doit suffire. Et bien non, Ctrl-C et pg_cancel_backend() nous indiquaient bien que la demande d'annulation avait été envoyée mais les opérations sur le disque continuaient et psql ne nous rendait pas la main. Nous avons donc été forcés d'attendre la fin de l'opération.</p>
<p>Pendant ce temps, j'ai commencé à tester sur mon portable et a fouillé dans le code. Et j'ai fini par me rendre compte que rien ne permettait une prise en compte du signal pendant la copie. Autrement dit, vous lancez un changement de tablespace pour la table X de 50 Go, vous essayez de l'annuler au tout début, il vous faudra quand même attendre la fin de la copie des 50 Go pour que votre demande d'annulation soit prise en compte. Très dommageable. Il faut corriger ça. Tout le code se trouve dans la fonction <code>copy_relation_data</code> du fichier <code>src/backend/commands/tablecmds.c</code>. Une boucle s'occupe de la copie :</p>
<pre> for (blkno = 0; blkno &lt; nblocks; blkno++)
{
smgrread(src, forkNum, blkno, buf);
/* XLOG stuff */
if (use_wal)
log_newpage(&amp;dst-&gt;smgr_rnode, forkNum, blkno, page);
/*
* Now write the page. We say isTemp = true even if it's not a temp
* rel, because there's no need for smgr to schedule an fsync for this
* write; we'll do it ourselves below.
*/
smgrextend(dst, forkNum, blkno, buf, true);
}</pre>
<p>Autrement dit, on lit chaque bloc du fichier source, que l'on copie dans le fichier destination. Une bête copie bloc par bloc, avec aucun moyen de l'interrompre.</p>
<p>De mes lectures dans <a href="http://archives.postgresql.org/pgsql-hackers/" hreflang="en">pgsql-hackers</a>, je me rappelais qu'il existe une fonction appelée CHECK_FOR_INTERRUPTS faisant exactement le travail dont j'avais besoin. J'ai donc uniquement ajouté un appel à cette fonction au début de la boucle, ce qui donne au final :</p>
<pre> for (blkno = 0; blkno &lt; nblocks; blkno++)
{
/* If we got a cancel signal during the copy of the data, quit */
CHECK_FOR_INTERRUPTS();
smgrread(src, forkNum, blkno, buf);
/* XLOG stuff */
if (use_wal)
log_newpage(&amp;dst-&gt;smgr_rnode, forkNum, blkno, page);
/*
* Now write the page. We say isTemp = true even if it's not a temp
* rel, because there's no need for smgr to schedule an fsync for this
* write; we'll do it ourselves below.
*/
smgrextend(dst, forkNum, blkno, buf, true);
}</pre>
<p>Une compilation et quelques tests après, je me suis aperçu que tout fonctionnait comme je le souhaitais. L'annulation se fait exactement au moment où je la demande.</p>
<p>J'ai corrigé aussi le déplacement d'une base de données. Le patch terminé, je l'ai envoyé sur pgsql-hackers pour qu'il puisse être testé, relu et enfin commité. Je l'ai même <a href="https://commitfest.postgresql.org/action/patch_view?id=331" hreflang="en">saisi sur le site commitfest</a>. Robert Haas s'en est occupé et l'a finalement commité vendredi sur toutes les versions, de la 8.0 (version à laquelle les tablespaces ont été ajoutées) à la future 9.0.</p></description>
<pubDate>sam, 03 jui 2010 09:45:00 +0000</pubDate>
</item>
<item>
<title>Actualités PostgreSQL.fr: Nouvelles hebdomadaires de PostgreSQL - 27 juin 2010</title>
<guid>urn:md5:abb35a5dfb22b0ff75494218045f5b23</guid>
<link>http://blog.postgresql.fr/index.php?post/2010/07/02/Nouvelles-hebdomadaires-de-PostgreSQL-27-juin-2010</link>
<description><p>PostgreSQL est &agrave; la recherche de citations/t&eacute;moignages pour la publication de la version 9.0. Si vous attendez avec impatience une ou plusieurs des fonctionnalit&eacute;s de la 9.0, et que vous repr&eacute;sentez une entreprise ou une organisation gouvernementale ou non, envoyez-nous s'il vous plait votre participation &agrave; [email protected].</p>
<p>PGXN, le "PostgreSQL Extension Network", inspir&eacute; du CPAN, a &eacute;t&eacute; lanc&eacute;&nbsp;:
<a target="_blank" href="http://www.pgxn.org/">http://www.pgxn.org/</a></p>
<p><strong>Les nouveaut&eacute;s des produits d&eacute;riv&eacute;s</strong></p>
<ul>
<li>Slony-I 2.0.4, un syst&egrave;me de r&eacute;plication-en-cascade-ma&icirc;tre-&agrave;-multiples-esclaves pour PostgreSQL&nbsp;:
<a target="_blank" href="http://www.slony.info/">http://www.slony.info/</a></li>
<li>Benetl 3.5, un outil d'ETL pour PostgreSQL, sp&eacute;cialis&eacute; dans les fichiers&nbsp;:
<a target="_blank" href="http://www.benetl.net">http://www.benetl.net</a></li>
<li>Muldis-D 0.130.0, une sp&eacute;cification pour un langage objet-relationnel pr&eacute;vu pour utiliser, entre autres syst&egrave;mes, PostgreSQL&nbsp;:
<a target="_blank" href="http://muldis.com/Muldis_D.html">http://muldis.com/Muldis_D.html</a></li>
</ul>
<p><strong>Offres d'emplois autour de PostgreSQL en juin</strong></p>
<ul>
<li>Internationales&nbsp;:
<a target="_blank" href="http://archives.postgresql.org/pgsql-jobs/2010-06/threads.php">http://archives.postgresql.org/pgsql-jobs/2010-06/threads.php</a>;</li>
<li>Francophones&nbsp;:
<a target="_blank" href="http://forums.postgresql.fr/viewforum.php?id=4">http://forums.postgresql.fr/viewforum.php?id=4</a>.</li>
</ul>
<p><strong>PostgreSQL Local</strong></p>
<ul>
<li>CHAR(10), la conf&eacute;rence PostgreSQL d&eacute;di&eacute;e au clustering, &agrave; la haute-disponibilit&eacute; et &agrave; la r&eacute;plication vient d'ouvrir les inscriptions en ligne et les r&eacute;servations. 2 &amp; 3 juillet 2010, Oriel College, Universit&eacute; d'Oxford (Royaume-Uni)&nbsp;:
<a target="_blank" href="http://www.char10.org/">http://www.char10.org/</a></li>
<li>Le PDXPUG Day est programm&eacute; pour le 18 juillet 2010 &agrave; "l'Oregon Convention Center" &agrave; Portland. D'avantage d'informations&nbsp;:
<a target="_blank" href="http://wiki.postgresql.org/wiki/PDXPUGDay2010">http://wiki.postgresql.org/wiki/PDXPUGDay2010</a></li>
<li>L'OSCON aura lieu &agrave; Portland (Oregon) du 19 au 23 juillet 2010&nbsp;:
<a target="_blank" href="http://www.oscon.com/oscon2010">http://www.oscon.com/oscon2010</a></li>
<li>La FrOSCon 2010 aura lieu &agrave; St. Augustin, Allemagne les 21 &amp; 22 ao&ucirc;t 2010. Le PUG allemand a obtenu sa propre salle de dev. et est &agrave; la recherche de conf&eacute;renciers. Plus de d&eacute;tails&nbsp;:
<a target="_blank" href="http://andreas.scherbaum.la/blog/archives/711-FrOSCon-2010-PostgreSQL-devroom-Call-for-papers.html">http://andreas.scherbaum.la/blog/archives/711-FrOSCon-2010-PostgreSQL-devroom-Call-for-papers.html</a></li>
</ul>
<p><strong>PostgreSQL dans les m&eacute;dia</strong></p>
<ul>
<li>Planet PostgreSQL&nbsp;:
<a target="_blank" href="http://planet.postgresql.org/">http://planet.postgresql.org/</a></li>
<li>Planet PostgreSQLFr&nbsp;:
<a target="_blank" href="http://planete.postgresql.fr/">http://planete.postgresql.fr/</a></li>
</ul>
<p><i>PostgreSQL Weekly News / les nouvelles hebdomadaires vous sont offertes cette semaine par David Fetter. Traduction par l'&eacute;quipe PostgreSQLFr sous licence CC BY-NC-SA.</i></p>
<p><i>Proposez vos articles ou annonces avant dimanche 15:00 (heure du Pacifique). Merci de les envoyer en anglais &agrave; david (a) fetter.org, en allemand &agrave; pwn (a) pgug.de, en italien &agrave; pwn (a) itpug.org et en espagnol &agrave; pwn (a) arpug.com.ar.</i></p>
<p>(<a target="_blank" href="http://www.postgresql.org/community/weeklynews/pwn20100627">lien vers l'article original</a>)</p> <p><strong>Correctifs appliqu&eacute;s</strong></p>
<p>Heikki Linnakangas a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/src/pl/plpgsql/src/pl_exec.c, in a PL/pgSQL "FOR cursor" statement, the statements executed in the loop might close the cursor, rendering the Portal pointer to it invalid. Closing the cursor in the middle of the loop is not a very sensible thing to do, but we must handle it gracefully and throw an error instead of crashing.</li>
</ul>
<p>Robert Haas a commit&eacute;&nbsp;:</p>
<ul>
<li>Minor markup improvements for Hot Standby documentation.</li>
<li>Deprecate the use of =&gt; as an operator name. In HEAD, emit a warning when an operator named =&gt; is defined. In both HEAD and the backbranches (except in 8.2, where contrib modules do not have documentation), document that hstore's text =&gt; text operator may be removed in a future release, and encourage the use of the hstore(text, text) function instead. This function only exists in HEAD (previously, it was called tconvert), so backpatch it back to 8.2, when hstore was added. Per discussion.</li>
<li>In pgsql/contrib/hstore/expected/hstore.out, updated expected-output file for hstore. This is an oversight in my previous patch to deprecate =&gt; as an operator name. Per buildfarm.</li>
<li>Add TCP keepalive support to libpq. This adds four additional connection parameters to libpq: keepalives, keepalives_idle, keepalives_count, and keepalives_interval. keepalives default to on, per discussion, but can be turned off by specifying keepalives=0. The remaining parameters, where supported, can be used to adjust how often keepalives are sent and how many can be lost before the connection is broken. The immediate motivation for this patch is to make sure that walreceiver will eventually notice if the master reboots without closing the connection cleanly, but it should be helpful in other cases as well. Tollef Fog Heen, Fujii Masao, and me.</li>
<li>In pgsql/src/backend/postmaster/postmaster.c, add stray "else" that seems to have gone missing.</li>
<li>In pgsql/doc/src/sgml/release-9.0.sgml, further 9.0 release notes updates. Josh Berkus.</li>
<li>In pgsql/doc/src/sgml/high-availability.sgml, some copy-editing of the Hot Standby documentation. Thanks to Joshua Tolley for the review.</li>
<li>In pgsql/doc/src/sgml/installation.sgml, make AIX suggestions about disabling ipv6 more version-sensitive. Chris Browne, based on a report from John Pierce.</li>
<li>In pgsql/doc/src/sgml/libpq.sgml, rewrite docs for new libpq keepalive parameters. The revised documentation makes it more clear that these are client-side parameters, rather than server side parameters. It also puts the main point of each parameter first, and consolidates the conditions under which it might be ignored in a single list at the end.</li>
</ul>
<p>Bruce Momjian a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/doc/src/sgml/ref/pg_ctl-ref.sgml, update pg_ctl docs to explain server output behavior differences on win32 and non-win32 platforms.</li>
<li>Fix pg_upgrade's use of pg_ctl on Win32 to not send command and sever output to the same file, because it is impossible. Also set user name for pg_dumpall in pg_upgrade.</li>
<li>Add username designations to all pg_upgrade utility calls that support it.</li>
<li>In pgsql/doc/src/sgml/ref/alter_table.sgml, mention that when alter rewrites a table, indexes are also rebuilt.</li>
</ul>
<p>Simon Riggs a commit&eacute;&nbsp;:</p>
<ul>
<li>Fix log_temp_files docs and comments to say bytes not kilobytes. stat(2) field st_size returns bytes not kilobytes. Bug found during recent performance tuning for PostgreSQL user.</li>
</ul>
<p>Tom Lane a commit&eacute;&nbsp;:</p>
<ul>
<li>Fix thinko in tok_is_keyword(): it was looking at the wrong union variant of YYSTYPE, and hence returning the wrong answer for cases where a plpgsql "unreserved keyword" really does conflict with a variable name. Obviously I didn't test this enough :-(. Per bug #5524 from Peter Gagarinov.</li>
<li>In pgsql/src/bin/pg_dump/pg_backup_custom.c, fix pg_restore so parallel restore doesn't fail when the input file doesn't contain data offsets (which it won't, if pg_dump thought its output wasn't seekable). To do that, remove an unnecessarily aggressive error check, and instead fail if we get to the end of the archive without finding the desired data item. Also improve the error message to be more specific about the cause of the problem. Per discussion of recent report from Igor Neyman. Back-patch to 8.4 where parallel restore was introduced.</li>
</ul>
<p><strong>Correctifs rejet&eacute;s (&agrave; ce jour)</strong></p>
<ul>
<li>Pas de d&eacute;ception cette semaine&nbsp;:-)</li>
</ul>
<p><strong>Correctifs en attente</strong></p>
<ul>
<li>Guillaume Lelarge sent in a patch to add a CHECK_FOR_INTERRUPTS call to the copy_relation_data(), copy_dir(), and copy_file() functions, which fixes an issue where cancelling ALTER TABLE ... SET TABLESPACE and ALTER DATABASE ... SET TABLESPACE did not work.</li>
<li>Heikki Linnakangas sent in a patch to fix an issue where the server would crash while trying to read an expression using pg_get_expr().</li>
<li>Andrew Dunstan sent in a WIP patch to make ENUMs alterable.</li>
<li>Kevin Grittner sent in a cleaned-up version of the patch to allow dividing money by money.</li>
<li>Peter Eisentraut sent in a patch to make PostgreSQL compile under clang.</li>
<li>Peter Eisentraut sent in another revision of the patch which allows ommission of non-aggregate columns in certain situations in GROUP BY.</li>
<li>Pavel Baros sent in a patch to implement materialized views.</li>
<li>Robert Haas sent in a patch to simplify emode_for_corrupt_record.</li>
<li>Mark Fowler sent in another revision of the patch to add an xpath_exists function.</li>
<li>Mark Fowler sent in another revision of the patch to add XMLEXISTS to the grammar.</li>
<li>Robert Haas sent in a patch to allow suppressing crash recovery after a crash, per discussion on -performance about a volatile version of PostgreSQL.</li>
</ul></description>
<pubDate>jeu, 01 jui 2010 23:31:05 +0000</pubDate>
</item>
<item>
<title>Guillaume Lelarge: Vous voulez connaître les nouveautés de la 9.0 ?</title>
<guid>urn:md5:cbf08b4830e0380339be880d8b9dd88d</guid>
<link>http://blog.guillaume.lelarge.info/index.php/post/2010/06/26/Vous-voulez-conna%C3%AEtre-les-nouveaut%C3%A9s-de-la-9.0</link>
<description><p>Alors allez lire le document rédigé par Marc Cousin. Il existe en <a href="http://blog.postgresql.fr/index.php?post/2010/06/16/Pr%C3%A9sentation-de-la-version-9.0-de-PostgreSQL2" hreflang="fr">version française</a> et en <a href="http://wiki.postgresql.org/wiki/Illustrated_9_0" hreflang="en">version anglaise</a>. <a href="http://archives.postgresql.org/pgsql-advocacy/2010-06/msg00080.php" hreflang="en">Josh Berkus semble l'avoir beaucoup apprécié.</a>. Et avec raison, car ce document est une mine.</p></description>
<pubDate>sam, 26 jun 2010 21:44:00 +0000</pubDate>
</item>
<item>
<title>Actualités PostgreSQL.fr: Nouvelles hebdomadaires de PostgreSQL - 20 juin 2010</title>
<guid>urn:md5:1db97ea6b5df60029af31a4706fe90ad</guid>
<link>http://blog.postgresql.fr/index.php?post/2010/06/25/Nouvelles-hebdomadaires-de-PostgreSQL-20-juin-2010</link>
<description><p><strong>Offres d'emplois autour de PostgreSQL en juin</strong></p>
<ul>
<li>Internationales&nbsp;:
<a target="_blank" href="http://archives.postgresql.org/pgsql-jobs/2010-06/threads.php">http://archives.postgresql.org/pgsql-jobs/2010-06/threads.php</a>;</li>
<li>Francophones&nbsp;:
<a target="_blank" href="http://forums.postgresql.fr/viewforum.php?id=4">http://forums.postgresql.fr/viewforum.php?id=4</a>.</li>
</ul>
<p><strong>PostgreSQL Local</strong></p>
<ul>
<li>Conf&eacute;rence de Michael Renner au Netways OSDC &agrave; Nuremberg (All.) les 23 &amp; 24 juin 2010&nbsp;:
<a target="_blank" href="http://www.netways.de/osdc/y2010/programm/">http://www.netways.de/osdc/y2010/programm/</a></li>
<li>CHAR(10), la conf&eacute;rence PostgreSQL d&eacute;di&eacute;e au clustering, &agrave; la haute-disponibilit&eacute; et &agrave; la r&eacute;plication vient d'ouvrir les inscriptions en ligne et les r&eacute;servations. 2 &amp; 3 juillet 2010, Oriel College, Universit&eacute; d'Oxford (Royaume-Uni)&nbsp;:
<a target="_blank" href="http://www.char10.org/">http://www.char10.org/</a></li>
<li>Le PDXPUG Day est programm&eacute; pour le 18 juillet 2010 &agrave; "l'Oregon Convention Center" &agrave; Portland. D'avantage d'informations&nbsp;:
<a target="_blank" href="http://wiki.postgresql.org/wiki/PDXPUGDay2010">http://wiki.postgresql.org/wiki/PDXPUGDay2010</a></li>
<li>L'OSCON aura lieu &agrave; Portland (Oregon) du 19 au 23 juillet 2010&nbsp;:
<a target="_blank" href="http://www.oscon.com/oscon2010">http://www.oscon.com/oscon2010</a></li>
</ul>
<p><strong>PostgreSQL dans les m&eacute;dia</strong></p>
<ul>
<li>Planet PostgreSQL&nbsp;:
<a target="_blank" href="http://planet.postgresql.org/">http://planet.postgresql.org/</a></li>
<li>Planet PostgreSQLFr&nbsp;:
<a target="_blank" href="http://planete.postgresql.fr/">http://planete.postgresql.fr/</a></li>
</ul>
<p><i>PostgreSQL Weekly News / les nouvelles hebdomadaires vous sont offertes cette semaine par David Fetter. Traduction par l'&eacute;quipe PostgreSQLFr sous licence CC BY-NC-SA.</i></p>
<p><i>Proposez vos articles ou annonces avant dimanche 15:00 (heure du Pacifique). Merci de les envoyer en anglais &agrave; david (a) fetter.org, en allemand &agrave; pwn (a) pgug.de, en italien &agrave; pwn (a) itpug.org et en espagnol &agrave; pwn (a) arpug.com.ar.</i></p>
<p>(<a target="_blank" href="http://www.postgresql.org/community/weeklynews/pwn20100620">lien vers l'article original</a>)</p> <p><strong>Correctifs appliqu&eacute;s</strong></p>
<p>Heikki Linnakangas a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/src/backend/access/transam/xlog.c, if a corrupt WAL record is received by streaming replication, disconnect and retry. If the record is genuinely corrupt in the master database, there's little hope of recovering, but it's better than simply retrying to apply the corrupt WAL record in a tight loop without even trying to retransmit it, which is what we used to do.</li>
</ul>
<p>ITAGAKI Takahiro a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/src/bin/psql/po/ja.po, fix typo in Japanese translation for psql "Use \d+ to list them."</li>
<li>Add new GUC categories corresponding to sections in docs, and move description for vacuum_defer_cleanup_age to the correct category. Sections in postgresql.conf are also sorted in the same order with docs. Per gripe by Fujii Masao, suggestion by Heikki Linnakangas, and patch by me.</li>
<li>In pgsql/src/include/replication/walsender.h, remove prototype of GetOldestWALSendPointer(), that is marked as NOT_USED.</li>
</ul>
<p>Simon Riggs a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/contrib/Makefile, new contrib module for use as an archive_cleanup_command, or as a standalone utility for removing files from archive.</li>
<li>Files for pg_archivecleanup.</li>
<li>Docs for pg_archivecleanup.</li>
</ul>
<p>Bruce Momjian a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/doc/src/sgml/plperl.sgml, fix doc plperl doc with is -&gt; are change.</li>
<li>Properly define pg_upgrade global variable, per bug report from Chris Ruprecht on Mac (64 bit).</li>
<li>In pgsql/doc/src/sgml/ref/select.sgml, clarify SELECT FOR UPDATE behavior in docs.</li>
<li>In pgsql/contrib/pg_upgrade/option.c, fix storage of getopt() return, should be 'int', for pg_upgrade. Steve Singer.</li>
<li>In pgsql/doc/src/sgml/release-9.0.sgml, 9.0 release notes updates. Josh Berkus</li>
<li>In pgsql/doc/src/sgml/release-9.0.sgml, update doc description for 9.0 release note item: Have SELECT and CREATE TABLE AS return row counts to the client</li>
<li>In pgsql/contrib/pg_upgrade/tablespace.c, fix pg_upgrade to remove malloc(0) call.</li>
</ul>
<p>Tom Lane a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/contrib/dblink/dblink.c, rearrange dblink's dblink_build_sql_insert() and related routines to open and lock the target relation just once per SQL function call. The original coding obtained and released lock several times per call. Aside from saving a not-insignificant number of cycles, this eliminates possible race conditions if someone tries to modify the relation's schema concurrently. Also centralize locking and permission-checking logic. Problem noted while investigating a trouble report from Robert Voinea --- his problem is still to be fixed, though.</li>
<li>Consolidate and improve checking of key-column-attnum arguments for dblink_build_sql_insert() and related functions. In particular, be sure to reject references to dropped and out-of-range column numbers. The numbers are still interpreted as physical column numbers, though, for backward compatibility. This patch replaces Joe Conway's patch of 2010-02-03, which handled only some aspects of the problem.</li>
<li>Fix dblink_build_sql_insert() and related functions to handle dropped columns correctly. In passing, get rid of some dead logic in the underlying get_sql_insert() etc functions --- there is no caller that will pass null value-arrays to them. Per bug report from Robert Voinea.</li>
<li>Change the interpretation of the primary_key_attnums parameter of dblink_build_sql_insert() and related functions. Now the column numbers are treated as logical not physical column numbers. This will provide saner behavior in the presence of dropped columns; furthermore, if we ever get around to allowing rearrangement of logical column ordering, the original definition would become nearly untenable from a usability standpoint. Per recent discussion of dblink's handling of dropped columns. Not back-patched for fear of breaking existing applications.</li>
<li>In pgsql/doc/src/sgml/libpq.sgml, fix typo, init =&gt; int, per KOIZUMI Satoru.</li>
<li>Don't allow walsender to send WAL data until it's been safely fsync'd on the master. Otherwise a subsequent crash could cause the master to lose WAL that has already been applied on the slave, resulting in the slave being out of sync and soon corrupt. Per recent discussion and an example from Robert Haas. Fujii Masao.</li>
<li>In pgsql/doc/src/sgml/ref/copy.sgml, add missing close brackets in old-style COPY syntax diagram. Spotted by Evan Carroll.</li>
<li>In pgsql/contrib/pg_archivecleanup/pg_archivecleanup.c, clean up pg_archivecleanup's error and logging output: put newlines in sane places, make messages follow project's message style guidelines. Also, avoid closedir(NULL). Fujii Masao and Tom Lane</li>
<li>In pgsql/src/backend/access/transam/xlog.c, make RemoveOldXlogFiles's debug printout match style used elsewhere: log and seg aren't an XLogRecPtr and shouldn't be printed like one. Fujii Masao.</li>
<li>Clean up some randomness associated with trace_recovery_messages: don't put the variable declaration in the middle of a bunch of externs, and do use extern where it should be used.</li>
<li>Fix mishandling of whole-row Vars referencing a view or sub-select. If such a Var appeared within a nested sub-select, we failed to translate it correctly during pullup of the view, because the recursive call to replace_rte_variables_mutator was looking for the wrong sublevels_up value. Bug was introduced during the addition of the PlaceHolderVar mechanism. Per bug #5514 from Marcos Castedo.</li>
</ul>
<p>Andrew Dunstan a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/src/tools/msvc/Mkvcbuild.pm, unbreak MSVC builds for pg_archivecleanup by linking with libpgport.</li>
<li>Remove perl symbol table additions for plperl functions, and mention of it in the release notes, as it is not apparently providing anything useful.</li>
</ul>
<p>Robert Haas a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/doc/src/sgml/ref/analyze.sgml, document new 9.0 behavior of ANALYZE on inheritance hierarchies. In particular, note that autovacuum does not yet understand that it might need to vacuum inheritance parents as a result of changes to the child tables.</li>
<li>Remove hstore's text[] =&gt; text[] operator. This is not yet in any released version, so we still have the option to backtrack. Instead, document hstore(text[], text[]). Per discussion.</li>
<li>In pgsql/doc/src/sgml/func.sgml, document that receive location can rewind if replication restarts. Fujii Masao, with some further wordsmithing by me.</li>
</ul>
<p>Peter Eisentraut a commit&eacute;&nbsp;:</p>
<ul>
<li>Refactor sprintf calls with computed format strings into multiple calls with constant format strings, so that the compiler can more easily check the formats for correctness.</li>
<li>Add notes that CREATE/DROP CONVERSION is similar to CREATE/DROP TRANSLATION in the SQL standard.</li>
</ul>
<p><strong>Correctifs rejet&eacute;s (&agrave; ce jour)</strong></p>
<ul>
<li>Pas de d&eacute;ception cette semaine&nbsp;:-)</li>
</ul>
<p><strong>Correctifs en attente</strong></p>
<ul>
<li>Robert Haas sent in a patch to implement --quote-all-identifiers for pg_dump and pg_dumpall, per discussion.</li>
<li>KaiGai Kohei sent in two revisions of a patch to add a security hook to InitPostgres().</li>
<li>KaiGai Kohei sent in a patch to rework DML permissions checks.</li>
<li>KaiGai Kohei sent in a patch to add makeRangeTblEntry into makefuncs.c.</li>
<li>KaiGai Kohei sent in a patch to modify the ExecutorCheckPerms() hook.</li>
<li>Fujii Masao sent in a patch to fix a condition where the server crashes during streaming replication.</li>
<li>Dimitri Fontaine sent in a patch to add a pg_archive_bypass command.</li>
<li>Robert Haas sent in another patch for get_whatever_oid.</li>
<li>Mike Lewis sent in another revision of the patch to enhance performance in array utility functions.</li>
<li>ITAGAKI Takahiro sent in a patch to reorganize GUC categories.</li>
<li>ITAGAKI Takahiro sent in a patch to implement foreign tables for SQL/MED.</li>
<li>Robert Haas sent in a patch to turn =&gt; into &amp; for hstore.</li>
<li>Florian Pflug sent in a patch to show individual statement latencies in pgbench output.</li>
<li>Zoltan Boszormenyi sent in a patch to fix a performance problem in ECPG.</li>
<li>ITAGAKI Takahiro sent in an update revision of the patch for table partitioning syntax.</li>
<li>ITAGAKI Takahiro sent in a patch to add a view to pg_catalog for walsender activity.</li>
</ul></description>
<pubDate>jeu, 24 jun 2010 22:07:28 +0000</pubDate>
</item>
<item>
<title>Actualités PostgreSQL.fr: Présentation de la version 9.0 de PostgreSQL</title>
<guid>urn:md5:45dc7ea07698084592d13f456b6691ec</guid>
<link>http://blog.postgresql.fr/index.php?post/2010/06/16/Pr%C3%A9sentation-de-la-version-9.0-de-PostgreSQL2</link>
<description><p>Ce document tente de présenter les principaux changements apportés par PostgreSQL 9.0, par rapport à la version majeure précédente, la version 8.4. Dans la mesure du possible, chaque fonctionnalité sera expliquée et accompagnée d'une démonstration. Toutes les nouveautés ne sont bien sûr pas présentées (il y en a plus de 200).</p>
<p>La version 9.0, comme son nom l'indique, est une version capitale dans la progression de PostgreSQL. Même si les solutions de réplication pour PostgreSQL sont nombreuses et répondent à des problématiques variées, la version 9.0 apporte une réplication simple, robuste et intégrée au moteur, qui sera vraisemblablement utilisée par défaut dans la plupart des configurations de Haute Disponibilité reposant sur PostgreSQL.</p>
<p>Les changements ont été subdivisés en quatre parties:</p>
<ul>
<li>Les deux nouveautés incontournables</li>
<li>Les nouveautés</li>
<li>Les changements pouvant entraîner des régressions</li>
<li>Les améliorations</li>
</ul>
<h2>Les incontournables</h2>
<p>Ces deux nouveautés sont celles qui ont justifié à elles seules le renommage de 8.5 en 9.0.</p>
<h3>Hot Standby</h3>
<p>Cette nouvelle fonctionnalité est une des deux raisons du renommage en 9.0. Il s'agit de proposer une base de 'Standby', c'est-à-dire une baseappliquant les journaux binaires générés par la base de production, tout&nbsp;&nbsp;en la rendant ouverte en lecture seule. Ceci est assez complexe car, pendant l'exécution de ces requêtes en lecture seule, la base en Standby doit aussi pouvoir appliquer les données binaires provenant de la base de production, être capable de décider si les modifications peuvent entrer en conflit avec les lectures et déterminer les actions à entreprendre en conséquence&nbsp;: mettre en pause la restauration ou tuer des requêtes en lecture seule. Ce patch est volumineux et complexe, il rajoute des informations dans la journalisation à l'intention de la base de Standby et un mécanisme de résolution des conflits. C'est donc une des fonctionnalités majeures, et une des principales fonctionnalités à aider à tester.</p>
<p>Pour mettre ceci en place, il suffit de paramétrer la base de production comme suit&nbsp;:</p>
<p><code>postgresql.conf</code> Primaire:</p>
<pre>wal_level = 'hot standby' # Génère les informations supplémentaires dans les journaux<br /># vacuum_defer_cleanup_age # Optionnellement, vous pourriez vouloir paramétrer ceci, mais son réglage pourrait être complexe</pre>
<p>Ensuite, créer une base de standby (la procédure est la même que précédemment pour un Warm Standby&nbsp;: pg_start_backup sur la production, recopie des fichiers sur l'esclave, pg_end_backup sur la production).</p>
<p>Puis il suffit de recopier les journaux sur le secondaire et de rajouter ceci dans son postgresql.conf&nbsp;: </p>
<p><code>postgresql.conf</code> Secondaire:</p>
<pre>hot_standby=on<br />max_standby_delay=30s # -1= toujours attendre, 0= ne jamais attendre, sinon attendre cette durée</pre>
<p>et d'utiliser un programme comme pg_standby sur le secondaire pour intégrer les journaux (à paramétrer dans le <code>recovery.conf</code>).</p>
<p>max_standby_delay permet de déterminer le comportement de la base de standby en cas de conflit entre l'application des journaux de transactions et les requêtes en lecture seule. En cas de conflit, la base de standby acceptera d'attendre au plus max_standby_delay avant de tuer les requêtes en lecture qui bloquent l'application des journaux.</p>
<p>Il est bien sûr vivement conseillé de lire la documentation avant de mettre en place cette fonctionnalité… Ne serait-ce que pour bien comprendre les conséquences du réglage de max_standby_delay et vacuum_defer_cleanup_age, qui ne sont pas simples à appréhender.</p>
<h3>Streaming Replication</h3>
<p>C'est la deuxième moitié de la raison du passage en 9.0. Il s'agit cette fois-ci de modifier le mécanisme d'archivage pour le rendre continu&nbsp;: les bases de standby peuvent donc se connecter au maître et récupérer à tout moment ce qui leur manque des journaux, non plus en termes de fichiers entiers, mais bien en termes d'enregistrements dans ces journaux (des fragments de ces fichiers donc). Il s'agit donc bien d'une réplication binaire, pas de la rééxécution dans le même ordre de requêtes SQL comme sur certains autres moteurs de bases de données, avec tous les risques de cohérence que cela impliquerait.</p>
<p>Les bases de production et de standby sont identiques au niveau binaire (enfin presque, on ne va pas rentrer dans les détails, mais ne vous en faites pas si les fichiers de données n'ont pas la même somme de contrôle).</p>
<p>wal_level devra valoir «&nbsp;archive&nbsp;» (ou «&nbsp;hot standby ») pour continuer à faire de l'archivage continu.</p>
<p><code>postgresql.conf</code> primaire :</p>
<pre>max_wal_senders = x # Nombre maximum de « wal_senders », les processus chargés de répondre à des serveurs de standby<br />wal_keep_segments # Nombre de fichiers de journaux de transactions à conserver en ligne quoi qu'il arrive (évite d'avoir à les recopier manuellement sur le(s) secondaires en cas de déconnection lente)</pre>
<p>Sur le secondaire&nbsp;:</p>
<p><code>recovery.conf</code> secondaire:</p>
<pre>stanby_mode = on<br />primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass' # La chaîne de connexion pour une session sur le maître</pre>
<p><code>postgresql.conf</code> secondaire:</p>
<pre>wal_level # à la même valeur que sur le maître (pour le retour de bascule…)<br />hot_standby=on/off # Suivant que vous voulez en même temps être en hot standby</pre>
<p>fichier pg_hba.conf&nbsp;:
On doit y créer une entrée pour les connexions de réplication. La base est «&nbsp;replication », l'utilisateur utilisé doit avoir l'attribut de superutilisateur. Attention à ne pas donner des droits trop importants ici, donner accès aux journaux de transactions en lecture à n'importe qui donne accès à des informations privilégiées.</p>
<p><code>pg_hba.conf</code> primaire:</p>
<pre>host replication foo 192.168.1.100/32 md5</pre>
<p>Comme pour Hot Standby, cette fonctionnalité est suffisamment riche et complexe pour qu'il soit vivement conseillé de lire la doc. Et de faire des tests de bascule une fois l'ensemble mis en place.</p>
<p>Ce qui est très important avec ces deux fonctionnalités, c'est que vous pouvez les utiliser ensemble. Vous pouvez donc avoir donc une base de stanby répliquée de façon quasi-synchrone avec la production, et exécuter des requêtes en lecture seule sur cette base.</p>
<h2>Les nouveautés</h2>
<h3>Contraintes d'exclusion</h3>
<p>Il est maintenant possible de déclarer des contraintes d'unicité plus complexes que celles s'appuyant sur l'opérateur '=' (contrainte d'unicité, deux jeux de colonnes ne pouvant être identiques).</p>
<p>Nous allons, pour l'illustrer, utiliser l'exemple de l'auteur, en utilisant le type 'temporal' qu'il a aussi développé. Ce type de données permet de définir des 'plages de temps', c'est à dire par exemple 'la plage de 12h15 à 13h15'.</p>
<p>Il faut donc récupérer le module temporal à l'adresse suivante&nbsp;: http://pgfoundry.org/projects/temporal/ , le compiler et l'installer comme un contrib (exécuter le script SQL fourni).</p>
<pre>CREATE TABLE reservation<br />(<br /> salle TEXT,<br /> professeur TEXT,<br /> durant PERIOD);<br /><br />ALTER TABLE reservation ADD CONSTRAINT test_exclude EXCLUDE USING gist (salle WITH =,durant WITH &amp;&amp;);</pre>
<p>Par ceci, nous disons qu'un enregistrement doit être refusé (contrainte d'exclusion) s'il en existe déjà un vérifiant les deux conditions concerner la même salle, et être en intersection au niveau de l'intervalle de temps.</p>
<pre>marc=# INSERT INTO reservation (professeur,salle,durant) VALUES ( 'marc', 'salle techno', period('2010-06-16 09:00:00', '2010-06-16 10:00:00'));<br />INSERT 0 1<br />marc=# INSERT INTO reservation (professeur,salle,durant) VALUES ( 'jean', 'salle chimie', period('2010-06-16 09:00:00', '2010-06-16 11:00:00'));<br />INSERT 0 1<br />marc=# INSERT INTO reservation (professor,room,during) VALUES ( 'marc', 'salle chimie', period('2010-06-16 10:00:00', '2010-06-16 11:00:00'));<br />ERROR: conflicting key value violates exclusion constraint "test_exclude"<br />DETAIL: Key (room, during)=(salle chimie, [2010-06-16 10:00:00+02, 2010-06-16 11:00:00+02)) conflicts with existing key (room, during)=(salle chimie, [2010-06-16 09:00:00+02, 2010-06-16 11:00:00+02)).</pre>
<p>L'insertion est interdite, puisque la salle de chimie est déjà prise de 9h à 11h.</p>
<h3>Triggers par colonne</h3>
<p>Voici d'abord un trigger par colonne.</p>
<pre>CREATE TRIGGER toto BEFORE UPDATE of a ON t1 FOR EACH ROW EXECUTE PROCEDURE mon_trigger();</pre>
<p>Ce trigger ne se déclenche que si la colonne a de la table t1 a été modifiée.</p>
<h3>Triggers WHEN</h3>
<p>Voici maintenant des exemples tirés de la documentation officielle pour la clause WHEN des triggers:</p>
<pre>CREATE TRIGGER check_update<br />BEFORE UPDATE ON accounts<br />FOR EACH ROW<br />WHEN (OLD.balance IS DISTINCT FROM NEW.balance)<br />EXECUTE PROCEDURE check_account_update();<br /><br />CREATE TRIGGER log_update<br />AFTER UPDATE ON accounts<br />FOR EACH ROW<br />WHEN (OLD.* IS DISTINCT FROM NEW.*)<br />EXECUTE PROCEDURE log_account_update();</pre><h3>DEFERRABLE UNIQUE CONSTRAINTS</h3>
<p>Cette fonctionnalité aussi promet d'être pratique. Voici un exemple avec une clé primaire au lieu d'une simple clé unique, mais cela revient au même&nbsp;:</p>
<pre>marc=# CREATE TABLE test (a int primary key);<br />marc=# INSERT INTO test values (1), (2);<br />marc=# UPDATE test set a = a+1;<br />ERROR: duplicate key value violates unique constraint "test_pkey"<br />DETAIL: Key (a)=(2) already exists.</pre>
<p>Normal, mais dommage&nbsp;: à la fin de la transaction, mes données auraient été cohérentes. D'autant plus que si la table avait été triée physiquement par ordre descendant, ça passait&nbsp;! En 8.4, il n'y avait pas d'échappatoire simple, il fallait trouver une astuce pour mettre à jour les enregistrements dans le bon ordre.</p>
<p>Nous pouvons maintenant faire ceci&nbsp;:</p>
<pre>marc=# CREATE TABLE test (a int primary key deferrable);<br />marc=# INSERT INTO test values (2),(1);<br />marc=# UPDATE test set a = a+1;<br />ERROR: duplicate key value violates unique constraint "test_pkey"<br />DETAIL: Key (a)=(2) already exists.</pre>
<p>Ah zut, ça ne marche pas. </p>
<p>En fait, je l'ai fait exprès&nbsp;: j'en profite pour faire un petit rappel sur les contraintes deferrable/deferred&nbsp;: une contrainte 'deferrable' PEUT être vérifiée en fin de transaction (elle est 'retardable'). Il faut toutefois dire à PostgreSQL expressément qu'on veut vraiment faire ce contrôle en fin de transaction.</p>
<p>On peut, pour la session en cours demander à passer toutes les contraintes en 'DEFERRED'&nbsp;:</p>
<pre>marc=# SET CONSTRAINTS ALL DEFERRED;<br />SET CONSTRAINTS<br />marc=# UPDATE test set a = a+1;<br />UPDATE 2</pre>
<p>Si on veut ne pas avoir à effectuer le SET CONSTRAINTS à chaque fois, il est aussi possible de déclarer la contrainte comme INITIALLY DEFERRED:</p>
<pre>CREATE TABLE test (a int PRIMARY KEY DEFERRABLE INITIALLY DEFERRED);</pre>
<p>Un autre rappel s'impose&nbsp;: les contraintes DEFERRED sont plus lentes que les contraintes IMMEDIATE. Par ailleurs, il faut bien stocker la liste des enregistrements à vérifier en fin de transaction quelque part, et cela consomme de la mémoire. Attention à ne pas le faire sur des millions d'enregistrements d'un coup. C'est la raison pour laquelle les contraintes 'DEFERRABLE' ne sont pas 'INITIALLY DEFERRED' par défaut.</p>
<h3>Fonctions anonymes</h3>
<p>Cette nouvelle fonctionnalité permet de créer des fonctions à usage unique. Elles seront très pratiques dans des scripts de livraison de version applicative par exemple. Voici une version un peu différente du GRANT SELECT ON ALL TABLES qui sera présenté plus loin dans ce document, qui donne le droit de sélection à tout un jeu de tables, en fonction du propriétaire des tables, et en ignorant deux schémas&nbsp;:</p>
<pre>DO language plpgsql $$ <br />DECLARE<br />vr record;<br /><br />BEGIN<br /><br />FOR vr IN SELECT tablename FROM pg_tables WHERE tableowner = 'marc' AND schemaname NOT IN ('pg_catalog','information_schema')<br />LOOP<br /> EXECUTE 'GRANT SELECT ON ' || vr.tablename || ' TO toto';<br />END LOOP;<br />END<br />$$<br />;</pre>
<p>En 8.4, il aurait fallu créer une fonction (via CREATE FUNCTION), l'exécuter puis la supprimer (avec DROP FUNCTION). Le tout demandant d'avoir les droits pour ça. La 9.0 facilite donc ce type d'exécution rapide.</p>
<h3>Paramètres nommés</h3>
<p>La syntaxe retenue pour nommer les paramètres est la suivante:</p>
<pre>CREATE FUNCTION test (a int, b text) RETURNS text AS $$<br />DECLARE<br />valeur text;<br />BEGIN<br />valeur := 'a vaut ' || a::text || ' et b vaut ' || b;<br />RETURN valeur;<br />END;<br />$$ LANGUAGE plpgsql;</pre>
<p>Jusque là, on écrivait&nbsp;:</p>
<pre>SELECT test(1,'toto');<br />test <br />-------------------------<br />a vaut 1 et b vaut toto<br />(1 row)</pre>
<p>Maintenant, on peut utiliser cette syntaxe explicite:</p>
<pre>SELECT test( b:='toto', a:=1);<br />test <br />-------------------------<br />a vaut 1 et b vaut toto<br />(1 row)</pre>
<p>De nombreux langages permettent ce type de syntaxe d'appel de fonction, qui améliore fortement la lisibilité du code.</p>
<h3>GRANT/REVOKE IN SCHEMA</h3>
<p>C'est un problème idiot, et un peu frustrant, qui est déjà arrivé à beaucoup d'administrateurs de base de données&nbsp;: créer 400 tables, puis devoir attribuer des droits à un utilisateur sur ces 400 tables. Jusque là, on en était quitte pour créer un script. Plus maintenant&nbsp;:</p>
<pre>GRANT SELECT ON ALL TABLES IN SCHEMA public TO toto;</pre>
<p>Et la marche arrière&nbsp;:</p>
<pre>REVOKE SELECT ON ALL TABLES IN SCHEMA public FROM toto;</pre>
<p>Bien sûr, cette commande ne vaut que pour les tables en place au moment de la commande. Il faudra toujours faire de nouveaux GRANT pour les futures tables du schéma.</p>
<h3>ALTER&nbsp;DEFAULT PRIVILEGES</h3>
<p>Encore une commande permettant de gagner du temps dans la gestion des droits.</p>
<pre>ALTER DEFAULT PRIVILEGES FOR ROLE marc GRANT SELECT ON TABLES TO PUBLIC ;<br />CREATE TABLE test_priv (a int);<br />\z test_priv<br /> Access privileges<br /> Schema | Name | Type | Access privileges | Column access privileges <br />--------+------------+-------+-------------------+--------------------------<br /> public | test_priv | table | =r/marc +| <br /> | | | marc=arwdDxt/marc | </pre>
<p>Les informations sur les droits par défaut sont stockées dans pg_default_acl.</p>
<h2>Les changements pouvant entraîner régression</h2>
<p>Ces deux changements dans PL/pgSQL peuvent entraîner des régressions dans du code fonctionnant en 8.4. Si vous avez du code PL/pgSQL, vérifiez le avant de migrer en 9.0. Le moteur génère des erreurs à l'exécution, comme illustré ci-dessous.</p>
<h3>PL/pgSQL&nbsp;: meilleur contrôle du nom des variables</h3>
<pre>marc=# DO LANGUAGE plpgsql<br />$$<br />DECLARE<br />a int;<br />BEGIN<br />SELECT a FROM test;<br />END<br />$$<br />ERROR: column reference "a" is ambiguous<br />LINE 1: select a from test<br />DETAIL: It could refer to either a PL/pgSQL variable or a table column.<br />QUERY: select a from test<br />CONTEXT: PL/pgSQL function "inline_code_block" line 4 at SQL statement</pre>
<p>Si vous voulez modifier ce comportement, vous pouvez le faire globalement mais il est préférable de le faire par fonction, en exécutant une de ces commandes au début de votre fonction:</p>
<pre>variable_conflict error # mode par défaut<br />variable_conflict use_variable # choisir le nom de variable<br />variable_conflict use_column # choisir le nom de colonne</pre>
<h3>Protection des mots réservés en PL/pgSQL</h3>
<pre>marc=# DO LANGUAGE plpgsql<br />$$<br />DECLARE<br />table int;<br />BEGIN<br />table :=table+1;<br />END<br />$$<br />;<br />ERROR: syntax error at or near "table"<br />LINE 6: table :=table+1;<br />^<br />marc=# DO LANGUAGE plpgsql<br />$$<br />DECLARE<br />"table" int;<br />BEGIN<br />"table" :="table"+1;<br />END<br />$$<br />;<br />DO</pre>
<h2>Les améliorations</h2>
<p>Le planificateur de requête a reçu un grand nombre d'améliorations dans cette version. Nous allons donc commencer par lui:</p>
<h3>Join Removal</h3>
<pre>marc=# CREATE TABLE t1 (a int);<br />CREATE TABLE<br />marc=# CREATE TABLE t2 (b int);<br />CREATE TABLE<br />marc=# CREATE TABLE t3 (c int);<br />CREATE TABLE</pre>
On insère quelques données avec le generate_series…<br /><pre>marc=# EXPLAIN SELECT t1.a,t2.b from t1 join t2 on (t1.a=t2.b) left join t3 on (t1.a=t3.c);<br /> QUERY PLAN <br />------------------------------------------------------------------------------<br /> Merge Right Join (cost=506.24..6146.24 rows=345600 width=8)<br /> Merge Cond: (t3.c = t1.a)<br /> -&gt; Sort (cost=168.75..174.75 rows=2400 width=4)<br /> Sort Key: t3.c<br /> -&gt; Seq Scan on t3 (cost=0.00..34.00 rows=2400 width=4)<br /> -&gt; Materialize (cost=337.49..853.49 rows=28800 width=8)<br /> -&gt; Merge Join (cost=337.49..781.49 rows=28800 width=8)<br /> Merge Cond: (t1.a = t2.b)<br /> -&gt; Sort (cost=168.75..174.75 rows=2400 width=4)<br /> Sort Key: t1.a<br /> -&gt; Seq Scan on t1 (cost=0.00..34.00 rows=2400 width=4)<br /> -&gt; Sort (cost=168.75..174.75 rows=2400 width=4)<br /> Sort Key: t2.b<br /> -&gt; Seq Scan on t2 (cost=0.00..34.00 rows=2400 width=4)</pre>Pour l'instant, c'est normal, et on a le même comportement qu'en 8.4. Mais imaginons que sur la table t3, on ait une contrainte UNIQUE sur la colonne c. Dans ce cas, théoriquement, la jointure sur la table t3 ne sert à rien&nbsp;: le nombre d'enregistrements du résultat ne sera pas modifié, pas plus, bien sûr, que leur contenu. C'est lié au fait que la colonne est UNIQUE, que la jointure est un LEFT JOIN, et qu'aucune colonne de t3 n'est récupérée. Si la colonne n'était pas UNIQUE, la jointure pourrait augmenter le nombre d'enregistrements du résultat. Si ce n'était pas un LEFT JOIN, la jointure pourrait diminuer le nombre d'enregistrements du résultat.<p>En 9.0&nbsp;:</p>
<pre>marc=# ALTER TABLE t3 ADD UNIQUE (c);<br />NOTICE: ALTER TABLE / ADD UNIQUE will create implicit index "t3_c_key" for table "t3"<br />ALTER TABLE<br />marc=# EXPLAIN SELECT t1.a,t2.b from t1 join t2 on (t1.a=t2.b) left join t3 on (t1.a=t3.c);<br /> QUERY PLAN <br />------------------------------------------------------------------<br /> Merge Join (cost=337.49..781.49 rows=28800 width=8)<br /> Merge Cond: (t1.a = t2.b)<br /> -&gt; Sort (cost=168.75..174.75 rows=2400 width=4)<br /> Sort Key: t1.a<br /> -&gt; Seq Scan on t1 (cost=0.00..34.00 rows=2400 width=4)<br /> -&gt; Sort (cost=168.75..174.75 rows=2400 width=4)<br /> Sort Key: t2.b<br /> -&gt; Seq Scan on t2 (cost=0.00..34.00 rows=2400 width=4)<br />(8 rows)</pre>Cette optimisation devrait pouvoir être très rentable, entre autre quand les requêtes sont générées par un ORM (mapping objet-relationnel). Ces outils ont la fâcheuse tendance à exécuter des jointures inutiles. Ici on a réussi à diviser le coût estimé de la requête par 10.
<p>C'est aussi une optimisation qui pourra être très utile pour les applications utilisant beaucoup de jointures et de vues imbriquées.</p>
<p>Cela constitue encore une raison supplémentaire de déclarer les contraintes dans la base&nbsp;: sans ces contraintes, impossible pour le moteur d'être sûr que ces réécritures sont possibles.</p>
<h3>IS NOT NULL peut utiliser les index</h3>
<p>Pour cette démonstration, nous allons comparer la version 8.4 et la 9.0 (la table que j'ai créée contient majoritairement des valeurs NULL)&nbsp;:</p>
<p>En 8.4&nbsp;:</p>
<pre>marc=# EXPLAIN ANALYZE SELECT max(a) from test;<br />QUERY PLAN <br />------------------------------------------------------------------------------------------------------------------------------------------------<br />Result (cost=0.03..0.04 rows=1 width=0) (actual time=281.320..281.321 rows=1 loops=1)<br />InitPlan 1 (returns $0)<br /> -&gt; Limit (cost=0.00..0.03 rows=1 width=4) (actual time=281.311..281.313 rows=1 loops=1)<br /> -&gt; Index Scan Backward using idxa on test (cost=0.00..29447.36 rows=1001000 width=4) (actual time=281.307..281.307 rows=1 loops=1)<br />Filter: (a IS NOT NULL)<br />Total runtime: 281.360 ms<br />(6 rows)</pre><p>En 9.0&nbsp;:</p>
<pre>marc=# EXPLAIN ANALYZE SELECT max(a) from test;<br />QUERY PLAN <br />--------------------------------------------------------------------------------------------------------------------------------------------<br />Result (cost=0.08..0.09 rows=1 width=0) (actual time=0.100..0.102 rows=1 loops=1)<br />InitPlan 1 (returns $0)<br /> -&gt; Limit (cost=0.00..0.08 rows=1 width=4) (actual time=0.092..0.093 rows=1 loops=1)<br /> -&gt; Index Scan Backward using idxa on test (cost=0.00..84148.06 rows=1001164 width=4) (actual time=0.089..0.089 rows=1 loops=1)<br />Index Cond: (a IS NOT NULL)<br />Total runtime: 0.139 ms<br />(6 rows)</pre><p>On constate que la 9.0 parcourt uniquement les clés non nulles de l'index (Index cond, au lieu d'un filtre à posteriori). Dans ce cas précis, le gain est très net.
</p>
<h3>Utilisation d'index pour générer des statistiques à la volée</h3>
<p>Avant de commencer à expliquer la nouveauté, un petit rappel sur les histogrammes: PostgreSQL, comme d'autres moteurs de bases de données, utilise un optimiseur statistique. Cela signifie qu'au moment de la planification d'une requête il a (ou devrait) avoir une idée correcte de ce que chaque étape de la requête va lui ramener, en termes de nombres d'enregistrements. Pour cela, il utilise des statistiques, comme le nombre d'enregistrements de la table approximatif, sa taille, la corrélation physique entre valeurs voisines dans la table, les valeurs les plus fréquentes, et les histogrammes, qui permettent d'évaluer assez précisément le nombre d'enregistrements ramenés par une clause WHERE sur une colonne, suivant la valeur ou la plage demandée sur la clause WHERE.</p>
<p>Il arrive que les statistiques soient rapidement périmées, et donc
posent problème, pour certains ordres SQL. Par exemple, une table de
trace dans laquelle on insèrerait des enregistrements horodatés, et sur
laquelle on voudrait presque toujours sélectionner les enregistrements
des 5 dernières minutes.</p>
<p>Dans ce cas, il était impossible avant la 9.0 d'avoir des statistiques à jour. Maintenant, quand PostgreSQL détecte qu'une requête demande un «range scan» sur une valeur supérieure à la dernière valeur de l'histogramme (ou inférieure à la première valeur), c'est à dire la plus grande valeur connue au dernier calcul de statistiques, et que la colonne est indexée, il récupère le max (ou le min si c'est la première valeur) de cette colonne en interrogeant l'index AVANT d'exécuter la requête, afin d'obtenir des statistiques plus réalistes. Comme il utilise un index pour cela, il faut qu'un index existe, bien sûr.</p>
<p>Voici un exemple. La colonne "a" de la table test a déjà été remplie avec de nombreuses dates, antérieures. Elle a donc des statistiques à jour, avec des histogrammes lui donnant la répartition des valeurs de a.</p>
<p>Il est 13:37, et je n'ai encore rien inséré dans la table de date supérieure à 13:37.</p>
<pre>marc=# EXPLAIN ANALYZE select * from test where a &gt; '2010-06-03 13:37:00';<br />QUERY PLAN <br />--------------------------------------------------------------------------------------------------------------<br />Index Scan using idxtsta on test (cost=0.00..8.30 rows=1 width=8) (actual time=0.007..0.007 rows=0 loops=1)<br />Index Cond: (a &gt; '2010-06-03 13:37:00'::timestamp without time zone)<br />Total runtime: 0.027 ms<br />(3 rows)</pre>Tout est donc normal. La borne supérieure de mon histogramme est 2010-06-03 13:36:16.830007 (l'information se trouve dans pg_stats). Il n'a aucun moyen d'évaluer le nombre d'enregistrements supérieurs à 13:37, et en 8.4, il aurait continué à estimer '1' tant qu'un analyze n'aura pas été passé.
<pre>marc=# DO LANGUAGE plpgsql<br />$$<br />DECLARE<br />i int;<br />BEGIN<br />FOR i IN 1..10000 LOOP</pre>
<pre> INSERT INTO test VALUES (clock_timestamp());</pre>
<pre>END LOOP;<br />END<br />$$<br />;<br />DO</pre>
<p>(Décidément, j'aime bien les DO).</p>
<p>Nous venons d'insérer 10000 dates supérieures à 13:37.</p>
<pre>marc=# EXPLAIN ANALYZE SELECT * FROM test WHERE a &gt; '2010-06-03 13:37:00';<br />QUERY PLAN <br />-----------------------------------------------------------------------------------------------------------------------<br />Index Scan using idxtsta on test (cost=0.00..43.98 rows=1125 width=8) (actual time=0.012..13.590 rows=10000 loops=1)<br />Index Cond: (a &gt; '2010-06-03 13:37:00'::timestamp without time zone)<br />Total runtime: 23.567 ms<br />(3 rows)</pre><p>Le nombre d'enregistrements estimé n'est pas à 0 ou 1. Et pourtant les statistiques ne sont pas à jour&nbsp;:</p>
<pre>marc=# SELECT last_autoanalyze FROM pg_stat_user_tables WHERE relname = 'test';<br />last_autoanalyze <br />-------------------------------<br />2010-06-03 13:36:21.553477+02<br />(1 row)</pre><p>Dans cet exemple, nous avons tout de même une erreur d'un facteur 10. Ce n'est pas si mal: sans cette optimisation, l'erreur aurait été d'un facteur 10&nbsp;000. En tout cas, une erreur d'un facteur 10 nous donne de plus fortes chances de choisir un plan intelligent.</p>
<h3>seq_page_cost/random_page_cost par tablespace</h3>
<pre>marc=# ALTER TABLESPACE pg_default SET ( random_page_cost = 10, seq_page_cost=5);<br />ALTER TABLESPACE</pre>
<p>Nous venons de modifier random_page_cost et seq_page_cost pour tous les objets du tablespace pg_default. Quel peut être le cas d'utilisation&nbsp;?</p>
<p>C'est pour le cas où vous avez des tablespaces de performances différentes&nbsp;: par exemple, vous avez quelques données essentielles sur un disque SSD, ou bien des données d'historique sur une vieille baie moins performante que la baie flambant neuf que vous avez décidé d'utiliser pour les données actives. Cela vous permet de signaler à PostgreSQL que tous vos tablespaces ne sont pas forcément équivalents en termes de performance. Cela ne s'applique, bien sûr, que sur de très grosses bases.</p>
<h3>Permettre de forcer le nombre de valeurs distinctes d'une colonne</h3>
<p>Ceci permet de forcer le nombre de valeurs différentes d'une colonne. Ce n'est pas à utiliser à la légère, mais uniquement quand l'ANALYZE sur la table n'arrive pas à obtenir une valeur raisonnable.</p>
<p>Voici comment procéder&nbsp;:</p>
<pre>marc=# ALTER TABLE test ALTER COLUMN a SET (n_distinct = 2);<br />ALTER TABLE</pre>
<p>Il faut repasser un ANALYZE pour que la modification soit prise en compte&nbsp;:</p>
<pre>marc=# ANALYZE test;<br />ANALYZE</pre>
<p>Essayons maintenant&nbsp;:</p>
<pre>marc=# EXPLAIN SELECT distinct * from test;<br />QUERY PLAN <br />------------------------------------------------------------------<br />HashAggregate (cost=6263.00..6263.02 rows=2 width=8)<br />-&gt; Seq Scan on test (cost=0.00..5338.00 rows=370000 width=8)<br />(2 rows)</pre><p>C'est l'exemple même de ce qu'il ne faut pas faire&nbsp;: j'ai bien 370 000 valeurs distinctes dans ma table. Maintenant mes plans d'exécution seront très mauvais.
</p>
<p>Si la valeur n_distinct est positive, il s'agit du nombre de valeurs distinctes. Si la valeure est négative (entre 0 et -1), il s'agit du coefficient multiplicateur par rapport au nombre d'enregistrements estimés de la table&nbsp;: par exemple -0.2 signifie qu'il y a 1 enregistrement distinct pour 5 enregistrements dans la table. 0 ramène le comportement à celui par défaut (c'est ANALYZE qui effectue la mesure).</p>
<p>Ne touchez à ceci que si vous êtes absolument sûr d'avoir correctement diagnostiqué votre problème. Sinon, vous pouvez être sûr d'empirer les performances.</p>
<br />
<p>De nombreuses autres fonctionnalités de la base ont été améliorées. En voici quelques exemples parmi les plus significatifs&nbsp;:</p>
<h3>VACUUM FULL amélioré</h3>
<p>La commande VACUUM FULL était jusque ici très lente. Cette commande permet de récupérer l'espace perdu dans une table, principalement quand la commande VACUUM&nbsp;n'a pas été passée très régulièrement. Ceci était du à son mode de fonctionnement&nbsp;: les enregistrements étaient lus et déplacés un par un d'un bloc de la table vers un bloc plus proche du début de la table. Une fois que la fin de la table était vide, l'enveloppe était réduite à sa taille minimale.</p>
<p>Le problème était donc que ce mécanisme était très inefficace&nbsp;: le déplacement des enregistrements un à un entraine beaucoup d'entrées/sorties aléatoires (non contigues). Par ailleurs, durant cette réorganisation, les index doivent être maintenus, ce qui rend l'opération encore plus couteuse, et fait qu'à la fin d'un vacuum full, les index sont fortement désorganisés. Il est d'ailleurs conseillé de réindexer une table juste après y avoir appliqué un VACUUM FULL.</p>
<p>La commande VACUUM FULL, dans cette nouvelle version, crée une nouvelle table à partir de la table actuelle, en y recopiant tous les enregistrements de façon séquentielle. Une fois tous les enregistrements recopiés, les index sont recréés, et l'ancienne table détruite.</p>
<p>Cette méthode présente l'avantage d'être très largement plus rapide. Toutefois, VACUUM&nbsp;FULL&nbsp;demande toujours un verrou complet sur la table durant le temps de son exécution. Le seul défaut de cette méthode par rapport à l'ancienne, c'est que pendant le temps de son exécution, le nouveau VACUUM FULL peut consommer jusqu'à 2&nbsp;fois l'espace disque de la table, puisqu'il en crée une nouvelle version.</p>
<p>Mesurons maintenant le temps d'exécution suivant les deux méthodes. Dans les deux cas, on prépare le jeu de test comme suit (en 8.4 et en 9.0:)</p>
<pre>marc=# CREATE TABLE test (a int);<br />CREATE TABLE<br />marc=# CREATE INDEX idxtsta on test (a);<br />CREATE INDEX<br />marc=# INSERT INTO test SELECT generate_series(1,1000000);<br />INSERT 0 1000000<br />marc=# DELETE FROM test where a%3=0;<br />DELETE 333333<br />marc=# VACUUM test;<br />VACUUM</pre>
<pre>En 8.4&nbsp;:<br />marc=# \timing<br />Timing is on.<br />marc=# VACUUM FULL test;<br />VACUUM<br />Time: 6306,603 ms<br />marc=# REINDEX TABLE test&nbsp;;<br />REINDEX<br />Time: 1799,998 ms</pre>
<p>Soit environ 8 secondes.</p>
<pre>En 9.0&nbsp;:<br />marc=# \timing<br />Timing is on.<br />marc=# VACUUM FULL test;<br />VACUUM<br />Time: 2563,467 ms</pre>
<p>Ça ne veut toujours pas dire que VACUUM FULL est une bonne idée en production. Si vous en avez besoin, c'est probablement que votre politique de VACUUM n'est pas appropriée.</p>
<h3>64 bits sous windows.</h3>
<p>Il y a maintenant une version 64 bits native pour Windows. Pour l'instant aucune mesure de performance n'a été effectuée (à ma connaissance) pour en connaître les gains&nbsp;: peut on maintenant dépasser la limite de shared_buffers aux alentours de 500Mo sous Windows sans dégradations de performances&nbsp;?</p>
<h3>PL/pgSQL par défaut</h3>
<p>Vous n'aurez plus à ajouter le langage plpgsql dans chaque base où vous en avez besoin car il est installé par défaut.</p>
<h3>Beaucoup d'améliorations sur les langages PL.</h3>
<p>Beaucoup de langages ont vu leur support grandement amélioré, PLPerl par exemple. Consultez les release notes si vous voulez davantage de détails, les modifications étant nombreuses.</p>
<h3>Mot clé ALIAS</h3>
<p>Nous pouvons maintenant utiliser le mot clé ALIAS. Comme son nom l'indique, il permet de créer des alias de variables.</p>
<p>La syntaxe est «&nbsp;nouveau_nom ALIAS FOR ancien_nom ». Cela se place dans la section DECLARE d'un code PL/pgSQL.</p>
<p>C'est utilisable dans deux cas principalement&nbsp;:</p>
<ul><li>
pour donner des noms aux variables d'une fonction PL:</li>
</ul>
<pre> monparam ALIAS FOR $0</pre><ul><li>pour renommer des variables qui pourraient être en conflit. Dans un trigger par exemple:</li>
</ul>
<pre> nouvelle_valeur ALIAS FOR new</pre> (on aurait risqué le conflit avec la variable new dans la fonction trigger).
<h3>Passage de message dans NOTIFY/pg_notify</h3>
<p>On peut donc passer des messages dans NOTIFY. Voici la méthode:</p>
<ul><li>On s'abonne dans la session 1 à la file d'attente «&nbsp;messagerie_instantanee&nbsp;»
<br />Session 1&nbsp;:
<br /><pre>marc=# LISTEN messagerie_instantanee;<br />LISTEN</pre></li>
</ul>
<ul><li>On envoie une notification dans la file d'attente «&nbsp;messagerie_instantanee&nbsp;» d'une autre session
<br />Session 2&nbsp;:
<br /><pre>marc=# NOTIFY messagerie_instantanee, 'Vous avez reçu un popup';<br />NOTIFY</pre></li>
</ul>
<ul><li>On vérifie le contenu de la file d'attente
<br />Session 1&nbsp;:<br /><pre>LISTEN<br />Asynchronous notification "messagerie_instantanee" with payload "Vous avez reçu un popup" received from server process with PID 5943.</pre></li>
</ul>
<ul><li>On peut donc maintenant associer des messages (payloads) aux notifications, ce qui rend le mécanisme beaucoup plus puissant.</li>
</ul>
<p>Signalons aussi la présence d'une nouvelle fonction pg_notify. </p>
<p>Le code de la session 2 peut donc être: </p>
<pre>SELECT pg_notify('messagerie_instantanee','Vous avez reçu un popup');</pre>
<p>Cela peut simplifier l'écriture, dans le cas d'un programme devant piloter de nombreuses files de messages.</p>
<h3>get_bit et set_bit pour les bit strings</h3>
<p>En voici un exemple très synthétique. Cet outil permet de manipuler les bits indépendamment dans un bit().</p>
<pre><br />marc=# SELECT set_bit('1111'::bit(4),2,0);<br /> set_bit <br />---------<br /> 1101<br />(1 row)<br /><br /><br />marc=# SELECT get_bit('1101'::bit(4),2);<br /> get_bit <br />---------<br /> 0<br />(1 row)</pre><h3>application_name pour pg_stat_activity</h3>
<p>Dans la session de supervision&nbsp;:</p>
<p>marc=# SELECT * from pg_stat_activity where procpid= 5991;</p>
<pre>datid | datname | procpid | usesysid | usename | application_name | client_addr | client_port | backend_start | xact_start | query_start | waiting | current_query<br />------+---------+---------+----------+---------+------------------+-------------+-------------+-------------------------------+------------+-------------+---------+----------------<br />16384 | marc | 5991 | 10 | marc | psql | | -1 | 2010-05-16 13:48:10.154113+02 | | | f | &lt;IDLE&gt;</pre>
<p>(1 row)</p>
<p>Dans la session '5991'&nbsp;:</p>
<p>marc=# SET application_name TO 'mon_appli';
SET</p>
<p>Dans la session de supervision&nbsp;:</p>
<p>marc=# SELECT * from pg_stat_activity where procpid= 5991;</p>
<pre>datid | datname | procpid | usesysid | usename | application_name | client_addr | client_port | backend_start | xact_start | query_start | waiting | current_query<br />------+---------+---------+----------+---------+------------------+-------------+-------------+-------------------------------+------------+-------------+---------+----------------<br />16384 | marc | 5991 | 10 | marc | mon_appli | | -1 | 2010-05-16 13:48:10.154113+02 | | 2010-05-16 13:49:13.107413+02 | f | &lt;IDLE&gt;</pre>
<p>(1 row)</p>
<p>À vous de le positionner correctement dans votre application, ou vos sessions. Votre DBA vous dira merci, sachant enfin qui lance quoi sur son serveur facilement.</p>
<h3>Configuration par base de données+rôle</h3>
<pre>marc=# ALTER ROLE marc IN database marc set log_statement to 'all';<br />ALTER ROLE</pre>
<p>Pour savoir qui a quelles modifications de variables dans quels rôles de quelles bases de données, il y a une nouvelle commande psql&nbsp;: </p>
<pre>marc=# \drds</pre>
<pre> List of settings<br />role | database | settings<br />-----+----------+-----------------<br />marc | marc | log_statement=all</pre><pre>(1 row)</pre>
<p>Il y a donc eu une modification du catalogue pour gérer cette nouvelle fonctionnalité&nbsp;:</p>
<p>Table "pg_catalog.pg_db_role_setting"</p>
<pre> Column | Type | Modifier<br />------------+--------+----------<br />setdatabase | oid | not null<br />setrole | oid | not null<br />setconfig | text |</pre>
<h3>Tracer les parametres modifiés lors d'un rechargement du postgresql.conf</h3>
Voici un exemple, lors de la modification du paramètre log_line_prefix :<br /><pre>LOG:&nbsp; received SIGHUP, reloading configuration files<br />&lt;%&gt; LOG:&nbsp; parameter "log_line_prefix" changed to "&lt;%u%%%d&gt; "</pre>
<h3>Nouvelles options de frame dans les fonctions de fenêtrage</h3>
<p>Si vous ne vous connaissez pas les fonctions de fenêtrage, lisez la présentation de la 8.4 ici : <a href="http://blog.postgresql.fr/index.php?post/2010/06/16/post.php?id=475" title="http://blog.postgresql.fr/index.php?post/2009/04/28/Nouveaut%C3%A9s-PostgreSQL-8.4">Nouveautés PostgreSQL 8.4</a></p>
<p>Il y a donc des nouveautés dans le paramétrage du 'frame' des fonctions de fenêtrage. Soit la table suivante (faute de mieux…)</p>
<pre>marc=# SELECT * FROM salaire ;<br />entite | personne&nbsp; | salaire | date_embauche <br />-------+-----------+---------+---------------<br />R&amp;D&nbsp;&nbsp;&nbsp; | marc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp; 700.00 | 2010-02-15<br />Compta | etienne&nbsp;&nbsp; |&nbsp; 800.00 | 2010-05-01<br />R&amp;D&nbsp;&nbsp;&nbsp; | maria&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp; 700.00 | 2009-01-01<br />R&amp;D&nbsp;&nbsp;&nbsp; | kevin&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp; 500.00 | 2009-05-01<br />R&amp;D&nbsp;&nbsp;&nbsp; | jean&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 1000.00 | 2008-07-01<br />R&amp;D&nbsp;&nbsp;&nbsp; | tom&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 1100.00 | 2005-01-01<br />Compta | stephanie |&nbsp; 850.00 | 2006-01-01</pre>
<p>Voici un exemple de fonctions de fenêtrage, sans préciser le frame.</p>
<pre>marc=# SELECT entite, personne, salaire, date_embauche, avg(salaire) OVER (PARTITION BY entite ORDER BY date_embauche) FROM salaire;<br />entite | personne&nbsp; | salaire | date_embauche |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; avg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />-------+-----------+---------+---------------+-----------------------<br />Compta | stephanie |&nbsp; 850.00 | 2006-01-01&nbsp;&nbsp;&nbsp; |&nbsp; 850.0000000000000000<br />Compta | etienne&nbsp;&nbsp; |&nbsp; 800.00 | 2010-05-01&nbsp;&nbsp;&nbsp; |&nbsp; 825.0000000000000000<br />R&amp;D&nbsp;&nbsp;&nbsp; | tom&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 1100.00 | 2005-01-01&nbsp;&nbsp;&nbsp; | 1100.0000000000000000<br />R&amp;D&nbsp;&nbsp;&nbsp; | jean&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 1000.00 | 2008-07-01&nbsp;&nbsp;&nbsp; | 1050.0000000000000000<br />R&amp;D&nbsp;&nbsp;&nbsp; | maria&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp; 700.00 | 2009-01-01&nbsp;&nbsp;&nbsp; |&nbsp; 933.3333333333333333<br />R&amp;D&nbsp;&nbsp;&nbsp; | kevin&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp; 500.00 | 2009-05-01&nbsp;&nbsp;&nbsp; |&nbsp; 825.0000000000000000<br />R&amp;D&nbsp;&nbsp;&nbsp; | marc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp; 700.00 | 2010-02-15&nbsp;&nbsp;&nbsp; |&nbsp; 800.0000000000000000</pre><br />
<p>Le frame est le groupe d'enregistrements sur lequel la fonctions de fenêtrage est appliquée. Évidemment, si on ne précise pas la frame, il met une valeur par défaut. Voici la même requête, écrite avec une frame explicite.</p>
<pre>marc=# SELECT entite, personne, salaire, date_embauche, avg(salaire) OVER (PARTITION BY entite ORDER BY date_embauche RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM salaire;<br />entite | personne | salaire | date_embauche | avg <br />-------+-----------+---------+---------------+-----------------------<br />Compta | stephanie | 850.00 | 2006-01-01 | 850.0000000000000000<br />Compta | etienne | 800.00 | 2010-05-01 | 825.0000000000000000<br />R&amp;D | tom | 1100.00 | 2005-01-01 | 1100.0000000000000000<br />R&amp;D | jean | 1000.00 | 2008-07-01 | 1050.0000000000000000<br />R&amp;D | maria | 700.00 | 2009-01-01 | 933.3333333333333333<br />R&amp;D | kevin | 500.00 | 2009-05-01 | 825.0000000000000000<br />R&amp;D | marc | 700.00 | 2010-02-15 | 800.0000000000000000</pre>
<p>La frame est donc par 'range', entre le début du range et l'enregistrement courant (pas vraiment l'enregistrement courant en fait, mais laissons de côté les subtilités, allez lire la doc si vous voulez en savoir plus). On constate que la fonction de moyenne (avg) est appliquée entre le premier des enregistrements du frame (les enregistrements de la même entité) et l'enregistrement courant.</p>
<p>Première nouveauté&nbsp;: en 9.0, la frame peut se calculer entre l'enregistrement courant et la fin du groupe (au lieu d'entre le début du groupe et l'enregistrement courant):</p>
<pre>marc=# SELECT entite, personne, salaire, date_embauche, avg(salaire) OVER (PARTITION BY entite ORDER BY date_embauche RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM salaire;<br />entite | personne | salaire | date_embauche | avg <br />-------+-----------+---------+---------------+----------------------<br />Compta | stephanie | 850.00 | 2006-01-01 | 825.0000000000000000<br />Compta | etienne | 800.00 | 2010-05-01 | 800.0000000000000000<br />R&amp;D | tom | 1100.00 | 2005-01-01 | 800.0000000000000000<br />R&amp;D | jean | 1000.00 | 2008-07-01 | 725.0000000000000000<br />R&amp;D | maria | 700.00 | 2009-01-01 | 633.3333333333333333<br />R&amp;D | kevin | 500.00 | 2009-05-01 | 600.0000000000000000<br />R&amp;D | marc | 700.00 | 2010-02-15 | 700.0000000000000000</pre>
<p>Deuxième nouveauté, on peut calculer des frames sur les n enregistrements précédents et n enregistrements suivants. Aucun intérêt avec ce jeu de données, mais il faut bien que je vous donne un exemple&nbsp;:</p>
<pre>marc=# SELECT entite, personne, salaire, date_embauche, avg(salaire) OVER (PARTITION BY entite ORDER BY date_embauche RANGE ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM salaire;<br />entite | personne | salaire | date_embauche | avg <br />-------+-----------+---------+---------------+-----------------------<br />Compta | stephanie | 850.00 | 2006-01-01 | 825.0000000000000000<br />Compta | etienne | 800.00 | 2010-05-01 | 825.0000000000000000<br />R&amp;D | tom | 1100.00 | 2005-01-01 | 1050.0000000000000000<br />R&amp;D | jean | 1000.00 | 2008-07-01 | 933.3333333333333333<br />R&amp;D | maria | 700.00 | 2009-01-01 | 733.3333333333333333<br />R&amp;D | kevin | 500.00 | 2009-05-01 | 633.3333333333333333<br />R&amp;D | marc | 700.00 | 2010-02-15 | 600.0000000000000000</pre>
<p>On reste bien sûr sur le groupe (voir l'enregistrement de tom par exemple, l'enregistrement d'etienne ne rentre pas dans le calcul de sa moyenne).</p>
<p>Si on voulait la même requête que précédemment, mais avec des moyennes sur 3 enregistrements glissants, sans réinitialiser à chaque entité (toujours aucun intérêt pratique dans l'exemple).</p>
<pre>marc=# SELECT entite, personne, salaire, date_embauche, avg(salaire) OVER (ORDER BY entite, date_embauche ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM salaire;<br />entite | personne | salaire | date_embauche | avg <br />--------+-----------+---------+---------------+----------------------<br />Compta | stephanie | 850.00 | 2006-01-01 | 825.0000000000000000<br />Compta | etienne | 800.00 | 2010-05-01 | 916.6666666666666667<br />R&amp;D | tom | 1100.00 | 2005-01-01 | 966.6666666666666667<br />R&amp;D | jean | 1000.00 | 2008-07-01 | 933.3333333333333333<br />R&amp;D | maria | 700.00 | 2009-01-01 | 733.3333333333333333<br />R&amp;D | kevin | 500.00 | 2009-05-01 | 633.3333333333333333<br />R&amp;D | marc | 700.00 | 2010-02-15 | 600.0000000000000000</pre>
<p>Bref, un outil à maîtriser d'urgence, si ce n'est pas déjà le cas (même si je n'ai pas été capable de vous donner un exemple décent).</p>
<h3>Tris dans les aggrégations</h3>
<p>Celle-ci est un peu subtile&nbsp;: le résultat de certaines fonctions d'aggrégation dépend de l'ordre dans lequel on leur fournit les données.</p>
<p>Il ne s'agit évidemment pas de count, avg, mais plutôt de array_agg, xml_agg, string_agg…</p>
<p>Ce qui va me permettre de vous présenter deux nouvelles fonctionnalités d'un coup, string_agg étant une nouveauté de la 9.0.</p>
<p>Reprenons la table salaire. Je voudrais la liste des employés, concaténés dans un seul champ, par entité. C'est pour stocker dans mon tableur.</p>
<pre>marc=# SELECT entite,string_agg(personne,', ') FROM salaire GROUP BY entite;<br />entite | string_agg <br />-------+-------------------------------<br />Compta | etienne, stephanie<br />R&amp;D | marc, maria, kevin, jean, tom</pre><p>C'est déjà bien. Mais j'aimerais bien les avoir par ordre alphabétique, parce que je ne sais pas écrire de macro dans mon tableur pour retrier les données.</p>
<pre>marc=# SELECT entite,string_agg(personne,', ' ORDER BY personne) FROM salaire GROUP BY entite;<br />entite | string_agg <br />--------+-------------------------------<br />Compta | etienne, stephanie<br />R&amp;D | jean, kevin, marc, maria, tom</pre>
<p>Il suffit donc de rajouter une clause de tri à l'intérieur de la fonction d'agrégat, sans virgule à la fin.</p>
<h3>Amélioration des erreurs sur contrainte&nbsp;: message plus clair</h3>
<p>En 8.4: </p>
<pre>marc=# INSERT INTO test VALUES (1);<br />ERROR: duplicate key value violates unique constraint "test_a_key"</pre>
<p>En 9.0:</p>
<pre>marc=# INSERT INTO test VALUES (1);<br />ERROR: duplicate key value violates unique constraint "test_a_key"<br />DETAIL: Key (a)=(1) already exists.</pre>
<p>Cela devrait aider à trouver les causes des violations de contrainte.</p>
<h3>Explain buffers/statistiques sur les hash, xml, json, yaml, nouvelle syntaxe optionnelle explain</h3>
<p>Voici un EXPLAIN ANALYZE classique&nbsp;:</p>
<pre>marc=# EXPLAIN ANALYZE SELECT a, sum(c) FROM pere JOIN fils ON (pere.a = fils.b) WHERE b BETWEEN 1000 AND 300000 GROUP BY a; QUERY PLAN <br />---------------------------------------------------------------------------------------------------------------------------------<br /> HashAggregate (cost=905.48..905.86 rows=31 width=8) (actual time=0.444..0.453 rows=6 loops=1)<br /> -&gt; Nested Loop (cost=10.70..905.32 rows=31 width=8) (actual time=0.104..0.423 rows=6 loops=1)<br /> -&gt; Bitmap Heap Scan on fils (cost=10.70..295.78 rows=31 width=8) (actual time=0.040..0.154 rows=30 loops=1)<br /> Recheck Cond: ((b &gt;= 1000) AND (b &lt;= 300000))<br /> -&gt; Bitmap Index Scan on fils_pkey (cost=0.00..10.69 rows=31 width=0) (actual time=0.023..0.023 rows=30 loops=1)<br /> Index Cond: ((b &gt;= 1000) AND (b &lt;= 300000))<br /> -&gt; Index Scan using pere_pkey on pere (cost=0.00..19.65 rows=1 width=4) (actual time=0.005..0.005 rows=0 loops=30)<br /> Index Cond: (pere.a = fils.b)<br /> Total runtime: 0.560 ms<br />(9 rows)</pre><p>Si vous voulez avoir accès aux nouvelles informations, il faut opter pour la nouvelle syntaxe&nbsp;:
</p>
<pre>EXPLAIN [ ( { ANALYZE boolean | VERBOSE boolean | COSTS boolean | BUFFERS boolean | FORMAT { TEXT | XML | JSON | YAML } } [, ...] ) ] instruction</pre><p>Par exemple&nbsp;:</p>
<pre>marc=# EXPLAIN (ANALYZE true, VERBOSE true, BUFFERS true) SELECT a, sum(c) FROM pere JOIN fils ON (pere.a = fils.b) WHERE b BETWEEN 1000 AND 300000 GROUP BY a;<br /> QUERY PLAN <br />-------------------------------------------------------------------------------------------------------------------------------------<br /> HashAggregate (cost=905.48..905.86 rows=31 width=8) (actual time=1.326..1.336 rows=6 loops=1)<br /> Output: pere.a, sum(fils.c)<br /> Buffers: shared hit=58 read=40<br /> -&gt; Nested Loop (cost=10.70..905.32 rows=31 width=8) (actual time=0.278..1.288 rows=6 loops=1)<br /> Output: pere.a, fils.c<br /> Buffers: shared hit=58 read=40<br /> -&gt; Bitmap Heap Scan on public.fils (cost=10.70..295.78 rows=31 width=8) (actual time=0.073..0.737 rows=30 loops=1)<br /> Output: fils.b, fils.c<br /> Recheck Cond: ((fils.b &gt;= 1000) AND (fils.b &lt;= 300000))<br /> Buffers: shared hit=4 read=28<br /> -&gt; Bitmap Index Scan on fils_pkey (cost=0.00..10.69 rows=31 width=0) (actual time=0.030..0.030 rows=30 loops=1)<br /> Index Cond: ((fils.b &gt;= 1000) AND (fils.b &lt;= 300000))<br /> Buffers: shared hit=3<br /> -&gt; Index Scan using pere_pkey on public.pere (cost=0.00..19.65 rows=1 width=4) (actual time=0.013..0.014 rows=0 loops=30)<br /> Output: pere.a<br /> Index Cond: (pere.a = fils.b)<br /> Buffers: shared hit=54 read=12<br /> Total runtime: 1.526 ms<br />(18 rows)</pre>VERBOSE apporte les lignes 'Output' (l'option existait déjà en 8.4).
<p>BUFFERS indique les opérations sur les buffers (les entrées sorties de la requête): hit correspond aux données lues en cache, read aux données demandées au système d'exploitation. Ici, peu de données étaient en cache.</p>
<p>Vous pouvez aussi demander une sortie dans un autre format que texte. Pour un utilisateur, cela n'a aucune importance. Pour les développeurs d'interfaces graphiques présentant le résultat d'explain, cela permettra de faire l'économie d'un analyseur sur le texte du EXPLAIN, et des bugs qui vont avec.</p>
<p>On peut aussi désactiver l'affichage des coûts avec COSTS false.</p>
<h3>Dictionnaire de filtrage (unaccent)</h3>
<p>Il est possible maintenant de paramétrer des dictionnaires de filtrage. On parle bien sûr des dictionnaires du Full Text Search.</p>
<p>Le but de ces dictionnaires de filtrage est d'appliquer un premier filtrage sur les mots avant de les indexer. Le module présenté ci-dessous (unaccent) est l'illustration de ce mécanisme. Le filtrage peut consister en la suppression de mots ou en leur modification.</p>
<p>Unaccent ne supprime pas les mots, il supprime les accents (tous les signes diacritiques en fait), en remplaçant les caractères accentués par leur version sans accent. Unaccent est un module contrib.</p>
<p>Pour l'installer, comme pour toutes les contribs, psql mabase &lt; chemin_contribs/unaccent.sql.</p>
<p>Nous allons à peu près suivre la documentation d'unaccent, les auteurs ayant eu la gentillesse de donner leurs exemples en français.</p>
<p>Nous créons un nouveau dictionnaire fr (pour ne pas polluer le dictionnaire french 'standard')&nbsp;: </p>
<pre>marc=# CREATE TEXT SEARCH CONFIGURATION fr ( COPY = french );<br />CREATE TEXT SEARCH CONFIGURATION</pre>
<p>Nous modifions le paramétrage de 'fr' pour les lexemes de type mot, en lui demandant de les faire passer par unaccent et french_stem (au lieu de seulement french_stem) </p>
<pre>marc=# ALTER TEXT SEARCH CONFIGURATION fr<br />ALTER MAPPING FOR hword, hword_part, word<br />WITH unaccent, french_stem;<br />ALTER TEXT SEARCH CONFIGURATION</pre><pre>SELECT to_tsvector('fr','Hôtels de la Mer');<br />to_tsvector <br />-------------------<br />'hotel':1 'mer':4<br />(1 row)<br /><br />marc=# SELECT to_tsvector('fr','Hôtel de la Mer') @@ to_tsquery('fr','Hotels');<br />?column? <br />----------<br />t<br />(1 row)</pre>Cela vous permet donc, sans changer une ligne de code, et en gardant les caractères accentués, de rechercher maintenant sans accent.
<h3>vacuumdb --analyze-only</h3>
<p>Comme son nom l'indique, on peut maintenant utiliser vacuumdb pour passer des analyses uniquement. Cela peut être pratique dans une crontab.</p>
<h3>Amélioration du module contrib hstore</h3>
<p>Ce contrib, déjà très pratique, devient encore plus puissant&nbsp;: </p>
<ul><li>La limite de taille sur les clés et valeurs a été supprimée.</li>
<li>Il est maintenant possible d'utiliser GROUP BY et DISTINCT </li>
<li>De nombreux opérateurs et fonctions ont été ajoutés</li>
</ul>
<p>Un exemple serait trop long, tellement ce module est riche. Lisez la documentation sans perdre de temps&nbsp;!</p>
<h3>Texte requête dans auto_explain</h3>
<p>Le module contrib auto_explain affichera maintenant le code de la requête en même temps que son plan, ce qui devrait en augmenter la lisibilité.</p>
<h3>Compteurs sur buffers dans pg_stat_statements</h3>
<p>Ce module contrib, déjà très utile, vient de rajouter des compteurs. Pour rappel, son intérêt est de stocker des statistiques sur les requêtes exécutées par le moteur. Jusque là, il donnait la requête, le nombre d'exécutions, son temps cumulé et le nombre d'enregistrements cumulés. Maintenant, il collecte aussi des informations sur les entrées sorties (en cache, et réelles).</p>
<pre>marc=# SELECT * from pg_stat_statements order by total_time desc limit 2;<br />-[ RECORD 1 ]-------+---------------------<br />userid | 10<br />dbid | 16485<br />query | SELECT * from fils ;<br />calls | 2<br />total_time | 0.491229<br />rows | 420000<br />shared_blks_hit | 61<br />shared_blks_read | 2251<br />shared_blks_written | 0<br />local_blks_hit | 0<br />local_blks_read | 0<br />local_blks_written | 0<br />temp_blks_read | 0<br />temp_blks_written | 0<br />-[ RECORD 2 ]-------+---------------------<br />userid | 10<br />dbid | 16485<br />query | SELECT * from pere;<br />calls | 2<br />total_time | 0.141445<br />rows | 200000<br />shared_blks_hit | 443<br />shared_blks_read | 443<br />shared_blks_written | 0<br />local_blks_hit | 0<br />local_blks_read | 0<br />local_blks_written | 0<br />temp_blks_read | 0<br />temp_blks_written | 0</pre>
<p>On peut donc, une fois ce contrib installé, répondre aux questions suivantes&nbsp;: </p>
<ul><li>Quelle est la requête la plus gourmande en temps d'exécution cumulé&nbsp;?</li>
<li>Quelle est la requête qui génère le plus d'entrées sorties&nbsp;? (attention, les données peuvent être tout de même dans le cache système)</li>
<li>Quelles requêtes utilisent principalement le cache (et ne gagneront donc pas à le voir augmenté)</li>
<li>Qui effectue beaucoup de mises à jour de bloc&nbsp;?</li>
<li>Qui génère des tris&nbsp;?</li>
</ul>
<p>'local' et 'temp' correspondent aux buffers et entrées des tables temporaires et autres opérations locales (tris, hachages) à un backend.</p>
<h3>passwordcheck</h3>
<p>Ce module contrib permet de vérifier les mots de passe, et d'empêcher les plus mauvais de rentrer. Après l'avoir installé comme décrit dans la documentation, voici le résultat&nbsp;:</p>
<pre>marc=# ALTER USER marc password 'marc12';<br />&lt;marc%marc&gt; ERROR: password is too short<br />&lt;marc%marc&gt; STATEMENT: ALTER USER marc password 'marc12';<br />ERROR: password is too short<br />marc=# ALTER USER marc password 'marc123456';<br />&lt;marc%marc&gt; ERROR: password must not contain user name<br />&lt;marc%marc&gt; STATEMENT: ALTER USER marc password 'marc123456';<br />ERROR: password must not contain user name</pre>
<p>Ce module souffre de limitations, principalement dues au fait que PostgreSQL permet l'envoi d'un mot de passe déjà encrypté à la base au moment de la déclaration, ce qui l'empêche de le vérifier correctement. Néanmoins, c'est une avancée dans la bonne direction.</p>
<p>Par ailleurs, le code du module contrib est bien documenté, ce qui permet de l'adapter à vos besoins (entre autres, il est très facile d'y activer la cracklib, afin d'effectuer des contrôles plus complexes).</p>
<p>[email protected]</p></description>
<pubDate>lun, 21 jun 2010 12:08:07 +0000</pubDate>
</item>
<item>
<title>Stephane Bortzmeyer: Créer ses propres types de données avec PostgreSQL</title>
<guid>tag:bortzmeyer.org,2006-02:Blog/postgresql-creer-ses-types</guid>
<link>http://www.bortzmeyer.org/postgresql-creer-ses-types.html</link>
<description>Une des grands forces du SGBD
PostgreSQL est la possibilité de créer ses
propres types de données. Voici deux exemples complets et expliqués,
un pour les nombres rationnels, l'autre pour les noms de
domaine.</description>
<pubDate>lun, 21 jun 2010 00:00:00 +0000</pubDate>
</item>
<item>
<title>Guillaume Lelarge: Fin de la traduction du manuel de la 9.0 (beta 2)</title>
<guid>urn:md5:35b2139323dadedc807a46358e3725fe</guid>
<link>http://blog.guillaume.lelarge.info/index.php/post/2010/06/17/Fin-de-la-traduction-du-manuel-de-la-9.0-%28beta-2%29</link>
<description><p>Enfin, pour moi en tout cas. Il ne reste plus aucun fichier à réserver pour la traduction. Seuls quatre fichiers sont toujours à traduire mais déjà réservés. En attendant leur traduction, il est possible de lire le reste au <a href="http://docs.postgresql.fr/9.0/" hreflang="fr">format HTML</a> ou au <a href="http://docs.postgresql.fr/9.0/pg90.pdf" hreflang="fr">format PDF</a>.</p>
<p>Bonne lecture.</p>
<p>Et n'hésitez pas à me faire parvenir tout problème de traduction.</p></description>
<pubDate>jeu, 17 jun 2010 18:06:00 +0000</pubDate>
</item>
<item>
<title>Actualités PostgreSQL.fr: Nouvelles hebdomadaires de PostgreSQL - 13 juin 2010</title>
<guid>urn:md5:089fe8c4e7fccdf2519984e0c3c3adc8</guid>
<link>http://blog.postgresql.fr/index.php?post/2010/06/15/Nouvelles-hebdomadaires-de-PostgreSQL-13-juin-2010</link>
<description><p>PostgreSQL 9.0 beta 2 publi&eacute;e. Testez&nbsp;!
<a target="_blank" href="http://www.postgresql.org/developer/beta">http://www.postgresql.org/developer/beta</a></p>
<p>Nouveau sondage&nbsp;: laquelle des fonctionnalit&eacute;s de la 9.0 Beta (hors r&eacute;plication) est votre pr&eacute;f&eacute;r&eacute;e&nbsp;?
<a target="_blank" href="http://www.postgresql.org/community/">http://www.postgresql.org/community/</a></p>
<p>Les archives vid&eacute;o du rassemblement du SFPUG du 8 d&eacute;cembre 2009&nbsp;: "Contraintes d'Exclusion via Op&eacute;rateur", sont maintenant disponibles&nbsp;:
<a target="_blank" href="http://thebuild.com/blog/2009/12/23/sfpug-operator-exclusion-constraints/">http://thebuild.com/blog/2009/12/23/sfpug-operator-exclusion-constraints/</a></p>
<p><strong>Les nouveaut&eacute;s des produits d&eacute;riv&eacute;s</strong></p>
<ul>
<li>pgnotifyd v0.1, un gestionnaire de notification asynchrone pour PostgreSQL&nbsp;:
<a target="_blank" href="http://www.pogo.org.uk/~mark/pgnotifyd/">http://www.pogo.org.uk/~mark/pgnotifyd/</a></li>
</ul>
<p><strong>Offres d'emplois autour de PostgreSQL en juin</strong></p>
<ul>
<li>Internationales&nbsp;:
<a target="_blank" href="http://archives.postgresql.org/pgsql-jobs/2010-06/threads.php">http://archives.postgresql.org/pgsql-jobs/2010-06/threads.php</a>;</li>
<li>Francophones&nbsp;:
<a target="_blank" href="http://forums.postgresql.fr/viewforum.php?id=4">http://forums.postgresql.fr/viewforum.php?id=4</a>.</li>
</ul>
<p><strong>PostgreSQL Local</strong></p>
<ul>
<li>Conf&eacute;rence de Michael Renner au Netways OSDC &agrave; Nuremberg (All.) les 23 &amp; 24 juin 2010&nbsp;:
<a target="_blank" href="http://www.netways.de/osdc/y2010/programm/">http://www.netways.de/osdc/y2010/programm/</a></li>
<li>CHAR(10), la conf&eacute;rence PostgreSQL d&eacute;di&eacute;e au clustering, &agrave; la haute-disponibilit&eacute; et &agrave; la r&eacute;plication vient d'ouvrir les inscriptions en ligne et les r&eacute;servations. 2 &amp; 3 juillet 2010, Oriel College, Universit&eacute; d'Oxford (Royaume-Uni)&nbsp;:
<a target="_blank" href="http://www.char10.org/">http://www.char10.org/</a></li>
<li>Le PDXPUG Day est programm&eacute; pour le 18 juillet 2010 &agrave; "l'Oregon Convention Center" &agrave; Portland. D'avantage d'informations&nbsp;:
<a target="_blank" href="http://wiki.postgresql.org/wiki/PDXPUGDay2010">http://wiki.postgresql.org/wiki/PDXPUGDay2010</a></li>
<li>L'OSCON aura lieu &agrave; Portland (Oregon) du 19 au 23 juillet 2010&nbsp;:
<a target="_blank" href="http://www.oscon.com/oscon2010">http://www.oscon.com/oscon2010</a></li>
</ul>
<p><strong>PostgreSQL dans les m&eacute;dia</strong></p>
<ul>
<li>Planet PostgreSQL&nbsp;:
<a target="_blank" href="http://planet.postgresql.org/">http://planet.postgresql.org/</a></li>
<li>Planet PostgreSQLFr&nbsp;:
<a target="_blank" href="http://planete.postgresql.fr/">http://planete.postgresql.fr/</a></li>
</ul>
<p><i>PostgreSQL Weekly News / les nouvelles hebdomadaires vous sont offertes cette semaine par David Fetter et Josh Berkus. Traduction par l'&eacute;quipe PostgreSQLFr sous licence CC BY-NC-SA.</i></p>
<p><i>Proposez vos articles ou annonces avant dimanche 15:00 (heure du Pacifique). Merci de les envoyer en anglais &agrave; david (a) fetter.org, en allemand &agrave; pwn (a) pgug.de, en italien &agrave; pwn (a) itpug.org et en espagnol &agrave; pwn (a) arpug.com.ar.</i></p>
<p>(<a target="_blank" href="http://www.postgresql.org/community/weeklynews/pwn20100613">lien vers l'article original</a>)</p> <p><strong>Correctifs appliqu&eacute;s</strong></p>
<p>Teodor Sigaev a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/contrib/dblink/uninstall_dblink.sql, add missed function dblink_connect_u(text[,text]) to uninstall script</li>
</ul>
<p>Tom Lane a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/src/backend/replication/walreceiver.c, avoid useless snprintf() call when update_process_title is turned off. Fujii Masao.</li>
<li>In pgsql/src/pl/plpython/plpython.c, fix quite-bogus handling of arrays in plpython datum-to-PyObject conversion. Per bug #5497 from David Gardner.</li>
<li>In pgsql/src/bin/scripts/vacuumdb.c, add missing 'Z' letter to getopt_long call --- the newly added --analyze-only switch did not work in its short form -Z. Josh Berkus</li>
<li>In pgsql/doc/src/sgml/Makefile, Postgres.txt should get cleaned by 'make clean'.</li>
</ul>
<p>Robert Haas a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/doc/src/sgml/plhandler.sgml, make procedural language handler reference C-language function docs. Based on suggestions from Jonathan Leto and Joshua Tolley.</li>
<li>In pgsql/src/backend/commands/explain.c, attempt to fix EXPLAIN (FORMAT YAML) quoting to behave sanely. The previous code failed to quote in many cases where quoting was necessary - YAML has loads of special characters, including -:[]{},"'|*&amp; - so quote much more aggressively, and only refrain from quoting things where it seems fairly clear that it isn't necessary. Per report from Dean Rasheed.</li>
<li>In pgsql/src/backend/catalog/pg_largeobject.c, remove stray word from comment.</li>
<li>In pgsql/src/backend/commands/explain.c, quote all string values in EXPLAIN (FORMAT YAML) output. While my previous attempt seems to always produce valid YAML, it doesn't always produce YAML that means what it appears to mean, because of tokens like "0xa" and "true", which without quotes will be interpreted as integer or Boolean literals. So, instead, just quote everything that's not known to be a number, as we do for JSON. Dean Rasheed, with some changes to the comments by me.</li>
<li>Fix ALTER LARGE OBJECT and GRANT ... ON LARGE OBJECT for large OIDs. The previous coding failed for OIDs too large to be represented by a signed integer.</li>
<li>In pgsql/doc/src/sgml/release-9.0.sgml, fix typo.</li>
<li>In pgsql/doc/src/sgml/release-9.0.sgml, fix misplaced modifier. As suggested by Ian Barwick.</li>
</ul>
<p>Tatsuo Ishii a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/src/backend/replication/walreceiver.c, fix typo in the header comment. Per request from Masao Fujii.</li>
</ul>
<p>ITAGAKI Takahiro a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/contrib/dblink/dblink.c, fix connection leak in dblink when dblink_connect() or dblink_connect_u() end with "duplicate connection name" errors. Backported to release 7.4.</li>
<li>In pgsql/contrib/dblink/dblink.c, avoid "identifier will be truncated" warning in dblink when connection string is longer than NAMEDATALEN. The previous fix for long connection name broke the behavior.</li>
<li>In pgsql/contrib/dblink/dblink.c, fix incorrect change in dblink introduced by the previous commit "Fix connection leak in dblink".</li>
<li>Rename restartpoint_command to archive_cleanup_command.</li>
<li>In pgsql/src/backend/storage/ipc/standby.c, remove max_standby_delay message from ps display of recovery process in waiting status. The parameter is not so interesting in ps display because it is referable in postgresql.conf.</li>
</ul>
<p>Magnus Hagander a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/src/backend/access/transam/xlog.c, make the walwriter close its handle to an old xlog segment if it's no longer the current one. Not doing this would leave the walwriter with a handle to a deleted file if there was nothing for it to do for a long period of time, preventing the file from being completely removed. Reported by Tollef Fog Heen, and thanks to Heikki for some hand-holding with the patch.</li>
</ul>
<p>Heikki Linnakangas a commit&eacute;&nbsp;:</p>
<ul>
<li>In standby mode, respect checkpoint_segments in addition to checkpoint_timeout to trigger restartpoints. We used to deliberately only do time-based restartpoints, because if checkpoint_segments is small we would spend time doing restartpoints more often than really necessary. But now that restartpoints are done in bgwriter, they're not as disruptive as they used to be. Secondly, because streaming replication stores the streamed WAL files in pg_xlog, we want to clean it up more often to avoid running out of disk space when checkpoint_timeout is large and checkpoint_segments small. Patch by Fujii Masao, with some minor changes by me.</li>
<li>Return NULL instead of 0/0 in pg_last_xlog_receive_location() and pg_last_xlog_replay_location(). Per Robert Haas's suggestion, after Itagaki Takahiro pointed out an issue in the docs. Also, some wording changes in the docs by me.</li>
<li>Make TriggerFile variable static. It's not used outside xlog.c. Fujii Masao.</li>
</ul>
<p>Alvaro Herrera a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/doc/src/sgml/syntax.sgml, add index entry for ::, per complaint from John Gage.</li>
<li>In pgsql/doc/src/sgml/ref/alter_table.sgml, update ALTER TABLE docs to account for exclusion and deferrable uniqueness constraints. Dean Rasheed.</li>
</ul>
<p>Bruce Momjian a commit&eacute;&nbsp;:</p>
<ul>
<li>In pgsql/doc/src/sgml/release-9.0.sgml, update text of 9.0 release notes. Josh Berkus.</li>
<li>In pgsql/doc/src/sgml/Makefile, add space between after "&gt;" in "&gt;$@" in SGML Makefile, for clarity.</li>
<li>In pgsql/doc/src/sgml/Makefile, add SGML Makefile rule for single-page text, postgres.txt.</li>
<li>Have pg_upgrade create its output files in the current directory, rather than in a subdirectory of the $HOME directory, or $TMP in Windows.</li>
<li>In pgsql/doc/src/sgml/Makefile, remove lynx -stdin flag for postgres.text.</li>
<li>In pgsql/src/test/regress/pg_regress.c, add missing --use-existing --help mention from regression binary. Jan Urbanski</li>
<li>In pgsql/contrib/pg_upgrade/pg_upgrade.h, update pg_upgrade C comment about cwd.</li>
</ul>
<p>Peter Eisentraut a commit&eacute;&nbsp;:</p>
<ul>
<li>Add a regression test case for bug #5497.</li>
<li>In pgsql/src/pl/plpython/expected/README, update Python version information.</li>
<li>In pgsql/src/backend/access/transam/xlog.c, fix typo/bug, found by Clang compiler.</li>
<li>Add target to build HTML documentation as single page.</li>
</ul>
<p><strong>Correctifs rejet&eacute;s (&agrave; ce jour)</strong></p>
<ul>
<li>Pas de d&eacute;ception cette semaine&nbsp;:-)</li>
</ul>
<p><strong>Correctifs en attente</strong></p>
<ul>
<li>Fujii Masao sent in a patch per Andrew Dunstan to clarify that to use a pgpass file to connect to Streaming Replica standbys, it is necessary to use a * for the database field.</li>
<li>Peter Eisentraut sent in a WIP patch to allow GROUP BY to infer functional dependencies and not require that the target list include all non-aggregated columns when it finds them, per the SQL standard.</li>
<li>Alexander Korotkov sent in another revision of the patch to allow multi-byte character sets in Levenshtein functions in the supplied module for fuzzy string matching.</li>
<li>Joel Jacobson sent in another revision of the patch to add a pg_stat_transaction system view.</li>
<li>Robert Haas sent in a patch to deprecate =&gt; and add ==&gt; to the hstore module, per discussion.</li>
</ul></description>
<pubDate>mar, 15 jun 2010 21:39:47 +0000</pubDate>
</item>
<item>
<title>Actualités PostgreSQL.fr: Nouvelles hebdomadaires de PostgreSQL - 6 juin 2010</title>
<guid>urn:md5:f5009136b3c347f172f0a06ed5a81e9a</guid>
<link>http://blog.postgresql.fr/index.php?post/2010/06/12/Nouvelles-hebdomadaires-de-PostgreSQL-6-juin-2010</link>
<description><p>Le 11 juin 2010, Gabriele Bartolini (de 2<sup>nd</sup>Quadrant Italia) interviendra lors de la conf&eacute;rence italienne sur les Logiciels Libres &agrave; Cagliari, Sardaigne&nbsp;; intervention titr&eacute;e "High Availability of business databases with PostgreSQL" [ndt: Haute Disponibilit&eacute; de bases de donn&eacute;es d'entreprises avec PostgreSQL]&nbsp;:
<a target="_blank" href="http://www.confsl.org/">http://www.confsl.org/</a></p>
<p>Le 12 juin 2010, le PUG italien fera la promotion de PostgreSQL lors de la conf&eacute;rence italienne sur les Logiciels Libres &agrave; Cagliari, Sardaigne avec une journ&eacute;e enti&egrave;re d'ateliers autour de PostgreSQL allant d'une "Introduction" &agrave; la "Haute Disponibilit&eacute;"&nbsp;:
<a target="_blank" href="http://www.confsl.org/">http://www.confsl.org/</a></p>
<p><strong>Les nouveaut&eacute;s des produits d&eacute;riv&eacute;s</strong></p>
<ul>
<li>ChronicDB v2.2.2, un outil de d&eacute;ploiement de sch&eacute;ma&nbsp;:
<a target="_blank" href="http://chronicdb.com">http://chronicdb.com</a></li>
</ul>
<p><strong>Offres d'emplois autour de PostgreSQL en juin</strong></p>
<ul>
<li>Internationales&nbsp;:
<a target="_blank" href="http://archives.postgresql.org/pgsql-jobs/2010-05/threads.php">http://archives.postgresql.org/pgsql-jobs/2010-05/threads.php</a>;</li>
<li>Francophones&nbsp;:
<a target="_blank" href="http://forums.postgresql.fr/viewforum.php?id=4">http://forums.postgresql.fr/viewforum.php?id=4</a>.</li>
</ul>
<p><strong>PostgreSQL Local</strong></p>
<ul>
<li>La "Southeast Linuxfest 2010" aura lieu &agrave; Spartanburg (Caroline du Sud, &Eacute;tats-Unis) du 11 au 13 juin. Nos PG-gourous Joshua Drake et Andrew Dunstan donneront des pr&eacute;sentations &agrave; ne pas manquer&nbsp;:
<a target="_blank" href="http://southeastlinuxfest.org/">http://southeastlinuxfest.org/</a></li>
<li>Conf&eacute;rence de Michael Renner au Netways OSDC &agrave; Nuremberg (All.) les 23 &amp; 24 juin 2010&nbsp;:
<a target="_blank" href="http://www.netways.de/osdc/y2010/programm/">http://www.netways.de/osdc/y2010/programm/</a></li>
<li>CHAR(10), la conf&eacute;rence PostgreSQL d&eacute;di&eacute;e au clustering, &agrave; la haute-disponibilit&eacute; et &agrave; la r&eacute;plication vient d'ouvrir les inscriptions en ligne et les r&eacute;servations. 2 &amp; 3 juillet 2010, Oriel College, Universit&eacute; d'Oxford (Royaume-Uni)&nbsp;: